
编程珠玑
ProfessionalEngineer
这个作者很懒,什么都没留下…
展开
-
第二章 啊哈!算法(变位词)
给定一个英语字典,找出其中的所有变位词集合。例如,“pots”、“stop”和“tops”互为变位词,因为每一个单词都可以通过改变其他单词中字母的顺序来得到。“解决这个问题的许多方法都出奇地低效和复杂。任何一种考虑单词中所有字母的排列的方法都注定了要失败。而比较所有单词对的任何方法在我的机器上运行至少要花费一整夜的时间。”我们获得的”啊哈!灵机一动“就是标识字典中的每一个词,使得在相同变位原创 2011-12-12 13:32:24 · 2023 阅读 · 0 评论 -
附录C 时空开销模型
在书中的第七章《性能开销》中有两个小例子,由此也就引出了附录C时空开销模型中的两段比较牛逼的程序,我辈也只能学习学习其中的思想和编程手法了。第一个例子是估计一个数据结构占用的字节数,书中的问题为两百万个如下的节点能否装入128MB的计算机中:struct node {int i; struct node *p;};按照一般的思路来讲,这样一个节点在32位机器上占用的内存为 4+4 =原创 2012-05-15 21:09:41 · 994 阅读 · 0 评论 -
第十三章 搜索
这一章详细研究一个搜索问题:在没有其他相关数据的情况下,如何存储一组数据。(这个问题的搜索特性主要体现在向数据集合容器中插入新的数据,但还需要保证容器中没有相同的数据,这就涉及到了搜索容器的问题。)具体的问题定义是这样的:生成[0, maxval)范围内m个随机整数的序列,不允许重复。 根据上一张的内容,解决这个问题主要任务是实现如下伪代码: initialize set原创 2012-05-18 21:33:17 · 780 阅读 · 0 评论 -
第十一章 排序
如何将一系列的记录排成有序的?答案通常很简单:使用库函数排序。本节介绍几个排序方法,以及部分方法的改进措施,并作出相应的实验来验证。1.插入排序为了将数组x[n]按升序排列,我们首先将第一个元素视为有序子数组x[0..0],然后插入x[1],...,x[n-1],如下面的伪代码所示:for i=[1,n) /* invariant: x[0..i-1] is sorte原创 2012-03-14 15:49:53 · 768 阅读 · 0 评论 -
第十五章 字符串(一)
第十五章是《编程珠玑》的最后一章,本章由易到难围绕字符串处理主要分三个部分:1,单词。2,短语。3,文本。在这三个问题中涉及到的技术有C++中的标准模板库,哈希表,新介绍的一种数据结构“后缀数组”。先从第一个部分“单词”入手。 “我们的第一个问题是为文档中包含的单词生成一个列表”。这个问题用C++标准模板库中的set和string可以很容易解决。[cpp] v原创 2012-05-31 19:49:24 · 1616 阅读 · 0 评论 -
第十五章 字符串(二)
第十五章的第二部分涉及到“短语”,其书中提出的一个问题是:给定一个文本文件作为输入,查找其中最长的重复子字符串。例如,"Ask not what your country can do for you, but what you can do for your country"中最长的重复字符串是“can do for you”,第二长的是"your country"。如何解决这个问题呢?原创 2012-05-31 20:25:09 · 1122 阅读 · 0 评论 -
第十五章 字符串(三)
在十五章的最后展示了一个挺复杂的问题,也是利用到了后缀数组的结构,解决的问题是:如何生成随机文本。因为算法的最终确定是“通过文本内容的前K个字符或单词来判断下一个字符或单词是什么”这个思想来进行的,所以书中说这是一个“具有固定转化概率的有限状态马尔科夫链”,但这个术语究竟是什么意思我还没搞清楚。但是总结说来比较简洁的描述方法就是:生成k阶单词或字符级别的随机文本(马尔科夫链)。 在确原创 2012-05-31 22:23:39 · 923 阅读 · 0 评论 -
第二章--求二进制数中1的个数
对于一个字节(8bit)的无符号整型变量,求其二进制表示中“1”的个数,要求算法的执行效率尽可能高。#include using namespace std;int main(){ //unsigned char num; int num, tst, count=0, i; cout<<"Please input an unsigned char nu原创 2012-06-27 21:22:00 · 700 阅读 · 0 评论 -
第九章 代码调优
前面各章已经讨论了提高效率的高层次方法:问题定义、系统结构、算法设计以及数据结构选择。本章讨论一个低层次方法。”代码调优“首先确定程序中开销较大的部分,然后进行少量的修改,以提高其运行速度。“他发现常见记录类型的空间分配次数是次常见记录类型的30倍”。如果你知道了程序的大部分运行时间都用于为某一类型的记录分配存储空间,你会如何进行改进程序使其运行得更快呢?Van W原创 2012-03-13 15:09:15 · 700 阅读 · 0 评论 -
第一章 开篇
《编程玑珠》中一些章节中有一些算法的实现,书后和网络上有源代码的例子,边看边学同时做一下记录。如果不缺内存,如何使用一个具有库的语言来实现一种排序算法以表示和排序集合。利用C语言中的qsort函数实现程序。“qsort函数是ANSI C标准中提供的,其声明在stdlib.h文件中,是根据二分法写的,其时间复杂度为n*log(n),其结构为:void qsort(void *ba原创 2011-12-06 20:52:29 · 1028 阅读 · 0 评论 -
第十四章 堆
这章的内容主要是围绕堆这个数据结构和围绕堆的结构提供的两种操作:siftup,由下向上调整重新获得堆的性质;siftdown,由上向下调整重新获得堆的性质。通过堆(和对堆的性质的定义),两个调整堆的函数,就可以完成本章后面两部分介绍的内容:1,优先级队列。2,堆排序。本章的代码主要是针对优先级队列的。 优先级队列操作一个初始为空的元素集合,S。insert函数在集合中插入一个新元素,ex原创 2012-05-20 14:55:24 · 584 阅读 · 0 评论 -
第二章 啊哈!算法 (向量旋转)
将一个n元一维向量向左旋转i个位置。例如,当n=8且i=3时,向量abcdefgh旋转为defghabc。简单的代码使用一个n元的中间向量在n步内完成该工作。你能否仅使用数十个额外字节的存储空间,在正比于n的时间内完成向量的旋转?“旋转操作对应于交换相邻的不同大小的内存块:每当拖动文件中的一块文字到其他地方时,就要求程序交换两块内存中的内容。在许多应用场合下,运行时间和存储空间的约束会很严格。原创 2011-12-12 11:01:10 · 2774 阅读 · 0 评论 -
第八章 算法设计技术
问题:输入是具有n个浮点数的向量x,输出是输入向量的任何连续子向量中的最大和,认为当所有的输入都是负数时,总和最大的子向量是空向量,总和为0。例如,如果输入向量包含下面10个元素:那么该程序的输出为x[2..6]的总和,即187。书中主要提到了3中不同的算法,其时间复杂度也各不相同。1.平方算法主要是通过遍历数组中数来计算出连续子向量的最大和,时间复杂度为O(n^2原创 2012-03-06 15:30:06 · 992 阅读 · 0 评论 -
第四章 编写正确的程序
编写一个正确的二分搜索程序。二分搜索的关键思想是如果t在x[0..n-1]中,那么它就一定存在于x的某个特定范围之内。编写程序如下: #include #define N 100int a[N];int BinarySearch(int a[N], int t){ int l=0, r=N-1; int m=(l+r)/2; while(t!=a[m原创 2012-03-01 09:09:36 · 886 阅读 · 0 评论 -
第十二章 取样问题
问题:程序的输入包含两个整数m和n,其中m1.genknuth():算法依次考虑整数0,1,2,...,n-1,并通过一个适当的随机测试对每个整数进行选择。通过按序访问整数,可以保证输出结果是有序的。2.gensets():一种解决方案是在一个初始为空的集合里面插入随机整数,直到个数足够,然后排序输出集合中的元素(利用C++中的set容器可以节省排序这一步骤)。3.genshu原创 2012-04-12 19:31:43 · 1266 阅读 · 0 评论