定义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
对删除一个。所以。maj
q2
M' = 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。