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

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情
《编程珠玑》的第二部分讲的是性能,第三部分讲的是应用,所以我暂时跳过第二部分,直接看应用。

第十一章 排序

排序问题一直是面试的热点!本章首先介绍了插入排序,然后介绍了快速排序,并提出了快速排序的几种改进方法,例如双向划分、随机数划分、以及小范围结合插入排序,三种的性能递增。

排序免不了交换,书中特别指出将swap()函数写入循环中会加速。

插入排序: 稳定,时间复杂度O(n^2),主要代码如下
               
for ( i = 1 ; i < n ; i ++ )
{
    t = x[i];
    for( j = i ; j > 0 && x[j-1]>t;j--)
           x[j] = x[j-1];
    x[j] = t;
}

快速排序: 不稳定;时间复杂度O(nlogn)。

当出现n个相同元素组成的数组时,插入排序性能非常好,总运行时间为O(n),但qsort性能非常糟糕,因此提出改进。

改进二:采用双向划分的方法,代入如下:
void qsort3( l , u )
  if l>=u
    return
  t = x[l];  i = l;  j = u + l;
  loop
      do  i++  while  i<=u && x[i]<t    //从左往右找到第一个大于等于t的数
      do  j--  while  x[j]>t           //从右往左找到第一风格小于等于t的数
      if  i > j
          break;
      swap( i , j )
  swap( l , j)
  qsort3( l , j-1 )
  qsort3( j+1 , u )

改进三:随机元素划分

改进四:快排+插入排序

第十二章 取样问题

本章主要介绍了生成0~n-1区间内m个随机数的三种方法,假设bigrand()函数返回一个随机大整数,例如C库函数rand()返回15位整数。
方法一:bigrand()%remaining<select,时间复杂度O(n)

方法二:C++zhongSTL的set集合,随机生成一个数,插入set中,最后有序输出。用空间换取时间,O(mlogn)

方法三:随机打乱一个数组,输出前m个即可,O(n+mlogn)

第十三章 搜索

本章介绍了5中表示随机整数集合的数据结构:有序数组、有序链表、二叉树、箱、位向量。各自性能如下:
集合表示初始化操作insert操作输出操作总时间空 间
有序数组1mmO(m^2)m
有序链表1mm
O(m^2)
2m
二叉树1logmm
O(mlogm)
3m
m1m
O(m)
3m
位向量n1n
O(n)
n/b

有序数组 IntSetArr类 实现于 P129;
有序链表 IntSetList类 实现于 P130;
二叉树    IntSetBST类 实现于 P132;
位向量   IntSetBitVec类 实现于 P134;
箱         IntSetBins类   实现于  P135;
详细代码见《附录E》

本章的边栏介绍了“拼写检查器”的实现。

第十四章 堆

本章首先介绍了堆的性质:一是有序,二是形状,以及用数组来表示堆。

堆的两个关键函数是:siftup()自底向上,siftdown()自顶向下,代码分别实现于P144、P145。

优先级队列(插入和删除操作很频繁)是一种常见的数据结构,主要有三种实现方法:有序序列、无序序列、堆(介于前两者之间的折中方法),三者性能比较如下:
数据结构一次insert时间一次extract时间两种操作各n次时间
有序序列O(n)O(1)O(n^2)
O(logn)O(logn)O(nlogn)
无序序列O(1)O(n)O(n^2)

用堆实现优先级队列的代码在P147,建议动手实践!

最后介绍了堆排序算法,分两步进行:建堆+排序,O(nlogn),习题2,3对堆排序进行了改进,暂未明白。
堆排序代码:
for i = [2 , n)
  siftup(i)
for( i = n ; i >= 2 ; i-- )
  swap( l , i )
  siftdown(i-1);
//x[l]是前i个元素中最大的,将它和x[i]交换使得有序序列多一个元素,因此下移保持堆平衡


第十五章 字符串

本章主要介绍了三种字符串的应用:

1、生成词典,统计单词的个数,分别用C++和C实现。
     C++实现使用了STL的set和map,其实本质是平衡搜索树。
     C实现使用的是散列表,比C++速度更快。

2、最长重复字串,用后缀数组实现,O(nlogn),需要额外的n个指针空间。

3、生成随机文本,主要了解k阶文本-->k接马尔科夫链。

编程珠玑读书笔记(一) 第一章 目的是为了引入位向量数据结构。 转载自 http://www.cnblogs.com/wuyuegb2312/p/3136831.html 位向量的定义和应用:位向量/位图在充分利用小空间存储大数据方面很有优势。Linux内核中很多用到了位向量。 一般地,对于多个对象和一个性质,这些对象可能满足(true)也可能不满足(false)这条性质。那么,为了表示所有对象对这个性质的满足情 阅读详情

相关推荐

编程珠玑读书笔记

编程珠玑读书笔记

编程珠玑》---笔记。浏览此文,一窥此书。

第一章: 磁盘排序:对于一个提出的问题,不要未经思考就直接给出答案。要先深入研究问题,搞清楚这个问题的特点,根据这个特点,可能有更好的解决方案。   比如:文中:最初的需求只是“我如何对磁盘文件排序”。 我们首先想到了经典的归并排序。 但,进一步了解到排序的内容是10000000个记录,每条记录都是一个7位整数,且只有1M可用的内存。每条记录不相同。   【位示图法,详见我的关于排序

菜鸟的自留地-mooyang 1万+

编程珠玑总结笔记

编程珠玑是一本提升coding能力不可多得的好书,看书时,可以结合这个笔记,突出重点。

编程珠玑读书笔记

   这本书中的程序都很有趣,传授了重要的编程技巧和基本的设计原理。书的结构如下: 第1章: 问题“怎样给一个磁盘文件排序?”准确的问题描述输入:一个最多包含n个正整数的文件,每个数都小于n,其中n=107。如果在输入文件中有任何整数重复出现就是致命错误。没有其他数据与该整数相关联。输出:按升序排列的输入整数的列表约束:最多有1MB内存空间可用,有充足的磁盘空间

DeepIT的专栏 1623

编程珠玑读书笔记开场白

在正式写述之前,先说一些闲话。 实习期间其实也是看了不少书的,可是几天下来,发觉看过的内容忘记了不少。之前也听说过导师说看了论文就一定要做好笔记,否则很容易忘记的。看来做好读书笔记真的是相当重要啊。在我看来,写笔记至少有两点好处,一是强迫自己总结看过的内容,二是也方便以后阅读重温已学过的知识。何乐而不为呢? 前几天买了《编程珠玑》,里面包含了不少有趣的算法问题,听说一些大公司也喜欢用里面的题来

Leo的博客 1114

编程珠玑读书笔记

编程珠玑读书笔记 娄雨禛 PB16060356 准确的问题描述   很多时候,我们总是过度关注了解决问题所用的巧妙算法,而将问题本身的重要性忽视。当我们拿到一个问题时,应当反复研读问题的每一个细节,因为正是这些细节的细微偏差导致了我们在解决问题时方案与技巧的重大不同。   如果我们只花很少的时间研读问题本身,而过度专注于问题的解决时,极有可能在百般忙碌之后,发现自己走了一大段弯路。...

weixin_30900589的博客 194

【读薄《编程珠玑》】壹 开篇

这篇文章是《读薄<编程珠玑>》系列博客的第一篇,在这篇文章中,我总结了在书中出现的一些问题以及一些解决方案。 问题集合 0x01:一个最多包含n个正整数的文件,每个数都小于n,其中n=107,并且没有重复。最多有1MB内存可用。要求用最快方式将它们排序并按升序输出 0x02:使用位逻辑运算来实现位向量 0x03:尽可能快的生成位于 0~n-1 之间的 k 个随机不同顺序的整数 0x04:如果在问题0

远航 | FIBOS.io 4212

读书笔记(V) 编程珠玑

编程珠玑是著名的算法手册,两本书都很薄,但真正做到了字字珠玑,以前买书就像买白菜一样求大而全,读完了之后,却味同嚼蜡,收获甚少。这两本书慕名买了很久,却没有去细读它,最近项目结束,有了闲暇,读了几篇,立刻让我如同发现了新大陆,因为上次做项目用到的一些优化技巧,这本书几乎都涉及到了,就在一句话的简短描述中。 说实话,除了编程珠玑外,我还忽略了一部书,也就是高德纳的计算机程序设计艺术,至少是在以前我

RONGE-KUTA的博客 991

编程珠玑读书笔记第一章

编程珠玑读书笔记第一章 解决一个排序问题描述输入: 一个最多包含n个正整数的文件,每个数都小于n,n=10^7,没有重复数据,数据之间互不关联。 输出: 按升序排列的整数列表。 约束: 最多有1MB内存空间可用,运行时间最多几分钟。解决问题条件: 输入数据限制在较小的范围内 没有重复数据 每条数据互补关联

zhu_free的博客 626

【读后感】编程珠玑(第二版)前言

引 总算结束了论文之旅(也可以说是造假之旅),可以看看书,玩玩游戏,陪陪老婆家人等等。从今天开始,我准备完成编程珠玑读书笔记了,读书当然要从前言开始。我这人有个习惯,前言总是要看两遍,甚至很多遍,总觉得前言写的好的才算是好书,如果看完前言都不知道在干什么,会有点扫兴吧。 开头 Jon一开始就提到了两本名著。Fred Brooks的《人月神话》(未购)和Steve McConn...

weixin_30507269的博客 222

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

前言 今天来读读《编程珠玑》,预计未来若干个月会有一系列博客记录《编程珠玑》的读书笔记读书笔记 第一章是本书的开篇,主要讲述了如何解决这么两个问题: 一. 如何对实际问题进行抽象,找出问题的独特性质。 很多低级的程序员,一上来就使用普适性的方法来解决问题,而不去认真学习实际问题的性质。具体来说,实际问题的特性包括:输入数据的特征,内存的特征,运行时间的限制,问题本身的特征。 根...

jmhIcoding 737

编程珠玑》和《梦断代码》(部分) 读书笔记

这周我阅读了《编程珠玑》和一部分《梦断代码》,将感想和收获记录于下。 《编程珠玑》是一本小而精巧的书,它讲了很多与编程、沟通、软件工程相关的知识,对我大有启发。书一开始讲了一个程序员求助的故事。那个程序员要做一些和排序相关的业务,于是向高手求助,但花了整整30分钟才把问题描述清楚。他之前以为这个问题需要写很多代码,需要花整整一个周去维护,但当他把问题描述清楚后,高手给出了一个...

weixin_30876945的博客 154
上一篇: 微软暑期实习面试总结
下一篇: malloc/free与new/delete的区别
蜡笔大龙猫
博客等级 码龄18年 349粉丝 98原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值