摩尔投票算法(Moore’s Voting Algorithm),通常被称为“投票算法”,是一种用于在众多元素中找出出现次数超过半数的元素(即多数元素)的高效算法。这种算法特别适用于解决“多数元素问题”,即在一个序列中找出一个出现次数超过 n/2
的元素(如果存在的话)。
摩尔投票算法的核心思想
摩尔投票算法的核心思想是使用一个计数器来跟踪当前的候选元素,并通过不断更新候选元素及其计数来找到出现次数最多的元素。算法的步骤如下:
-
初始化: 设置一个候选元素
candidate
和一个计数器count
。初始时,candidate
可以是任意值,count
设为0。 -
遍历数组:
- 如果
count
为0,选择当前元素作为新的candidate
。 - 如果当前元素等于
candidate
,将count
增加1。 - 如果当前元素不等于
candidate
,将count
减少1。
- 如果
-
验证候选元素: 在第一次遍历完成后,
candidate
是可能的多数元素,但需要第二次遍历来确认其出现次数是否确实超过数组长度的一半。
代码实现
以下是摩尔投票算法的 Python 代码实现:
def moore_voting_algorithm(nums):
# 第一轮遍历:确定候选元素
candidate = None
count = 0
for num in nums:
if count == 0:
candidate = num
count += (1 if num == candidate else -1)
# 第二轮遍历:验证候选元素
count = 0
for num in nums:
if num == candidate:
count += 1
if count > len(nums) // 2:
return candidate
else:
return None
# 示例
nums = [3, 2, 3]
print(moore_voting_algorithm(nums)) # 输出:3
nums = [1, 2, 3, 4, 5, 5, 5, 5, 6]
print(moore_voting_algorithm(nums)) # 输出:5
nums = [1, 2, 3, 4]
print(moore_voting_algorithm(nums)) # 输出:None
解释
-
第一轮遍历:
candidate
是可能的多数元素候选。count
是用于追踪候选元素的计数器。- 遇到相同元素时增加
count
,遇到不同元素时减少count
,当count
为0 时,更新candidate
。
-
第二轮遍历:
- 统计
candidate
在数组中出现的次数,检查是否超过数组长度的一半。
- 统计
时间复杂度
- 时间复杂度: O(n),因为算法只需要两次遍历数组。
- 空间复杂度: O(1),仅使用常数空间来存储
candidate
和count
。
摩尔投票算法是解决多数元素问题的一种非常高效的算法,适合在大数据量场景下使用。