《编程珠玑》第一章笔记

记录第一章的阅读感受,把自己所能够理解或认为重要的东西,记录下来。一方面督促自己更好地去理解,另一个方面也作为笔记使用,以便以后有依可循。

-------------------------------------------------------------------------------------------------------

第1章 开篇
1.1 一次友好的对话
1.2 准确的问题描述
1.3 程序设计
1.4 实现概要
1.5 原理
1.6 习题
1.7 深入阅读

-------------------------------------------------------------------------------------------------------

第1章 开篇

【友好的对话】

问题:我如何对磁盘文件进行排序?

我需要在怎么样解决问题和进一步学习之间得到一种衡量和妥协。我对怎么样解决问题充满着热情远远高于进一步学习,而这样的结果最终是无法解决问题。我觉得程序猿能够面对问题,并且通过进一步学习而知道怎么样解决问题,是一种无比骄傲的事情。

对答:为什么喜欢编写自己的排序程序,而不使用系统的排序程序呢?

回答:在大型系统中进行排序,技术也不明朗,不能使用系统的排序算法。

对答:排序的内容是什么?文件中有多少记录?每一个记录的格式是什么?

回答:10,000,000个记录,每一个记录是一个7位整数。若文件小,确实不需要进行磁盘排序,在内存中即可。可毕竟在大型系统中,内存有限,只有1M的空闲内容啊!

对答:晕倒。那具体的记录内容能够说得详细些吗?

回答:每一个记录是一个7位整数,不重复,数据之间不关联。

回答:1MB=1024*1024B=1048576B,也就是1MB内存,最多只有1048576个字节呀,怎么能够把任意多的7位数(最多有999 9999个)放在内存进行排序呀,那就只能在磁盘中进行排序啦。对含有999 9999个记录的文件进行升序排序,可气的是居然还要求在10秒内完成排序任务,这简直疯啦,哪有这种要求呀,简直是欺负人啊?!

对答:嗯,明白了问题的具体描述信息啦。

【精确的对话】

果真有问题有需求,程序猿的职业素养要表现的不带任何偏见的以更有用的形式进行需求分析!

输入:

所输入的是一个文件,至多有n个正整数,每个正整数小于n,n=10的7次幂即n=10,000,000。输入时某一个正整数不能出现两次,否则报致命的错误。这些整数和其它任何数没有关联。

输出:

以增序的形式输出经过排序的正整数列表。

约束:

至多使用1M内存,磁盘空间丰富;运行时间只允许几分钟,10秒钟时最适宜的运行时间。

【程序设计】

(1)若以7个字节表示一个正整数,则1M内存可保存14,9796个数据;

(2)若以4个字节表示一个正整数,则1M内存可保存26,2144个数据,约25,0000个数据,则1000,0000个数据可以分40组。

快速排序(Quicksort)在内存中相当有效,只需要20行代码。这样就可以分40组进行快速排序,虽然内存排序效率很高,但是需要读取整个文件40次的代价。

(3)1M=1024*1024B=1048576B=8388608byte,也就是说将1000,0000个数据存放到约800,0000byte中;

【实现纲要】——位图解决方案

在现实中,位图和位向量最为常见,而它们的表示方法很值得学习和借鉴。

例如:用20位byte表示小于20的非负正整数集合,例如:{1,2,3,5,8,13}就可以表示为0 1 1 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0。那么至多1000,0000个数据就可以使用1000,0000个byte,轻松实现排序。数据对应的byte位置为1,否则为0。那么增序或减序输出就相当容易啦。

通过使用位图解决方案,该程序只需10秒左右,就可以完成排序。

评语:简单、较少的零部件、易于维护、非常强壮。

使用技巧:

(0)恰当的问题:问题的定义需要占据这场战役90%的时间;

(1)位图数据结构:有限域中的稠集【每个元素只出现一次,没有其他数据和该元素相关】,有限域中的键作为表索引【存在多重元素或额外的数据】;

(2)多通道算法:有多个输入数据的通道,每读一次就向完成前进一步;

(3)简单设计:设计师的至高境界不是他不能再往作品中添加什么东西,而是他不能再从中取走什么东西;更加可靠、安全、健壮和有效。

(4)时间和空间之间的权衡,两者不可偏废:

【进阶】

打破概念上的障碍,转而解决一个更简单的问题,这样我们最终解决问题。

"概念性障碍"——妨碍问题解决者正确认识问题或获得解答的心理障碍。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值