珠玑编程读书笔记——<一>
来源:互联网 发布:rds sql server 编辑:程序博客网 时间:2024/05/21 00:54
我看这本书是这样的,你呢?
也是偶然发现这本书的,好多书都没能坚持看完,希望这次能坚持下去。
第一章
问题描述:
对磁盘文件中的10000000个电话号码(7位数字)进行排序。
约束:1MB的主存,磁盘空间充足,时间最多几分钟,10秒为最佳。
我想,如果在面试的时候给我这个问题,我肯定不能给出一个让面试官满意的答案
书中提供了一些方案:
一、修改使用现有的基于磁盘的合并排序。(说实话,我没有了解过此类算法,还得花些额外的时间去学习)
二、使用多通道算法,将号码表示成32位整数,1MB空间了可以存储250000个号码,那么10000000个号码则要40个通道来读取文件,第一个通道将0到249999之间任意数读如内存,并对其排序,以此类推,第四十个通道将处理9750000到9999999之间的数。使用快排。作者说:整个程序代码只20多行,比第一个方案直接少了个‘0’。不用使用中间磁盘文件。不好的一点:读入文件40次。
三、利用位图,在这之前,关于位图,我只是了解到可以用来处理数据量比较大的排序,而对其原理、实现都一点都不知道。
文中举了一个例子,让我对位图有了基本的认识,感觉位图确实很强大。可以节省很大的空间。
eg:利用20位的字符串来表示一个小型的非负整数集合,如{1,2,3,5,8,13},我们可以这样存储:
01110100100001000000
那么在这个问题中,每个号码表示一个小于千万的整数,我们则可以使用一个具有千万位的字符串来表示该文件。在该字符串中,当且仅当整数i出现在文件中时,第i个位设为1.
算法如下: 直接摘自书本
1。初始化:
for i = [0,n)
bit[i] = 0
2.处理文件:
for each i in input file
bit[i] = 1
3.这时排序已经完成,直接输出就好
for i = [0,n)
if i = 1
write i on the output file
我相信这个算法所有人都可以很容易的理解。
简洁、明了,易读,效率高,真是个强大的算法
对于本章节,核心思想就这样了。
我想自己用代码实现这个算,运行体验一下他的效率,但是发现第二步的处理对我来说是个问题。
所以一个遗留的问题,作者说在接下来的章节会进行描述,这正好是一个很好的诱惑,诱惑我继续往下读
好了,第一章就到这,算法已经记下,就等着实现了。
- 珠玑编程读书笔记——<一>
- 《编程珠玑》读书笔记(一)
- 《编程珠玑》读书笔记(一)
- 编程珠玑读书笔记(一)
- 《编程珠玑》读书笔记(一)
- 珠玑编程读书笔记——<二>
- 抽样问题——《编程珠玑》读书笔记
- 蓄水池抽样——《编程珠玑》读书笔记
- 蓄水池抽样——《编程珠玑》读书笔记
- 蓄水池抽样——《编程珠玑》读书笔记
- 蓄水池抽样——《编程珠玑》读书笔记
- 《编程珠玑》读书笔记——第一章.开篇
- 蓄水池抽样——《编程珠玑》读书笔记
- 蓄水池抽样——《编程珠玑》读书笔记
- 编程珠玑读书笔记——串的转置算法
- 《编程珠玑(第二版)》读书笔记——第一章
- 位图排序及其扩展应用——《编程珠玑》读书笔记
- 插入查找元素效率问题——《编程珠玑》读书笔记
- java程序员职业规划分享
- 用innerHTML给textarea的value赋值,IE下丢失换行
- C# Sqlite 应用记录
- 求子数组的最大和
- MySqlHelper
- 珠玑编程读书笔记——<一>
- XmlHelper
- 11.04 ubuntu 开启ssh服务
- 如何在GOOGLE获得清晰的卫星图片
- JAVA自动拆装箱详细说明(转)
- Oracle学习笔记之三字符型及处理方法
- Android中布局的巧妙设计【android进化二十六】
- Jboss 虚拟主机设置
- 总结 关于C风格字符串