算法导论题解
二喵棒棒哒
算法 大数据 区块链 硕士在读
github:https://github.com/zslomo
展开
-
算法导论 练习 2.3-1
题目:说明合并排序在数组A={3,41,52,26,38,57,9,49} 上的运行过程解答:原数组:3,41,52,26,38,57,9,49 第一趟:3,41,26,52,38,57,9,49 1合2 第二趟:3,26,41,52,9,38,49,57 2合4 第三趟:3,9,26,38,41,49,52,57 4合8原创 2016-04-15 21:21:18 · 625 阅读 · 0 评论 -
算法导论 思考题 2-4
题目:求逆序对解答:a) 列出数组<2,3,8,6,1> 的五个逆序对<8,6 > <8,1 > <6,1 > <3,1 > <2,1 >b) 如果数组的元素取自集合{1,2,3,4,......,n}\{1,2,3,4,......,n\} 怎样的数组还有最多的逆序对,它包含多少个逆序对逆序序列 {n,n−1,n−2,n−3,......,1}\{ n,n-1,n-2,n-3,......,1\原创 2016-04-17 21:32:54 · 2619 阅读 · 0 评论 -
算法导论 思考题 2-3
题目:霍纳规则而的正确性解答:a)这一段实现霍纳规则的代码的渐进运行时间是什么:一个循环,显然是Θ(n)\Theta(n)b) 写出朴素多项式求值的伪代码,求这个算法的渐进运行时间,并且与霍纳规则进行比较1 y ← 02 x ← 03 while i < n4 do y ← a[i]*x+y5 x ← x*x6 i ← i+1渐进运行时间也是 Θ(n)\原创 2016-04-17 21:11:22 · 1041 阅读 · 0 评论 -
算法导论 思考题 2-2
题目:冒泡排序算法的正确性解答:a)还需要证明什么?不等式证明了,终止条件也证明了,缺啥? 证明子数组是原数组的一部分,也就是说,A′[i]A'[i] i=1∼n i=1\sim n 可以构成原数组b)对第2~4行的for循环给出一个准确的循环不变式,并证明该循环不变式是成立的b问题就是证明每一趟的排序, 这种证明真是。。。要亲命了,证明:循环不变式:每次迭代中,A[j]=min{A[k]:j原创 2016-04-16 20:44:04 · 1417 阅读 · 0 评论 -
算法导论 思考题 2-1
题目:在合并排序中,对小数组采用插入排序解答:a)证明在最坏情况下,n/kn/k个子列表(每个子列表长度为kk)可以用插入排序在Θ(nk)\Theta(nk)时间内完成:长度为k的表插入排序是 Θ(n2)\Theta(n^2) 那么 n/kn/k 个就是 Θ(n2)∗n/k=Θ(nk)\Theta(n^2)*n/k=\Theta(nk)b)证明这些子列表可以在Θ(nlg(n/k))\Theta(nl原创 2016-04-16 19:52:05 · 2494 阅读 · 0 评论 -
算法导论 练习 2.3-7
题目:请给出一个运行时间为 Θ(nlgn)\Theta(nlgn)的 算法,使之能在给定一个由n个整数构成的集合S和另一个整数x时,判断S中是否存在有两 个其和为x的元素。解答:其实这是一个蛮经典的算法题目,我的leetcode题解上有这个算法,想看代码可以看看我的这篇博客那么具体怎么实现呢?实际上这个问题有两个切入点:1、 Θ(nlgn)\Theta(nlgn),咦?好熟悉 2、给定和SS,那就原创 2016-04-15 22:31:38 · 1302 阅读 · 0 评论 -
算法导论 练习 2.3-5
题目:说明二分查找算法最坏情况下的时间复杂度为什么是 Θ(lgn)\Theta(lgn),并给出代码解答:二分查找每次舍弃一半,比较操作耗时是线性时间,所以很显然,递归式是 T(n)=T(n/2)+Θ(1)T(n)=T(n/2)+\Theta(1),为了方便计算,不妨把Θ(1)\Theta(1) 换成 CCT(n)=T(n/2)+C=T(n/4)+C+C=.....=T(1)+Clgn=Θ(lgn)原创 2016-04-15 22:15:30 · 439 阅读 · 0 评论 -
算法导论 练习 2.3-6
题目:是否可以用二分查找法把插入排序最坏条件下运行时间改善到 Θ(nlgn)\Theta(nlgn)?解答:显然是不可以的,数组排序中影响时间复杂度的因素有两个,一个是寻找位置时的比较,一个是找到位置后插入操作引起的元素移动,原来这两者的复杂度都是 Θ(n2)\Theta(n^2),即使用二分法把比较操作降低到了Θ(nlgn)\Theta(nlgn),插入依然没有变,最后的复杂度还是 Θ(n2)\T原创 2016-04-15 22:22:08 · 1494 阅读 · 0 评论 -
算法导论 练习 2.3-4
题目:插入排序可以如下改写成一个递归过程:为排序A[1...n]A[1...n],先递归地排序A[1...n−1]A[1...n-1],然后再将A[n]A[n]插入到已排序的数组中去。对于插入排序的这一递归版本,为他的运行时间写一个递归式解答:T(n)={Θ(1)T(n−1)+Θ(n)如果 n=1其他.T(n) = \begin{cases} \Theta(1) & \text{原创 2016-04-15 22:03:07 · 697 阅读 · 0 评论 -
算法导论 练习 2.3-3
题目: 数学归纳法证明:当nn是22的整数幂时,递归式 T(n)=⎧⎩⎨22T(n/2)+n if n=2 if n=2k,k>1T(n)=\begin{cases} 2& \text{ if } n=2 \\\\ 2T(n/2)+n& \text{ if } n=2^{k},k>1 \end{cases}的解为:T(n)=nlgnT(n)=nlgn证明:假设:T(n)=nlgn原创 2016-04-15 21:55:23 · 685 阅读 · 2 评论 -
算法导论 练习 2.3-2
题目:改写MERGE过程,不用哨兵,复制完停止,然后处理余下元素解答:我们写归并的时候,基本用的就是这样的写法,实际上没什么大区别 代码如下:(引用自skanev主页)#include <stdio.h>void merge(int A[], int p, int q, int r) { int i, j, k; int n1 = q - p + 1; int n2 = r原创 2016-04-15 21:25:55 · 1153 阅读 · 0 评论 -
算法导论题解索引
关于题解顺利被复旦大学拟录取之后,终于结束了漫长的考研生涯,开始静下心来学一些东西,算法导论之前看过一些,但是走马观花没有学到什么,主要问题就是没有好好的做后面的习题。 然而,当我想好好做做习题后才发现,作者声明为了培养学生的自主思考能力,不会发布任何题解,只有教师手册上有部分题解,而且网上发布的题解非常非常少并且不全,大多要翻墙去搜英文题解,非常不便。 所以,这里准备随着自己的学习,慢慢把自己原创 2016-04-15 20:05:32 · 992 阅读 · 2 评论