算法导论课后习题
Baggiobx
这个作者很懒,什么都没留下…
展开
-
目录说明
本目录下的题目都是从《Introduction to Algorithms (third edition)》各章节的Execises和Problems中,选取的一些我觉得比较有意思的和有启发性的。我将它们证明出来或者用程序实现,将思路和结果放在这里,以供日后复习和大家参考!原创 2013-09-01 00:01:43 · 394 阅读 · 0 评论 -
Chapter1,Problems 1-1
>第三版,Chapter1,Problems 1-1,即对输入为n的一个算法,假设其需要运行f(n)毫秒才能得出结果,那么对下表中不同的时间t,算出能在此时间能完成运行所对应的最大的n。一般的算法题都是对相同的输入大小n,计算不同的运行时间。此题正好反过来,限定时间,看在这个时间内,不同的算法能够求解的最大的输入大小。为了有一个直观的认识,我计算了一下,得出了下面的结果原创 2013-08-30 00:01:08 · 621 阅读 · 0 评论 -
Chapter 2, Problem 2-4
这里先给出了一个定义:数组中的两个元素,如果排在前面的元素(iA[j])排在后面的元素,那么这对元素(i,j)就被定义为A的一个Inversion。 a.(2,1)(3,1)(8,6)(8,1)(6,1)b.很明显,一个从大到小排列的数组含有最多的inversion,即,其个数为n-1+n-2+n- 3+……+1=n(n-1)/2 c.插入排序的运行时间是与数组中inversi原创 2013-09-04 22:27:51 · 551 阅读 · 0 评论 -
Chapter 2, Exercise 2.3-7
即给定一个大小为n,元素为整数的数组S,以及另外一个整数x,用一个算法来确定:是否可以在S中找到两个整数,使得它们的和是x。要求该算法的时间复杂度为nlgn。 比较容易想到的方法是:先求出S中任意两个整数相加所得到的和的集合Sum,然后从Sum中搜索x,如果能找到,那么就可以确定S中有两个整数的和是x。 但是这种方法的时间复杂度是n2。因为求出S中任意两个整数的和需要n2的时间(假原创 2013-09-04 18:45:13 · 516 阅读 · 0 评论 -
Chapter 3, Exercise 3.2.4
原创 2013-09-15 19:26:53 · 400 阅读 · 0 评论 -
Chapter 3, Exercise 3.2.3
原创 2013-09-15 19:23:11 · 577 阅读 · 0 评论 -
对归并排序的优化和思考
算法导论的课后习题中有这样一道题目(Problems 2-1):即当n的个数较小时,插入排序的速度是要优于归并排序的。原因是:插入排序的时间复杂度是n的平方,即C1n^2;而归并排序的时间复杂度是nlgn,即C2nlgn;当n较小时,由于C1和C2关系,使得插入排序的速度可以比归并排序的速度快。正是利用了这个性质,可以对归并排序的算法进行一下优化。方法一就是题中所说的,将大小为n的数组原创 2013-09-22 22:15:22 · 715 阅读 · 0 评论 -
不同情景下的快速排序的优化
最近一直在做排序算法的题目,插入排序,归并排序,堆排序,快速排序。不得不说,快速排序真的很快,特别是当输入数据的个数n很大时(我都是以1亿个数据做实验,并且数据的值是随机的,相同的数据很少)。虽然快速排序,归并排序和堆排序的时间复杂度都是nlgn,但可能是因为常系数的原因,快速排序是这三种算法中最快的。即便如此,快速排序也是有优化的空间的。针对不同的情景,有不同的优化方法。情景1:大数原创 2013-09-23 23:49:56 · 668 阅读 · 0 评论 -
Young tableaus 的一种实现方法
附上一种实现方法的源码:#include #include #include using namespace std;class young_tableaus{ #define DEFAULT_VALUE -1public: young_tableaus(int m, int n):_m(m),_n(n),_i(-1),_j(n-1),_count(0),原创 2013-10-21 21:36:01 · 709 阅读 · 0 评论