![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
swordmanwk
这个作者很懒,什么都没留下…
展开
-
冒泡排序算法分析——《算法导论》学习笔记
BUBBLESORT(A)1 fori ← 1 tolength[A]2 do forj ← length[A] downtoi + 13 do ifA[j] 4 then exchange A[j] ↔A[j - 1] 1 使用循环不变式证明算法的正确性:初始化:首先,先证明对于第一轮迭代开始之前,循环不变式是成立的。此时i=1,而子数组为A[1..i]。亦即,它只包含一个元素A[1],实际上就是最初A[1]中的那个元素。这个原创 2011-01-19 17:05:00 · 3262 阅读 · 1 评论 -
证明:如果作用于一动态表上的第i个操作是TABLE-DELETE,且αi-1 ≥ 1/2,则以势函数(17.6)表示的每个操作的平摊代价由一个常数从上方限界
<br />这是《算法导论》(原书第二版)中第17章的一个习题(17.4-2)。<br />分成三种情况讨论:<br />1)αi≥ 1/2<br />这时表并没有进行扩张或收缩,只是表中的项数少了1<br />平摊代价<br /><br />^Ci<br />=<br />ci+Φi-Φi-1<br /> <br />=<br />1 + (2 ·numi - sizei) - (2 ·numi-1 - sizei-1)<br />= 1-2 =-1<br />2) 1/4<=αi < 1/2<br /原创 2011-05-30 20:18:00 · 2704 阅读 · 2 评论 -
合并两个二项堆的伪代码
BINOMIAL-LINK(y, z)子过程用于将以结点y为根的Bk-1树与以结点z为根的Bk-1树连接起来,亦即,它使得z成为y的父结点,并且成为一颗Bk树的根。BINOMIAL-LINK(y, z)子过程的伪代码如下:BINOMIAL-LINK(y, z)1 p[y] ←z2 sibling[y] ←child[z]3 child[z] ←y4 degree[z] ←degree[z] + 1 BINOMIAL-HEAP-MERGE(H1, H2)子过程,用于将H1和H2的根表合并成一个按度数的原创 2011-05-27 22:11:00 · 2723 阅读 · 0 评论 -
用循环不变式证明BINOMIAL-HEAP-UNION(H1, H2)的正确性
初始化:x指向Head[H],Head[H]是对两个二项堆的根表合并后的数据结构的第一个结点(合并时根表的度数是按照单调递增排列的),并且Head[H]不为NIL,next-x指向x的兄弟结点。x指向的结点左侧(包括结点本身)所构成的数据结构是二项堆,因为此时该堆只有Head[H]一个根结点。保持:需要分成四种情况讨论。首先,循环的目的是要把x沿着根表向链表的尾端推进,并且在循环过程中保持x结点左边的数据结构(包括x结点,以及以x结点为根的二项树)是二项堆。情况1):degree[x] ≠ degree[n原创 2011-05-28 21:56:00 · 954 阅读 · 0 评论 -
B树的定义
A B-tree T is a rooted tree (whose root is root[T]) having the following properties:1. Every node x has the following fields:a. n[x], the number of keys currently stored in node x,b. the n转载 2011-06-15 20:09:00 · 985 阅读 · 0 评论 -
向B树插入关键字
B树的创建:B-TREE-CREATE(T)1 x ← ALLOCATE-NODE()2 leaf[x] ← TRUE3 n[x] ← 04 DISK-WRITE(x)5 root[T] ← x B树中节点的分裂:B-TREE-SPLIT-CHILD(x, i, y) 1 z ← ALLOCATE-NODE() 2 leaf[z] ← le转载 2011-06-15 20:22:00 · 2100 阅读 · 1 评论 -
从B树中删除关键字
《算法导论》练习18.3-2: 请写出B-TREE-DELETE的伪代码。 与插入情况相对称,除了根结点外(根结点个数不能少于1),B树的关键字数不能少于t-1个。对于简单删除情况,如果我们定位到关键字处在某个结点中,如果这个结点中关键字个数恰好是t-1个,如果直接删除这个关键字,就会违反B树规则。此时,需要考虑两种处理方案:1)把这个结点与其相邻结点合并,合并时需要把父结点的一个原创 2011-06-16 21:35:00 · 15177 阅读 · 13 评论 -
试找出被9,8,7除时,余数分别为1,2,3的所有整数x。
《算法导论》练习31.5-2x ≡ 1 (mod 9)x ≡ 2 (mod 8)x ≡ 3 (mod 7) 根据中国余数定理,n=504a1 = 1, n1 = 9,m1 = 56,56-1 ≡ 5 (mod 9)a2 = 2, n2 = 8,m2 = 63,63-1 ≡ 7 (mod 8)a3 = 3, n3 = 7,m2 = 72,72-1 ≡ 4 (mod原创 2011-06-20 19:12:00 · 2588 阅读 · 0 评论 -
《算法导论》练习28.1-5
Prove that if P is an n × n permutation matrix and A is an n × n matrix, then P A can be obtained from A by permuting its rows, and AP can be obtained from A by permuting its columns. Prove that the p原创 2011-06-23 21:45:00 · 1075 阅读 · 0 评论 -
计算出使方程x ≡ 4 (mod 5)和x ≡ 5 (mod 11)同时成立的所有解
《算法导论》练习31.5-1根据中国余数定理,n= 55a1 = 4, n1 = 5,m1=11,11-1 ≡ 1 (mod 5)a2 = 5, n2 = 11,m2 = 5, 5-1 ≡ 9 (mod 11)c1 = 11(1 mod 5) = 11c2 = 5(9 mod 11) = 45 a ≡ 4 · 11 + 5 ·原创 2011-06-20 19:09:00 · 2180 阅读 · 0 评论 -
试画出一张表以说明Z*11中每个元素的阶。找出最小的原根g并计算出一张表,要求写出对所有x属于Z*11,相应的ind11,g(x)的值。
《算法导论》练习31.6-1 ord11(1) = 1ord11(2) = 10ord11(3) = 5ord11(4) = 5ord11(5) = 5ord11(6) = 10ord11(7) = 10ord11(8) = 10ord11(9) = 5ord11(10) = 2 因此最小原根是g=2 ind11,2(1) = 0in原创 2011-06-21 20:00:00 · 1171 阅读 · 0 评论 -
二项树和二项堆(Binomial Heaps)
<br />二项树Bk是一种递归定义的有序树。二项树B0只包含一个结点。二项树Bk由两个子树Bk-1连接而成:其中一棵树的根是另一棵树的根的最左孩子。<br /><br />二项树Bk具有以下性质:<br />1)共有2的k次方个结点;<br />2)树的高度为k;<br />3)在深度i处恰有(上k,下i)(因此叫二项树)个结点,其中i=0,...,k;<br />4)根的度数为k,它大于任何其他结点的度数,并且,如果对根的子女从左到右编号为k-1,k-2,...,0,子女i是子树Bi的根。<br />证转载 2011-05-27 22:08:00 · 5716 阅读 · 0 评论 -
红黑树的删除
以下是红黑树删除的伪代码: RB-DELETE(T, z) 1 ifleft[z] = nil[T] or right[z] = nil[T] 2 theny←z 3 elsey← TREE-SUCCESSOR(z) 4 ifleft[y] ≠nil[T] 5 thenx←left[y] 6 elsex←right[y] 7 p[x] ←p[y] 8 ifp[y] = nil[T] 9 thenroot[T] ←x10 else ify = left[p[y]]11原创 2011-05-17 21:29:00 · 561 阅读 · 0 评论 -
生日悖论问题——《算法导论学习笔记》
1 生日悖论问题1.1 原始问题一个房间里的人数必须达到多少,才能使两个人生日相同的机会达到50%?不考虑闰年情况,也就是一年按照365天来计算。解答:假设房间里的人数是k,我们对其进行编号:1, 2, … , k。为简单起见,用n表示一年的天数(也就是365天),那么一个人的生日在一年中的哪一天应该是机会均等的,我们用bi表示第i个人的生日,1这个问题可以通过求补法来求解:也就是先计算任意两个人的生日都不相同的概率,然后用1去减,就可以算得相应概率。K个人各有互不相同生日的事件为Bk =原创 2011-01-21 21:50:00 · 7832 阅读 · 2 评论 -
堆排序算法分析——《算法导论》学习笔记
1 堆排序算法分析MAX-HEAPIFY(A, i) 1 l← LEFT(i) 2 r← RIGHT(i) 3 ifl≤heap-size[A] and A[l] >A[i] 4 thenlargest←l 5 elselargest←i 6 ifr≤heap-size[A] and A[r] >A[largest] 7 thenlargest←r 8 iflargest≠i 9 then exchange A[i] ↔A[largest]10 MAX-HE原创 2011-01-21 22:01:00 · 870 阅读 · 0 评论 -
用循环不变式证明RB-DELETE-FIXUP的正确性
初始化:在循环的第一次迭代之前,我们从一颗正常的红黑树开始,并删除了一个黑色结点y。这样在调用RB-DELETE-FIXUP之前,有:a)性质1)和性质3)成立。b)所有经过x结点路径的黑高度是相等的,并且会比所有不经过x的路径的黑高度少1(除非所有路径都经过x)。可能违反3个性质:l 如果y是根结点,而y的唯一的一个红色孩子成为新的根(可以证明,y最多只有一个不是nil[T]的孩子),则性质2)被违反;l 如果x和p[y]都是红色,那么性质4)被违反;l 删除y会直接导致性质5)被违反,所有经过x的原创 2011-05-18 19:16:00 · 1007 阅读 · 0 评论 -
红黑树的性质
如果一颗二叉查找树满足下面的红黑性质,则称为一颗红黑树:1)每个结点或是红的,或是黑的。2)根结点是黑的。3)每个叶结点(NIL)是黑的。4)如果一个结点是红的,则它的两个儿子都是黑的。5)对每个结点,从该结点到其子孙结点的所有路径上包含相同数目的黑结点。转载 2011-05-16 22:13:00 · 805 阅读 · 0 评论 -
在RB-INSERT的第16行中,假设新插入的结点z是红色的。注意如果将z着为黑色,则在红黑树的性质4)就不会被破坏。那么我们为什么没有选择将z着为黑色呢?
<br />如果把z着为黑色,那么性质5)一定被破坏。<br />如果把z着为红色,那么性质2)(如果根是红结点,则原来一定是空树)和性质4)(如果z的父结点是红节点)有可能会被破坏。<br />我估计修正违反性质5)所带来的复杂度要大于修正违反性质2)和性质4)。所以没有选择将z着为黑结点。原创 2011-05-16 22:19:00 · 905 阅读 · 0 评论 -
证明:在RB-DELETE中,如果y是红色的,则当y被删除后,红黑性质得以保持
<br />在RB-DELETE中,当y是黑色时,会调用RB-DELETE-FIXUP函数对红黑树的颜色进行调整,这意味着,如果y是红色的,就不需要进行调整,下面来证明这个命题的正确性。<br /> <br />首先,红黑树的性质1)和3)显然满足,对于性质2)、4)和5)分为3种情况来讨论。<br /> <br />对于情况1),删除的结点z的子结点只有黑色哨兵结点,这种情况下,y=z,删除y不会对红黑树的黑高度造成影响,y是红色,也不可能是根,也不可能造成出现两个红色结点相邻,因此,性质2)、4)和5)原创 2011-05-17 21:32:00 · 956 阅读 · 0 评论 -
写出RIGHT-ROTATE的伪代码
RIGHT-ROTATE(T, x) 1 y←left[x] ▹ Set y. 2 left[x] ←right[y] ▹ Turn y's right subtree into x's left subtree. 3 p[right[y]] ←x 4 p[y] ←p[x] ▹ Link x's parent to y. 5 ifp[x] = nil[T] 6 thenroot[T] ←y 7 else ifx = righ原创 2011-05-16 22:01:00 · 1889 阅读 · 0 评论 -
证明:在一棵有n个结点的二叉查找树中,刚好有n-1种可能的旋转
<br />用数学归纳法证明:<br />首先对n=1时,对于二叉查找树,只有一个结点,也就是根结点,这时无法旋转,因此有0(n-1)种可能的旋转,命题成立。<br />假设对于n=k(k>1)时,对于二叉查找树,有k-1种可能的旋转。<br />那么对于n=k+1时,也就是我们在原来的二叉查找树中添加了一个结点,这个结点最终一定是二叉查找树的一个叶结点,其父结点一定存在(k>1),这个叶结点可能是其父结点的左子结点,也可能是其父结点的右子结点。如果是左子结点,那么相对于原二叉查找树,增加了一个右旋操作;如原创 2011-05-16 22:02:00 · 2292 阅读 · 1 评论 -
红黑树的插入
<br />以下是红黑树插入的伪代码:<br /> RB-INSERT(T, z) 1 y←nil[T] 2 x←root[T] 3 whilex≠nil[T] 4 doy←x 5 ifkey[z] <key[x] 6 thenx←left[x] 7 elsex←right[x] 8 p[z] ←y 9 ify = nil[T]10 thenroot[T] ←z11 else ifkey[z] <key[y]12原创 2011-05-16 22:14:00 · 563 阅读 · 0 评论 -
用循环不变式证明RB-INSERT-FIXUP的正确性
初始化:在循环的第一次迭代之前,我们从一颗正常的红黑树开始,并新增了一个红色结点z。这样在调用RB-INSERT-FIXUP之前,有:a)z是红色结点。b)如果p[z]是根,则p[z]是黑色。c)红黑树的性质1)、3)和5)都成立。但性质2)和4)有可能被违反,但不会同时被违反。如果性质2)被违反,说明红色的根结点必然是新增的结点z,它是树中唯一的内结点。由于z的父结点和两个子结点都是黑色的哨兵(nil[T]),没有违反性质4)。所以,这种情况下,只违反性质2)如果性质4)被违反,则由于z的子女是黑色的哨兵原创 2011-05-17 21:28:00 · 1229 阅读 · 0 评论 -
0-1背包问题
《算法导论》练习16.2-20-1背包问题不能用贪心算法求解,需要使用动态规划方法。假设窃贼可以偷的物品是Item[i](i=1...n),n为物品件数,窃贼背包可以放入的最大重量为W。我们需要构造一个递归子过程,获取小于W的价值最多的物品。首先选取Item[1],那么问题可以分成两部分,一部分是包括Item[1]的最优选择,一部分是不包括Item[1]的最优选择,然后比较这两原创 2012-02-26 18:22:39 · 705 阅读 · 0 评论