第一章 开篇:
本章主要解决的问题是“在内存不足的情况下,如何对数据进行排序”,提出了两种解决方法:归并排序和位图排序。
归并排序: 思想是每次将两个有序表合成一个长的有序表,程序一般用递归来实现,时间复杂度是O(nlogn),需要O(n)的空间复杂度,稳定。
位图排序: 使用条件有两点,一是数据不重复,二是知道数据范围,时间复杂度是O(n),以1000万数据为例,消耗的空间大小为10^7/8约等于1.25MB。C++中提供了bitsae这种数据结构实现位图,清空操作用reset(),设置1操作用set(num,1)。C语言实现位图可以使用位操作,左移=除,与=取余。
海量数据的处理一直是面试的重点关注问题,july的博客中有详细系统介绍海量数据面试题的方法,有兴趣者可以前往观阅,网址为:http://blog.csdn.net/v_july_v/article/details/6279498
第二章 啊哈!算法
本章主要提出了三个问题,并找到解决方法。
A、一个最多包含40亿个随机排列的32位整数中找到一个不存在的整数。解决方法是二分搜索。(注意这32位整数是二进制表示方法,当初看到这里时纠结了很久)。n=40亿,根据第1bit为0或1分别存储在不同的文件中,通过数量判断二分查找的范围,运行时间为O(nlogn)。
B、n元一维向量左旋i个位置,只用数十个额外字节空间,正比于n的时间内完成。解决方法是倒转和转置。书中介绍了五种方法,其中方法四和方法五可以用代码值得进一步介绍。 方法四: 方法五:
C、找出英文字典中所有变位词集合。解决方法是排序。首先标识字典中的每一个单词,然后选择具有相同标识的单词,可以使用基于排序的标识。
2.8边栏一节介绍了变位词程序的代码实现。
第三章 数据决定程序结构
本章主要介绍了一种最简单的数据结构——数组。以及在日期函数、单词分析中的使用。我就不详细介绍了。POJ程序设计方法学中字符串那章的题目都很好。
其中提到了“格式信函发生器”,在Java与数据库的链接语句中使用过。
闰年的判断:(a%4==0 && a%100!=0)|| a%400==0 是闰年,否则不是。
第四章 编写正确的程序
本章是在第三章介绍的二分搜索的基础上,对二分搜索的改进算法,传统上二分搜索的时间复杂度为O(logn),在介绍的过程中个,顺便介绍了断言(assertion)=不变式(invariant)。传统代码如下:
- l = 0 ; u = n-1 ; p = -1;
- while ( l <= u)
- {
- m = ( l + u ) / 2
- if ( x[m] == t ) { p = m ; break ; }
- else if ( x[m] < t )
- l = m + 1 ;
- else u = m - 1 ;
- }
- if ( p==-1 ) 未找到;else 找到;
在9.2节中,提出了一种更优化的改进方法,使用下限值l 以及增量 i 来表示 l+i=u,其中i保持为2的幂。代码如下:
- l = -1 ; i = n/2 ;
- if ( x[i-1] < t )
- l = n - i ;
- while ( i != 1 )
- {
- i /= 2;
- if ( x[l+i] < t ) l += i ;
- }
- p = l + 1 ;
- if ( p > n || x[p] != t ) p = -1;
第五章 编程小事
本章主要介绍了测试的工作。 assert的用法:证明某个逻辑是真的。 计时函数语句: 可以使用clock()库函数.
作者在前言里说“阅读本书的一个提示:不要读的太快。要仔细阅读,一次读一章。要尝试解答书中提出的问题”,确实本书讲的都是精华,我也只做到了每次读一章,因为现阶段主要是想面对找实习的笔试面试,无暇顾及其他,书中提到的一些很原始的理论知识,都没有深入去了解,代码也没有具体实现,这样很不好。这就是速食主义的阅读。