-
2020-10-15 18:22:40
投票算法主要用于解决数组中出现次数最多的元素问题。
投票算法的理解主要是记住数组里只有两种元素:我和我之外的元素。
比如:有个数组{0,1,2,1,2,1}
用temp存储出现次数最多的元素,count计数。
1.首先用temp存储0,count赋初值为1。
2.开始从第二个元素遍历,此时1不等于0,那么就给count–,同时当count为0时将当前遍历的元素赋值给temp,将count++。(为什么要如此操作,因为:遍历到1时,1和0都出现了一次,那么我们可以认为0可能没有1出现的次数多,于是我们就可以将1赋值给temp,将1当作出现次数最多的数字,同时将count++变为1。)
3.继续遍历到2,参照第2步,将2赋值给temp,count继续初始化为1。
4.遍历到1,将1赋值给temp,count初始化为1。
5.遍历到2…
6.遍历到1,将1赋值给temp,count初始化为1。
到此遍历完毕我们将1输出,count实际上是不同元素出现次数的一个差值,出现次数最多的的元素其最后count必然是大于0的。
核心代码如下:public static int majorityElement(int[] nums){ //投票算法 int count = 1; int temp = nums[0]; for(int i = 1;i < nums.length;i++){ if(temp == nums[i]){ count++; }else { count--; } if(count == 0){ temp = nums[i]; count = 1; } }
更多相关内容 -
Adaptive Fault Masking With Incoherence Scoring:用于测试各种投票算法的 Matlab 仿真环境-matlab开发
2021-06-01 17:47:21Matlab 中的这个模拟环境是为测试“自适应故障屏蔽与不连贯评分”论文中解释的各种投票算法而构建的。 论文请点击http://www.oncubilim.net/HataDuzeltMateryal/Hata0801/AdaptiveFaultMasking.pdf 要开始模拟,请... -
论文研究-应用分形维数的自适应张量投票算法.pdf
2019-09-11 12:10:26张量投票算法是感知聚类方法中一种比较常用的计算方法,可以应用到图像处理等各个方面,具有较强的鲁棒性,非迭代等特性。张量投票算法中尺度参数的自适应选取对于投票域的建立起着至关重要的作用。通过分形维数来... -
一种面向图像线特征提取的改进投票域的张量投票算法-论文
2021-07-08 05:56:38张量投票算法利用人类感知功能原理进行计算,它具有较强的鲁棒性、非迭代性、参数唯一性等特性,其非迭代性具有节省计算时间的显著性特征,因此,广泛应用于图像线特征提取,但在一些含有复杂噪声的图像中,却不能得到更为... -
matlab_软投票算法
2022-06-24 05:19:26软投票算法演示 可以用于传感器(信号)管理任务,也可以作为信号整合问题的解决方案。 传统投票方案和软投票方案都是基于多数投票的。主要区别在于同类传感器信号对整合信号的贡献方式。 该算法具有以下优点: ... -
算法 摩尔投票算法(图解例题)
2021-01-08 16:31:06摩尔投票算法 摩尔投票算法也叫多数投票算法 摩尔投票法,解决的问题是如何在任意多的候选人中,选出票数超过一半的那个人。注意,是超出一半票数的那个人。 假设投票是这样的,[A, C, A, A, B],ABC 是指三个候选...摩尔投票算法
摩尔投票算法也叫多数投票算法
摩尔投票法,解决的问题是如何在任意多的候选人中,选出票数超过一半的那个人。注意,是超出一半票数的那个人。
假设投票是这样的,[A, C, A, A, B],ABC 是指三个候选人。
第一张票与第二张票进行对坑,如果票不同则互相抵消掉;
接着第三票与第四票进行对坑,如果票相同,则增加这个候选人的可抵消票数;
这个候选人拿着可抵消票数与第五张票对坑,如果票不同,则互相抵消掉,即候选人的可抵消票数 -1。动画演示
应用
来源:leetcode 剑指offer 39
题目:求数组中出现次数超过一半的数字
要求:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例:
输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]
输出: 2代码
//摩尔投票 int majorityElement(int* nums, int numsSize) { int count = 0; int res = 0; for (int i = 0; i < numsSize; ++i) { if (count == 0) { ++count; res = nums[i]; } else if (nums[i] == res) { ++count; } else { --count; } } return res; }
测试截图
摩尔投票算法进阶版
来源:leetcode.229
题目:给定一个大小为 n 的整数数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素。
示例 1:
输入:[3,2,3]
输出:[3]
示例 2:
输入:[1,1,1,3,3,2,2,2]
输出:[1,2]超过n/3的数最多只能有两个。先选出两个候选人A,B。 遍历数组,分三种情况:
1、如果投A(当前元素等于A),则A的票数++;
2、如果投B(当前元素等于B),B的票数++;
3、如果A,B都不投(即当前与A,B都不相等),那么检查此时A或B的票数是否减为0:
3.1、 如果为0,则当前元素成为新的候选人;
3.2 、如果A,B两个人的票数都不为0,那么A,B两个候选人的票数均减一;遍历结束后选出了两个候选人,但是这两个候选人是否满足>n/3,还需要再遍历一遍数组,找出两个候选人的具体票数。
动画演示
代码
int* majorityElement(int* nums, int numsSize, int* returnSize) { int count1 = 0; int count2 = 0; int res1 = 0; //候选人1 int res2 = 0; //候选人2 int* arr = (int*)malloc(sizeof(int) * 2); for (int i = 0; i < numsSize; ++i) { if (res1 == nums[i]) { ++count1; continue; } if (res2 == nums[i]) { ++count2; continue; } // 第1个候选人配对 if (count1 == 0) { res1 = nums[i]; ++count1; continue; } // 第2个候选人配对 if (count2 == 0) { res2 = nums[i]; ++count2; continue; } --count1; --count2; } // 找到了两个候选人之后,需要确定票数是否满足大于 N/3 count1 = count2 = 0; for (int i = 0; i < numsSize; ++i) { if (nums[i] == res1) ++count1; else if (nums[i] == res2) ++count2; } if (count1 > (numsSize / 3) && count2 > (numsSize / 3)) { arr[0] = res1; arr[1] = res2; *returnSize = 2; return arr; } else if (count1 > (numsSize / 3)) { arr[0] = res1; *returnSize = 1; return arr; } else if (count2 > (numsSize / 3)) { arr[0] = res2; *returnSize = 1; return arr; } *returnSize = 0; return arr; }
测试截图
总结
如果至多选一个代表,那他的票数至少要超过一半(⌊ 1/2 ⌋)的票数;
如果至多选两个代表,那他们的票数至少要超过 ⌊ 1/3 ⌋ 的票数;
如果至多选m个代表,那他们的票数至少要超过 ⌊ 1/(m+1) ⌋ 的票数。 -
大数据-算法-张量投票算法及其应用.pdf
2022-04-18 03:32:11大数据-算法-张量投票算法及其应用.pdf -
基于张量投票算法的SA.R图像道路提取方法 (2009年)
2021-05-17 06:26:06阐述了张量投票算法基本原理,提出了一种利用张量投票算法从合成孔径雷达(SAR)图像中提取道路网的方法。首先利用一个比值算子和一个相关算子的融合检测算子将道路基元检测出来;然后再利用方向可调滤波器进行SAR... -
掘客投票算法的属性论方法 (2009年)
2021-06-13 23:45:17针对目 前掘客类网站中投票算法过于简单,建立了一套投票算法指标体系,并且提出了基于属性论方法的投票算法,为掘 客类网站以及其他类型的投票网站提供了一种新的投票算法。给出实际例子的投票结果更公正和客观,从而... -
大数据-算法-方向估计和张量投票算法及X射线成像的研究.pdf
2022-04-19 01:06:32大数据-算法-方向估计和张量投票算法及X射线成像的研究.pdf -
禁止刷票的投票算法
2017-10-31 11:00:06主要是算法思想。程序不完整、下载请郑重。主要算法思想:根据每天投票次数设定,统计历史投票判定能否投票、加密投票对象的ID、加密IP传输参数、对投票区间数据统计、时间戳判定等主要是防止一般的机器刷票行为。 -
基于集成学习投票算法的Android恶意应用检测.pdf
2021-09-21 20:37:19基于集成学习投票算法的Android恶意应用检测.pdf -
PCL Houghing(霍夫投票)算法的实现
2016-10-23 14:27:02通过霍夫投票算法获得旋转平移矩阵 -
【算法设计与分析】Majority Voting Algorithm-多数投票算法
2019-05-16 22:01:48对这个问题,最大投票算法的时间复杂度是O(n)(总共遍历两次数组),空间复杂度是O(1)(总共维护两个变量) 算法的思想是,如果一个数存在超过数组的一半,则这个数和其他数相互抵消,最终还是会有自己的同党剩下...问题:
有一个数组,里面是一些重复的数字。问是否存在一个数,这个数出现的次数超过了数组大小的一半?如果存在的话,这个数是多少?
例如对于数组[1,1,3,1,3,1,2],数字1的出现的次数超过了数组的一半;
而对于数组[6,6,6,7,7,7],没有数字超过数组的一半(数字6和7都出现了3次,出现的次数等于数组的一半,而没有超过数组的一半)如果题目要求的是数字出现的次数大于等于数组的一半,那多数投票算法就失效了,只能用其他方法来实现。
解决方式:
对于这个问题,最佳的算法是多数投票算法,也叫作Boyer-Moore algorithm。
对这个问题,最大投票算法的时间复杂度是O(n)(总共遍历两次数组),空间复杂度是O(1)(总共维护两个变量)算法的思想是,如果一个数存在超过数组的一半,则这个数和其他数相互抵消,最终还是会有自己的同党剩下来。
例如有一些人来投票,投的票选项分别是[1,3,2,1,1].
第一个人投1号,第二个人投3号,两个选票不同,相互抵消;
第三个人投2号,第四个人投1号,两个选票不同,相互抵消;
最后剩下一个1号投票,1号也是超过半数的投票号。再看一个例子:[1,1,3,4,2]
第1、2个人的投票将选项1的票数累加到2;
第3、4个人的投票不是1,所以抵消选项1的票数到0;
最后一个人的投票是2.
但是很明显,2号不是多数的票号。所以我们需要再遍历一次数组来判断2号票是不是多数票。这个就是多数投票算法的思想。
JAVA实现:
public int majorityVote(int nums[]) { int candidate=0,count=0; for(Integer num : nums) { if(num==candidate) { count++; }else if(count==0) { candidate=num; count=1; }else { count--; } } count=0; for(Integer num : nums) if(num==candidate) count++; if(count>Math.ceil(nums.length/2)) return candidate; return -1; // 表示没有超过半数的票 }
传进函数的参数nums数组表示选票的票号,candidate表示可能的多数票号,初始值就设为0,count可以粗略理解为多数票号超过了其他票号的票数有多少。
拓展:
leetcode 229中求的就是超过三分之一的选票。
可以轻易想到,超过数组三分之一长度的数最多有两个,不可能有三个。
例如[1,1,1,2,2,2,3,3,3]就不存在超过数组三分之一长度的数字
而数组[1,1,1,2,2,2,3,3]存在两个超过数组三分之一长度的数字1、2做法类似.
-
增强的投票算法(英文文)
2011-05-22 11:26:31增强的投票算法(英文文)增强的投票算法(英文文)增强的投票算法(英文文)增强的投票算法(英文文) -
摩尔投票算法
2019-03-19 08:57:35Boyer-Moore majority vote algorithm(摩尔投票算法)是一种线性时间复杂度和常数级空间复杂度的算法,永安里查找元素序列中的众数。它是Robert S. Boyer和J Strother Moore命名,是一种典型的流算法。 该算法的最...Boyer-Moore majority vote algorithm(摩尔投票算法)是一种线性时间复杂度和常数级空间复杂度的算法,用来查找元素序列中的众数。它是用Robert S. Boyer和J Strother Moore两人的名字命名,是一种典型的流算法。
该算法的最简单的形式,查找最多出现的元素,也就是找到一个输入中出现一半以上的重复元素。但是,如果该数不存在的话,算法将检测不到真实结果,但是仍将输出输入元素中的一个元素。 但是,我们可以再次遍历输入序列,计算返回元素出现的次数,以确定它是否真的是众数。
该算法在其局部变量中维护一个临时变量
m
和一个计数器c
,计数器初值为零。 然后我们遍历序列中的每个元素。如果c==0
,则m=x;c=1;
(其中x
表示我们遍历到的元素)。 如果m==x
,那么c++
,否则c--
。 最后返回m
即可。这可以用伪代码表示为以下步骤:
- 初始化一个元素
m
和一个计算器c=0
- 对于输入序列中的每个元素
x
- 如果
i == 0
, 那么m = x
并且i = 1
- 如果
m == x
, 那么c++
,否则的话c--
- 如果
- 返回
m
举个例子:
[ 1 1 1 2 2 3 1] m = 0, c = 0 [*1 1 1 2 2 3 1] m = 1, c = 1 [1 *1 1 2 2 3 1] m = 1, c = 2 [1 1 *1 2 2 3 1] m = 1, c = 3 [1 1 1 *2 2 3 1] m = 1, c = 2 [1 1 1 2 *2 3 1] m = 1, c = 1 [1 1 1 2 2 *3 1] m = 1, c = 0 [1 1 1 2 2 3 *1] m = 1, c = 1
实际上这个过程类似于栈。当我们碰到第一个元素
1
,我们将他压入栈中stack: 1
接着碰到一系列
1
,持续压栈,就变成了stack: 1 1 1
当我们碰到
2
,此时2
和栈顶元素1
不同,所以我们需要弹出栈顶元素,同时这个2
也不需要压栈。 后面的元素操作同理,最后返回栈顶元素。这样我们只通过m
和c
两个元素模拟了栈操作。class Solution { public: /* * @param nums: a list of integers * @return: find a majority number */ int majorityNumber(vector<int> &nums) { int c = 0, m = nums[0]; for (auto num : nums) { if (c == 0) { m = num; ++c; } else if (m == num) ++c; else --c; } // check if there is a majority int counter = 0; for (auto num : nums) { if (num == m) counter++; } if (counter < (nums.size() + 1) / 2) return -1; return m; } };
reference:
https://en.wikipedia.org/wiki/Boyer–Moore_majority_vote_algorithm
- 初始化一个元素
-
KNN算法:电影分类(投票算法)
2019-11-29 21:42:14K最近邻 (k-Nearest Neighbors,KNN) 算法是一种分类算法,也是最简单 易懂的机器学习算法,没有之一。1968年由 Cover 和 Hart 提出,应用场景有 字符识别、文本分类、图像识别等领域。该算法的思想是:一个样本与... -
行业资料-交通装置-一种基于SVM置信度的车牌字符投票算法.zip
2021-08-19 17:23:41行业资料-交通装置-一种基于SVM置信度的车牌字符投票算法.zip -
[LeetCode]169. 多数元素(java实现)投票算法
2022-03-25 08:47:22所用到的数据结构与算法思想6. 总结 1. 题目 2. 读题(需要重点注意的东西) 思路(): 3. 解法 ---------------------------------------------------解法--------------------------------------------------- ... -
Leetcode第169题Boyer-Moore 投票算法证明
2022-03-09 20:54:16Boyer-Moore 算法: 1.维护一个候选众数 candidate 和它出现的次数 count。初始时 candidate 可以为任意值,count 为 0; 2.遍历数组 nums 中的所有元素,对于每个元素 x,在判断 x 之前,如果 count 的值为 0,... -
Moore's voting最大投票算法
2017-07-03 13:49:13最近在刷LeetCode的题的时候,发现一个特别巧妙的算法:Moore’s voting algorithm。 这个算法是解决这样一个问题:从一个数组中找出出现半数以上的元素。 Moore的主页上有这个算法的介绍:A Linear Time ... -
多数投票算法(Boyer-Moore Algorithm)详解
2016-10-11 19:08:30多数投票算法(Boyer-Moore Algorithm)详解 -
张量投票算法及其使用并分析.pdf
2020-12-19 19:17:50张量投票算法及其使用并分析摘 要本文主要介绍了一种新的数据分析算法,即张量投票算法.该算法完全利用图像数据,根据张量分析,矩阵论和几何的知识,对数据点进行编译和几何阐释,再根据心理学中的Gestalt原理制定... -
多数投票算法
2017-04-18 17:08:18**多数投票算法** 在一个数组中,元素个数为n,获得元素出现次数大于n/2的数,如果有满足条件的数,输出该数;没有满足条件的数,输出-1。(使用lua实现该算法) -
多数投票算法(Boyer-Moore Algorithm)
2019-12-16 21:23:51三、算法介绍 1、传统方法: 包括但不仅限于暴力法(双重循环逐个数字判断是否为众数)、HashMap法(计数)、排序法(中位数一定为众数,因为即便从距离中点最远的两端起,众数依旧能够到达中位数的位置)、随机数... -
张量投票算法及其应用
2009-08-06 17:39:13张量投票(TensorVoting)算法是由G.Guy{31首先提出,后由M.S.Lee{41和C.K.Tang同等人所发展.这种算法源于心理学的Gestalt原理,即人类视觉系统趋于根据某种准则将所提取到的图像特征按照某种规律编组为更高层的结构,... -
通俗解释随机森林算法
2021-02-24 05:15:07最后将所有的gt通过投票uniform的形式组合成一个G,G即为我们最终得到的模型。DecisionTree是通过递归形式,利用分支条件,将原始数据集D切割成一个个子树结构,长成一棵完整的树形结构。DecisionTree最终得到的G(x)... -
优化的求众数方法 - 摩尔投票算法(算法思想+求众数的三种方法+摩尔投票算法改进版求众数 II)
2019-03-26 22:30:52摩尔投票算法是一种在线性时间O(n)和空间复杂度O(1)的情况下,在一个元素序列中查找包含最多的元素的典型的流算法。 下面用此算法来解LeetCode的169. 求众数、229. 求众数 II。 一、求众数: 给定一个大小为 n 的...