Merge 合并两个小序列-算法

Merge 合并两个小序列-算法,merge,proof,array-algorithms,Merge,Proof,Array Algorithms,证明最多进行5次比较就足以合并长度为2和5的两个排序序列。假设输入数组是[a b c d e]和[x y] 我们首先尝试将x插入到较大的数组中。我们进行二进制搜索,但我们有一个机会:我们不是从中间开始而是稍微向左:我们检查 x< b>代码> < /p> 如果幸运的话,x落在数组的左侧(较小)部分,我们可以比较x

证明最多进行5次比较就足以合并长度为2和5的两个排序序列。

假设输入数组是
[a b c d e]
[x y]

我们首先尝试将
x
插入到较大的数组中。我们进行二进制搜索,但我们有一个机会:我们不是从中间开始而是稍微向左:我们检查<代码> x< b>代码> < /p>
  • 如果幸运的话,
    x
    落在数组的左侧(较小)部分,我们可以比较
    x
    来确定结果应该以
    xa
    还是
    ax
    开始。然后,我们为
    y
    剩下3个比较,这足以进行二进制搜索

  • 如果我们运气不好,
    x
    将落在数组的右侧(较大)部分。换句话说,
    x
    应该在
    cde
    中。我们通过检查
    x
    继续二进制搜索

    • 如果幸运的话,这是错误的,因为我们知道结果以
      abcd
      开始,然后我们可以检查
      x
      y
      来计算最后三个元素的顺序

    • 如果这是真的,我们检查
      x
      以确定序列是否应该以
      abcx
      abx
      开头。然后我们剩下2个比较,这足以对
      y
      进行二进制搜索,因为我们知道它应该在
      x
      的右侧

这当然只是一个解决方案的概要,而不是一个正式的证明。然而,它可以很容易地转化为一个正式的证明使用霍尔逻辑。情况如下:

{ a ≤ b ≤ c ≤ d ≤ e ∧ x ≤ y }
if (x < b) {
    { a ≤ b ≤ c ≤ d ≤ e ∧ x ≤ y ∧ x < b }
    if (x < a) {
        ...
    } else {
        ...
    }
} else {
    { a ≤ b ≤ c ≤ d ≤ e ∧ x ≤ y ∧ b ≤ x }
    if (x < d) {
        ...
    } else {
        ...
    }
}
{a≤ B≤ C≤ D≤ E∧ x≤ y}
if(x
谢谢。我的一位朋友(一位来自阿根廷的博士生)提出了完全相同的解决方案。不客气。一位来自瑞典的(前)博士生向他致意;-)Offtop:这是一个来自v的BSc级真实考试任务。我的国家有一所很好的大学。我想知道他们是如何在90分钟内解决像这样的5项任务的。老实说,我认为它不太适合考试。我讨厌有谜语/谜语类问题的考试。