前言
“《编程珠玑》是对我职业生涯早期影响最大的书之一,其中的许多真知灼见多年之后仍然使我受益匪浅”
——Steve MrConnell, 软件工程大师, IEEE Software前主编, 《代码大全》作者
当设计程序时遇到一些问题,我们不妨深入思考一下,通过将仔细的问题定义和直接的程序设计技术结合起来,往往会得到优美的解决方案。
问题
程序设计
误区
在看到问题时候,或许我们会选择最直接的方式直接设计,也就是设计一个大小为10,000,000的数组进行存储,然后进行排序,这是最简单的想法,但是这题数据量太大了,这就导致这样设计的程序不能满足需求了。我们可以来看一下,在C语言中,10,000,000的整型数组大小为10,000,000 * 4B = 40,000,000 B ≈ 38 MB,这远比1MB大,从这一点上来说就不行,我们就需要考虑别的方法了。
别的方案
通过仔细阅读定义,我们可以发现,这一堆数据居然是不重复的,而且有极值。经过思考,我们需要一个神奇排序,通过读入输入文件,将文件按照升序或降序的方式排好,然后放入存储空间,我们这里还是需要解决存储空间的问题。
经过思考,我们是不是会想到,用0和1来存储呢?乔恩·本特利在《编程珠玑》中给出了答案,我们建立一个从0到10,000,000的数组,数组元素占用的空间仅有2bit,也就是说数组元素只有0和1,我们用0表示没有这个元素,用1表示这个元素存在。
这里举例:我们将0,2,4,5放在数组中,这个数组就是110101,这里用图来帮助理解:
这样我们占用的存储空间大小就是10,000,000 * 2b ≈ 1.19 MB 了,如果你要是问不是要求是1MB吗,这其实也很简单,我们只要将这些数据分成两次存储输出就可以了。