当合并在Timsort中的A,B中运行时(在merge_lo函数中),它说:“在合并结束时还必须拥有ssa.keys [na-1]”。为什么?

时间:2019-01-23 15:44:59

标签: timsort

A和B是堆栈上的相邻行,A是最底部的行和较小的行(如果B较小,则merge_hi将执行合并,但同样的问题也适用于此)。我一直在试图弄清楚为什么A的最后一个元素必须大于B的最后一个元素,因为我看不到运行分解(或算法的其余部分)如何确保该条件。另外,在同一函数中,代码似乎暗示B的第一个元素总是小于A的第一个元素,我也不知道为什么,但是我猜这个问题的答案与答案有关第一个问题。

1 个答案:

答案 0 :(得分:0)

简而言之,疾驰是原因。这就是为什么我们最初没有看到它的原因,因为我认为gallop_ {left} right}仅从merge _ {lo,{ {1}}}。但这不是真的。也依次从hi,{em>之前调用gallop_ ... merge_at _ {mergelo}找到“ b从a哪里开始?”和“ b的结尾在哪里?”。那些调用(和后续代码) change hi(及其长度ssb),还有nb及其长度ssa,这样标题不变。

也就是说,要点是A和B不是要排序的原始列表中的“在运行堆栈上相邻运行”。在调用na _ {mergelo}之前,将它们修剪掉,以使标题中的条件成立。也就是说,在A与B合并之前,不考虑B大于A的最后一个元素的元素explicitly。换句话说,“由于合并hi必须具有ssa.keys[na-1]并不是因为ssa.keys[na-1]的某些特殊属性,而是因为我们在其中定义了“合并结束”这样的方式。 :-)

这也意味着,当您自己实现Timsort时,如果您不进行讨论,则还必须忽略此处讨论的优化,否则代码将无法正常工作。