![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
编程珠玑
JohnnyHu90
这个作者很懒,什么都没留下…
展开
-
编程珠玑之第二章questionA: 40亿个随机排列整数问题
问题描述:A. 给定一个最多包含40亿个随机排列的32位整数的顺序文件,找出一个不在文件中的32位整数(在文件中至少缺失这样一个数——为什么?)。在具有足够内存的情况下,如何解决该问题?如果有几个外部的“临时”文件可用,但是仅有几百字节的内存,又该如何解决该问题?问题解析:1、首先要明白整型代表的范围如下:由此看出一个无符号长整型大约表示43亿个数,所以大约有3亿个数是在此原创 2015-01-02 11:43:32 · 3682 阅读 · 0 评论 -
编程珠玑之第三章习题6
问题描述:6.编写一个“格式信函发生器”,使之可以通过数据库中的每条记录来生成定制的文档(这常常称为“邮件归并”特性)。设计简短的模板和输入文件来测试程序的正确性。问题解析:1、“格式信函发生器” 即现在我们所说的模板,在Web编程中经常用到,有固定的格式和文字,只需要修改部分里面的变量值,就可以生成我们的所需要的类容,经常收到的一些垃圾短信及邮件,都是用类似的模板生成的!如下面我原创 2015-02-05 16:35:26 · 1086 阅读 · 0 评论 -
编程珠玑之第一章:开篇(习题)泛览
习题1.如果不缺内存,如何使用一个具有库的语言来实现一种排序算法以表示排序和集合。实现1:C++的vector容器sort函数(当然也可以是list, sort):12345678910111213141516171819202122232425262728原创 2013-09-14 16:20:32 · 2752 阅读 · 0 评论 -
编程珠玑之第一章习题7:处理程序存在的缺陷的问答与测试
1、如果某个数出现超过一次的话,会发生什么?答:就位图排序而言,set()函数把标识数值的相应位设为1,当再次出现相同值是,由于其相应位已经有1标识,其结果不会发生变化,所以相关与过滤掉了多余的相同值。2、在这种情况下如何修改程序来调用错误处理函数?答:就位图排序来说,在我们或得某一值时,我们可以先对其进行判断,看其是否存在,如果存在,那么我们可以设定相应的错误处理函数,给予适当的处理原创 2013-09-16 20:09:36 · 925 阅读 · 0 评论 -
编程珠玑之第一章习题5:k趟算法给1000w数据排序的测试用例
习题5中为了能够实现在严格的1MB空间内给数据排序,可以使用k趟算法进行排序。每一趟一个区间,k趟我们可以给1000w整数划分k个区间,在这k个区间内分别进行排序,依照这个思路,我写了一个简单的测试用例,如下:1234567891011121314151617181920212223原创 2013-09-17 17:08:14 · 2538 阅读 · 1 评论 -
编程珠玑之第一章习题3:度量100w整数排序的运行时间
首先利用“编程珠玑之习题1.4: 生成不同的随机顺序的随机整数及存储与读取”给出的生成随机数的方法,在1000w整数的范围内生成100w个随机数;这里生成的随机数文件是unsortfile.txt文件,排序后的文件是sortedfile.txt1.C++STL(vector, sort)进行排序:1234567891011原创 2013-09-16 10:36:32 · 1836 阅读 · 0 评论 -
编程珠玑之第一章习题8:包含区号800、877,888情况下的排序测试用例
测试用例说明:这里测试用例的区号为:80、87、88;假设电话号码的范围是[0, 10000), 那么除去区号后其他号的范围就是[0, 100),设计程序如下:原创 2013-09-17 20:50:49 · 1302 阅读 · 1 评论 -
编程珠玑之第三章习题7
习题描述:7.常见的字典允许用户查找单词的定义。习题2.1描述了允许用户查找变位词的字典。设计查找单词的正确拼写的字典和查找单词的押韵词的字典。讨论具有以下功能的字典:查找整数序列(例如:1,1,2,3,5,8,13,21…)、化学结构或者歌曲韵律结构。习题解析: 1、本题是属于脑洞大开的题,具体解答可以考虑前两个小问“设计查找单词的正确拼写的字典和查找单词的押韵词的字典。”原创 2015-02-08 15:32:43 · 1005 阅读 · 0 评论 -
编程珠玑之第一章习题4: 生成不同的随机顺序的随机整数及存储与读取
这里对“生成小于n且没有重复的k个整数的问题”做一记录,以后扩充!如下:1.C++版:12345678910111213141516171819202122232425262728293031323334353637原创 2013-09-15 10:56:08 · 1746 阅读 · 0 评论 -
编程珠玑之第一章习题6给每个整数不超过10次的100w数据排序的测试用例
依照答案提示,我们可以使用4bit来统计每个整数出现的次数,我在这里利用位段实行一个测试用例:具体如下:12345678910111213141516171819202122232425262728293031323334原创 2013-09-16 16:41:46 · 1272 阅读 · 0 评论 -
编程珠玑之第三章习题3
问题描述:3. 编写一个“banner”函数,该函数的输入为大写字母,输出为一个字符数组,该数组以图形化的方式表示该字母。问题解析:1、如果编写一个通用的以26个字母为参数,输出为该字母的图形化表示,我目前还没有有效的方法,不过这对单个的字母,就简单的多,这也是目前想到的解决该问题的方法,就是在该函数中 分别对26个字母进行相应的初始化!2、可以假设26个字母中单个的字母有固定的长原创 2015-01-17 21:27:24 · 1374 阅读 · 0 评论 -
编程珠玑之第三章习题8
习题描述:8.[S.C.Johnnson]七段显示设备实现十进制数字: 的廉价显示。七段显示通常如下编号: 编写一个使用5个七段显示数字来显示16位正整数的程序。输出为一个5个字节的数组,当且仅当数字j中的第i段点亮时,字节j中的位i置1.习题解析: 1、7段显示在控原创 2015-02-08 15:45:56 · 1939 阅读 · 0 评论 -
编程珠玑之第12章习题1: 随机位问题
习题描述:C库函数rand()通常返回约15个随机位。使用该函数实现函数bigrand和bigrand和randint(l, u), 要求前者至少返回30个随机位,后者返回[l,u]范围内的一个随机整数。问题解析:什么是随机位? 其实这里作者是说rand()函数通常返回的值范围是:[0, RAND_MAX], 而RAND_MAX的值通常为32767(0x7FFF)(15个bit位的最大值),原创 2014-12-31 09:43:44 · 1174 阅读 · 1 评论 -
编程珠玑之第一章习题5:两趟算法完成100w数据排序
习题5鼓励大家利用两趟算法去完成排序,这里,我依照C库的qsort实现了一个两趟算法对100w数据排序,其他算法实现大同小异!代码如下:123456789101112131415161718192021222324252627282930313原创 2013-09-16 14:48:46 · 2445 阅读 · 0 评论 -
编程珠玑之第三章习题5
问题描述:5. 本习题处理英语中的一小部分连字符问题。下面所示的规则描述了以字母“c”结尾的单词的一些合法的连字符现象:et-ic al-is-tic s-tic p-tic -ly-ic an-tic c-tic at-ic h-nic n-ic m-ic l-lic -clic l-ic h-ic f-ic d-ic -bic a-ic-mac i-ac规则的应用必须按照上述顺序进原创 2015-02-04 19:35:42 · 1039 阅读 · 0 评论 -
编程珠玑之第三章习题2
问题描述:问题解析:1、如果咨询研究其规律,会发现其输入的km的a的值由上面公式就可以递推到!2、研究其性质,会发现a[1] = c[k+1]是永远不会变得,那么由a[1]就可以向后推得知a[2].......a[m]的值。3、下面摘录几个研究实例:(1)m = 4, k = 1a[1] = c[2]a[2] = c[1]a[1] + c[2]a[3] =原创 2015-01-15 23:54:21 · 1465 阅读 · 0 评论 -
编程珠玑之第三章习题1
问题描述:1. 本书行将出版之时,美国的个人所得税分为5种不同的费率,其中最大的费率大约为40%。以前的情况更为复杂,税率也更高。下面所示的程序文本采用25个if语句的合理方式来计算1978年的美国联邦所得税。税率分别为0.14,0.15,0.16, 0.17, 0.18,·····。此后的费率增幅大于0.01.有何建议? 1234567原创 2015-01-14 15:37:20 · 1037 阅读 · 0 评论 -
编程珠玑之第二章习题1
问题描述:考虑查找给定输入单词的所有变位词问题。仅给定单词和字典的情况下,如何解决该问题?如果有一些时间和空间可以响应任何查询之前的预处理,又会如何?问题解析:1、给定的单词有唯一的标识和长度,那么在顺序遍历整个个字典的情况下,我们可以先计算该输入单词的长度,长度不等,跳过,长度相等,计算该单词的标识,再比较该标识与给定单词的标识。解决方案:方案1:在不进行预处理的情况下,解决原创 2015-01-10 11:18:54 · 922 阅读 · 0 评论 -
编程珠玑之第二章questionB: n元一维向量旋转问题
问题描述:B.将一个n元一维向量向左旋转i个位置。例如,当n=8且i=3时,向量abcdefgh旋转为defghabc. 简单的代码使用一个n元的中间向量在n步内完成该工作。你能否仅使用数十个额外字节的存储空间,在正比于n的时间内完成该向量的旋转?问题解析:1、以正比于n的时间(相当于n步内)完成该操作,那么就是每个元素的移动都差不多一步到位,如将第4位的d一步移动到第1位处,原创 2015-01-07 14:56:28 · 1473 阅读 · 1 评论 -
编程珠玑之第二章习题4
问题描述:几位读者指出,既然所有的三个旋转算法需要的运行时间都正比于n,杂技算法的运行速度显然是求逆算法的两倍。杂技算法对数组中的每个元素仅存储和读取一次,而求逆算法需要两次。在实际的计算机上进行实验以比较两者的速度差异,特别注意内存引用位置附近的问题。问题解析:解决方案:见作者的实验结论:page200 (编程珠玑第2版,黄倩,钱丽艳译);我的结论:暂无(以后再说)!心得原创 2015-01-10 15:44:21 · 723 阅读 · 0 评论 -
编程珠玑之第二章习题6
问题描述:20世纪70年代末期,贝尔实验室开发出了“用户操作的电话号码簿辅助程序”,该程序允许雇员使用标准按键电话在公司电话号码簿中查找电话号码。要查找该系统设计者的名字Mike Lesk,可以按“LESK*M*”(也就是“5375*6*”),随后,系统会输出他的电话号码。这样的服务现在随处可见。该系统中出现的一个问题是,不同的名字有可能具有相同的按键编码。在Lesk的系统中发生这种情况时,系原创 2015-01-11 15:26:46 · 882 阅读 · 0 评论 -
编程珠玑之第二章questionC: 求变位词问题
问题描述:C. 给定一个英语词典,找出其中的所有变位词集合。例如,“pots”、“stop”和“tops”互为变位词,因为每一个单词都可以通过改变其他单词中的字母的顺序来得到。问题解析:1、2、3、解决方案:原创 2015-01-10 10:45:52 · 1306 阅读 · 0 评论 -
编程珠玑之第二章习题2
问题描述:给定包含4 300 000 000个32位整数的顺序文件,如何找出一个至少出现两次的整数? 问题解析:1、假设4 300 000 000个32整数的顺序是随机的。2、给定的32位整数的个数是4 300 000 000大于2^32-1, 如果其中没有任何一个缺失的32整数,那么重复整数个数就是(4300000000-2^32+1)个。3、可以通过统计中间值(2^32-1原创 2015-01-10 13:00:33 · 1139 阅读 · 0 评论 -
编程珠玑之第二章习题3
问题描述:前面涉及了两个需要精巧代码来实现的向量旋转算法。将其分别作为独立程序实现。在每个程序中,i和n的最大公约数如何出现?问题解析:1、作者在本章共给出了3种解决给问题的方法,前两种需要“精巧”代码,实现过程比较复杂,最后一种最简单易懂,效率也高,可以说是解决该问题的最佳方法!解决方案:方案可见:编程珠玑之第二章questionB: n元一维向量旋转问题原创 2015-01-10 13:26:49 · 769 阅读 · 0 评论 -
编程珠玑之第二章习题5
问题描述:向量旋转函数将向量ab变为ba。如何将向量abc变为cba? (这对交换非相邻内存块问题进行了建模)问题解析:1、这里需要用到一个重要的性质:解决方案:心得疑惑:原创 2015-01-10 19:05:26 · 1188 阅读 · 0 评论 -
编程珠玑之第二章习题8
问题描述:8.[J.UIlman]给定一个n元实数集合,一个实数t和一个整数k,如何快速确定是否存在一个k元子集,其元素之和不超过t?问题解析:1、 本题问题清晰,不会产生什么歧义,要找到该k元子集,那么首先就是要找到n元实数里所有的小于实数t的数,这自然就想到了排序最为方便!2 、排序之后,看前k个数之和与n进行比较,就能够得到!解决方案:下面是测试代码:心得疑惑原创 2015-01-13 11:04:55 · 1339 阅读 · 0 评论 -
编程珠玑之第二章习题10
问题描述:10.某一天,一个新研究员向托马斯·爱迪生报到。爱迪生要求他计算出一个空灯泡盒的容积。在使用测径仪和微积分进行数小时的计算后,这个新员工给出了一个答案——150立方厘米。而爱迪生在几秒钟之内就计算完毕并给出了结果“更接近155”。他是如何实现呢?问题解析:1、 阿基米德鉴定皇冠的故事:公元前245年,为了庆祝盛大的月亮节,赫农王给金匠一块金子让他做一顶纯金的皇原创 2015-01-13 19:15:56 · 994 阅读 · 0 评论 -
编程珠玑之第二章习题7
问题描述:7. 在20世纪60年代早期,Vic Vyssotsky与一个程序员一起工作,该程序员需要转置一个存储在磁带上的4000x4000的矩阵(每条记录的格式相同,为数十个字节)。他的同事最初提出的程序需要运行50个小时。Vyssotsky如何将运行时间减少到半个小时呢?问题解析:1、首先应该知道什么是转置矩阵?2、这里的“每条记录”说的是的矩阵里的每一个数。解决方原创 2015-01-12 22:47:13 · 1692 阅读 · 0 评论 -
编程珠玑之第三章习题4
问题描述:4.编写处理如下日期的函数:给定两个日期,计算两者之间的天数;给定一个日期,返回值为周几;给定月和年,使用字符数组生成该月的日历。问题解析:解决方案:心得疑惑:原创 2015-01-30 11:27:20 · 885 阅读 · 0 评论 -
编程珠玑之第二章习题9
问题描述:9.顺序搜索和二分搜索代表了搜索时间和预处理之间的折中。处理一个n元表格时,需要执行多少次二分搜索才能弥补对表进行排序所消耗的预处理时间?问题解析:1、二分搜索所用的时间是排序时间和搜索时间(预处理时间)之和。解决方案:暂无心得疑惑:暂无原创 2015-01-13 19:02:23 · 1054 阅读 · 0 评论 -
编程珠玑之第四章习题1
问题描述:1、尽管我们的二分搜索证明历经曲折,但是按照某些标准来衡量还是不够完善。你会如何证明该程序没有运行时错误(例如除数为0, 数值溢出、变量值超出声明的范围或者数组下标越界)呢?如果有离散数字的基础知识,你能否用逻辑系统形式化该证明?原创 2015-03-15 18:44:48 · 818 阅读 · 0 评论