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

xiaoxiao2021-02-28  33

前言

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

读书笔记

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

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

二. 如何在1MB左右的内存空间中对区间[0,10000000]内若干个整数组成的集合S里面的这些整数进行排序,而且排序时间需要在10s内。 S S 集合可能特别大。 书中提出了结合位向量,使用桶排序的方法来解决这个排序问题。 具体来说核心思想是酱紫的: 1MB=1024×1024×8bit800,0000bit1MB=1024×1024×8bit≈800,0000bit 如果我们用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 i 个分量为1,说明iSi∈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]
转载请注明原文地址: https://www.6miu.com/read-2614400.html

最新回复(0)