一,题目:
如何在1MB的空间里面对一千万个整数进行排序?并且每个数都小于1千万。实际上这个需要1.25MB的内存空间。
1MB总共有838,8608。所以估计也可以在1MB左右的空间里面进行排序了。
二,分析:
1)基于磁盘的归并排序(耗时间)
2)每个号码采用32位整数存储的话,1MB大约可以存储250 000 个号码,需要读取文件40趟才能把全部整数排序。(耗时间)
3)位图法,采用一个1千万位的字符串表示每个数,比如{0,2,3}表示为 1 0 1 1 0 0 0 0 。遍历每一个整数,有则标记为1,否则标记为0。然后按顺序输出每个整数。这种方法实际需要1.25MB内存,如果可以方便弄到内存的话可以采用此种方法。
4)假如严格限制为1MB,可以采用的策略:两次遍历或者除去第一位为0或1的整数。
解释:考虑到没有以数字0或1开头的电话号码,可以省略对这些数的操作。
两次遍历:对 1 ---4999 999之间的数排序,需要存储空间为:5000 000/8 =625 000 字节(8为一个字节中的位数)
对 5000 000 -10000 000 之间的数排序。
如果需要采用k趟算法,方法类似。
三,源码:
四,课后的题目:
1、使用库函数来进行排序
使用set容器
2、使用位运算
3、比较位图排序与系统排序
位图排序是最快的,针对这个问题而言,qsort比stl sort速度快。
4、随机生成[0, n)之间不重复的随机数(关键思想为:先把所有可能数顺序放到数组,然后打乱顺序,则保证不重复)
5、如果1MB是严格控制的空间,如果数据有1.25MB的bit数目。那么应该是需要读取2次。
k = 需要跑几趟直接用 需要排序的数据量/内存空间bit数,往上取整则可。
时间开销 = kn
空间开销 n/k
注意的是,每次在扫描的时候,取数据的范围是不一样的。
6、如果每个数据出现最多10次,那么需要4个bit位来刻录一个数。这时存储空间减小至原来的1/4。
那么如果一定要按照bitmap的方式来进行处理,则需要利用5题中的结论。
7、问题:[R. Weil]本书1.4 节中描述的程序存在一些缺陷。首先是假定在输入中没有出现两次的整数。如果某个数出现超过一次的话,会发生什么?在这种情况下,如何 修改程序来调用错误处理函数?当输入整数小于零或大于等于n时,又会发生什么?如果某个输入不是数值又如何?在这些情况下,程序该如何处理?程序还应该包含 哪些明智的检查?描述一些用以测试程序的小型数据集合,并说明如何正确处理上述以及其他的不良情况。
如果某个数出现超过一次的话,会发生什么?
会被忽略掉, 因为原来的程序本身就是用来处理只出现一次的情况的。
在这种情况下,如何修改程序来调用错误处理函数?
当输入整数小于零或大于等于n时,又会发生什么?
会出现访问越界的情况。-1访问时,会访问a[-1]的31个bit位。
如果某个输入不是数值又如何?在这些情况下,程序该如何处理?
输入可能是浮点数,或是字符什么的~~
可以先读入字符串,再用atoi转换成为整形数,如果失败,则进行出错处理。
程序还应该包含哪些明智的检查?
8、免费电话号码至少有800,878,888等,那么如何查看一个号码是否是免费号码。?
第一种方案:如果是一千万个电话号码都有可能成为免费号码,那么至需要1.25MB * (免费号码前缀个数)。
第二种方案:省空间,多次扫描文件:
1、首先扫描整个文件,看有哪个免费号码前缀。以及每个免费号码前缀下的号码个数。
2、设置区间映射表:比如800前缀有125个免费号码,找到最大的数,与最小的数,差值做为bit长度。
第三种方案:建立索引的方式来进行处理。以最后7位为索引,后面800,878什么的,为值。如果不是免费号码,应该是不用加入到这个hash表中。
9、避免初始化问题
做法是:使用两个等长的辅助数组,比如要把a[n]初始化,那么在第一次访问时:
b[i] = top;
c[b[i]] = i;
++top;
给出示例代码
分享到:
相关推荐
《编程珠玑》一书将这些技巧和经验整理成章,涵盖了算法、数据结构、性能优化、代码质量等多个方面,是程序员自我提升的重要参考资料。书中强调的问题求解策略和程序设计思想,对于初学者和资深开发者都有很大的启发...
根据提供的标题“编程珠玑(第二版)答案”和描述“编程珠玑(第二版)答案”,我们可以推测出这是关于《编程珠玑》这本书的相关解答资料。《编程珠玑》是一本经典的计算机科学书籍,作者为Jon Bentley。本书旨在...
算法经典书籍编程珠玑第2版,这本书除了讲算法,更是讲述解决问题的思想。
《编程珠玑》是一本经典的计算机科学与编程书籍,作者是Jon Bentley。这本书以其独特的视角深入探讨了程序设计的艺术和技巧,旨在提升程序员的问题解决能力,优化算法,并提高代码效率。书中涵盖了一系列实用的编程...
"第二章questionC"提及的问题是关于"求变位词",这是一个常见的字符串处理问题,涉及到字符统计、排序以及字符串比较等基础知识。 变位词,又称为同字母异序词,是指两个或多个单词由完全相同的字母组成,但字母...
《编程珠玑》是计算机科学领域的一本经典之作,由Jon Bentley 编著,它以其深入浅出的方式探讨了程序设计的问题和解决方案,尤其在数据结构、算法优化以及问题解决策略方面有着独到的见解。这本书的源代码是作者为了...
《编程珠玑》是计算机科学领域的一本经典之作,作者是Jon Bentley,它以其独特的视角和深入浅出的讲解方式,向读者展示了编程艺术的精髓。这本书的第二版更是深受程序员和计算机科学家们的喜爱,因为它不仅涵盖了...
《编程珠玑(续)》是计算机...书中涵盖了程序员操纵程序的技术、程序员取舍的技巧、输入和输出设计以及算法示例,这些内容组成一个有机的整体,如一串串珠玑展示给程序员。 《编程珠玑(续)》适合各级程序员阅读参考。
第一部分 编 程 技 术 第1章 性能监视工具 3 1.1 计算素数 3 1.2 使用性能监视工具 7 1.3 一个专用的性能监视工具 8 1.4 开发性能监视工具 10 1.5 原理 11 1.6 习题 11 1.7 深入阅读 12 第2章 关联数组 13 2.1 Awk中...
《编程珠玑》是由Jon Bentley所著的一本计算机程序设计的经典著作,它在计算机科学领域内具有非常高的声誉。这本书深入探讨了计算机程序设计中的诸多方面,尤其强调了程序设计过程中洞察力和创造力的重要性。 Jon ...
《编程珠玑》和其续篇是两部深受程序员喜爱的经典著作,主要涵盖了程序设计、算法分析和数据结构等核心编程领域。这两本书以其深入浅出的讲解方式和丰富的实例,帮助读者提升编程技巧和解决问题的能力。 在《编程...
总之,《编程珠玑(第二版)》通过对实际问题的深入剖析和对编程案例的巧妙讲解,为读者带来了一系列宝贵的经验和启示。这些经验不仅包括了编写代码的技巧,更重要的是让程序员学会了如何思考和解决问题,进而提升...
总的来说,《编程珠玑》第二版是一本全面而深入的编程指南,无论你是初学者还是经验丰富的开发者,都能从中获益匪浅。通过学习这本书,你可以提升解决问题的能力,掌握更高效的数据处理方法,并了解到如何在实际工作...
《编程珠玑》是计算机科学领域的一本经典之作,由Jon Bentley著,主要探讨了程序设计问题的解决方法和算法优化。这本书的核心理念是通过实际的编程问题来传授如何高效地设计和分析算法,旨在提升程序员的问题解决...
编程珠玑第二版及源代码实现(C/C++) 如果让程序员们列举他们喜欢的书籍,Jon Bentley的《编程珠玑》一定可以归于经典之列。如同精美的珍珠出自饱受沙砾折磨的牡蛎,程序员们的精彩设计也来源于曾经折磨他们的实际...
《编程珠玑》第二版是计算机科学领域的一本经典著作,由Jon Bentley撰写,它以其深入浅出的方式探讨了程序设计中的诸多问题和解决方案。这本书不仅涵盖了算法和数据结构,还涉及了软件工程的实践与智慧,对于程序员...
《编程珠玑》是计算机科学领域的一本经典之作,作者Jon Bentley通过一系列实际问题的探讨,引导读者理解和掌握编程中的高效解题技巧。书中的问题和解决方案涵盖了算法设计、数据结构优化以及问题解决策略等多个方面...
编程珠玑II(编程珠玑·续) 扫描版6.56M pdf格式
编程珠玑续、编程珠玑续本、编程珠玑续本、编程珠玑续本