用谎言排序

时间:2014-01-20 19:40:43

标签: sorting mergesort reliability

问题:考虑排序n个项目的问题,其中比较oracle在执行算法时最多只能存在一次。复杂性是根据使用的比较次数(oracle咨询)来衡量的。显示如何仅使用nlgn + O(n)比较对此模型中的n个项目进行排序,给出算法和正确性证明。

我得到了什么:

到目前为止,我的最佳解决方案非常简陋。我基本上实现了一种合并排序形式,唯一的区别是,与merge相比,我比较两次(因为如果存在不一致性,oracle只能说谎一次,我将比较第三次但是这只能发生一次)。

我知道有lg(n)级别的合并,并且因为我有n个元素,所以我将进行的最大比较量为2nlg(n)+1。然而,这是一个相当粗糙的上界,因为我知道两个长度为m和p的数组的合并需要m + p-1个比较(而不是m + p)。

为简单起见,如果我假设数组长度是2的幂,那么我有m = p,并且我得到总共n-1个合并。所以我可以从2nlg(n)+1中减去2(n-1),这给出了2nlg(n) - 2n - 1个比较。

不是我想要的答案。我想我会以错误的方式解决这个问题(我不认为每次合并时我都需要进行两次比较......)如果有人能帮我推进正确的方向,我将非常感激!

干杯,

萨沙

1 个答案:

答案 0 :(得分:1)

我的解决方案:

(假设我为了简化语言而按递增顺序对数字进行排序)。

1)我像往常一样做MergeSort(我的数组中最多有一个错误)

2)我通过数组比较每个索引两次到下一个(也许是第三次    如果比较结果不一致,则一次。

3)如果A [i]> A [i + 1](由甲骨文确认两次),我发现了我的错误,切换A [i + 1]和A [i],检查A [i + 1]> A [i + 2]如果是这种情况,请将A [i + 1]与A [i + 2]两次(最差情况)进行比较,依此类推(直到我达到n-2)。如果A [i + 1]> A [i + 2],则在每个阶段切换A [i + 1]和A [i + 2]。如果A [i + 1]< = A [i + 2],则向下向下比较A [i]和A [i-1]两次(最差情况)的数组,依此类推(直到i达到0)。如果A [i]> A [i-1],则在每个阶段切换A [i]和A [i-1]。

步骤1将导致少于nlgn的比较,步骤2和3最多进行4n + 1次比较。

当然所有这些都需要正式化,但我认为这是基本的想法。

如果我遗失了某些内容或者在这里完全错误,请随时告诉我。

谢谢,

萨沙