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

简介: 你总不想成为聚会中唯一一个不知道“deposit”、“dopiest”、“posited”和“topside”是变位词的人吧?如果这些理由还嫌不够,可以看一下习题6描述的现实系统中的一个相似的问题。

本节书摘来自异步社区《编程珠玑(第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节描述了该算法的一个实现。

相关文章
|
5月前
|
算法 Java
算法编程(十五):位1的个数
算法编程(十五):位1的个数
30 0
|
5月前
|
算法
算法编程(二十九):统计一致字符串的数目
算法编程(二十九):统计一致字符串的数目
49 0
|
6月前
|
存储 移动开发 算法
八大排序(一)--------排序的基本概念与分类
八大排序(一)--------排序的基本概念与分类
32 0
【排序引论】第二章 单机排序问题
【排序引论】第二章 单机排序问题
42 0
【排序引论】第二章 单机排序问题
|
搜索推荐
七大常见排序,你究竟懂几个?(上)(1)
七大常见排序,你究竟懂几个?(上)
93 0
七大常见排序,你究竟懂几个?(上)(1)
|
存储 算法
再学一道算法题:PAT排名汇总 (排序+存储)
再学一道算法题:PAT排名汇总 (排序+存储)
|
算法
重温算法之三数之和
双指针的查找使用范围很广,也是必须掌握的一种解题方案,由上题比对我们也可以看到,在算法中要考虑到多种情况,如果遗漏掉某一些环节,就有可能发生异常,所以算法还是对思维严谨性要求比较高的,所谓失之毫厘差之千里。
99 0
重温算法之三数之和
|
存储 缓存 算法
真•扑克牌洗牌算法实现
欢迎关注「前端西瓜哥」
171 0
[解题报告]《算法零基础100讲》(第31讲) 多维枚举(一) - 入门(2)
[解题报告]《算法零基础100讲》(第31讲) 多维枚举(一) - 入门(2)
[解题报告]《算法零基础100讲》(第31讲) 多维枚举(一) - 入门(1)
[解题报告]《算法零基础100讲》(第31讲) 多维枚举(一) - 入门(1)
[解题报告]《算法零基础100讲》(第31讲) 多维枚举(一) - 入门(1)