算法--数据结构基础.ppt

  1. 1、本文档共36页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
算法--数据结构基础

2.5 散列表 假定某应用需要一个动态集合,其关键值取自全集U = {0, 1, ..., m - 1},其中的m不是太大。利用一个称为直接寻址表的数组T[0 .. m - 1]来表示该动态集合,其中的每一个元素称为一个槽位,对应于全集U中的一个关键值。 散列函数与冲突 若全集U很大时,在通常的计算机中对给定的内存容量存储规模为|U|的表T是不现实的,甚至是不可能的。另一方面,实际存储的关键值集合K可能相对于U来说很小,以至于T中的大多数槽位会被浪费。我们使用一个散列函数h根据关键值k计算出槽位。此处的h把全集U映射到散列表T[0 … m - 1]的槽位: h : U → {0, 1, ..., m - 1} . 通常,我们将散列函数h创建为对k?U, h(k)= k MOD m 但这可能会引起冲突:两个关键值得函数值相等。 利用拉链解决冲突 散列表的字典操作 CHAINED-HASH-SEARCH(T, k) 1 在表T[h(k)]中查找关键值为k的元素 CHAINED-HASH-INSERT(T, x) 1 if CHAINED-HASH-SEARCH(T, key[x])=NIL 2 then 调用LIST-INSERT将x插入到表T[h(key[x])]的表首 CHAINED-HASH-DELETE(T, k) 1 x? LIST-SEARCH (T[h(k)], k) 2 LIST-DELETE(T[h(k)], x) 用拉链法的散列技术分析 给定一个具有m个槽位,存储了n个元素的散列表T,定义T的装载因子α为n/m,即,一个拉链表中的平均元素数目。 定理 2-3 在一个利用拉链法解决冲突的散列表中,在简单均匀散列的假定下,不成功查找的期望时间是Θ(1 + α)。 第2章 数据结构基础 2.1 线性表 将集合中的n 个元素一字排列: a1,a2,…,ai-1,ai,ai+1,…,an ↑ ↑ 表首 表尾 有且仅有一个元素a1没有前驱,该元素称为表首;有且仅有一个元素an没有后继,称为表尾;此外的所有1 i n的元素ai均有一个前驱ai-1,且有一个后继ai+1。以这样的方式组织起来的数据结构称为一个线性表。 在计算机中,用一个连续存储的数组来表示一个线性表是很自然的,因为数组的下标自然地表示出了线性表中元素的前后关系。 线性表的链表表示 链表常用来表示可变长线性表。链表中为每一个元素单独分配一个称为结点的存储空间,元素间的前后顺序是由指向每个结点的指针确定的。 带有哨兵结点的环形链表 在一个链表中,若表首的prev域指向表尾,而表尾的next域指向表首,称为环形表。此时表可视为一个由元素构成的环。这样,链表中任何一个结点都有唯一前驱和后继。 我们为链表L添加一个哨兵结点nil[L]:它不表示任何数据元素,但它是头结点的前驱,尾结点的后继。添加了哨兵后,形成了一个环形链表,其中的每个结点都有各自的前驱和后继。 对链表的扫描 LIST-DISPLAY(L) 1 x?next[nil[L]]?x指向头结点 2 while x?nil[L]?x指向链表中的正常结点 3 do print key[x] 4 x?next[x] 运行时间T(n)=?(n),n为L的结点数。 在链表中查找 LIST-SEARCH (L, k) 1 x ←next[nil[L]] ?从表首结点开始 2 while x ≠nil[L] and key[x] ≠ k 3 do x ← next[x] 4 return x 运行时间T(n)=O(n),n为L的结点数。 将元素插入到链表中 LIST-INSERT(L, a, x) ?在L的结点a之前插入新的结点x 1 if x=nil[L] 2 then return 3 b? prev[a] 4 prev[x] ?b 5 next[x] ? a 6 next[b] ? prev[a] ?x 运行时间T(n)=?(1)。 从链表中删除元素 LIST-DELETE(L, x) 1 if x=NIL ?空结点 2 then return 3 a←next[x] 4 b←prev[x] 5 next[b] ←a 6 prev[a] ←b 运行时间T(n)=?(1)。 2.2 栈 栈是用线性表表示的动态集合,INSERT操作DELETE操作均被限制在表首。在栈中,从集合中删除的元素是最近才插入其中的:栈实现的是后进先出或LIFO的策略。 可以用一个链表来实现一个栈S。S有两个属性:一个是链表L[S],另一个属性是栈顶top[S],它指向

文档评论(0)

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

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

1亿VIP精品文档

相关文档