当前位置: 首页 > 知识库问答 >
问题:

当合并运行A,B时(在函数merge_lo中),它说“也必须有那个ssa.keys[na-1]属于合并的末尾”。为什么?

支阳波
2023-03-14

A和B是堆栈上的相邻运行,A是底部和较小的运行(如果B较小,merge\u hi将执行合并,但同样的问题也适用于那里)。我一直在试图找出为什么A的最后一个元素必须大于B的最后一个元素,因为我不知道运行分解(或算法的其余部分)如何确保这种条件。同样,在同一个函数中,代码似乎表明B的第一个元素总是小于A的第一个元素,我也不明白为什么,但我猜这个问题的答案与第一个问题的答案有关。

共有1个答案

左丘繁
2023-03-14

总之,奔腾是原因。这就是为什么我们一开始没有看到它,因为我认为gallop_{code>left,right}仅从合并中调用。但这不是真的<代码>gallop_。。。也从处的merge\u调用,在merge之前,调用{code>hi},以查找“b在a中从哪里开始?”还有“a在哪里以b结尾?”。这些调用(和后续代码)更改ssb(及其长度nb),以及ssa及其长度na,从而满足标题中的不变量。

也就是说,重点是A和B不是要排序的原始列表中的“runstack上的相邻运行”。在调用{code>合并{code>低,}之前,对它们进行修剪,使标题中的条件保持不变。也就是说,在A与B合并之前,明确不考虑B中大于A最后一个元素的元素。换言之,“还必须具有ssa。键[na-1]属于合并的末尾”是真的,这并不是因为ssa的某些特殊属性。键[na-1],但因为我们以这样的方式定义了“合并结束”。:-)

这也意味着,当您自己实现Timsort时,您必须忽略奔腾,也必须忽略这里讨论的优化,否则代码将无法正常工作。

 类似资料:
  • 问题内容: 在我看到的所有支持可选参数的编程语言中,都有一个模仿,即可选参数必须出现在声明的末尾。可选项目后不得包含必需的参数。是什么原因呢?我想这可能是编译器/解释器的要求。 问题答案: 好吧,如果它们在最前面,您将如何检测何时停止供应它们?唯一的方法是 在 可选参数 之后 变量类型是否不同。有点不可思议的要求,因此您只需将它们强制设置为最后是有意义的(省去了用于检测“最终”可选参数的复杂规则的

  • 问题内容: 我有3个文本字段,其中用户键入表名和2个需要合并的列名。 如何将2列值合并(合并)为1? 我使用oracle 11g企业版 问题答案: 串联?

  • 然而,今天我在处理一些代码时,意外地发现以下两个交换给出了不同的结果: 这让我难以置信。有人能给我解释一下这里发生了什么吗?

  • 问题内容: 这里有点“简单”的问题,但是 使用Eclipse进行此类操作似乎很复杂。 我有一个“ utils”项目,在其中开发了“通用”代码,例如xml解析器,记录器,数学计算,调试实用程序等。 该库基于其他几个外部库(commons-lang-3.1,colt-1.2.0,jdom-2.0.4)工作,并且它是不可运行的JAR文件(即, 没有main(),包含在其他项目中的实用程序代码)。 我想做

  • 我尝试了一些代码在Java中交换两个整数,而不使用第三个变量,即使用XOR。 以下是我尝试的两个交换函数: 该代码产生的输出如下: 我很想知道,为什么会有这样的说法: 和这个不一样?