多数投票算法(Majority Vote Algorithm)

原创 2014年11月06日 23:29:47

假设有一个数组,其中含有N个非负元素,求其中是否存在一个元素其元素个数大于等于N/2。

分析:看到这个问题最先想到的是暴力算法,将数组在O(NlogN)的时间内进行排序,然后扫描一次数组就知道是否存在满足条件的元素了。

算法实现:

int Majority_Vote_Sort(const int* a, const int n)
{
	sort(a,n);
	int count=0;
	int max = 0;
	int now = a[0];
	int res = a[0];
	for(int i=1; i<n; i++)
	{
		if(a[i] == now)
		{
			count++;
		}
		else
		{
			if(count > max)
			{
				max = count;
				res = now;
			}
			now = a[i];
			count = 0;
		}
	}
	return max;
	//return res;
}

上述算法可以在O(logN)的时间内找到满足条件的元素,但是仔细观察发现,算法中对数组的排序似乎是多余的,为此可以在算法排序处进行一定的改进便可以得到更加快速的算法。

学过hash表的同学看到这个问题通常容易想到使用一个定义一个数组count,其中数组的角标为原来数组的元素值,count数组的元素值代表了这个角标元素出现的次数,由此可以在扫面一遍数组的情况下获得原数组中各个元素的个数,从而解决此题。也可以利用hash表来替代count数组,这样做的话算法的鲁棒性会更好。

算法实现


int Majority_Vote(const int* a, const int n)
{
	int* res = new int[n];
	for(int i=0; i<n; i++)
		res[i] = 0;
	for(int i=0; i<n; i++)
		res[a[i]]++;
	int max = res[0];
	for(int i=1; i<n; i++)
	{
		if(max < res[i])
			max = res[i];
	}
	delete[] res;
	return max;
}

上述算法在时间复杂度上做到了最优,但是却花费了额外的空间复杂度,为此,查阅文献的时候发现了一个很神奇的方法A Fast Majority Vote Algorithm,此方法只需在常数空间复杂度上就可以实现上述算法的功能。

神奇算法的思路:(存在一个计数器count和一个临时存储当前元素的变量now)

  1. 如果count==0,则将now的值设置为数组的当前元素,将count赋值为1;
  2. 反之,如果now和现在数组元素值相同,则count++,反之count--;
  3. 重复上述两步,直到扫描完数组。
  4. count赋值为0,再次从头扫描数组,如果素组元素值与now的值相同则count++,直到扫描完数组为止。
  5. 如果此时count的值大于等于n/2,则返回now的值,反之则返回-1;
算法实现

int Majority_Vote_update(const int* a, const int n)
{
	struct item 
	{
		int now;
		int count;
	};
	item* t = new item;
	t->count = 0;
	for(int i=0; i<n; i++)
	{
		if(t->count == 0)
		{
			t->now = i;
			t->count = 1;
		}
		else
		{
			if(t->now == a[i])
				t->count++;
			else
				t->count--;
		}
	}
	int res=0;
	for(int i=0; i<n; i++)
	{
		if(t->now == a[i])
			res++;
	}
	if(res >= n+1/2)
		return res;
	else
		return -1;
}
上述算法只需在常数的额外空间的条件下就可以在常数的时间内判断并找出符合条件的元素。

此文仅供参考,若要挖掘算法的理论基础,请点击A Fast Majority Vote Algorithm

学过hash表的同学看到这个问题通常容易想到使用一个定义一个数组count,其中数组的角标为原来数组的元素值,count数组的元素值代表了这个角标元素出现的次数,由此可以在扫面一遍数组的情况下获得原数组中各个元素的个数,从而解决此题。也可以利用hash表来替代count数组,这样做的话算法的鲁棒性会更好。

算法实现

多数投票算法(Boyer-Moore Algorithm)详解

多数投票算法(Boyer-Moore Algorithm)详解
  • kimixuchen
  • kimixuchen
  • 2016年10月11日 19:08
  • 2044

多数投票算法

在一个数组中,元素个数为n(假设最多投票元素存在),输出元素出现次数大于n/2的数 算法思路:1、一个变量cand表示所求的元素,一个变量count统计个数,将count初始化为0.         ...
  • wuli2496
  • wuli2496
  • 2015年10月08日 22:51
  • 2825

知乎VS悟空问答:精英们的投票体系和不特定的多数人

本文作者 柳胖胖,独立互联网评论人,资深产品经理,微信号leslie0724,原文来自微信公众号“一个胖子的世界”(ID:we_the_people)。 “每个傻逼的产品经理都有一个社区梦...
  • bKMk01MZ3w
  • bKMk01MZ3w
  • 2018年01月07日 19:45
  • 52

经典排序算法锦集(深度好文)

这是今天在微博上看到的,感觉写的不错 浅显易懂,数据结构当时也没学这么多排序算法,自己整理一下,遂转之。   原文链接:http://www.cnblogs.com/kkun/archive/201...
  • acm_1361677193
  • acm_1361677193
  • 2015年09月04日 08:50
  • 777

多数投票算法 Majority Vote Algorithm

题目如下: Write a program to find the element in an array that is repeated more than half number of time...
  • feliciafay
  • feliciafay
  • 2014年01月30日 04:19
  • 9511

多数投票算法 --- A linear time majority vote algorithm

多数投票算法 --- A linear time majority vote algorithm
  • u012965373
  • u012965373
  • 2016年08月01日 10:49
  • 682

计数排序和基数排序和桶排序

本文转载于:http://www.cnblogs.com/kkun/archive/2011/11/23/2260299.html 经典排序算法 - 计数排序Counting sort 经典排序...
  • msdnwolaile
  • msdnwolaile
  • 2016年09月07日 14:46
  • 435

用Hough投票做物体检测(续)

文献: Object Detection using a Max-Margin Hough Transform, CVPR 2009. 用最大化margin的方法学习出参与投票的部分的权重, 用优化...
  • tiandijun
  • tiandijun
  • 2014年03月26日 10:16
  • 1194

多数投票算法 Majority Vote Algorithm

题目 Given an integer array of size n, find all elements that appear more  than ? n/3 ? times. The...
  • yangquanhui1991
  • yangquanhui1991
  • 2016年07月12日 23:46
  • 1517

多数算法(Majority Algorithm)

当一个序列中存在一个占大多数的的元素的时候(超过50%),该算法可以在O(1)空间和O(n)时间内找出这个元素。 步骤: 假设我们一开始从数组的开头,碰到某个元素的时候,就设置该元素为当前元素。当前出...
  • china_wanglong
  • china_wanglong
  • 2013年07月29日 16:41
  • 2073
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:多数投票算法(Majority Vote Algorithm)
举报原因:
原因补充:

(最多只允许输入30个字)