Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting 如何从这些指令中提取算法?_Sorting_Sequential_Taocp - Fatal编程技术网

Sorting 如何从这些指令中提取算法?

Sorting 如何从这些指令中提取算法?,sorting,sequential,taocp,Sorting,Sequential,Taocp,我一直在通读,虽然它有我无法理解的高等数学的时刻,但有些练习很有趣 在我做了其中一个之后,我会去寻找答案,看看我是做得比这本书所建议的更好还是更差(通常更差),但我根本不知道我正在做的这本书的答案想要传达什么 可以找到本书的问题和建议的解决方案 我所理解的是,t可能是“缺失”元素的数量,也可能是一个一般常量,但我真正不理解的是,根据元素的组成对它们进行排序的看似任意的指令,对我来说,这看起来像是在原地打转,因为乍一看,这并不能让你更接近原来的订单。以及(除其他外)用数字替换配对名称的一部分的决定

我一直在通读,虽然它有我无法理解的高等数学的时刻,但有些练习很有趣

在我做了其中一个之后,我会去寻找答案,看看我是做得比这本书所建议的更好还是更差(通常更差),但我根本不知道我正在做的这本书的答案想要传达什么

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

我所理解的是,
t
可能是“缺失”元素的数量,也可能是一个一般常量,但我真正不理解的是,根据元素的组成对它们进行排序的看似任意的指令,对我来说,这看起来像是在原地打转,因为乍一看,这并不能让你更接近原来的订单。以及(除其他外)用数字替换配对名称的一部分的决定(文件G包含n的所有配对(i,xi))−t 所以我的问题很简单,我如何从这个答案中提取算法

有点澄清:


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

假定名称是可排序的,并且有足够数量的磁带机来解决此问题。将一对定义为(name,next_name),其中next_name是西边的人的名字。将成对文件复制到另一个磁带上。第一个文件按名称排序,第二个文件按下一个名称排序。磁带排序是自底向上的合并排序或更复杂的称为多相合并排序的变体,但对于这个问题,标准的自底向上合并排序就足够了。对于C++,可以使用STD::STATELYORSO()来模拟磁带排序,使用lambda函数进行比较,按第一文件的名称排序,并用NExtNeX为第二文件排序。 索引术语使用名称[1]表示最东部的名称,名称[n]表示最西部的名称

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

已知名称[n-1]和名称[n]后,将使用这两个文件执行类似于合并的操作,跳过名称[n-1]和名称[n],为i=1到n-2(按名称顺序)创建具有对(名称[i],名称[i+2])的F,并为G创建具有两对(n-1,x[n-1])和(n,x[n])的G,也按名称顺序创建(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]),按名称顺序。最后,所有对都以G(i,x[i])结束,i=1到n,按名称顺序排列,然后G按索引(对的左侧部分)排序,结果是名称按排序顺序排列。

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