《编程珠玑》——开篇

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

        开篇以一个问题开始,有人问了作者一个问题:“怎样给一个磁盘文件排序”,我看到这个问题的第一反应是,要知道磁盘文件里面的数据结构是什么样子的,然后就根据文件里面的数据内容采用经典的排序算法,就可以解决该问题了。

        继续往下看,作者的回答总结如下:“建议提问者深入研究算法教材,在程序设计书里有磁盘排序的程序,参考书里的实现,最多花费一周时间就可以实现并测试完成该代码”。

        作者给了上述答复后,并没有让提问者满意,便开始了继续深入的交流。通过一系列的交流最后得出该问题的全景,全景如下:

        待排序的文件中最多包含1千万条记录,每条记录都是7位的整数,每个记录只出现一次。由于各种限制,该程序只有1MB的内存可以使用。这个问题的背景是给美国的免费电话进行排序,问题的输入是电话号码的列表,期望的输出是以升序排列的电话号码列表,基于应用场景,对一次排序的性能时间要求为最多几分钟,10秒钟是最理想的运行时间。

         基于以上的交流后,作者给出了准确的问题描述规范或者说是模板。针对以上全景,可将所有情况组织称以下形式:

        输入:一个最多包含n个正整数的文件,每个数都小于n,其中n=10^{7}。如果在输入文件中有任何整数重复出现就是致命错误。没有其他数据与该整数相关联。

        输出:按升序排列的输入整数的列表

        约束:最多有(大约)1MB的内存空间可用,有充足的磁盘存储空间可用。运行时间最多几分钟,运行时间为10秒就不需要进一步优化了。

        以上就是问题的描述规范,应包含输入、输出和约束。输入是对程序的输入进行了详细的描述,输出描述了程序运行完之后应该返回的结果应当是什么样子,约束描述了该问题解决过程中的各种限制条件,包含了各方面的约束。

        开篇用这么一个问题加一段对话,引出了问题的描述规范,接下来开始解决问题之路。

        作者一开始就说了一种方法,用基于磁盘的归并排序来解决该问题,基于磁盘的归并排序是一种外排序方法,为什么要采用外排序方法呢?因为该问题的约束条件中描述了输入文件中最多有1千万个不重复的7位数,内存的大小限制位1MB。在此先进行初步计算,1MB=1024*1024*8=8,388,608bit,采用平均计算后,8,388,608/10000000=0.84bit,即用0.84bit存储1个7位数,显然是不可能的。意味着使用1MB的内存,是无法读入1千万个的7位数,因此首要方法都会考虑用外排序。

        我其实一开始并没有明白作者为什么一开始就想到了基于磁盘的归并排序,如果有跟我一样有问题的读者可以看以下外排序相关的介绍。

        接着作者基于该问题的特殊性,又提出了该排序问题的另一种解法,是基于该问题的特殊性,思路如下:待排序的数不大于n,根据内存大小,将n个数分成m份,在第i次,读入范围在(i-1)*n/m~(i*n/m-1)的数到内存中,在内存中采用内排序算法将本次读入的所有元素进行排序,因为是对整数进行排序,快排是个非常不错的选择。但因此需要读入输入文件m次。到目前位置,作者已经提出了两种方案,第一种是基于磁盘的归并排序(外排序),第二种是根据该问题的特殊情况采用的一种特殊排序方法,但是需要多次读入输入文件,并进行多轮排序。

        在以上两种方案之后,作者又提出了一种采用以上两种方法优点的方案,读入输入文件一次且不使用中间文件。这种方案一定要能够在1MB内存中可以表示文件中所有的整数。于是问题就变成了如何在800万个可用位表示最多1000万个互异的整数。

        基于该排序问题的特殊性:待排序的数据限制在相对较小的范围内、数据没有重复、待排序的数据是单一的整数且没有任何其他关联数据,可采用位图或者位向量来解决该问题。位图的基本思想使用第i位是0或者1来表示对应的整数是否出现过,例如用一个4位长的位图,来表示1和3出现过,应是如下形式:0101,第1和3位都是1,表示1和3出现过。

        针对上面的问题,可以构造一个长度为1000万个位的字符串,从输入文件中挨个读取输入,文件中的每个7位数都不会重复,每读入到一个7位数i,便将字符串中的第i位置为1,表示该数字出现了,进行排序的时候,从0开始遍历该字符串,出现1的数代表刚才输入文件中有对应的数值,遍历完该字符串也就是从小到大完成了排序,最后将排序结果输出到输出文件中,便完成了该问题所要求的排序结果。

