3.1符号表

符号表最主要的目的就是将一个键和一个值联系起来。用例能够将一个键值对插入符号表并希望在之后能够从符号表的所有键值对中按照键值姐找到对应的值。要实现符号表,我们首先要定义其背后的数据结构,并指明创建并操作这种数据结构以实现插入、查找操作所需要的算法。

查找在大多数应用程序中都至关重要,许多编程环境也因此将符号表实现为高级的抽象数据结构,包括Java——我们会在3.5节中讨论Java的符号表实现。下标给出的例子是在一些典型的应用场景中可能出项的键和值。我们马上会看到一些参考性的用例。3.5节的目的就是向你展示如何在程序中有效的使用符号表。本书中我们还会在其他算法中使用符号表。

定义。符号表是一种存储键值对的数据结构,支持两种操作:插入(put),即将一组新的键值对存入表中;查找(get),即根据给定的键得到相应的值。

3.1.1 API

符号表是一种典型的抽象数据类型:它代表着一组定义清晰的值以及相应的操作,使得我们能够将类型的实现和使用区分开来。和以前一样,我们要用应用程序编程接口(API)来精确地定义这些操作,为数据类型的实现和用例提供一份“契约”。

在查看用例代码之前,为了保证代码的一致、简洁和实用,我们要先说明具体实现中的几个设计决策。

3.1.1.1 泛型

和排序一样,在设计方法时我们没有指定处理对象的类型,而是使用了泛型。对于符号表,我们通过明确地制定查找时键和值的类型来区分它们的不用角色,而被忽视优先队列那样将键和元素本身混为一谈。在考虑了这份基本的API后(例如,这里没有说明键的有序性),我们会用Copparable的对象来扩展典型的用例。这也会为数据类型带来许多新的方法。

3.1.1.2 重复的键

我们的所有实现都遵循以下规则:

◆每个键值能对应着一个值(表中不允许存在重复的键)

◆当用例代码向表中存入的键值对和表中已有的键(及关联的值)冲突时,新的值会代替旧的值。

这些规则定义了关联数组的抽象形式。你可以将符号表想象成一个数组,新的值会代替旧的值。关联数组(符号表)中,键可以是任意类型,但我们可以用它阿里快速访问数组的内容。一些编程语言(非Java)值姐支持程序员使用st[key]来代替st.get(key), st[key] = val来代替st.put(key, val),其中key(键)和val(值)都可以是任意类型的对象。

3.1.1.3 空(null)键

键不能为空。和Java中的许多其他机制一样,使用空键会产生一个运行时异常。

3.1.1.4 空(null)值

我们还规定不允许有空值。这个规定的值姐原因是在我们的API定义中,当键不存在时get()方法会返回空,这也意味着任何不在表中的键关联的值都是空。这个规定产生了两个(我们所期望的)结果:第一,我们可以用get()方法是否返回空来测试给定的键是否存在于符号表中;第二,我们可以将空值作为put()方法的第二个参数存入表中来实现删除,也就是删除操作的主要内容。

3.1.1.5 删除操作

在符号表中,删除的实现可以有两种方法:延时删除,也就是将键对应的值置为空,然后在某个时候删除所有值为空的键;或是即时删除,也就是立刻从表中删除指定的键。刚才已经说过,put(key, null)是delete(key)的一种简单的(延时型)delete()就是为了代替这种默认的方案。在我们的符号表实现中不会使用默认的方案,而在本书的网站上put()实现的开头有这样一句防御性代码:

if(val == null)  {delete(key); return ;}

这保证了符号表中任何键的值都不为空。

3.1.1.6 便捷方法

为了用例代码的清晰,我们在API中加入了contains()和isEmpty()方法,他们的实现如下表。

方法 默认实现
boolean contains(key key) return get(key) != null;
void delete(Key key) put(key, null);
boolean isEmpty() return size() == 0;

3.1.1.7 迭代

为了方便用例处理表中的所有键值,我们有时会在API的第一行加上implements Iterable<Key>这句话,强制所有实现都必须包含iterator() 方法来返回一个实现了hasNext()和next()方法的迭代器。但是对于符号表我们采用了一个更简单的方法。我们定义了keys()方法来返回一个Iterable<Key>队形以方便用例遍历所有的键。这么做是为了和以后的有序符号表的所有方法保持一直,使得用例可以遍历表的键集的一个指定的部分。

3.1.1.8 键的等价性

要确定一个给定的键是否存在于符号表中,首先要确立对象等价性的概念。在Java中,按照约定所有的对象都继承了一个equals()方法,Java也为它标准数据类型例如Integer、Double和String 以及一些更复杂的类型,如File和URL,实现了equals()方法——当使用这些数据类型时你可以直接使用内置的实现。例如,如果x和y都是String类型,当且仅当x和y的长度相同且每个位置上的字母都相同时,x.equals(y)返回true。而自定义的键则需要重写equals()方法。


