定义N = 2 n. 数组包含N元素。
定义为出现在数组中M的次数。maj“多数元素”的定义是M > N/2。
现在将数组分成对p[1] ... p[n]。定义q0为包含 的零个实例的对数maj。定义q1为恰好包含 的一个实例的对数maj。定义q2为恰好包含 的两个实例的对数maj。
然后N = 2 q0 + 2 q1 + 2 q2和M = q1 + 2 q2。
代入定义多数元素的不等式,并简化:
M > N / 2
q1 + 2 q2 > (2 q0 + 2 q1 + 2 q2) / 2
q1 + 2 q2 > q0 + q1 + q2
2 q2 > q0 + q2
q2 > q0
因此,包含 的两个实例的对maj的数量超过了包含 的零实例的对的数量maj。
现在定义为运行算法后出现在新数组中M'的次数。maj该算法为每一对删除一个,为maj每一q1对删除一个。所以。majq2M' = M - q1 - q2
定义N'为算法生成的新数组的大小。该算法为每对删除两个元素,为每q1对删除一个元素q2。
但是我们不知道算法为每一q0对删除了多少元素。一些q0对包含两个不同的元素,算法会删除这两个元素。但其他q0对包含相同的(非maj)元素,算法只删除一个。
一个极端是所有q0对都被完全删除。在这种情况下,算法会删除2 q0元素,所以
N - 2 q1 - q2 - 2 q0 ≤ N'
另一个极端是每q0对只删除一个元素。在这种情况下,算法会删除q0元素,所以
N - 2 q1 - q2 - q0 ≥ N'
让我们回到“多数元素”的定义,做一些代数:
M > N / 2
M - q1 - q2 > N / 2 - q1 - q2
M - q1 - q2 > (N - 2 q1 - 2 q2) / 2
M - q1 - q2 > (N - 2 q1 - q2 - q2) / 2
左边是M'。
M' > (N - 2 q1 - q2 - q2) / 2
我们可以把右手边变成N' / 2吗?首先,两边都乘以 2:
2 M' > N - 2 q1 - q2 - q2
回想一下,我们证明了q2 > q0. 所以
2 M' > N - 2 q1 - q2 - q2 > N - 2 q1 - q2 - q0
并且,由于我们推断N - 2 q1 - q2 - q0 ≥ N',
2 M' > N - 2 q1 - q2 - q0 ≥ N'
所以
2 M' > N'
M' > N' / 2
因此maj在新数组中出现了足够的时间成为新数组的多数元素。QED。