【问题标题】:How do I extract an algorithm from these instructions?如何从这些指令中提取算法?
【发布时间】:2016-07-12 13:30:54
【问题描述】:

我一直在阅读The Art of Computer Programming,虽然它有一些我无法理解的高等数学,但做一些练习很有趣。

在我完成其中一个之后,我会去寻找答案,看看我是否比书中建议的更好或更差(通常更糟),但我不知道当前的答案是什么m on 试图传达。

本书的问题和建议的解决方案可以找到here

我的理解是t 可能是“缺失”元素的数量,也可能是一个一般常数,但我真正不明白的是看似任意的指令根据它们的组件对它们进行排序,在我看来,这就像在原地旋转你的轮子,因为乍一看它并没有让你更接近原始订单。并且决定(除其他外)用数字替换成对名称的一部分(文件 G 包含 n−t

所以我的问题很简单,如何从这个答案中提取算法?

澄清一点:

我了解它的目的,以及我将如何将其翻译成 C++。我不明白为什么我应该对输入文件的副本进行排序,如果是,我应该按照哪些标准进行排序,以及将对的一侧更改为数字的原因。

【问题讨论】:

  • 我能想象的唯一回应是“那个答案算法。没有什么可提取的。”。但是由于您已将其标记为 C++,我想您实际上想知道如何将算法转换为 C++。这主要是一个仔细阅读的问题。
  • 数据代表一个链表。除了第一个和最后一个元素之外,任何特定的数据值都会出现两次。将其链接到正确的顺序。
  • 通过编辑,我怀疑您错过了 TAOCP 的要点。这是最难的文本之一,所以不要指望一眼就能理解。读。每一个。单词。在这种情况下,您似乎错过了背景。 如果您在给定的约束条件下工作(无随机访问),那么您需要什么替代解决方案?因为这将是一个没有这些限制的初学者的例子。 TAOCP 是规范的 Comp.Sci 教科书,它教您如何解决缺乏明显解决方案的问题。

标签: sorting sequential taocp


【解决方案1】:

假设名称是可排序的,并且有足够数量的磁带驱动器来解决问题。将一对定义为 (name, next_name),其中 next_name 是向西的人的姓名。成对文件的副本被制作到另一个磁带上。第一个文件按名称排序,第二个文件按 next_name 排序。磁带排序是自下而上的归并排序或更复杂的变体,称为多相归并排序,但对于这个问题,标准的自下而上归并排序就足够了。对于 C++,您可以使用 std::stable_sort() 模拟磁带排序,使用 lambda 函数进行比较,第一个文件按名称排序,第二个文件按 next_name 排序。

索引术语使用 name[1] 表示最东端的名称,使用 name[n] 表示最西端的名称。

在对成对的两个文件进行初始排序后,解决方案指出“传递文件”是为了识别姓氏的下一个名称,name[n-1],但没有具体说明如何。在此过程中,我假设 name[n] 也被识别。这些文件按顺序进行比较,将第一个文件中的名称与第二个文件中的 next_name 进行比较。不匹配表示名字,name[1] 或姓氏,name[n],或者在极少数情况下,必须检查每个文件中的两者和下一个对以确定不匹配表示的内容。在识别姓氏 name[n] 时,第二个文件对中的 name 将是姓氏 name[n-1] 的下一个。

一旦知道 name[n-1] 和 name[n],就会执行使用这两个文件的类似合并操作,跳过 name[n-1] 和 name[n] 以创建具有对 (name[i] , name[i+2]) 对于 i = 1 到 n-2(按名称顺序),并且 G 有两对 (n-1, x[n-1]) 和 (n, x[n]),也按名称顺序排列(G 和 G' 在最后一步之前按名称顺序排列)。

F 被复制到 H 中,并按照算法中的描述执行迭代过程,t 每次加倍,2,4,8,...。每次通过后,F' 包含对 (x[i], x[i+t]) 为 i = 1 到 n-t,然后 G' 被排序并与 G 合并回 G',产生一个 G',其中包含按名称顺序对 (i, x[i]) 表示 i = n-t 到 n。最终,所有对都以名称顺序在 i = 1 到 n 的 G (i, x[i]) 中结束,然后 G 按索引(对的左侧部分)排序,从而产生按排序顺序的名称。

【讨论】:

  • @RiggedDeath - 我更新了答案以解释如何处理初始姓氏和姓氏旁边的名字。算法描述解释了创建初始 F 和 G 文件后如何继续。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-10-12
  • 1970-01-01
  • 2020-03-07
  • 1970-01-01
  • 2017-10-19
  • 1970-01-01
  • 2021-04-06
相关资源
最近更新 更多