《Algorithms 4th Edition》读书笔记——3.1 符号表(Elementary Symbol Tables)-Ⅰ的更多相关文章

  1. 《Algorithms 4th Edition》读书笔记——3.1 符号表(Elementary Symbol Tables)-Ⅳ

    3.1.4 无序链表中的顺序查找 符号表中使用的数据结构的一个简单选择是链表,每个结点存储一个键值对,如以下代码所示.get()的实现即为遍历链表,用equals()方法比较需被查找的键和每个节点中的 ...

  2. 《Algorithms 4th Edition》读书笔记——3.1 符号表(Elementary Symbol Tables)-Ⅲ

    3.1.3 用例举例 在学习它的实现之前我们还是应该先看看如何使用它.相应的我们这里考察两个用例:一个用来跟踪算法在小规模输入下的行为测试用例和一个来寻找更高效的实现的性能测试用例. 3.1.3.1 ...

  3. 《Algorithms 4th Edition》读书笔记——3.1 符号表(Elementary Symbol Tables)-Ⅱ

    3.1.2 有序的符号表 典型的应用程序中,键都是Comparable的对象,因此可以使用a.compare(b)来比较a和b两个键.许多符号表的实现都利用Comparable接口带来的键的有序性来更 ...

  4. 符号表(Symbol Tables)

    小时候我们都翻过词典,现在接触过电脑的人大多数都会用文字处理软件(例如微软的word,附带拼写检查).拼写检查本身也是一个词典,只不过容量比较小.现实生活中有许多词典的应用: 拼写检查 数据库管理应用 ...

  5. C++Primer 4th edition读书笔记-第二章

    1 变量的定义用于为变量分配存储空间,还可以为变量指定初始值.在一个程序中,变量有且只有一个定义.声明用于向程序表明变量的名字和类型.定义也是声明:当定义变量时,我们声明了它的类型和名字.可以通过使用 ...

  6. 《Algorithms 4th Edition》读书笔记——2.4 优先队列(priority queue)-Ⅶ(延伸:堆排序的实现)

    2.4.5 堆排序 我们可以把任意优先队列变成一种排序方法.将所有元素插入一个查找最小元素的有限队列,然后再重复调用删除最小元素的操作来将他们按顺序删去.用无序数组实现的优先队列这么做相当于进行一次插 ...

  7. 《Algorithms 4th Edition》读书笔记——2.4 优先队列(priority queue)-Ⅵ

    · 学后心得体会与部分习题实现 心得体会: 曾经只是了解了优先队列的基本性质,并会调用C++ STL库中的priority_queue以及 java.util.PriorityQueue<E&g ...

  8. 《Algorithms 4th Edition》读书笔记——2.4 优先队列(priority queue)-Ⅴ

    命题Q.对于一个含有N个元素的基于堆叠优先队列,插入元素操作只需要不超过(lgN + 1)次比较,删除最大元素的操作需要不超过2lgN次比较. 证明.由命题P可知,两种操作都需要在根节点和堆底之间移动 ...

  9. 《C++ Primer 4th》读书笔记 序

    注:本系列读书笔记是博主写作于两三年前的,所以是基于<C++ Primer>第四版的,目前该书已更新至第五版,第五版是基于C++11标准的,貌似更新挺多的.博主今年应届硕士毕业,如若过阵子 ...

随机推荐

  1. IDF实验室解题学习笔记1

    1.图片里的英文 图片可以有很多种打开方式,破解该题,需将图片下载下来. 对于图片,我们可以使用图片编辑软件,进行各种调明暗,变色调等操作. 我们还可以使用2进制或者16进制的文件打开方式打开.该图使 ...

  2. 解决IE6下DIV无法实现1px高度问题

    2.多加一个line-height:1px的属性,不过得在DIV里多加一个 ,也就是空格,以下为引用的内容: <styletypestyletype="text/css"&g ...

  3. Could not load the Tomcat server configuration at /Servers/Tomcat v7.0 Server at localhost-config.

    [问题] Eclipse[Ubuntu14.04]中启动Tomcat Server[7.0.55]的时候出现错误例如以下: [解决方法] 1.将下边的Servers中的server[Tomcat v7 ...

  4. hdu 4405 Aeroplane chess (概率DP)

    Aeroplane chess Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  5. .NET--接口设计

    我们学习.net视频的时候,老师讲的是"介面设计",有意思的是,这里的介面不是我们想象中的界面的意思,而是接口的意思. 由于视频是Micorsoft公司做的,所以整个视频看下来.仅 ...

  6. [华为机试练习题]55.最大公约数 &amp; 多个数的最大公约数

    题目 描写叙述: 输入2个数字,最后输出2个数字的最大公约数 题目类别: 位运算 难度: 0基础 执行时间限制: 无限制 内存限制: 无限制 阶段: 入职前练习 输入: 2个整数 输出: 输出数字1和 ...

  7. 图像重采样(CPU和GPU)

    1 前言 之前在写影像融合算法的时候,免不了要实现将多光谱影像重采样到全色大小.当时为了不影响融合算法整体开发进度,其中重采样功能用的是GDAL开源库中的Warp接口实现的. 后来发现GDAL War ...

  8. IOS 原生解析JSON 问题

    服务器----WebService 返回的是JSON数据 IOS解析报错: Error Domain=NSCocoaErrorDomain Code=3840 "Unable to conv ...

  9. windows消息常量值

    WM_NULL = 0WM_CREATE = 1应用程序创建一个窗口WM_DESTROY = 2一个窗口被销毁WM_MOVE = 3移动一个窗口WM_SIZE = 5改变一个窗口的大小WM_ACTIV ...

  10. web开发常用样式

    1.div保持底部浮动(不受滚动条影响) position:fixed;_position:absolute;bottom:0px;_bottom:0px;_margin-top:expression ...