珠玑编程读书笔记——<一>

来源:互联网 发布: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

我相信这个算法所有人都可以很容易的理解。

简洁、明了,易读,效率高,真是个强大的算法

对于本章节,核心思想就这样了。

我想自己用代码实现这个算,运行体验一下他的效率,但是发现第二步的处理对我来说是个问题。

所以一个遗留的问题,作者说在接下来的章节会进行描述,这正好是一个很好的诱惑,诱惑我继续往下读

好了,第一章就到这,算法已经记下,就等着实现了。

原创粉丝点击