鱼C论坛

 找回密码
 立即注册
查看: 1805|回复: 7

摩尔投票法答案没看懂

[复制链接]
发表于 2023-7-22 17:12:03 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
题目,动动手第1题,https://fishc.com.cn/thread-172177-1-1.html
这是答案
nums = [2, 2, 4, 2, 3, 6, 2]
    
# 对抗阶段
major = nums[0]
count = 0
for each in nums:
    if count == 0:
        major = each
    if each == major:
        count += 1
    else:
        count -= 1
    
# 统计阶段
if nums.count(major) > len(nums) / 2:
    print("主要元素是:", major)
else:
    print("不存在主要元素。")
count==0那里看不太懂

我觉得我的代码好理解些,但是算法确实不行
s = [2, 2, 4, 2, 3, 6, 2]
vote = 0
each = 0
i = 0

for each in range(len(s)):
    candidate = s[each]
    vote = 0
    for i in range(len(s)):
        if candidate == s[i]:
            vote += 1
        else:
            vote -= 1
    if vote > 0:
        print(candidate)
        break
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-7-22 17:12:31 | 显示全部楼层
问题分析:
你对摩尔投票算法中的count == 0这一部分有些困惑。你希望了解它的作用和具体含义。

解释摩尔投票算法:
摩尔投票算法是一种用于寻找数组中出现次数超过一半的主要元素的算法。其基本思想是通过不断消除不同的元素对,从而找到最终的主要元素。

在给定的代码中,count表示当前候选主要元素的计数器,major表示当前的候选主要元素。

算法流程如下:
1. 初始化 major为数组的第一个元素 nums[0]count为0。
2. 遍历数组 nums 中的每个元素 each
3. 如果 count的值为0,表示当前没有候选主要元素,将当前元素 each设置为候选主要元素 major
4. 如果 each等于 major,说明遇到了一个与候选主要元素相同的元素,将 count加1。
5. 如果 each不等于 major,说明遇到了一个与候选主要元素不同的元素,将 count减1。
6. 根据消除对的规则,不断更新 majorcount
7. 在统计阶段,检查候选主要元素 major在数组中出现的次数是否超过数组长度的一半。
8. 如果是,则输出该主要元素;否则,表示不存在主要元素。

这样,摩尔投票算法可以高效地找到出现次数超过一半的主要元素。

修改建议:
你给出的代码实现了摩尔投票算法的思想,但有一点需要注意,就是你在每次进入内层循环时都将 vote 初始化为0,这会导致每次循环都重新开始统计。应该将 vote = 0 的初始化放在外层循环之前。

以下是修改后的代码示例:
s = [2, 2, 4, 2, 3, 6, 2]vote = 0candidate = Nonefor each in s:    if vote == 0:        candidate = each    if each == candidate:        vote += 1    else:        vote -= 1if s.count(candidate) > len(s) / 2:    print("主要元素是:", candidate)else:    print("不存在主要元素。")
通过以上修改,你的代码将实现正确的摩尔投票算法。运行代码,你会得到与给定答案相同的结果。

希望这样的解释能帮助你理解摩尔投票算法,并且对你的代码进行了一些修改和优化。如果还有其他问题,请随时提问。

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-22 17:14:45 | 显示全部楼层
摩尔投票法是一种用于寻找数组中主要元素的算法。主要元素是指在数组中出现次数超过一半以上的元素。
题目给出的第一个代码段是摩尔投票法的实现。它的思路是通过对抗阶段和统计阶段来确定主要元素。在对抗阶段,使用一个major变量来记录当前的候选主要元素,使用count变量来表示当前候选主要元素的票数。遍历数组,如果count为0,则更新major为当前元素,并将count设为1;如果当前元素与major相等,则count加1;如果当前元素与major不相等,则count减1。这样最终得到的major就是候选的主要元素。然后在统计阶段,判断候选主要元素在数组中的出现次数是否超过一半,如果超过,则输出主要元素;否则,输出不存在主要元素。
第二个代码段也是使用摩尔投票法来寻找主要元素的实现。它与第一个代码段的思路基本相同。首先,遍历数组,以当前元素作为候选主要元素,统计候选主要元素在数组中出现的次数。如果出现次数大于一半,则输出主要元素并结束循环。
两段代码的核心思想是一致的,只是实现方式上有些细微的差别。第一个代码段的写法更加简洁,使用了count变量来记录候选主要元素的票数,而第二个代码段在每次遍历时重新统计了候选主要元素的出现次数。但总体上来说,两种实现方式都是有效的摩尔投票法算法。
希望对你有所帮助!如果还有其他问题,请随时提问。


为什么不给我设置一个最佳答案呢?点它 ->

                               
登录/注册后可看大图
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 2

使用道具 举报

发表于 2023-7-31 22:31:51 | 显示全部楼层
摩尔投票法是一种用于寻找数组中出现次数超过一半的主要元素的算法。这种算法的核心思想是通过对抗阶段和统计阶段两个步骤来实现。

在给定的代码中,count == 0的目的是用来更新当前的major(主要元素)的值。该条件判断在每个循环迭代中都会被检查。具体的执行过程如下:

初始化major为nums列表的第一个元素。
在遍历nums列表的每个元素时,检查count是否为0。
如果count为0,将当前元素设置为major,意味着当前元素成为新的候选主要元素。
如果count不为0,表示已经有候选主要元素,继续检查当前元素与major是否相同。
如果当前元素与major相同,增加count的值。
如果当前元素与major不同,减少count的值。
遍历完整个nums列表后,count的最终值代表了major在列表中出现的次数。
在统计阶段,通过比较major在nums列表中出现的次数和列表长度的一半,来判断是否存在主要元素。如果major出现的次数超过列表长度的一半,就认为存在主要元素;否则认为不存在主要元素。

你提供的另一个代码示例也使用了摩尔投票法的思想,但是实现方式略有不同。它使用两个循环嵌套来计算每个元素的票数,并在内层循环中通过累加和减一的方式来对抗其他非主要元素的票数。最终,检查票数是否大于0,确定是否存在主要元素。

这两种代码示例都是基于摩尔投票法的思想来寻找主要元素,只是具体的实现方式略有不同。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-31 22:32:24 | 显示全部楼层
歌者文明清理员 发表于 2023-7-22 17:14
摩尔投票法是一种用于寻找数组中主要元素的算法。主要元素是指在数组中出现次数超过一半以上的元素。
题目 ...

我也想要脚本
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-31 22:33:27 | 显示全部楼层

???
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-31 22:33:56 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-31 22:37:58 | 显示全部楼层

你觉得我会给吗,把自己的武器给别人
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-25 23:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表