【问题标题】:How does Batcher Merge work at a high level?Batcher Merge 如何在高层次上工作?
【发布时间】:2010-03-01 23:15:21
【问题描述】:

我正在尝试掌握Batcher Sort 的概念。但是,我在网上找到的大多数资源完全集中在证明或低级伪代码上。在查看证明之前,我想了解 Batcher Sort 的工作原理。有人可以在没有过于冗长的伪代码的情况下对 Batcher Sort 的工作原理(尤其是合并)进行高级概述(我想了解 Batcher Sort 背后的想法,而不是实现它)?谢谢!

【问题讨论】:

    标签: algorithm sorting parallel-processing


    【解决方案1】:

    Batcher 的排序是 mergesort 与 Batcher 的合并。

    为了合并两个数组 A 和 B,Batcher 的合并将 A 正序与 B 反序连接,创建一个双调数组。然后应用 Batcher 的双调排序。

    Batcher 的双调排序是快速排序的表亲。它将数组分成两半,进行一些交换以确保前半部分中没有元素大于后半部分中的元素,并对两半部分进行递归排序。

    一个数组是双调的,如果它可以旋转使得它的元素增加然后减少。根据遗忘排序的零一原则,证明零一输入的正确性就足够了,我们现在做出这个假设。可能性是

    0^a 1^b 0^c = 0 ... a copies ... 0 1 ... b copies ... 1 0 ... c copies ... 0 (rotate right by c positions)
    

    1^a 0^b 1^c (rotate left by a positions)
    

    其中 a、b、c 是非负整数。双调排序首先将该数组分成大小相等的两半 A 和 B。有两种可能性:

    A = 0^w
    B = 1^x 0^y 1^z
    

    A = 0^w 1^x
    B = 1^y 0^z
    

    A = 0^w 1^x 0^y
    B = 1^z
    

    或其他三个零和一互换。 Batcher 的见解是,通过将所有 i 的比较器应用于 A[i]、B[i],要么 A 全为零,B 为双调,要么 A 为双调,B 全为 1。无论哪种方式,都满足递归排序的先决条件。

    唯一不平凡的情况是

    A = 0^w 1^x
    B = 1^y 0^z
    

    及其补语。如果 w >= y,则 A, B 变为

    A = 0^(w+x)
    B = 1^y 0^(w-y) 1^x
    

    所以A全为零,B是双调的。如果 w

    A = 0^w 1^(y-w) 0^z
    B = 1^(y+z)
    

    所以 B 是全一,A 是双调的。如果我们对 A 和 B 进行递归排序,那么它们的串联就是排序后的数组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-28
      • 2019-12-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多