码迷,mamicode.com
首页 > 其他好文 > 详细

摩尔投票法

时间:2020-07-18 22:36:05      阅读:120      评论:0      收藏:0      [点我收藏+]

标签:输入数据   一半   namespace   pac   --   计数器   lse   end   name   

在一个无序数组中,存在一个数,它出现的次数大于数组长度的一半。输出这个数

 

一、排序、遍历

 

二、摩尔投票法

摩尔投票算法是一种使用线性时间和常数空间查找大部分元素序列的算法。

最简单的形式就是,查找输入中重复出现超过一半以上(必须大于n/2,等于不算)的元素。如果序列中没有这种元素,算法不能检测到正确结果,将输出其中的一个元素之一。
如果不能保证输入数据中有占有一半以上的元素,需要再遍历一下验证。

满足两个先决条件

1、出现超过一半以上(n/2)的元素有且只有一个;

2、这个元素一定存在

 

算法步骤

我们维护一个局部变量作为当前查找元素,一个局部变量作为计数器,

当遍历开始的时候,此时计数(count)为0,则将数组第一个元素作为当前查找元素;

当遍历的元素与查找元素相等,计数加1;反之则-1;

若当计数为0时,将下一个元素作为当前查找元素,继续重复以上操作;当遍历结束时,当前查找元素则为目标元素。

 
#include<iostream>
using namespace std;
int main() {
    
    int nums[100];
    int count = 1;
    int e = nums[0];
    int n, x;
    cin >> n;
    for (int i = 0; i < n; i++) {
        cin >> nums[i];
    }
    for (int i = 1; i < n; i++) {
        if (e == nums[i])
            count++;
        else if (count != 0) {
            count--;
        }
        else if (count == 0)
            e = nums[i];
    }
    cout << e << endl;

    system("pause");
    return 0;
}

 

摩尔投票法

标签:输入数据   一半   namespace   pac   --   计数器   lse   end   name   

原文地址:https://www.cnblogs.com/-citywall123/p/13336802.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!