编程珠玑第一章、第二章

利用位图排序

问题:一个最多包含n个正整数的文件,每个数都小于n,n = 1000 0000。文件中的正整数没有重复的,请按升序排列这些整数。可用内存空间只有1MB左右,运行时间在10秒左右。

      解决方法:使用一个具有1000万个位的为序列表示这个文件中的所有整数。当且仅当整数 i 在文件中时,第 i 位为1。用C++具体实现的话,可用使用位域bitset来实现。bitset<10000000> my_bitset;

 

找出一个不在文件中的数

问题:给定一个最多包含40亿个随机排列的32位整数的顺序文件,找出一个不在文件中的32bit表示的整数。

    解决方法:因为32bit可用表示的最大无符号整数为小43亿,所以一定存在至少一个这样的整数。具体解决方法为,利用二分查找的思想,通过统计中间点之上和之下的元素个数来探测范围:或者上面或者下面的范围具有至多全部范围的一半元素。

 

向量abcdefgh向左旋转3个位置

问题:将向量abcdefgh向左旋转 i=3 个位置。

      解决方法:翻转算法。

   1: reverse(0, i-1);    /* cbadefgh */
   2: reverse(i, n-1);    /* cbahgfed */
   3: reverse(0, n-1);    /* defghabc */

      此方法可用通过翻转左右手来进行演示和理解,十个手指分别代表十个数1~10。

 

找出变位词

问题:找出字典中的变位词,如stop和tops。

      解决办法: 分为3步。第一步,给每个单词增加一个标识,标识由该单词的字母排序后组成,这样,变位词就具有了相同的标识符。第二步,按照标识符对单词进行排序。第三步,输出。如果用C语言实现的话,需要用到一个qsort 函数,类似于C++ STL中的排序算法。

posted on 2010-05-05 17:15  ︶ㄣ第二名  阅读(540)  评论(0编辑  收藏  举报