一组数据中出现次数最多的数值,叫众数,有时众数在一组数中有好几个。用M表示。 理性理解:简单的说,就是一组数据中占比例最多的那个数。
#include<iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
vector<int> v1;
int a[]={1,5,2,1,4,7,5,8,9,6,3,2,5,4,5,1,2,6,3,9,8,5,1,4,2,5,7,8,4,5,6};
int size=sizeof(a)/sizeof(a[0]);
for(int i=0;i<size;i++)
v1.push_back(a[i]);
vector< int > histogram(size,0);
vector< int >::iterator it = v1.begin();
while(it != v1.end()) histogram[*it++]++;
int mode = max_element(histogram.begin(),histogram.end()) - histogram.begin();
std::cout << "mode = " << mode << std::endl;
system("pause");
return 0;
}
时间不超过O(n),空间不超过O(1)?
1.普通方法就是排序+扫描2.如何更优化呢?3.必要性:众数若存在,则亦必中位数4.事实上:只要能找出中位数,就可以验证它是不是众数(教程方法,遍历+计数+判断)(我的方法,若min和它一样那它就是众数了)
从频繁数到众数
1.在高效的中位数算法未知之前,如何确定众数的候选呢?2.频繁数(出现次数很多的数):众数若存在,则亦必频繁数3.如何写出时间空间都高效的频繁数搜索算法?
减而治之
template<typename T> T majorElemCandidate( vector<T> A ){
T maj;
int count(0);
for(i(0);i<A.size();++i){
if(count == 0){
maj = A[i];
count++;
} else {
maj == A[i]? count++ : count--;
}
}
return maj; //假如众数存在,则为maj(但也有可能不存在)
}