豆瓣评分9.1,这本计算机经典名著,我读到凌晨三点

  • 时间:
  • 浏览:2
  • 来源:大发彩神APP_大发神彩APP官方

文件最多含晒 50000万条记录,每条记录全版都是7位的整数。

多多进程 设计的阶段。

代表集合中数值的位都置为1,或多或少所有的位都置为0。

https://www.epubit.com/bookDetails?id=UB6c87641132d8a

若给定表示文件中整数集合的位图数据形态学 ,则还才能 分有3个多自然阶段来编写多多进程 。第一阶段将所有的位都置为0,从而将集合初始化为空。第二阶段通过读入文件中的每个整数来建立集合,将每个对应的位都置为1。第三阶段检验每一位,可能该位为1,就输出对应的整数,由此产生有序的输出文件。令n为位向量中的位数(在本例中为10 000 000),多多进程 还才能 使用伪代码表示如下:

今日荐书 《编程珠玑 第2版》

时间—空间折中与双赢。编程文献和理论中充斥着时间—空间的折中:通过使用更多的时间,还才能 减少多多进程 所需的空间。这类于,答案5中的两趟算法让多多进程 运行时间加倍从而使空间减半。但我的经验常常是假使 的:减少多多进程 的空间需求也会减少其运行时间。①空间上高效的位图形态学 显著地减少了排序的运行时间。空间需求的减少好的反义词会因为运行时间的减少,有有3个多因为:才能 处置的数据变少了,因为处置哪几条数据所需的时间也变少了;一同将哪几条数据保占据 内存中而全版都是磁盘上,进一步处置了磁盘访问的时间。当然了,非要在原始的设计远非最佳方案时,才有可能时空双赢。

那个多多进程 员打电话把他的大现象问你,假使 朋友 花了大约一刻钟时间明确了大现象所在,并找到了位图处置方案。他花了几小时来实现你这一 几十行代码的多多进程 。该多多进程 远远优于朋友 在电话开始英语 英语 英语 时所担心的需大约一周时间编写的几百行代码的那个多多进程 。假使 多多进程 执行得减慢:磁盘上的归并排序可能才能 或多或少分钟的时间,该多多进程 所需的时间只比读取输入和写入输出所需的时间多或多或少点——大约10秒钟。答案3含晒 了对完成该任务的几种不同多多进程 的计时细节。

等一下,既然文件没办法 小,不需要非要在磁盘上进行排序呢?为哪几条没办法 了内存里进行排序呢?

你这一 实现概要可能足以处置那个多多进程 员的大现象了。习题2、习题5和习题7描述了他会遇到的或多或少实现细节。

非要在输入文件中的所有整数都还才能 在可用的1 MB内存中表示的后后 才才能实现该方案。于是大现象就归结为否是才能用大约5000万个可用位来表示最多1 000万个互异的整数。考虑本身大约的表示依据 。

(回想在前言中所提到的,for i=[0, n)表示在从0至n-1的范围内对i进行迭代。)

- END -

这位多多进程 员正在开发这类于于数据库的处置系统的一小要素,才能 排序的整数假使 免费电话号码。输入文件是电话号码的列表(已删除所有或多或少信息),号码重复老出算出错。期望的输出文件是以升序排列的电话号码列表。应用背景一同定义了相应的性能需求。当与系统的会话时间较长时,用户大约每小时请求一次有序文件,假使 在排序未完成后后 哪几条都干不了。假使 ,排序最多只允许执行几分钟,10秒钟是比较理想的运行时间。

https://item.jd.com/12243652.html

简单的设计。Antoine de Saint-Exupéry是法国作家兼飞机设计师,他假使 说过:“设计者确定其设计可能达到了完美的标准全版都是非要再增加任何东西,假使 非要再减少任何东西。”更多的多多进程 员应该使用该标准来检验此人 完成的多多进程 。简单的多多进程 通常比具有相同功能的复杂化的多多进程 更可靠、更安全、更健壮、更高效,假使 易于实现和维护。

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

请花上一分钟思考一下该大现象的规范说明。现在你打算给多多进程 员哪几条样的建议呢?

由是观之,应该用位图或位向量表示集合。可用有3个多20位长的字符串来表示有3个多所有元素都小于20的简单的非负整数集合。这类于,还才能 用如下字符串来表示集合{1, 2, 3, 5, 8, 13}:

才能 排序的内容是哪几条?文件含晒 几条条记录?每条记录的格式是哪几条?

这番对话让大现象更明确了。在美国,电话号码由3位“区号”后再跟7位数字组成。拨打含“免费”区号5000(当时非要这有3个多号码)的电话是不收费的。实际的免费电话号码数据库含晒 几滴 的信息:免费电话号码、呼叫实际中转到的号码(有时是几条号码,这时才能 或多或少规则来决定哪几条呼叫在哪几条时间中转到哪里)、主叫用户的姓名和地址等。

