定义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
。该算法为每个q1
对删除一个maj
,并且为每个q2
对删除一个maj
。所以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。