摘要:22.3-12 在一个有向图G=(V,E)中,如果u->v蕴含对所有定点u,v属于V,至多一条从u到v的简单路径,则称G是但连通的。给出一个有效算法来判定一个有向图是否是单连通的。 解:对图进行深度优先搜索,如果没有正向边(forward edge)或交叉边(cross edge),则是单连通的。 22-2 挂载点、桥及双连通分支 解: a)无向图的深度优先搜索树没有交叉边,当Gπ 的子女数多于1时,以每个子女为根的子树间不是连通的。此时,Gπ 的根是挂接点(必要性)。如Gπ 的根节点仅有一个子女,则删除该根节点后,其他节点任处于同一颗子树中,它们之间是连通的,所以此时Gπ 的节点不是挂 阅读全文
算法导论-B树习题解
2012-03-28 11:59 by meteorgan, 827 阅读, 0 推荐, 收藏, 编辑
摘要:18-1 辅存上的栈 解:a) 最坏情况下,假设是n次PUSH操作,共需2n次磁盘存取,Θ(2m*n)的CPU时间。 b) 每页有m个字,n次PUSH磁盘存取次数为n/m,CPU时间为Θ(n)。 c) 假设当前内存中页已满,第一次栈操作为PUSH,则需要换页,需要2次磁盘存取;接着进行两次POP,需要再次换页,需进行1次磁盘存取。接着进行2次PUSH,两次POP,……。 存取次数大致为n*(3/2),CPU时间为Θ(mn(3/2)). d) 使用磁盘中相邻两页放在内存中实现栈,这样当一页满或空时可以使用另外一页。最坏情况下连续m次PUSH或POP才需换一页... 阅读全文
qsort浅析
2012-03-10 19:13 by meteorgan, 418 阅读, 0 推荐, 收藏, 编辑
摘要:最近重读CLRS,除了完成各章后面的思考题外(练习题其实早就做了),打算把书中的各种算法实现一遍。 在写各种排序算法(heap_sort, quick_sort, merge_sort, insert_sort, counting_sort, radix_sort, bucket_sort, shell_sort)过程中,比较郁闷的一点我写的程序不够通用,我把数据类型都默认为int了(C++模板的好处在这时体现出来了)。而C语言库函数qsort是可以支持各种数据类型的。我想知道它是怎么实现的,花了大半天时间把相关代码翻了一遍,写写看法吧。 qsort定义在stdlib/stdlib.h文... 阅读全文
算法导论-快速排序习题解
2012-03-05 13:54 by meteorgan, 648 阅读, 0 推荐, 收藏, 编辑
摘要:7.2-6 证明:对于任何常数 0 < a <= 1/2,在一个随机输入数组上,过程PARITITION产生比 1-a:a更对称的划分的概率约为1-2a。 解:假设数组长度为n,在两个点可能产生1-a:a的划分:na, (1-a)a;产生比(1-a):a更差的划分的点是1..na, (1-a)n..n,占所有点个数的比率为2a,所以产生更对称划分的概率为1-2a。 7-4.6 考虑对PARTITION过程做这样的修改:从数组A中随机地选出三个元素,并围绕这三个数的中数(即这三个元素中间值)对它们进行划分。求出以a的函数形式的表示的,最坏情况中a:(1-a)划分的概率。 解:随机挑选 阅读全文
算法导论-线性时间排序习题解
2012-03-01 12:42 by meteorgan, 1302 阅读, 1 推荐, 收藏, 编辑
摘要:8.1-3 证明:对于长度为n的n!中输入中至少一半而言,不存在线性时间的比较排序算法。对于n!中的1/n部分而言又怎样呢?1/2n部分呢? 解:即在决策树模型中求1/2, 1/n, 1/2n部分的平均路径长度。分别为 \lg\frac{n!}{2}, \lg\frac{n!}{n}, \lg\frac{n!}{2^{n}}。渐近时间复杂度均为O(nlgn)。 8.3-4 说明如何在O(n)时间内,对0到n2-1之间的n个整数进行排序。 解: 这个问题技巧性较强。基数排序,以n为基数,数长度为2,每位有n个可能取值。时间复杂度O(n)。 8.3-5 在本节的第一个卡片排序算法中,为排序d... 阅读全文
算法导论-中位数和顺序统计学习题解
2012-02-28 20:33 by meteorgan, 886 阅读, 1 推荐, 收藏, 编辑
摘要:9.1-1 证明:在最坏情况下,利用 n + \lceil n\rceil -2 次比较,即可找到n个元素中的第2小元素。 解:n 个元素两两比较,取较小值再两两比较,继续这个过程,可用 n - 1 次比较找到最小值。此时,第2小值一定出现在与最小值比较过的元素组成的集合中,这个集合的大小为\lceil n \rceil,还需要\lceil n\rceil 次比较即可找到第2小值。 9.3-6 对于一个含k个元素的集合来说,所谓k分位数就是能把已排序的结合分为k个大小相等的集合的k-1个顺序统计量。给出一个能列出某一集合的k分位数的O(nlgk)时间的算法。解:1. 寻找第 \lfloor.. 阅读全文
算法导论-二叉查找树习题解
2012-02-16 13:19 by meteorgan, 745 阅读, 0 推荐, 收藏, 编辑
摘要:12.2-9 设T为一棵其关键字均不相同的二叉查找树,并设x为一个叶子节点,y是其父节点。证明:key[y]或者是T中大于key[x]的最小关键字,或者是T中小于key[x]的最大关键字。 若x是y的左节点,y是x的后继,此时key[y]是大于key[x]的最小关键字;若x是y的右节点,y是x的前驱,此时key[y]是小于key[x]的最大关键字。12.4-2 请描述这样的一棵二叉查找树:其中每个节点的平均深度为Θ(lgn),但树的深度是ω(lgn)。对于一棵含n个节点的二叉查找数,如果其中每个节点的平均深度为Θ(lgn),给出其高度的一个渐进上界。 方法来自stackoverflow的这.. 阅读全文
算法导论-堆排序习题解
2012-02-10 14:26 by meteorgan, 450 阅读, 0 推荐, 收藏, 编辑
摘要:6.1-7 证明:当数组表示存储了n个元素的堆时,叶子节点的下标是n/2+1, n/2+1, ……,n 解:最后一个叶子节点n,其父节点是n/2,在n/2后所有节点都是叶子节点,否则其子节点必大于n。6.5-8 请给出一个时间为O(nlgk)、用来将k个已排序链表合并为一个排序链表的算法。此处n为所有输入链表中元素的个数。(提示:用一个最小堆来作k路合并) 解:1. 建立一个k个元素的最小堆,堆中每个元素为一个链表,元素的key为链表中第一个元素的key。 2. 不断删除根节点元素,加入到新链表,然后用根节点所指的链表中的第二个元素代替第一个元素,执行min_heapify操作。... 阅读全文
为什么二进制数能表示所有整数
2011-11-03 18:28 by meteorgan, 1988 阅读, 0 推荐, 收藏, 编辑
摘要:1. 一个显而易见的问题: 为什么二进制数(仅考虑无符号数)与正整数一一对应? 二进制和整数间的相互转换算法说明每个二进制串对应一个整数,同样每个整数都对应一个二进制串。但不能说明不同二进制串对应不同整数,即,任两个不同的二进制串是不等的。这个问题有一个很简单的证明方法: 假设有两个二进制串a1,a2,它们的最高位分别为k1,k2(最高位不为0)。如果这两个二进制串相等则它们的最高位相等(k1=k2)。 反证:假设 k1> k2, 则有: 同理得k1不能小于k2于是有k1 = k2。由同样的方法可知它们的次高位有相等,以此类推得:a1,a2每一位都相等。所以有如... 阅读全文