前言
今天来读读《编程珠玑》,预计未来若干个月会有一系列博客记录《编程珠玑》的读书笔记。
读书笔记
第一章是本书的开篇,主要讲述了如何解决这么两个问题:
一. 如何对实际问题进行抽象,找出问题的独特性质。
很多低级的程序员,一上来就使用普适性的方法来解决问题,而不去认真学习实际问题的性质。具体来说,实际问题的特性包括:输入数据的特征,内存的特征,运行时间的限制,问题本身的特征。
根据输入的具体特性,可以采用相应的高效的数据结构来表示输入数据。
而根据内存和运行时的限制,可以采用时间换空间或者空间换时间的策略。
二. 如何在1MB左右的内存空间中对区间[0,10000000]内若干个整数组成的集合S里面的这些整数进行排序,而且排序时间需要在10s内。
集合可能特别大。
书中提出了结合位向量,使用桶排序的方法来解决这个排序问题。
具体来说核心思想是酱紫的:
如果我们用1MB内存的这800万个位长度的位向量来记录集合S中出现了那些元素,那我们就可以使用桶排序的方法对S内的所有元素进行排序。
举个例子:
若S={10,2,4,6,7,9,0},然后我们用一个长度为16个bit(也就是2个字节)的位向量l 来描述S:
l={1,0,1,0,1,0,1,1,0,1,1,0,0,0,0,0,0}
其中第0,2,4,6,7,9,10个分量为1,表示0,2,4,6,7,9,10 出现过哇。l的第
个分量为1,说明
然后我们使用桶排序的方法,遍历这个向量l,把那些分量为1对应的数字输出。
算法如下:
阶段1:初始化
将位向量设为0
l=0
阶段2:使用位向量来记录S出现了那些元素
for i in S :
l[i]=1
阶段3:遍历位向量,根据位向量输出排序结果。
for i in [0,len(l)):
if l[i]==1:
print l[i]