算法设计与分析基础 第七章谜题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_30432997/article/details/85282116

习题7.1

6. 祖先问题要求在一棵给定的n顶点二叉树中,确定一个顶点u是否是顶点v的祖先。设计一个属于O(n)的输入增强算法,使我们可以在常量时间内获得树的每一对顶点的足够信息,来对问题求解。

分析:一个顶点u是顶点v的祖先,当前仅当先序遍历u在v的前面,并且后序遍历u在v的后面。第一个条件,先序遍历u在v的前面,代表要么u是v的祖先,要么u在公共祖先的左子树中而v在公共祖先的右子树中;第二个条件,后序遍历u在v的后面,代表要么u是v的祖先,要么u在公共祖先的右子树中而v在公共祖先的左子树中。综合两个条件,我们可以知道确定一个顶点u是否是顶点v的祖先,其充分必要条件是先序遍历u在v的前面,并且后序遍历u在v的后面。

解答:在O(n)时间对二叉树进行先序遍历和后序遍历,在常量时间内对需要比较的两个节点在先序和后序中比较次序,确定顶点u是否是顶点v的祖先。

 

8.最小距离排序 在美术馆大厅,有10个古埃及石像放置成一排。新的馆长希望移动它们按照高度大小顺序放置,要怎样移动才能使所有石像的移动总和最小呢?为了简化问题,假设石像的高度都不相同。

解答:通过比较计数排序计算每个雕像的位置,也就是算出比该雕像高度更低的雕像数目为Count数组,然后根据计数来移动雕像位置。扫描Count数组,找到第一个不在正确位置的雕像,即Count[i]≠i,将该雕像从当前位置移动到正确的位置Count[i],然后再把Count[i]位置的雕像移动到Count[Count[i]]位置上,以此类推,直到有雕像移动到了i位置,则完成了一轮移动。此时若还有雕像不在正确位置上,则继续执行上述步骤,直到所有的雕像都在正确位置上。由于每个雕像都直接移动到最终位置,因此该算法显然最小化了雕像移动的总距离

 

习题7.2

2. 考虑使用Horspool算法在DNA序列中查找基因的问题。一个DNA序列是由来自字母表{A,C,G,T}的文本表示的,而基因或者基因片段就是模式。

a.为第10对染色体中的下列基因片段构造一个移动表:

TCCTATTCTT

解答:

字符

A

C

T

其他字符

移动距离tc

5

2

1

10

 

b.用Horspool算法,在下列DNA序列中为上面这个模式定位:

TTATAGATCTCGTATTCTTTTATAGATCTCCTATTCTT

解答:

T T A T A G A T C T C G T A T T C T T T T A T A G A T C T C C T A T T C T T

T C C T A T T C T T   T C C T A T T C T T

  T C C T A T T C T T   T C C T A T T C T T

      T C C T A T T C T T        T C C T A T T C T T

        T C C T A T T C T T        T C C T A T T C T T

                 T C C T A T T C T T   T C C T A T T C T T

                   T C C T A T T C T T     T C C T A T T C T T

                                           T C C T A T T C T T

                                                  T C C T A T T C T T

 

11.给定两个长度都为n的字符串S和T,需要确定其中一个字符串是否为另一个字符串循环右移之后的结果。例如,PLEA是由LEAP循环右移一位产生的字符串,反之亦然。

a. 设计一个空间效率较高的算法解决该问题,并说明算法的空间和时间效率类型。

解答

Algorithm RightCyclicShift(S[0..n - 1], T [0..n - 1])

//Checks by brute force whether string T is a right cyclic shift of string S

//Input: Strings S[0..n - 1] and T [0..n - 1]

//Output: Returns true if T is a right cyclic shift of S and false otherwise

for i ← 0 to n - 1 do        //try cyclic shift i positions to the right

       k←0               //number of matched characters

       while k ≤ n− 1 and S[(i + k) mod n] = T [k] do

                 k← k + 1

                 if k = n return true

        return false

该算法空间复杂度O(1),时间复杂度O(n^2)

 

b. 设计一个时间效率较高的算法解决该问题,并说明算法的空间和时间效率类型。

解答:将S的前n-1个字符复制添加到S的末尾形成一个新的字符串,然后用Boyer-Moore算法搜索该字符串是否包含字符串T。该算法的时间复杂度(包含末尾添加字符和搜索字符串)为θ(n),空间复杂度(包含后缀和移动表)为θ(n)+θ(m),m为搜索字符串中的字符数。

 

习题7.3

5.生日悖论 生日悖论问的是,当一个房间里有多少人时,其中两个人的生日(月和日)相同的概率大于1/2?这个问题的答案十分出人意料,请试着求解。对于散列来说这个结论意味着什么?

解答:  ,解得n=23。这个结论意味着,即使哈希表的大小比键的数量大得多(大于10倍),我们也不能忽略冲突。

 

习题7.4

6. a.自顶向下2-3-4树是一棵次数为4的B树,并对B数的插入操作做如下改动:一旦为一个新建的查找叶子节点时遇到的一个满节点(也就是一个包含3个键的节点),就把该节点分裂为两个节点,并把它们的中间键交给原来节点的父母(如果满节点恰好是根,就为中间键创造一个新的根)。向一棵空树连续插入下面这个键的列表,来构造一棵自顶向下的2-3-4树。

a. 10,6,15,31,20,27,50,44,18

解答

b. 和2-3树的插入过程比起来,这个插入过程的主要优点是什么?主要缺点又是什么?

解答:优点是一个满节点的分裂不会导致该节点的祖先链路上的连锁分裂;缺点是我们可能会得到一棵过高的树。

猜你喜欢

转载自blog.csdn.net/qq_30432997/article/details/85282116
今日推荐