应用场景:在数组中找出多数元素----->多数票投给了谁?
摩尔投票算法仅针对与数组中已知有多数元素存在。
多数元素:多数元素的数量大于总数组数的1/2
时间复杂度:O(n)
*算法步骤:(两步)
1. 指定第一个元素为多数元素,依次判断后面的元素是否与指定多数元素相同,若相同count+=1,不同则count-=1.当count=0时,将当前元素设为多数元素,count变为1,继续依次往后直到最后一个元素,此时的多数元素是谁,谁就是我们要的多数元素。
2. 验证我们第一步得到的多数元素是不是真的是数组中的多数元素
*举例:
a=[2,2,3,5,2,2,6]
- 初始化: maj_index=0, count =1---->a[maj_index]=2
- 下一个元素是2,与a[maj_index]相同,count+1=2
- 下一个元素是3,与a[maj_index]不同,count-1=1
- 下一个元素是5,与a[maj_index]不同,count-1=0,maj_index=3, count=1,a[maj_index]=5
- 下一个元素是2,与a[maj_index]不同,count-1=0,maj_index=4,count=1,a[maj_index]=2
- 下一个元素是2,与a[maj_index]相同,count+1=2
- 下一个元素是6,与a[maj_index]不同,count-1=1------> a[maj_index]=2 所以我们的多数元素是2
- 将多数元素带入到第二部判断该元素是否真的是多数元素
- maj=2, 如果数组中有元素与maj相同,count+=1,将数组遍历一遍
- 如果count>len(list)/2---->maj=2是数组中的多数元素