《编程珠玑》读书笔记(一)

《编程珠玑》(第二版)第一部分主要是讲基础

第一章 开篇:

本章主要解决的问题是“在内存不足的情况下,如何对数据进行排序”,提出了两种解决方法:归并排序和位图排序。

归并排序:
    思想是每次将两个有序表合成一个长的有序表,程序一般用递归来实现,时间复杂度是O(nlogn),需要O(n)的空间复杂度,稳定。

位图排序:
    使用条件有两点,一是数据不重复,二是知道数据范围,时间复杂度是O(n),以1000万数据为例,消耗的空间大小为10^7/8约等于1.25MB。C++中提供了bitsae这种数据结构实现位图,清空操作用reset(),设置1操作用set(num,1)。C语言实现位图可以使用位操作,左移=除,与=取余。

海量数据的处理一直是面试的重点关注问题,july的博客中有详细系统介绍海量数据面试题的方法,有兴趣者可以前往观阅,网址为: http://blog.csdn.net/v_july_v/article/details/6279498

第二章 啊哈!算法

本章主要提出了三个问题,并找到解决方法。

A、一个最多包含40亿个随机排列的32位整数中找到一个不存在的整数。解决方法是二分搜索。(注意这32位整数是二进制表示方法,当初看到这里时纠结了很久)。n=40亿,根据第1bit为0或1分别存储在不同的文件中,通过数量判断二分查找的范围,运行时间为O(nlogn)。

B、n元一维向量左旋i个位置,只用数十个额外字节空间,正比于n的时间内完成。解决方法是倒转和转置。书中介绍了五种方法,其中方法四和方法五可以用代码值得进一步介绍。
方法四:
方法五:

C、找出英文字典中所有变位词集合。解决方法是排序。首先标识字典中的每一个单词,然后选择具有相同标识的单词,可以使用基于排序的标识。

2.8边栏一节介绍了变位词程序的代码实现。

第三章 数据决定程序结构

本章主要介绍了一种最简单的数据结构——数组。以及在日期函数、单词分析中的使用。我就不详细介绍了。POJ程序设计方法学中字符串那章的题目都很好。

其中提到了“格式信函发生器”,在Java与数据库的链接语句中使用过。

闰年的判断:(a%4==0 && a%100!=0)|| a%400==0 是闰年,否则不是。

第四章 编写正确的程序

本章是在第三章介绍的二分搜索的基础上,对二分搜索的改进算法,传统上二分搜索的时间复杂度为O(logn),在介绍的过程中个,顺便介绍了断言(assertion)=不变式(invariant)。传统代码如下:
[cpp]  view plain copy
  1. l = 0 ; u = n-1 ; p = -1;  
  2. while ( l <= u)  
  3. {   
  4.     m = ( l + u ) / 2  
  5.     if ( x[m] == t )  { p = m ; break ; }  
  6.     else  if ( x[m] < t )  
  7.                  l = m + 1 ;  
  8.             else u = m - 1 ;  
  9.   }  
  10.   if ( p==-1 ) 未找到;else 找到;  

在9.2节中,提出了一种更优化的改进方法,使用下限值l 以及增量 i 来表示 l+i=u,其中i保持为2的幂。代码如下:
[cpp]  view plain copy
  1. l = -1 ; i = n/2 ;  
  2. if ( x[i-1] < t )    
  3.      l = n - i ;  
  4. while ( i != 1 )  
  5. {  
  6.     i /= 2;  
  7.     if ( x[l+i] < t ) l += i ;  
  8. }  
  9. p = l + 1 ;  
  10. if ( p > n || x[p] != t ) p = -1;  


第五章 编程小事

本章主要介绍了测试的工作。
assert的用法:证明某个逻辑是真的。
计时函数语句: 可以使用clock()库函数.


作者在前言里说“阅读本书的一个提示:不要读的太快。要仔细阅读,一次读一章。要尝试解答书中提出的问题”,确实本书讲的都是精华,我也只做到了每次读一章,因为现阶段主要是想面对找实习的笔试面试,无暇顾及其他,书中提到的一些很原始的理论知识,都没有深入去了解,代码也没有具体实现,这样很不好。这就是速食主义的阅读。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值