编程珠玑 这不是一本具体算法的讲解或者代码编写的教程,但是从书中的字里行间,我们可以学到的是更多的软知识:对编程新的认识、更加发散的思维方式、更严格的代码要求、堪比瑞士军刀的小技巧…… 编程也许入门并不难,但是要想真正成为一名优秀的软件工程师,还是需要很多锤炼。内外兼修,方成大器。 基础篇 第一章 开篇首先作者提出一个实际问题: 如何给磁盘的某个文件排序,更具体来说就是是对一个最多包含1千万条记录,每条 阅读详情

相关推荐

编程珠玑》习题练习In Python——第一章 开篇

问题:如何给磁盘文件排序 输入:一个包含最多n个正整数的文件,每个数都小于n,其中n=10^7。如果在输入文件中有任何整数重复出现就是致命错误。没有其他数据与该数据相关联。 输出:按升序排列的输入整数的列表。 约束:最多有(大约)1MB内存空间可用,有充足的磁盘存储空间可用。运行时间最多几分钟,运行时间为10秒就不需要进一步优化了。

vincent_hbl的博客 859

编程珠玑 第2版(修订版)_编程珠玑修订_资料_

编程相关文档建议。作者写了编程中的相关注意点,值得一看。在编程中可多注意。

编程珠玑:深入浅出的编程经典

本文还有配套的精品资源,点击获取 简介:《编程珠玑》是一本计算机科学的经典之作,由Jon Bentley撰写。书中不仅详细探讨了数据结构和算法,还深入分析了问题解决策略、编程的艺术与技巧,以及性能优化。书中附带源代码分析,帮助读者通过实际案例理解理论与实践的结合,从而提升编程技能和解决问题的能力。 1. 数据结构与算法详解 简介 数据结构与算法是计算机...

weixin_33072399的博客 1083

编程珠玑 Programming Pearls 第二版(中文版+源代码)

计算机经典书籍——编程珠玑 Programming Pearls

编程珠玑.pdf

编程珠玑,适合于开发人员的一本基础教材,建议可以通读一遍,会有收获的。

MiMo-VL-7B-SFT与其他开源VLM对比:Llava、Qwen-VL、CogVLM全面评测

在当今快速发展的多模态AI领域,**MiMo-VL-7B-SFT**作为小米推出的开源视觉语言模型,以其卓越的推理能力和视觉理解表现脱颖而出。本文将深入对比MiMo-VL-7B-SFT与当前主流的开源VLM模型——Llava、Qwen-VL和CogVLM,帮助开发者和研究者了解各模型的特点、优势与适用场景。 ## 🎯 核心功能对比:四大开源VLM模型 ### 1. MiMo-VL-7B-SF

gitblog_09741的博客 766

编程珠玑》阅读小记(1)— 开篇

1. 前言久闻《编程珠玑》一书的大名,一直没有找到合适的机会深入学习阅读,最近终于得以入手,便决心投入细细的研究,提升一下自己的编程思想与技术。阅读之后才发现,这本书确实一本不可多得的好书。它以计算机领域应用与编程算法相结合,让读者面对实际问题时,不单单局限于考虑该问题的解决方案,而是在入手实践之前能够驻足于考虑,该方案是否符合当前的实际环境,它的时间与空间的消耗是否达到了一个比较好的指标。 通过

指尖飞舞 1600

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

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

远航 | FIBOS.io 4212

编程珠玑开篇

约束:至多(大概)只有1MB的可用内存,但是可用的磁盘空间非常充足,运行时间最多只允许几分钟,10分钟是最适宜的运行时间。之间的整数的文件用于测试,我们可以自己在网上找一个这样的文件,不过我希望大家可以想一下如何生成一个乱序的,不重复的至少包含。如果输入时某一整数出现两次,就会产生一个致命的错误,这些数和其他任何数据都不关联,输入:所输入的是一个文件,至多包含n个正整数,每个正整数都要小于n,这里。输出:以增序形式输出经过排序的整数列表。在解决问题之前我们需要一个包含至少有。

qq_63762353的博客 907

1. 编程珠玑笔记一开篇

