算法导论习题解答17-2

Problem 17-2

(动态二分查找)有序数组上的二分查找花费对数时间,但插入一个新元素的时间与数组规模呈线性关系。我们可以通过维护多个有序数组来提高插入性能。

具体地,假定我们希望支持 n n n元集合上的 S E A R C H SEARCH SEARCH I N S E R T INSERT INSERT操作。令 k = ⌈ lg ⁡ ( n = 1 ) ⌉ k = \lceil \lg(n=1)\rceil k=lg(n=1),令 n n n的二进制表示为 < n k − 1 , n k − 2 , ⋯   , n 0 > <n_{k-1},n_{k-2},\cdots, n_0> <nk1,nk2,,n0>。我们维护 k k k个有序数组 A 0 A_0 A0 A 1 A_1 A1 ⋯ \cdots A k − 1 A_{k-1} Ak1,对 i = 0 , 1 , ⋯   , k − 1 i=0,1,\cdots,k-1 i=0,1,,k1,数组 A i A_i Ai的长度为 2 i 2_i 2i。每个数组或满或空,取决于 n i = 1 n_i=1 ni=1还是 n i = 0 n_i=0 ni=0。因此所有 k k k个数组中保存的元素总数为 ∑ i = 0 k − 1 n i 2 i = n \sum_{i=0}^{k-1}n_i2^i = n i=0k1ni2i=n。虽然单独每个数组都是有序的,但不同数组中的元素之间不存在特定的大小关系。

a. 设计算法,实现这种数据结构上的 S E A R C H SEARCH SEARCH操作,分析其最坏情况运行时间。

Answer:

对于 S E A R C H ( x ) SEARCH(x) SEARCH(x)操作,我们需要一次在 k k k个有序数组中做有序查找,对于满的数组 A i A_i Ai,查找的时间复杂度为 O ( i ) O(i) O(i)。最坏情况下所有数组都为满,且 x x x不在任意数组中,则最坏情况时间复杂度为:
T ( n ) = ∑ i = 0 k − 1 c i = c ⋅ ⌈ lg ⁡ ( n + 1 ) ⌉ ⋅ ( ⌈ lg ⁡ ( n + 1 ) ⌉ − 1 ) / 2 = O ( lg ⁡ 2 n ) T(n) = \sum_{i=0}^{k-1}ci = c\cdot \lceil \lg(n+1)\rceil \cdot (\lceil \lg(n+1)\rceil - 1) / 2 = O(\lg^2n) T(n)=i=0k1ci=clg(n+1)(lg(n+1)1)/2=O(lg2n)

b. 设计 I N S E R T INSERT INSERT算法。分析最坏情况运行时间和摊还时间。

Answer:

本题的数据结构实际上是将 n n n转化为二进制表示,该二进制数的位数为 ⌈ lg ⁡ ( n + 1 ) ⌉ \lceil \lg(n+1)\rceil lg(n+1),于数据结构中的数组一一对应,二进制数的该位为1时,对应数组为满,否则为空。因此为了在插入操作时保持数据结构特性,本题化为二进制数的 { 0 , 1 } \{0,1\} {0,1}翻转问题。

当插入一个元素时,新创建一个大小为1的数组 S S S存放该元素。然后进行以下操作:

  • 1.找到数据结构中大小与 S S S相同的数组 A lg ⁡ ∣ S ∣ A_{\lg|S|} AlgS
  • 2.若数据结构中大小与 S S S相同的数组 A lg ⁡ ∣ S ∣ A_{\lg|S|} AlgS为满,则创建新的数组 S S S有序存放原 S S S A lg ⁡ ∣ S ∣ A_{\lg|S|} AlgS中的元素。该操作时间复杂度度为 O ( ∣ S ∣ ) O(|S|) O(S)。完成后回到步骤0。
  • 3.若数据结构中大小与 S S S相同的数组 A lg ⁡ ∣ S ∣ A_{\lg|S|} AlgS为空,则用S替代该数组,插入操作完成。
  • 4.若不存在若数据结构中大小与 S S S相同的数组 A lg ⁡ ∣ S ∣ A_{\lg|S|} AlgS,直接将 S S S数组作为 A k A_k Ak加入数组集合。

上述操作最坏情况为初始的数组集合 { A i } \{A_i\} {Ai}全部为满,此时的最坏情况运行时间为:
T ( n ) = ∑ i = 0 ⌈ lg ⁡ ( n + 1 ) ⌉ c ⋅ 2 i = O ( 2 ⌈ lg ⁡ ( n + 1 ) ⌉ + 1 − 1 ) = O ( n ) T(n) = \sum_{i=0}^{\lceil \lg(n+1)\rceil} c \cdot 2^i = O(2^{\lceil \lg(n+1)\rceil + 1} - 1) = O(n) T(n)=i=0lg(n+1)c2i=O(2lg(n+1)+11)=O(n)

下分析摊还时间。从上述分析中可以看出,当数组 A i A_i Ai从空被置为满时,对应的数组 A j A_j Aj要被置满再置空 2 i − j − 1 2^{i-j-1} 2ij1次。此处 j < i j < i j<i。则从 0 0 0开始不断插入元素,插入的总开销小于等于插入 2 ⌈ lg ⁡ ( n + 1 ) ⌉ + 1 − 1 2^{\lceil \lg(n+1)\rceil + 1} - 1 2lg(n+1)+11个元素的开销。在此分析中,与数组 A i A_i Ai相关的开销为被置为满的单次开销乘以置满的次数:
T ( A i ) = 2 i ⋅ ( 1 + ∑ j = 1 k − 1 − i 2 j ) = 2 i ⋅ ( 2 k − i − 1 ) = Θ ( 2 k ) = Θ ( n ) T(A_i) = 2^i \cdot \left(1 + \sum_{j=1}^{k-1-i}2^{j}\right) = 2^i \cdot (2^{k-i}-1) = \Theta(2^k) = \Theta(n) T(Ai)=2i(1+j=1k1i2j)=2i(2ki1)=Θ(2k)=Θ(n)

