算法导论
文章平均质量分 87
TroyFou
桃开否?别着急询问。桃谢否?别担心花落。
展开
-
算法导论第十四章思考题参考答案(27)
b.我们将给出一个简单的解决方案来解决这个问题,它的运行时间为O(nlg (n)),它不会增加红黑树,尽管这是提示所建议的。然后按如下步骤进行:如果你刚刚打印了第k个值,其秩为r,则从树中删除该节点,那么要打印的第(k+ 1)值的秩为r−1 + m(n) mod (n−k)。a.假设我们有一个最大重叠点p,然后,只要我们想象移动点p但不经过任何区间的任何端点,那么我们不会改变包含p的区间的数量,所以,我们只是向右移动,直到我们到达某个区间的端点,然后,我们有一个最大重叠点,也就是区间的端点。原创 2024-03-24 18:43:36 · 165 阅读 · 0 评论 -
算法导论第十四章练习参考答案(26) - 14.1-14.3
呼叫顺序为:然后,我们得到返回的节点(键为20)是T.root.left.right.left.rightOS-RANK(T,x)的运算如下:r被设为0,y被设为x。在while循环的第一次迭代时,y被设为键为38的节点。在第二次迭代中,r增加到2,y设置为键为30的节点。在第三次迭代中,y被设置为键为41的节点。在第四次迭代中,r增加到15,y设置为键为26的节点,即根节点。这将打破while循环,并返回第15级。期望的结果是OS-SELECT(T,OS-RANK(T,x)+i)。原创 2024-03-24 18:42:30 · 1553 阅读 · 0 评论 -
算法导论第十三章练习参考答案(24) - 13.1-13.4
当z更新时,它要么是根,要么是根的子节点。因为每个红色节点需要有两个黑色的子节点,我们唯一的希望就是相对于我们的黑色内部节点的数量,得到大量的内部红色节点,就是让每个叶节点的父节点都是一个红色节点。因为我们是从红黑树中删除的,所以y.p的另一个子结点(在第14行调用RB-TRANSPLANT时成为x'的兄弟结点)必须是黑色的,所以x是x.p的唯一的子结点(是红色的)。在从根到叶的路径中,任意两个黑节点之间最多有一个红节点,所以这种树的最大高度是2k+1,从根到叶的每条路径都是红节点和黑节点交替出现。原创 2024-03-19 10:43:53 · 530 阅读 · 0 评论 -
算法导论第十二章思考题参考答案(23)
树的根的单词必然在它的左子树或右子树的任何单词之前,因为它既短,又是这些树中每个单词的前缀。为了非正式地计算期望的运行时间,只需注意在随机选择时,我们将大约有一半的时间选择左边,所以,树将大致平衡,所以,我们有深度大约是 lg(n),所以期望的运行时间将是nlg(n)。每个非根节点在到达该节点的路上都有一个来自根的第一条边的贡献,这条路径上的所有其他边都是通过查看以原始根的子树为根的两个子树中的边来计数的。然后,我们知道所有较小的元素都在左边而所有较大的元素都在子元素的右边。点的二叉树的个数,我们首先从。原创 2024-03-18 14:09:45 · 797 阅读 · 0 评论 -
算法导论第十二章练习参考答案(22) - 12.1-12.4
接下来观察 y.left 必须是 x 的祖先,因为如果它不是,那么 y.right 将是 x的祖先,这意味着 x > y.最后,假设 y 不是 x的最低祖先,它的左子也是 x的祖先,设 z 表示这个最低祖先。那么 z 一定在 y 的左子树中,这意味着 z < y,这与 y 是 x的后继结点的事实相矛盾。所以,它一定没有左子元素。首先我们确定 y 一定是 x的祖先,如果 y 不是 x的祖先,则设 z 表示 x和 y的第一个共同祖先,根据二叉搜索树的性质,x < z < y,因此 y 不能是 x的后继。原创 2024-03-18 14:06:42 · 728 阅读 · 0 评论 -
算法导论答案译文导航
算法导论第一章练习参考答案(1) - 1.1-1.2https://blog.csdn.net/TXLTF/article/details/131675589算法导论第二章练习参考答案(2) - 2.1-2.3https://blog.csdn.net/TXLTF/article/details/131677038算法导论第二章思考题参考答案(3)https://blog.csdn.net/TXLTF/article/details/131699788算法导论第三章练习参考答案(4) - 3.1-3.2ht原创 2024-03-15 21:22:59 · 2562 阅读 · 0 评论 -
算法导论第九章思考题参考答案(17)
c.由上一部分可知,如果i是常数,那么O(T(2i) lg(n/i))就变成了T(lg(n))。那么Ui(n) = n + O(T(2i) lg(n/i)) = n + O(lg(n))。d,从c部分,我们把n/k代入i得到Ui(n) = n+O(T(2i) lg(n/i)) = n+O(T(2n/k) lgk)。b.堆化耗时nlg (n),每次提取耗时lg(n),因此,总运行时间为O((n + i) lg(n))a.排序耗时nlg (n),列出它们耗时i,所以总运行时间是O(nlg (n) + i)原创 2024-03-15 21:19:20 · 670 阅读 · 0 评论 -
算法导论第十一章思考题参考答案(21)
当 n→∞时,除最后一项外的所有项都趋于 0,因此对于 N 的某个固定值, 选择 c = 4 适用于所有 n > N,设 ci 表示 n = i 时适用的值,然后通过令 ci= maxi(ci, 4)我们得到 c 的期望值,通过(b)部分,我们得到 Pk0≤nQk0< n/n^3 = 1/n^2。b.碰撞的概率是1/p,所以H是全称的。因为 i < i',我们有 i+ i' + 1≤ 2i' < 2 m,所以,我们必须有 i+ i' + 1 = 0,这与我们假设这样 的 i 和 i' 存在的假设相矛盾。原创 2024-03-17 11:58:16 · 512 阅读 · 0 评论 -
算法导论第十一章练习参考答案(20) - 11.1-11.5
如果是,则删除x时列表将为空,因此将 T[h(x.key)]插入空闲 列表,将 T[h(x.key)]的标志更新为 0,并从存储它的列表中删除 x。那么 E[X] = p(1+α)+(1− p)(1+E[X]),因为我们预计需要 1+α 步才能到达列表中 的一个元素,而且因为我们知道每个列表中有多少元素,如果元素不存在, 我们马上就会知道。此时我们检查的表项是[h1(k) + (m/d)h2(k)] mod m = [h1(k) + (m/d)(dc1)] mod m≡h1(k)。这需要时间 O(m)。原创 2023-08-10 10:54:02 · 867 阅读 · 0 评论 -
算法导论第十章思考题参考答案(19)
因为调用MIN-HEAPIFY的i的值总是在增加,而且我们不需要多次遍历元素,所以运行时间在列表的长度上是线性的。要将链表实现为堆,我们可以想象通常的二进制堆的数组实现,其中第i元素的子元素是2i和2i + 1。a.如果原始版本的算法只需要t次迭代,那么,我们知道它最多只能随机跳过列表以获得所需的值,因为原始while循环的每次迭代都可能是随机跳转,然后是通过链表的正常步骤。h.如果我们没有不同的键值,那么,我们可以随机选择一个比之前更远的元素,但不会跳转到它,因为它与我们当前所在的键值相同。原创 2024-03-16 10:44:36 · 648 阅读 · 0 评论 -
算法导论第十章练习参考答案(18) - 10.1-10.4
我们实现UNION的方式如下:设置L1.nil.prev.next = L2.nil.next和L2.nil.next.prev = L1.nil.prev,使得L1的最后一个元素紧跟着L2的第一个元素。然后设置l1.nil.prev = L2.nil.prev.和L2.nil.prev.next = L1.nil,所以L1.nil是包含L1和L2中所有元素的双链表的哨兵。要查找节点的所有子节点,首先查找x. left,然后跟踪“右”指针,直到布尔值的奇偶校验发生变化,忽略最后一个节点,因为它将是x。原创 2024-03-16 10:41:58 · 1069 阅读 · 0 评论 -
算法导论第九章练习参考答案(16) - 9.1-9.3
注意,如果图中存在从x到i的路径,则A[i]是i−1个较小元素中的一个,如果图中存在从i到x的路径,则A[i]是n−i个较大元素中的一个。设n < k时T(n) < cn,则m≥k时,T(m)≤T(m/7) + T(10m/14) + O(m)≤cm(1/7 + 10/14) + O(m)。在不失一般性的前提下,假设n和k是2的幂。换句话说,P(Xk = a| max(k−1,n−k) = m) = P(Xk = a)对于a = 0,1和m = k−1,n−k,所以Xk和max(k−1,n−k)是独立的。原创 2024-03-15 21:15:50 · 916 阅读 · 0 评论 -
算法导论第八章练习参考答案(14) - 8.1-8.4
例如,数组[2,1,1,3,4,4,4]将变成[(2,1),(1,2),(1,3),(3,4),(4,5),(4,6),(4,7)]。然后,在第10-12行循环的连续迭代之后,我们有B = <,,,,, 2,,,,, >,B = <,,,,, 2,, 3,, ,>,B = <,,,, 1,, 2,, 3,,, >,最后,B = <0,0,1,1,2,2,3,3,4,6,6>形成的子表为:<.13,.16>,<.20>,<.39>,<.42>,<.53>,<.64>,<.71,.79>,<.89>。原创 2023-08-06 16:53:38 · 365 阅读 · 0 评论 -
算法导论第七章思考题参考答案(13)
a.我们将使用参数p = 1, r = | A | = 12进行调用。所以x = 13。我们确实看到分割已经移动了两个比枢轴大的元素,19和21,到数组的最后两个位置。b.我们知道,在循环的开始,我们有i < j,因为它最初是成立的,只要|A|≥2。如果在某个迭代中它是不真实的,那么我们就会在之前的迭代中离开循环。为了证明我们不会访问数组外的元素,我们需要证明在每次循环开始时,有一个k > i使得 A[k]≥x,并且有一个k'< j使得A [j']≤x。原创 2023-08-06 11:52:19 · 153 阅读 · 0 评论 -
算法导论第七章练习参考答案(12) - 7.1 - 7.4
这个表达式对q的导数是2q - 2(n - q - 2) = - 2n + 4q + 4当2q + 2 =n时它等于零,所以在q =(n - 2)/2处有一个极小值。我们可以看到端点是相等的,因为在q = 0时,它是(n−1)^2,而在q = n−1时,它是(n−1)^2 + (n−n + 1−1)^2 = (n−1)^2。如果我们只在问题大小≤k之前进行快速排序,那么,我们将不得不采取lg(n/k)步,因为在随机化快速排序的原始分析中,我们期望递归树有lg(n)个层次。它的解是Θ(n^2)。原创 2023-08-06 09:53:29 · 416 阅读 · 0 评论 -
算法导论第六章思考题参考答案(11)
b.对于每一个i, j, Y[1,1]≤Y [i, 1]≤Y [i, j]。所以,如果Y[1,1] =∞,我们知道对于每一个i, j,Y [i, j] =∞,这意味着不存在任何元素。这两种操作的时间都不超过2n∈O(n),并且执行了n^2次,因此,总运行时间为O(n^3)。d.因为i + j在每一步都是递减的,从n + m开始,以2为界,我们知道这个程序的运行时间是O(n + m)。b.每个插入步骤最多需要O(lg(n)),因为我们做了n次,所以我们得到了O(nlg (n))的运行时间界限。原创 2023-08-05 21:40:43 · 92 阅读 · 1 评论 -
算法导论第六章练习参考答案(10) - 6.1 - 6.5
假设在第2-5行for循环的第i次迭代开始时,子数组A[1...i]是包含A[1...n]中第i个最小元素的最大堆,和子数组A[i + 1...n]包含A的n−i个最大的元素A[1...n]。第3行将A[1]与A[i]交换,因此A[i...n]包含数组中最大的n−i + 1个元素,和A[1..i−1]包含i−1个最小的元素。然后,当我们把i和它的父结点交换时如果它更大,因为它比它的父结点大,它也一定比它的兄弟结点大,同样,因为它的父结点在堆中最初比它的子结点高,我们知道它的父结点比它的子结点大。原创 2023-08-05 21:33:08 · 282 阅读 · 1 评论 -
算法导论第三章练习参考答案(4) - 3.1-3.2
如果最坏情况和最佳情况的运行时间分别是O(g(n))和Ω(g(n)),那么任何大小为n的输入的运行时间必须是O(g(n))和Ω(g(n))。假设f(n)∈Θ(g(n)),则∃c1, c2, n0,∀n≥n0,0≤c1g(n)≤f(n)≤c2g(n),如果我们单独看这些不等式,我们有c1g(n)≤f(n) (f(n)∈Ω(g(n))和f(n)≤c2g(n) (f(n)∈O(g(n)))。假设我们有∃n1, c1,∀n≥n1, c1g(n)≤f(n)和∃n2, c2,∀n≥n2, f(n)≤c2g(n)。原创 2023-07-15 21:04:43 · 409 阅读 · 1 评论 -
算法导论第三章思考题参考答案(5)
那么f (n) + g (n)≥f (n)所以f (n) + o(f(n)) =Ω(f (n))。现在我们需要找到d使得log(f(n))≤d*log(g(n))使log(c) + log(g(n))≤d*log(g(n))就足够了,这可以通过令d = log(c) + 1来实现,因为log(g(n))≥1。假设我们有∃n1, c1, k1,∀n≥n1,c1*g(n)/(lg(n))^k1≤f(n)和∃n2, c2, k2,∀n≥n2, f(n)≤c2*g(n)*((lg(n))^k2)。原创 2023-07-22 12:11:12 · 254 阅读 · 0 评论 -
算法导论第四章练习参考答案(6) - 4.1-4.6
假设f满足正则性条件,我们希望∃p,d,k,∀n≥k,有f(n)≥d*n^(loga(b) +p)。然后,我们将通过归纳法证明,对于最大的i,使得b^i * k小于n,并且对于每一个n≥k, f(n)≥dn^(loga(b) +p)。然后,根据规律性和归纳假设,cf(n)≥af(n/b)≥a* d* ( (n/b)^(loga(b) +p) )。取c =−2/ log(3/4), d = 34。假设n是奇数,那么递归式就是T(n) = T((n + 1)/2) + T((n - 1)/2) + Θ(n)。原创 2023-08-02 11:31:03 · 1178 阅读 · 1 评论 -
算法导论第四章思考题参考答案(7)
所有详细答案都在里面原创 2023-08-02 16:30:11 · 314 阅读 · 2 评论 -
算法导论第五章思考题参考答案(9)
b.对于ni的选择,我们知道在每次递增操作中,我们改变计数器值的概率是1/100。由于这是相对于计数器i的当前值的常数,因此我们可以将最终结果视为p值为0.01的二项分布。i.我将使用DETERMINISTIC-SEARCH,因为它有最好的预期运行时间,并保证在n步后终止,不像RANDOM-SEARCH。h.SCRAMBLE-SEARCH的工作原理与DETERMINISTIC-SEARCH相同,只不过我们在运行时间中增加了随机化输入数组所需的时间。,因为只有当它出现在包含x的k个指标之前,我们才检查它。原创 2023-08-05 20:52:31 · 132 阅读 · 1 评论 -
算法导论第五章练习参考答案(8) - 5.1 - 5.4
例如,如果我们得到的第一个数列是1,1,1,3,4,5,5,我们需要对这些1和5进行排序。然后23,14,23的相对顺序变成2,1,3,所以原始数组的新相对顺序是2,1,3,4,5,6,6。B[j] = A[i]的概率是dest = j的概率,即i + offset或i + offset - n等于j的概率,即1/n。在第二次(也是最后一次)迭代时,我们别无选择,只能将A[2]与A[3]交换,因此得到的数组是[3,1,2]。假设S是n−1的一致的m−1子集,亦即∀j∈[n−1],Pr[j∈S] =原创 2023-08-05 20:48:44 · 177 阅读 · 1 评论 -
算法导论第二章思考题参考答案(3)
第2行到第4行中的for循环维护以下循环不变量:在每次迭代开始时,A的最小元素的位置[i...n],在第一次迭代之前,这显然是正确的,因为任何元素的位置最多为A.length。由于A中最小的i - 1个元素已经在A[1...i-1],则A[i]一定是A的第i个最小元素,因此A[1...i]包含A中最小的i个元素,按顺序排序,保持循环不变性。第1行到第4行for循环的第i次迭代将导致第2行到第4行for循环的n - i次迭代,每次迭代的执行时间都是恒定的,所以最坏的运行时间是Θ(n^2)。原创 2023-07-13 13:22:58 · 158 阅读 · 1 评论 -
算法导论第二章练习参考答案(2) - 2.1-2.3
这是因为无论元素最初是如何排列的,在主for循环的第i次迭代时,算法总是检查剩余的n - i个元素中的每一个,以找到剩余的最小的元素。这意味着走k步的概率是p*(1−p)^k。最坏的情况显然是如果你要检查所有可能的位置,在这种情况下,它将花费正好A.length的步骤,所以它是Θ(A.length)现在,我们分析平均情况下的渐近行为。情形2∃k,(k, j)是考虑的并且k < i,在这种情况下,我们取最大的k,事实是非零的,这意味着在考虑它之后,我们立即考虑(k,j-1)这意味着Mk,j这意味着Mi,j。原创 2023-07-12 14:11:23 · 479 阅读 · 1 评论 -
算法导论第一章练习参考答案(1) - 1.1-1.2
算法导论的课后练习是很不错的练习,在网上找答案对照时,碰上很多给出略的答案,终于找到一份特别好的答案时,是来自。原创 2023-07-12 10:57:19 · 154 阅读 · 1 评论