《编程珠玑(第2版•修订版)》—第2章2.4节排序

本节书摘来自异步社区《编程珠玑(第2版•修订版)》一书中的第2章2.4节排序,作者【美】Jon Bentley,更多章节内容可以访问云栖社区“异步社区”公众号查看。

2.4 排序
现在我们来讨论问题C。给定一本英语单词字典(每个输入行是一个由小写字母组成的单词),要求找出所有的变位词分类。研究这个问题可以举出许多理由。首先是技术上的:获得这个问题的解决方案需要既具有正确的视角又能使用正确的工具。第二个理由更具有说服力:你总不想成为聚会中唯一一个不知道“deposit”、“dopiest”、“posited”和“topside”是变位词的人吧?如果这些理由还嫌不够,可以看一下习题6描述的现实系统中的一个相似的问题。

解决这个问题的许多方法都出奇地低效和复杂。任何一种考虑单词中所有字母的排列的方法都注定了要失败。单词“cholecystoduodenostomy”(我的字典中单词“duodenocholecystostomy”的一个变位词)有22!种排列,少量的乘法运算表明22! ≈ 1.1241021。即使假设以闪电一样的速度每百亿分之一秒执行一种排列,这也要消耗1.1109 秒。经验法则“π秒就是一个纳世纪”(见7.1节)指出1.1×109是数十年。而比较所有单词对的任何方法在我的机器上运行至少要花费一整夜的时间——在我使用的字典里有大约230 000个单词,而即使是一个简单的变位词比较也将花费至少1 微秒的时间,因此,总时间估算起来就是

230 000单词×230 000比较/单词×1微秒/比较=52 900×106微秒=52 900秒≈14.7小时

你能够找到同时避免上述缺陷的方法吗?

我们获得的啊哈!灵机一动就是标识字典中的每一个词,使得在相同变位词类中的单词具有相同的标识。然后,将所有具有相同标识的单词集中在一起。这将原始的变位词问题简化为两个子问题:选择标识和集中具有相同标识的单词。在进一步阅读之前,先好好想想这些问题。

对第一个问题,我们可以使用基于排序的标识⑦:将单词中的字母按照字母表顺序排列。“deposit”的标识就是“deiopst”,这也是“dopiest”和其他任何在该类中的单词的标识。要解决第二个问题,我们将所有的单词按照其标识的顺序排序。我所知道的关于该算法的最好描述就是Tom Cargill的翻手表示:先用一种方式排序(水平翻手),再用另一种方式排序(垂直翻手)。2.8节描述了该算法的一个实现。

编程珠玑》是由美国计算机科学家Jon Bentley编写的一本经典书籍,第二修订版pdf是该书的一种电子书格式。该书是一本关于编程问题和解决方法的指南,涵盖了算法、数据结构、程序设计等方面的知识。 第二修订版pdf相比于第一,进行了一些修订和更新。更新内容主要包括了一些新的编程问题和相应的解决方法,以及对一些已有问题的更详细的说明和讨论。此外,修订版还可能加入一些新的案例分析和实践经验,以帮助读者更好地理解和应用书中的内容。 作为一本经典的编程书籍,《编程珠玑》在计算机科学和编程领域具有很高的声誉和影响力。读者通过学习该书,可以提高自己解决编程难题的能力和思维方式,深入理解算法和数据结构的原理和应用,提升编程技巧和代码质量。 对于想要阅读《编程珠玑》的读者,选择第二修订版pdf是一种方便和经济的方式。pdf格式可以在电子设备上阅读,无需携带纸质书籍,随时随地都可以学习。而且,修订版相对于第一,内容更加全面和详细,更适合新手和有一定编程基础的读者阅读和学习。 综上所述,《编程珠玑》第二修订版pdf是一本经典的编程书籍的电子格式,通过学习该书,读者可以提高自己的编程能力和思维方式,了解算法和数据结构的原理和应用。阅读第二修订版pdf是一种便捷和经济的方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值