则总开销为:
T ( n ) = ∑ i = 0 k − 1 T ( A i ) = k ⋅ Θ ( n ) = Θ ( n lg ⁡ n ) T(n) = \sum_{i=0}^{k-1}T(A_i) = k\cdot \Theta(n) = \Theta(n\lg n) T(n)=i=0k1T(Ai)=kΘ(n)=Θ(nlgn)

故摊还时间为 O ( lg ⁡ n ) O(\lg n) O(lgn)

c. 讨论如何实现 D E L E T E DELETE DELETE

Answer:

与二进制减法相同,假设状态为满的最小下标数组为 A i A_i Ai,则删除操作需要变动的数组仅限被删除的元素本身所在的数组 A m A_m Am以及 A 0 , A 1 , ⋯   , A i A_0,A_1,\cdots,A_i A0,A1,,Ai。具体操作为 S E A R C H ( x ) SEARCH(x) SEARCH(x),所需时间为 O ( lg ⁡ 2 n ) O(\lg^2n) O(lg2n)。然后将 A m A_m Am中的 x x x替换为 A i A_i Ai中的一个元素,并将该元素从 A i A_i Ai中删除。然后将 A i A_i Ai中剩余的 2 i − 1 2^i-1 2i1个元素填入 A 0 , A 1 , ⋯   , A i − 1 A_0,A_1,\cdots,A_{i-1} A0,A1,,Ai1中,最后置空 A i A_i Ai。最坏情况下的总时间复杂度为:
T ( n ) = Θ ( lg ⁡ 2 n ) + 2 k − 1 = Θ ( n ) T(n) = \Theta(\lg^2n) + 2^k - 1 = \Theta(n) T(n)=Θ(lg2n)+2k1=Θ(n)

相关推荐
市面上能下载的《算法导论》中文版都没有目录(标签) 阅读极不方便 翻阅困难 本人 crocostone 亲自手动制作了完整的标签 包括章 节 小节的标签 在Acrobat 7 0和9 0版本和FoxitReader 4 2版本均能打开 而且 我精心调整了文档的大小 打开或点击标签的时候 默认就是最适合阅读 眼睛最舒服的文档大小 无需再调整大小 本人亲自制作 在CSDN上奉献 欢迎使用 有了目录(标签) 学习效率真的可以提高一大截啊 注意本压缩包使用WinRAR分卷压缩 4个部分都下载后才能解压 为什么要分卷:整个文件有130MB crocostone的上传权限不够 所以只能分卷压缩 已经测试:这4个压缩包 使用WinRAR 7zip Haozip都能正确解压 内容: 1 全世界唯一带“完整”目录的《算法导论》第二版中文版 2 目前能找到的多个版本的习题答案和代码 有Java实现的 C++实现的 官方的 非官方的 教参 考试题答案等等 3 讲义 4 算法导论第二版最清晰的英文版 文字和伪代码可以拷出来 书籍介绍: 《算法导论》(Introduction to Algorithms)原书第二版 Thomas H Cormen(科曼) Charles E Leiserson Ronald L Rivest Clifford Stein著 南京大学潘金贵 顾铁成 李成法 叶懋等译 机械工业出版社 2006 本书简称CLRS 麻省理工学院教材 全世界最广泛使用的算法超经典书籍 学习编程必看之书 作者之一的Rivest就是RSA算法发明者的R 2002年图灵奖得主 算法是程序员必练内功 此书主要讨论算法 数据结构方面的内容稍少 中文翻译质量不错 ################################################### 本人的电脑以前没有WinRAR 而是一直使用7zip 但是7zip制作的zip分卷压缩格式竟然与WinRAR不兼容 导致前面发的资源 用WinRAR的网友说无法解压 在这里表示抱歉 使用7zip或Haozip的人都解压成功了 这次发的资源 4个压缩包 使用WinRAR 7zip Haozip都能正确解压 请CSDN网友 下载完 评论的同时 要点击评论框上方的五角星(共5个五角星) 这样你的被扣的积分就可以返还 还会加一分 如果只评论 不点击小五角星 积分不会返还 一定要先下载完 再评论 如果先评论后下载 或者在下载的过程中评论 积分同样不会返还 数据结构教材 我强烈推荐Sartaj Sahni著《数据结构算法与应用 C++语言描述》 这是一部难得的好书 作者循序渐进 娓娓道来 每一种数据结构算法都给出了详细的实现代码和运行结果 而且代码质量极高 甚至可以直接照搬到商业软件开发中 此书的算法部分也很精到 比算法导论更容易学习和入门 Sartaj Sahni《数据结构算法与应用 C++语言描述》全集 包含中英文图书 代码 习题答案 演示动画 都是我亲自从此书的官方网站下载并汇总的 绝对权威 算法数据结构是计算机的绝对核心技术 学好核心技术 既为了自己 也为了天空不落下别国的炸弹 别国的天空落下我们的炸弹 ">市面上能下载的《算法导论》中文版都没有目录(标签) 阅读极不方便 翻阅困难 本人 crocostone 亲自手动制作了完整的标签 包括章 节 小节的标签 在Acrobat 7 0和9 0版本和FoxitReader 4 2版本均能打开 而且 我精心调整 [更多]
©️2020 CSDN 皮肤主题: 1024 设计师:白松林 返回首页