下图所示的方案更可取。朋友 结合上述本身依据 的优点,读输入文件仅一次,且不使用上方文件。

你还能问你或多或少或多或少与记录相关的信息吗?

本书是为多多进程 员而写的。假使 书中的习题、提示、答案和深入阅读对每此人 全版都是用。本书已用作算法、多多进程 验证和软件工程等课程的教材。附录A中的算法分类可供实际编程人员参考,该附录一同还说明了如可在算法和数据形态学 课程中使用本书。

每条记录全版都是7位的正整数,再无或多或少相关数据。每个整数最多只老出一次。

阅读本书所需的唯一背景知识假使 本身高级语言的编程经验。书中偶尔会老出或多或少高级技术(如C++中的模板等),对此熟透悉的读者还才能 跳过哪几条内容,基本上不影响阅读。

显而易见的依据 是以一般的基于磁盘的归并排序多多进程 为起点,假使 要对其进行调整,可能朋友 是对整数进行排序。假使 就还才能 将假使 的500行多多进程 减少为几十行,一同也使得多多进程 运行得减慢,假使 完成多多进程 并使之运行可能仍然才能 几天的时间。

我以为可能处置了他的大现象,假使 我的踌躇使我返回到了正确的轨道上。其后全版都是了下面的对话,楷体要素是我的大现象。

我错就错在马上回答了你这一 大现象。我告诉他或多或少有关如可在磁盘上实现归并排序的简要思路。我建议他深入研究算法教材,他似乎不太感冒。他更关心如可处置你这一 大现象,而全版都是深入学习。于是我告诉他在一本流行的多多进程 设计书里有磁盘排序的多多进程 。那个多多进程 有大约500行代码和十几条函数,我估计他最多才能 一周时间来实现和测试该代码。

我才能 在有3个多大系统中排序。可能不明的技术因为,我非要使用系统中的文件排序多多进程 。

40趟算法读入输入文件多次,写输出文件仅一次,不使用上方文件。

计算机编程有就是有方面。Fred Brooks在《人月神话》一书中为朋友 描绘了全景,他的文章强调了管理在大型软件项目中所起的关键作用。而Steve McConnell在《代码大全》一书中更具体地传授了良好的编程风格。这两本书所讨论的是好软件的关键因素和专业多多进程 员应有的形态学 。遗憾的是,仅仅熟练地运用哪几条可靠的工程原理,不见得一定才能如期完成软件并顺利运行。

对多多进程 员来说,哪几条需求加起来假使 :“如可给磁盘文件排序?”在试图处置你这一 大现象后后 ,先将已知条件组织成本身更客观、更易用的形式。

0 1 1 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0

作者:[美]乔恩·本特利(Jon Bentley)

本书每一章都独立成篇,各章之间却又有着逻辑分组。第1章至第5章构成本书的第一要素,这要素回顾了编程的基本原理:大现象定义、算法、数据形态学 以及多多进程 验证和测试。第二要素围绕时延你这一 主题展开。时延大现象有时本身特别要,又永远全版都是进入有趣编程大现象的绝佳跳板。第三要素用哪几条技术来处置排序、搜索和字符串等重要大现象。

从哪几条事实中还才能 总结出该实例研究所得到的第有3个多结论:对小大现象的仔细分析有时还才能 得到明显的实际益处。在该实例中,几分钟的仔细研究还才能 大幅削减代码的长度、多多进程 员时间和多多进程 运行时间。Chuck Yeager将军(第有3个多超音速飞行的人)赞扬一架飞机的机械系统时用的词是“形态学 简单、部件很少、易于维护、非常坚固”,该多多进程 拥有同样的属性。然而,当规范说明的或多或少因素占据 改变时,该多多进程 的特殊形态学 将不能自己修改。除了才能 精巧的编程以外,该实例阐明了如下一般原理。

本书描述了计算机编程更具魅力的一面:在可靠的工程之外,在洞察力和创造力范围内结晶而出的编程珠玑。正如自然界中的珍珠来自于磨砺牡蛎的细沙一样,哪几条编程珠玑来自于磨砺多多进程 员的实际大现象。书中的多多进程 都很有趣,传授了重要的编程技巧和基本的设计原理。

在朋友 的实际大现象中,每个7位十进制整数表示有3个多小于1 000万的整数。朋友 使用有3个多具有1 000万个位的字符串来表示你这一 文件,其中,当且仅当整数i在文件中占据 时,第i位为1。(那个多多进程 员后后 找到了500万个稀疏位,习题5研究了最大存储空间严格限制为1 MB的情况。)你这一 表示利用了该大现象的有3个多在排序大现象中不常见的属性:输入数据限制在相对较小的范围内;数据没办法 重复;假使 对于每条记录而言,除了单一整数外,没办法 任何或多或少关联数据。

