0-1排序引理

来源:互联网 发布:linux mv 创建文件夹 编辑:程序博客网 时间:2024/05/19 23:02

《算法导论(第3版)》第8章 思考题8-7:

针对两个数组元素A[i]和A[j] (i<j) 的比较交换操作的形式如下:

COMPARE-EXCHANGE(A, i, j)    if A[i] > A[j]        exchange A[i] with A[j]

经过比较交换操作之后,我们得到A[i]≤A[j]。

遗忘比较交换算法是指算法只按照事先定义好的操作执行,即需要比较的位置下标必须事先确定好。虽然算法可能依靠待排序元素的值,也不能依赖任何之前的比较交换操作的结果。例如,下面是一个基于遗忘比较交换算法的插入排序:

INSERTION-SORT(A)    for j = 2 to A.length        for i = j-1 downto 1            COMPARE-EXCHANGE(A, i, i+1)

0-1排序引理提供了有力的方法来证明一个遗忘比较算法可以产生正确的排序结果。该引理表明,如果一个遗忘比较交换算法能够对所有只包含0和1的输入序列排序,那么它也可以对包含任意值的输入排序序列排序。

根据书上的提示,作出以下证明:

假设遗忘比较交换算法X能对所有0-1序列排序,但不能对数组A[1..n]正确排序。设A[p]是没放到正确位置的最小元素,A[q]放到了A[p]的正确位置上,A[q]>A[p]。若A[q]<A[p],则违背了A[p]的最小性。

定义只包含0和1的数组B[1..n]:若A[i]≤A[p]则B[i]=0,反之,B[i]=1。B[p]=0,B[q]=1。

下标为p的元素与下标为<p1, p2, …, pm>的元素经历一系列遗忘比较交换。实例A中,A[p]最后放到了不正确的位置。对于B[r] (r≠p),若B[rx]=B[r],则B[rx]和B[r]不交换,即使A[rx]和A[r]进行了交换;但正是由于B[rx]=B[r],效果一样。特别地,B[p]与B[px]交换当且仅当A[p]与A[px]交换。总体而言,算法的输出和A一致。比如:
输入:5 3 2 4 7
输出:2 5 3 7 4
那么
输入:1 0 0 1 1
输出:0 1 0 1 1
也许4和5交换了,但在0-1序列中它们都是1,换不换无所谓。关键在于1比0(=B[p])大。

因此,本来该放B[p] (=0)的位置,放上了B[q] (=1),算法X不能对所有0-1序列产生正确的输出。这跟假设矛盾,所以不存在这样的数组A[1..n]。即:如果一个遗忘比较交换算法能够对所有只包含0和1的输入序列排序,那么它也可以对包含任意值的输入排序序列排序。

0 0