基本数据结构与散列表.ppt

  1. 1、本文档共23页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
基本数据结构和散列表 动态集合 概念:算法所操作的集合,可以随着时间的改变而增大、缩小或产生其他变化。 动态集合上的操作: SEARCH(S,k) INSERT(S,x) DELETE(S,x) MINIMUM(S) MAXIMUM(S) SUCCESSOR(S,x) PREDECESSOR(S,x) 基本数据结构 栈 队列 链表 有根树 栈和队列 栈和队列都是动态集合,在这种结构中,可以用DELETE操作去掉的元素是预先规定好的。 链表 链表 链表-有根树 时间性能比较 散列表 散列表示 散列函数 开放寻址法 完全散列 散列表 直接寻址表与散列表 散列表需要解决的问题——碰撞 若某个散列函数H对于不相等的关键字key1和key2得到相同的散列地址,即: H(key1)=H(key2), 则将该现象称为碰撞,而发生冲突的这两个关键字则称为该散列函数 H 的同义词。 链接法解决碰撞 链接法:将所有关键字为同义词的结点链接在同一个单链表中。 开放寻址法 当冲突发生时,使用某种方法在散列表中形成一个探查序列,沿着此探查序列逐个单元地检索,直到找到给定的关键字,或者碰到一个开放的地址为止。 开放寻址法好处在于根本不用指针,而是计算出要存取的各个槽。这样一来,由于不用存储指针而节省了空间,从而可以用同样的空间来提供更多的槽,其潜在效果就是可以减少碰撞,提高查找速度。 一致散列 常用技术 线性探查 二次探查 双重散列 这三种技术都不能实现一致散列的假设,因为它们能产生的不同探查序列数都不超过m2个(一致散列要求有m!个探查序列)。 在这三种技术中,双重散列能产生的探查序列数最多,因而能给出最好的结果。 散列函数 一个好的散列函数应(近似地)满足简单一致散列的假设:每个关键字都等可能地散列到m个槽位的任何一个之中去,并与其他的关键字已被散列到哪一个槽位中无关。 将关键字解释为自然数:多数散列函数都假定关键字域为自然数集N={0,1,2,……}。如果所给关键字不是自然数,则必须有一种方式将其解释为自然数。 例:标识符pt可以被解释为十进制整数对(112,116),因为在ASCII字符集中,p=112,t=116。然后,按128为基数来表示,pt即为(112*128)+116=14452. 散列函数 Company Logo * LOGO 栈 队列 LIFO、压入、弹出、上溢、下溢 FIFO、入队、出队、上溢、下溢 在链表这种数据结构中,各对象按线性顺序排序。链表中的顺序是由各对象中的指针所决定的。 双链表:包含next域和prev域 LIST-INSERT(L,x)操作 LIST-DELETE(L,x)操作 引入哨兵: 一个空链表仅含哨兵元素 非空链表,表头关键字为9,表尾关键字为1 执行LIST-INSERT(L,x)操作,插入关键字为25的新对象,称成为新表头 执行LIST-DELETE(L,x)操作,删掉表尾,新表尾为关键字为4的对象 二叉树: 分支数无限制的有根树: K 关键字 地址 h h(k) 一种能把关键字K映射成记录的存储地址的函数 散列函数h 散列地址 散列法 散列表 h(k) 关键码 — 地址转换 用散列法表示的字典 U (关键字全域) 0 9 4 7 6 1 假设每一个关键字的探查序列是0,1,……m-1的m!种排列中的任一种的可能性是相同的。 有三种技术常用来计算开放寻址法中的探查序列:线性探查、二次探查、双重探查。这几种技术都能保证对每个关键字k,h(k,0),h(k,1),……,h(k,m-1)都是0,1,……m-1的一个排列。 线性探查 二次探查 双重探查 基本思想:将散列表看成是一个环形表 d d+1, d+2, …… , m-1 0,1, … , d-1 若地址为 d ( 即 H(key)=d ) 用线形探查法解决冲突,求下一个开放地的公式为: di=(d+i)%m i=1,2,…,s (1?s?m-1) 其中:d=H(key) 存在的问题:一次群集 二次探查法的探查序列依次是12, -12, 22, -22, ……等,也就是说,发生冲突时,将同义词来回散列在 第一个地址d=H(key)的两端。由此可知,发生冲突时, 求下一个开放地址的公式为: d2i-1=(d+i2)%m d2i=(d-i2)%m (1?i?(m-1)/2) 虽然二次探查法减少了堆积的可能性,但是二次探 查法不容易探查到整个散列表空

文档评论(0)

xuefei111 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档