Author: bakari   Date: 2015.9.11

《算法导论》真是一本让人又爱又恨的书,爱自然是因为它精简凝练的算法呈现,读来让人欲罢不能;至于恨,是因为它在进行算法分析的时候所体现的数学思想太过于强大, 对于我这种数学不上不下的人来说,自然有几分畏难,以致于我很早就接触这本书,前前后后也粗略地看过几遍,但感觉每一遍都像是重新看一样,没有掌握其本质,本来一直都有着一个目标就是看一章,记一章读书笔记,但是本身固有的完美主义又强迫我说没看懂就不要轻易下笔,所以时至今日,我仍然没有付诸行动。现在由于面临找工作技术菜的窘境,拿到这本书的最新版第三版的时候,感觉又像是重新读一样,一些常见常用的算法,我仍然不能快速而准确的写出代码。这样的实践能力让我的危机感一下子到了极点,我甚至都怀疑自己是不是读书越高,能力反而退化得越快。所以,遵照那句老话:只要你想开始,任何时候都不算太晚。所以,又再一次拾起这本书,我也不给自己太多期望说读一章写一章读书笔记,我只希望能为我明年找工作留下一点努力的痕迹,不让自己觉得有努力的机会而没有努力而觉得遗憾。

第一章balabala,写一堆算法的定义和特点,这里不在过多记录,我也提炼不出什么有技术含量的东西,不过末尾有一句话值得记录一下:是否具有算法知识与技术的坚实基础是区分真正熟练的程序员与初学者的一个特征。这句话其实对于行内人来说,是一句废话,谁不知道呢。之所以记录它,是因为在这一章中,也就这一句话以其精炼的句子结构浓缩了精华,更把一个读者不甘做小白的心理刻画得淋漓尽致,巴不得今天通宵也要把这本书啃完。

关于算法,我认为掌握它最主要的是需要掌握两个方面:设计和分析,这也是算法的核心之处。这本书好就好在它是从算法的核心来展开算法章节的写作。所以,本书刚开始的几章都是着眼于分析算法的本质:算法的执行效率,也就是算法的时间复杂度。第二章的主要内容点就在于通过一些简单的例子入手,步步递进分析算法的复杂度,同时这些例子又是比较有代表性:比如重点讲到的基本排序算法,插入排序和合并排序,还有在习题部分讲到的线性查找和二分查找。通过第二章对分析算法复杂度有初步印象之后,第三章趁热打铁引出相关描述算法复杂度的符号,如此便对如何表示一个算法的复杂度,以及如何分析算法的复杂度有了比较深入完整的认识。而这些也正是很多公司喜欢刁难你的地方。

对于一个读者,我所能做的也就是记录下自己编程实践的结果,希望能通过动动手指头加深一下印象,也不至于留下一种“我来过这个世界,而这个世界没有留下我的痕迹”的失落感。我一直在想怎么来组织笔记的结构,也看了一些网友的博客,大致可以有三种方案:是看了书之后提炼自己的想法,还是照着书把重点的东西摘抄一边,亦或是把课后书本里的编程题还有课后习题自己动手实践一遍后在搬上来,第二种方法很明显自己是学不到东西的,pass,其余两个一起拥有是最好的,前面也说过,我有一点完美主义的倾向,所以,我自然选择两者都能兼具,不管花多少时间,我都愿意。所以,如你见到的,洋洋洒洒写了上面这一堆文字,但我也不能保证自己能完整的呈现,因为这还有很多外界因素的干扰,时间是最大的一个,我只能说,我一定会尽力的,不管是一天一篇,还是一个星期一篇,或更久,总之,我会写一个专题。

下面记录几个基础算法的实现,很早之前我也写过相关的文章,在此就不多说,直接贴代码吧。

1、插入排序:关于插入排序,我之前写过一篇文章,引申了三种插入排序的形式,详见:http://www.cnblogs.com/bakari/archive/2012/08/11/2633636.html

除此之外,还有一种插入排序的形式,即递归式(其实基本的排序算法,选择,冒泡等都有递归的排序版本),分析递归的排序算法,主要是融会贯通其算法复杂度的分析方法(貌似递归算法最容易分析算法复杂度的,因为有递归式),如下:

 

2、插入排序:非递归版本:

 1 //insertion sort: non-recursive
 2 //from big to small, only just arr[i] > key
 3 void InsertionSort(int arr[], int len)
 4 {
 5     if (arr == NULL || len == 0)
 6         return;
 7 
 8     for (int j = 1; j < len; j ++) {
 9         int key = arr[j];
10         int i = j - 1;
11         while(i >= 0 && arr[i] < key) {
12             arr[i+1] = arr[i];
13             i --;
14         }
15         arr[i+1] = key;
16     }
17 }
View Code

相关文章: