编程珠玑II
文章平均质量分 66
ddppqq
这个作者很懒,什么都没留下…
展开
-
(1)开篇
一、抽象问题 作者在被问到一个问题:“怎样给一个磁盘文件排序”时,起初想到的是一些有关如何在磁盘上实现归并排序的简单思想。而当深究问题的细节时会发现,通过磁盘上的归并排序不能是的问题被很好的解决。于是,对问题进行更客观、更易用的形式描述: 输入:一个最多包含n个正整数的文件,每个数都小于n,其中n=10^7。如果输入文件中有重复的数则出错。 输出:升序排列输入整数的列原创 2013-11-03 20:10:49 · 925 阅读 · 0 评论 -
(13)搜索
一、简介 通过构造可生成一个随机整数的有序集合(不允许重复)来引出问题的讨论。C++相关的代码使用了set数据结构,具体代码如下所示:void gensets(int m, int maxval){ int *v = new int[m]; IntSetImp S(m, maxval); while(S.size() < m) S.inser原创 2013-12-23 22:57:36 · 756 阅读 · 0 评论 -
(15)字符串
一、统计文本中各字符串出现的个数 利用map容器,代码实现如下所示:#include #include using namespace std;int main(){ map M; map ::iterator j; string t[5]={"abc","dd","abc","dd","dd"}; for(int i=0;i<5;++i) M[t[i]]+原创 2013-12-24 23:54:50 · 1006 阅读 · 0 评论 -
(12)取样问题
一、简介 问题描述:程序的输入包含两个整数m和n,其中m (1)一般情况下,如果要从r个剩余的整数中选出s个,我们以s/r的概率来选择下一个数。如下伪代码所示: select = m remaining = n for i = [0, n) if (bigrand() % remaining) < select原创 2013-12-15 20:01:52 · 867 阅读 · 0 评论 -
(11)排序
一、排序 本章以插入排序为伊始,进而介绍了快速排序,以及随机选取划分元素的改进的快速排序,且可根据所要排序元素的多少动态的选择是进行插入排序还是快速排序的算法(在元素较少的排序中,插入排序的运行效果可能更好)。插入排序与快速排序这里就不多介绍了。下面看一个这一章的习题。 习题第9题中要求编写一个程序,在O(n)时间内从数组x[0...n-1]中找到第k个最小的元素,算法可以对x原创 2013-12-15 16:19:34 · 899 阅读 · 0 评论 -
(5~7)编程小事、程序性能分析及粗略估算
这几章是在没啥总结的,就码点有意思的话吧。 1、assert表示我们相信某个逻辑表达式为真,若表达式为假则会报告某种错误; 2、得到正确程序需要做的主要有:脚手架、编码、测试、调试及计时; 3、想提高程序的性能,可以从以下几个方面进行入手和综合考虑:问题定义、系统结构、算法和数据结构、算法调优、数据结构重组、代码调优、硬件; 4、如果性能问题无法回避,则在设原创 2013-11-13 21:57:15 · 864 阅读 · 0 评论 -
(4)编写正确的程序
一、简介 编程技巧斤斤是编写正确程序的很小一部分,大部分内容还是前三节的主题:问题定义、算法设计及数据结构的选择。 一个正确运行的程序,其需要断言、顺序控制结构、选择控制结构及迭代控制结构。并且需要使用测试用例来保证程序的正确性。二、习题 1、给定一个盛有黑豆子和白豆子的咖啡罐以及一大堆额外的黑豆子,重复一下过程,直到仅剩下一个豆子为止。 从罐子中随机取原创 2013-11-12 20:31:57 · 1035 阅读 · 0 评论 -
(3)数据决定程序结构
一、格式信函编程 编写一个格式信函发声器,该发声器基于格式信函模板。可将数据从控制中分离出来。二、用于特殊数据的强大工具 在实际应用中,每种工具都是用数据的某一视图来解决特定但又通用的问题。主要包括超文本、名字-值对、电子表格、数据库、特定领域的编程语言。三、原理 数据结构对软件的一个贡献就是将大程序缩小为小程序。数据结构设计还有许多其他正面影响,包括节省时间原创 2013-11-11 22:53:42 · 820 阅读 · 0 评论 -
(9~10)代码调优、空间节省
一、代码调优 1、问题1--整数取模 一种算法是:k = (j + rotdist)%n; 另一种优化方法是:k = j + rotdist;if(k >= n) k -=n; 2、问题2--函数、宏和内联代码 通过宏替换函数来打破函数层次,提高算法效率。 3、问题3--顺序搜索 一种优化是设置哨兵值来测试是否已原创 2013-11-23 15:38:03 · 1043 阅读 · 0 评论 -
(8)算法设计
一、算法设计 1、问题描述:输入具有n个浮点数的向量x,输出是输入向量的任何连续子向量中的最大和。 有效解决方法: (1)分治算法:要解决规模为n的问题,可递归得解决两个规模近似为n/2的子问题,然后对他们的答案进行合并以得到整个问题的答案。 代码如下,最大子向量要么整个在a中,要么整个在b中,要么跨越a和b之间的边界。跨越a和b 的边界时,其最大子向量在a原创 2013-11-23 15:24:10 · 921 阅读 · 0 评论 -
(2)啊哈!算法
一、三个问题 1、给定一个最多包含40亿个随机排列的32位整数的顺序文件,找出一个不在文件中的32位整数。分别考虑在有足够内存或有几个外部临时文件可用,但仅有几百字节的内存的情况下,如果解决问题; 2、将一个n元一维向量向左旋转i个位置,例如,当n=8且i=3时,向量abcdefgh旋转为defghabc; 3、给定一个英语字典,找出其中的所有变位词集合。例如,“po原创 2013-11-05 22:15:22 · 1053 阅读 · 0 评论 -
(14)堆
一、简介 堆数据结构的性质:堆:任何结点的值都小于或等于其孩子的值的完全二叉树为小根堆,任何结点的值都大于或等于其孩子的值的完全二叉树为大根堆。为了方便使用完全二叉树的性质,假定数组从下标1开始。这样:leftChild = 2*i;rightChild = 2*i + 1;parent = i/2; 堆数据结构算法分析: 堆排序的最坏时间复杂度为O(nlogn)原创 2013-12-24 21:29:19 · 894 阅读 · 0 评论