如何从这些说明中提取算法?

时间:2016-07-12 13:30:54

标签: sorting sequential taocp

我一直在阅读 The Art of Computer Programming ,虽然它有更高的数学时刻,但我无法得到,有些练习很有趣。

在我完成其中一个之后,我会回答这个问题,看看我的表现是否比本书的建议更好或更差(通常情况更糟),但是我没有得到当前的答案。我正试图传达。

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

我所理解的是t可能是'缺失'元素的数量或者可能是一般常量,但我真正不理解的是看似随意的指令,根据它们对它们进行排序组件,对我而言,看起来像是将轮子旋转到位,因为乍一看它不会让你更接近原始顺序。并且决定(以及其他方式)用数字替换配对名称的一部分(文件G包含n-t

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

有点澄清:

我理解它的目的是什么,以及如何将其转换为C ++。我不明白为什么我应该对输入文件的副本进行排序,如果是这样的话,我会按哪种标准排序,以及将对的一侧更改为数字的原因。

1 个答案:

答案 0 :(得分:0)

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

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

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

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

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