第三章 3.1 符号表

来源:互联网 发布:java卡牌类游戏源代码 编辑:程序博客网 时间:2024/06/06 03:56
我们会使用符号表这个词来描述一张抽象的表格,我们会将信息存储在其中,然后按照指定的键来搜索并获取这些信息。键和值得具体意义取决于不同的应用,符号表中可能保存很多键和信息,
       符号表有时称为字典,符号表有时又称为索引,我们会学习三种经典的数据类型来实现高效的符号表:二叉查找树、红黑树和散列表。

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

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


                   用应           查找的目的                     键                      值           字典        找出单词的释义             单词           释义          图书索引             找出相应的页码               术语       一串页码            文件共享             找出歌曲的下载地址               歌曲名         计算机ID              账户管理            处理交易            账户号码            交易详情               网络搜索             找出相关网页               关键字               网页名称

               编译器       找出符号的类型和值            变量名                   类型和值

      符号表是一种典型的抽象数据类型:它代表着一组定义清晰的值以及相应的操作,使得我们能够将类型的实现和使用区别开来,
      这些规则定义了关联数组的抽象形式,你可以将符号表想象成一个数组,键即索引,值即数组的元素。我们可以通过整形的索引快速访问数组的内容;在一个关联数组中(符号表)中,键可以是任意类型,但我们仍然可以用它来快速访问数组的内容。键不能为空,值不能为空

删除操作
    删除的实现由两种:
  • 延时删除:现将键对应的值置为空,然后在某个时候删去所有值为空的键。
  • 即时删除:也就是立刻从表中删除指定的键。
   
有序符号表

在典型的应用中,键都是comparable对象,因此可以使用a.comparable(b)来比较a 和 b两个键。许多符号表的实现利用了comparable接口带来的键有序性来更好地实现put()和get()方法。更重要的是在这些实现中,我们可以认为符号表都会保持键的有序并大大扩展它的API,根据键的相对位置定义更多的实用的操作。

 
排名和选择

检验一个新的键是否插入合适的位置基本操作是排名(rank,找出小于指定键的键的数量)和选择(select,找出排名为k的键)。请确认对于0到size()-1的所有i都有i == rank(select(i)),且所有键都满足key == select()rank(key))


查找的成本模型
在学习符号表的实现时,我们会统计比较的次数(等价性测试或是键的相互比较)。在内循环不进行比较(极少)的情况下,我们会统计数组的访问次数。



无序链表中的顺序查找

      符号表中使用一个数据结构就是链表。每个结点存储一个键值对,get()的实现即为遍历链表,用equals()方法比较需被查找的键和每个结点中的键。如果匹配成功,返回相应的值。否则返回null。put()的实现也是遍历链表,用equals()方法比较需被查找的键和每个结点中的键。如果匹配成功我们就用第二个参数指定的值更新和改建相关联的值。否则我们就用给定的键值对创建一个新的结点并将其插入到链表的开头,这种方法也被称为书序查找。


命题A:在含有N对键值的基于(无序)链表的符号表中,未命中的查找和插入操作都需要N次比较。特别地,向一个空表中插入N个不同的键需要~N^2/2次操作
证明:在表中查找一个不存在的键时,我们会将表中的每个键和给定的键比较,因为不允许出现重复的键,每次插入操作之前我们都需要这样查找一遍。

推论:向一个空表中插入N个不同的键需要~N^2/2次比较


有序数组中的二分查找

      它使用的数据结构是一对平行的数组,一个存储键一个存储值。算法3.2(BinarySearchST)可以保证数组中Comparable 类型的键有序,然后用数组的索引来高效地实现get()操作和其他操作。
     这份实现的核心是rank()方法,它返回表中小于给定键的数量。对于ge
原创粉丝点击