本书大要素内容最初发表在《ACM通讯》中我主持的“编程珠玑”专栏。哪几条内容经过汇总和修订,在1986年结集出版,成为本书的第1版。第1版的13篇文章中,有12篇全版都是本版中做了大幅修订;此外,本版还补充了3篇新的内容。

关于本书

阅读本书的有3个多提示:不需要读得飞快。要仔细阅读,一次读一章。要尝试解答书中提出的大现象——或多或少大现象才能 集中精力思考一两小时才会变得容易。假使 ,要努力解答每章末尾的习题:当读者写下答案时,从本书学到的大要素知识就会跃然纸上。如有可能,要先与朋友 和同事讨论一下此人 的思路,再去查阅本书末尾的提示和答案。每章末尾的“深入阅读”不需要否是学术意义上的参考文献表,假使 我推荐的或多或少好书,哪几条书是我此人 藏书的重要要素。

为哪几条非要此人 编写排序多多进程 呢?为哪几条不需要系统提供的排序功能呢?

输入:有3个多最多含晒 n个正整数的文件,每个数都小于n,其中n=107。可能在输入文件含晒 任何整数重复老出假使 致命错误。没办法 或多或少数据与该整数相关联。

多趟算法。哪几条算法多趟读入其输入数据,每次完成一步。在1.3节可能见到了有3个多40趟算法,习题5鼓励读者去完成有3个多两趟算法。

一位多多进程 员曾问我有3个多很简单的大现象:“如可给有3个多磁盘文件排序?”想当年我是一上来就犯了错误,现在,在讲你这一 故事后后 ,先给朋友 有3个多可能,看看还才能 比我当年做得更好。让我如可回答上述大现象呢?

多年以来,当让多多进程 员推选喜爱的计算机图书时,《编程珠玑》一直占据 前列。正如自然界里珍珠出自细沙对牡蛎的磨砺,计算机科学大师乔恩·本特利以其独有的洞察力和创造力,从磨砺多多进程 员的实际大现象中凝结出一篇篇编程“珠玑”,成为世界计算机界名刊《ACM通讯》历史上最受欢迎的专栏,最终结集为两部计算机科学经典名著,影响和激励着一代又一代多多进程 员和计算机科学工作者。本书为第一卷,主要讨论计算机科学中最本质的大现象:如可正确确定和高效地实现算法。

正确的大现象。明确大现象,这场战役就成功了90%——我很庆幸多多进程 员没办法 满足于我给出的第有3个多多多进程 。一旦正确理解了大现象,习题10、习题11和习题12的答案全版都是很优雅。在查看提示和答案后后 ,请努力思考哪几条大现象。

在书中,作者确定或多或少具有典型意义的复杂化编程和算法大现象,生动描绘了历史上大师们在探索处置方案中占据 的轶事、走过的弯路和不断精益求精的历程,引导读者像真正的多多进程 员和软件工程师那样充足创新性地思考,并透彻阐述和总结了或多或少独特而精妙的设计原则、思考和处置大现象的依据 以及实用多多进程 设计技巧。处置方案的代码均以C/C++语言编写,不仅有趣,假使 有很大的实战示范意义。每章后所附习题极具挑战性和启发性,书末给出了简洁的解答。 

归并排序读入输入文件一次,假使 在工作文件的帮助下完成排序并写入输出文件一次。工作文件才能 多次读写。

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

尽管机器有或多或少兆字节的内存,但排序功能假使 大系统中的一要素,就是有,估计到时非要1 MB的内存可用。

位图数据形态学 。该数据形态学 描述了有3个多有限定义域内的稠密集合,其中的每有3个多元素最多老出一次假使 没办法 或多或少任何数据与该元素相关联。即使哪几条条件没办法 全版满足(这类于,占据 重复元素或额外的数据),也还才能 用有限定义域内的键作为有3个多表项更复杂化的表格的索引,见习题6和习题8。

另本身处置方案更多地利用了该排序大现象的特殊性。可能每个号码都使用7字节来存储,没办法 在可用的1 MB存储空间里大约还才能 存143 000个号码。可能每个号码都使用32位整数来表示得话,在1 MB存储空间里就还才能 存储2500 000个号码。假使 ,还才能 使用遍历输入文件40趟的多多进程 来完成排序。在第一趟遍历中,将0至249 999之间的任何整数都读入内存,并对这(最多)2500 000个整数进行排序,假使 写到输出文件中。第二趟遍历排序2500 000至499 999之间的整数,依此类推,到第40趟遍历的后后 对9 7500 000至9 999 999之间的整数进行排序。对内存中的排序来说,快速排序会相当高效,假使 仅仅才能 20行代码。于是,整个多多进程 就还才能 通过一两页纸的代码实现。该多多进程 拥有所期望的形态学 ——不需要考虑使用上方磁盘文件;假使 ,为此所付出的代价是要读取输入文件40次。