《编程珠玑》——读书笔记1

前言

今天来读读《编程珠玑》,预计未来若干个月会有一系列博客记录《编程珠玑》的读书笔记。

读书笔记

第一章是本书的开篇,主要讲述了如何解决这么两个问题:

一. 如何对实际问题进行抽象,找出问题的独特性质。
很多低级的程序员,一上来就使用普适性的方法来解决问题,而不去认真学习实际问题的性质。具体来说,实际问题的特性包括:输入数据的特征,内存的特征,运行时间的限制,问题本身的特征。
根据输入的具体特性,可以采用相应的高效的数据结构来表示输入数据。
而根据内存和运行时的限制,可以采用时间换空间或者空间换时间的策略。

二. 如何在1MB左右的内存空间中对区间[0,10000000]内若干个整数组成的集合S里面的这些整数进行排序,而且排序时间需要在10s内。 S 集合可能特别大。
书中提出了结合位向量,使用桶排序的方法来解决这个排序问题。
具体来说核心思想是酱紫的:
1 M B = 1024 × 1024 × 8 b i t 800 , 0000 b i t
如果我们用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的第 i 个分量为1,说明 i S
然后我们使用桶排序的方法,遍历这个向量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]

猜你喜欢

转载自blog.csdn.net/jmh1996/article/details/79332719