1.          编程珠玑笔记一开篇 从事于IT行业,如果不会编程,那蛤蟆只能呵呵了。 有些人将编程认识为敲字,所以一直是码农。有些人将编程认识为COPY,所以一直是搬运工。我们不是工程师,我们只是IT的搬运工~ 其实编程可以不一样,是一个洞察力和创造力的集合。需要我们不停磨练编程技巧和基本的设计原理。  欢迎转载,转载请标明出处: 1、     开篇 是一个外部排序的问题,题目

badman250的专栏 3万+

编程珠玑开篇2--磁盘文件排序问题再讨论

编程珠玑开篇--磁盘文件排序问题一文中,要求输入时某个正整数不会重复出现。 如果每个整数重复出现的次数至多10次,我们应该如何修改方案呢?如果每个整数最多出现10次,那么我们就可以使用半个字节4位,统计出现的次数。相应的设置函数也应该修改: #define BITSPEREORD 8 // the type int contains 8 bit num#define SHIF

fisher_jiang的专栏 1457

编程珠玑-开篇

本书的中心思想:对实例研究的深入思考不仅有趣,而且可以获得实际的益处

分享人工智能学习心得与实践经验,探讨应用场景,见证变革与进步 704

编程珠玑开篇

开篇作者就讲的一个磁盘文件排序问题:输入:所输入的文件,至多包含n个正整数,每个正证书都小于n,题目中n = pow(10,7),如果输入时某个正整数重复出现俩次,就会产生致命的错误,这些证书与其他任何数据都不相关.输出:以增序形式输出经过排序的整数列表约束至多只有1MB(包括程序本身)可用的主存,但是可以用的磁盘空间是充足的,运行时间至多几分钟,10秒针是最适宜的运行时间

tjltail的专栏 1025

编程珠玑笔记~~开篇

1. 开篇   程序设计的问题:        输入: 所输入的是一个文件,之多包含n个正整数,每个正整数都要小于n,这里 n=10^7。如果输入时某一个整数出现了两次,就会产生一个致命的错误。这些整数与其他任何数据都不关联。          输出:以增序形式输出经过排序的整数列表               约束:至多(大概)只有1MB的可用主存,但是可用磁盘空间非常充足。运行

Fly Follow the Heart 832

引用编程珠玑开篇介绍

基础的重要性(程序员之路)         这篇引自编程珠玑的,是很多程序员应该品读的,是很多程序员在工作过程中会经常遇到的。很多时候缺少扎实的基础就会引出许许多多的BUG,可能这些都是很基本的东西,但我们往往忽略最多的可能也是基础。基础打好了,任何难题都可以迎刃而解。相反,基础没打好,是很容易出现急躁不安,只会寻求百度,谷歌一类的单一的解决办法,从事的是拷贝的工作,并没有多大的技术含

黄小东的专栏 1072

编程珠玑_第一章_ 开篇

问题: 输入:给出至多10,000,000个正整数的序列 特征:每个数都小于10,000,000、数据不重复 且 数据之间不存在关联关系(相互独立) 输出:增序输出序列 约束:内存容量1MB,磁盘空间充足,运行时间至多几分钟,10是最适宜的时间 分析:我们需要10,000,000个数表示10,000,000个位。1MB的包含8*1024*1024个位 则,所需要的内存容量为:10,00

思考,思考,再思考~ 1630

编程珠玑】第一章 开篇

编程珠玑】第一章 开篇 一. 题目       如何给磁盘文件排序?      问题描述:      输入:一个最多含有n个不重复的正整数(也就是说可能含有少于n个不重复正整数)的文件,其中每个数都小于等于n,且    n=10^7。      输出:得到按从小到大升序排列的包含所有输入的整数的列表。      条件:最多有大约1MB的内存空间可用,但磁盘空间足够。且要求运行时间在5

chenglinhust的专栏 1009

编程珠玑第一章开篇

问题描述:如何给磁盘文件排序? 输入:一个最多包含n个正整数的文件,每个数都小于n,其中n=107。如果在输入文件中有任何整数重复出现就是致命错误。没有其他数据与该整数相关联。 输出:按升序排列的输入整数的列表。 约束:最多有(大约)1MB的内存空间可用,有充足的磁盘存储空间可用。运行时间最多几分钟,运行10秒就不需要进一步优化了。 实现概要: 这个样的题目咋一看就会想到外部排序的方法。

东方吹雪的专栏 1312
上一篇: Ubuntu开机默认进入命令行模式/用户图形界面
下一篇: 架构到底是什么?
拒绝New一个对象
博客等级 码龄14年 18粉丝 22原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值