摩尔投票法

摩尔投票法用于找出一组数字序列中出现次数大于总数1/2的数字。每次从序列中选择两个不同的数字删除,最后剩下的数字或相同数字集合即为所求。在示例中,通过模拟比较过程,展示了如何使用摩尔投票法找到数组nums=[3,1,4,1,1,1,6]的出现次数最多的数字1。" 54890985,1340888,机器学习笔记:多分类策略与类别不平衡处理,"['机器学习', '数据挖掘', '决策树算法', '分类', '样本均衡']

1概念理解

  1.1理解

        找出一组数字序列中出现次数大于总数1/2的数字(并且假设这个数字一定存在),显然这个数字只可能有一个。

       摩尔投票算法是基于:每次从序列里选择两个不相同的数字删除掉(或称为“抵消”),最后剩下一个数字或几个相同的数字,就是出现次数大于总数一半的那个。

1.2使用前提

      胜利者的选票必须大于总人数的1/2,即某个数字出现的次数必须比总人数的一半还要多

2思路分析

        假设有一个数组nums=[3,1,4,1,1,1,6],利用摩尔投票法,得到最终的胜利者(出现次数最多的数字)。利用摩尔投票法,即两两相护抵消,分析如下:

       用major 来存储出现次数最多的数,count来存储major抵消后剩余的次数。


  设置初值:major=3,count =1;

     第一轮比较:当前数字1,3和1不相等,则count-=1,即count=0,由于count=0,则major被重新赋值为当前比较的数字1,即major=1,同时count重新赋值1;

     第二轮比较:当前数字4,1和4不相等,则count-=1,即count=0,由于count=0,则major被重新赋值为当前比较的数字4,即major=4,同时count重新赋值1;

    第三轮比较:  当前数字1,4和1不相等,则,则count-=1,即count=0,由于count=0,则major被重新赋值为当前比较的数字1,即major=1,同时count重新赋值1;

    第四轮

### 实现摩尔投票法 摩尔投票法(Boyer–Moore Majority Vote Algorithm)是一种用于查找组中出现次数超过一半的元素的高效算法。该算法的核心思想是通过相互抵消不同元素的计来找到可能的主要元素候选者,最后验证候选者是否满足条件。 #### 单个主要元素的实现 如果目标是查找组中出现次数超过一半的主要元素,可以使用以下实现: ```python def majority_vote(nums): major = nums[0] count = 0 for num in nums: if count == 0: major = num count = 1 elif num == major: count += 1 else: count -= 1 # 验证候选者是否满足条件 if nums.count(major) > len(nums) // 2: return major else: return None ``` #### 示例用法 ```python nums = [2, 2, 1, 3, 2, 1, 2] result = majority_vote(nums) print("主要元素:", result) ``` #### 多个主要元素的实现 如果目标是查找组中出现次数超过总三分之一的两个主要元素,可以扩展摩尔投票法,同时维护两个候选者和计器: ```python def majority_vote_two(nums): major1 = nums[0] major2 = nums[0] count1 = 0 count2 = 0 for num in nums: if num == major1: count1 += 1 elif num == major2: count2 += 1 elif count1 == 0: major1 = num count1 = 1 elif count2 == 0: major2 = num count2 = 1 else: count1 -= 1 count2 -= 1 # 验证候选者是否满足条件 result = [] if nums.count(major1) > len(nums) // 3: result.append(major1) if nums.count(major2) > len(nums) // 3 and major2 != major1: result.append(major2) return result ``` #### 示例用法 ```python nums = [1, 1, 2, 1, 3, 2, 3, 2] result = majority_vote_two(nums) print("主要元素:", result) ``` ### 算法分析 1. **时间复杂度**:摩尔投票法的时间复杂度为 O(n),因为它只需要遍历组一次。 2. **空间复杂度**:算法的空间复杂度为 O(1),不需要额外的空间。 3. **适用场景**:摩尔投票法适用于无序组,尤其在需要高效查找主要元素的情况下[^1]。 ### 注意事项 - 摩尔投票法的候选者可能不是最终的主要元素,因此必须通过额外的验证步骤确认候选者的合法性。 - 如果组中不存在满足条件的主要元素,算法会返回 `None` 或空列表。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值