我是靠谱客的博主 爱笑皮带,最近开发中收集的这篇文章主要介绍C++数据处理之求众数+排序,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1.求众数

众数是获取一个特征属性的最准确的方式,它比先求均值后筛选数据要有效得多

double Find_Mod(vector<double>&theta)
{
vector<double>theta_(theta);
int n = theta.size();
sort(theta_.begin(),theta_.end());
int i = 0;
int MaxCount = 1;
int index = 0;
while (i < n)//遍历
{
int count = 1;
int j;
for (j = i; j < n - 1; j++)
{
if (theta[j] == theta[j + 1])//存在连续两个数相等,则众数+1
{
count++;
}
else
{
break;
}
}
if (MaxCount < count)
{
MaxCount = count;//当前最大众数
index = j;//当前众数标记位置
}
++j;
i = j;//位置后移到下一个未出现的数字
}
cout << theta[index] << " " << MaxCount << endl;
return theta[index];
}

后经过一些需要将代码做出如下优化:

//若输入数据为小数,则对原数组四舍五入存入新数组
for (int i = 0; i < theta.size(); ++i)
{
theta_.push_back(round(theta[i]));
}
//对新数组中的数据进行寻找,可实现小数数组寻找众数
if (theta_[j] == theta_[j + 1])//存在连续两个数相等,则众数+1
{
count++;
}
//若想将众数数据精度精确到小数位,可由如上优化得到数据后,统计原有数据与众数之间的误差
//给定一个阈值,对筛选过后的数据进行取平均操作,如:
double error=0;
double mean=0;
double t=0;
for(int i=0;i<theta_.size();++i)
{
error=abs(theta_[i]/mod-1);//mod为得到众数
if(error<0.2{
mean+=theta_[i];
t++;
}
}
mean/=t;

2.取平均

有时候进行数据处理,拿到的数据可靠性不是很好,需要在排序后进行剪枝,即剪掉最小值与最大值两侧的部分数据

double get_Mean(vector<double>&data)
{
int pruning = 0;
double mean_ = 0;
sort(data.begin(), data.end());
//剪枝
pruning = data.size() / 10;
int num = data.size() - pruning * 2;
mean_ = accumulate(data.begin() + pruning, data.end() - pruning, 0) / num;
//cout << "mean_area = " << mean_area << endl;
return mean_;
}

3.排序

C++中常用排序就STL中的sort,或者自己实现主流的一些排序算法:冒泡等

//升序排列
vector<double>data;
sort(data.begin(),data.end());

由于工作需要,归纳了一下类似于matlab中sortrow函数中的功能,对点坐标或者矩阵的某一行/列进行排序,得到排序后的点集,以下代码实现按照点集的x、y坐标分别进行排序

vector<Point> points_sort(vector<Point2f>&points, int flag)
{
double n = points.size();
vector<Point>result;
if (flag == 0)
{
double i, j, k;
double t, u;
for (i = 0; i < n - 1; ++i)
{
k = i;
for (j = i + 1; j < n; ++j)
{
if (points[k].x > points[j].x)
k = j;
}
if (k != i)
{
t = points[k].x;
points[k].x = points[i].x;
points[i].x = t;
u = points[k].y;
points[k].y = points[i].y;
points[i].y = u;
}
}
//将排序后的坐标点存放到一个新容器当中
for (int i = 0; i < n; i++)
result.push_back(points.at(i));
}
else if (flag == 1)
{
double i, j, k;
double t, u;
for (i = 0; i < n - 1; ++i)
{
k = i;
for (j = i + 1; j < n; ++j)
{
if (points[k].y > points[j].y)
k = j;
}
if (k != i)
{
t = points[k].y;
points[k].y = points[i].y;
points[i].y = t;
u = points[k].x;
points[k].x = points[i].x;
points[i].x = u;
}
}
//将排序后的坐标点存放到一个新容器当中
for (int i = 0; i < n; i++)
result.push_back(points.at(i));
}
return result;
}

4.排序求众数

//求众数,返回<众数个数,众数值>
vector<int> getMajorityEle(vector<int>& src_vect)
{
sort(src_vect.begin(), src_vect.begin());
vector<int> numSet;
vector<int> count;
numSet.push_back(src_vect[0]);
count.push_back(1);
int m = 0;
for (int i = 1; i < src_vect.size(); i++)
{
if (src_vect[i] != src_vect[i - 1])
{
numSet.push_back(src_vect[i]);
count.push_back(1);
m++;
}
else
{
count[m]++;
}
}
int max = count[0];
for (int i = 0; i < count.size(); i++)
{
if (max < count[i])
max = count[i];
}
vector<int> res;
res.push_back(max);
for (int i = 0; i < count.size(); i++)
{
if (count[i] == max)
res.push_back(numSet[i]);
continue;
}
return res;
}

后续有时间再补充一下其他经典排序算法,感兴趣的伙伴可以在评论区补充交流,谢谢查看

最后

以上就是爱笑皮带为你收集整理的C++数据处理之求众数+排序的全部内容,希望文章能够帮你解决C++数据处理之求众数+排序所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部