算法分析实验,保存备用,同时供参考交流,如有问题,请提出!
#include<iostream> #include<vector>
using namespace std; vector<pair<double, double> > FirstMethod(vector<pair<double,double> > point) { vector<pair<double, double> > maxPoint;//存储极大集点 vector<pair<double, double> >::iterator it1; vector<pair<double, double> >::iterator it2; /*找极大点集*/ for (it1 = point.begin(); it1 != point.end(); it1++) { /*最后一个点直接加入点集*/ if(it1 == (point.end()-1)) maxPoint.push_back(*it1); /*循环挨个对比it1后面的所有元素,如果存在y值大的跳出循环,否则it1为极大值点*/ for (it2 = (it1 + 1); it2 != point.end(); it2++) { if ((*it2).second >= (*it1).second) break; else if (it2 == (point.end() - 1)) maxPoint.push_back(*it1); } } return maxPoint; } /*point为输入的平面的点集,num为点的个数*/ vector<pair<double, double> > SecondMethod(vector<pair<double, double> > point , int num) { vector<pair<double, double> > maxPoint; vector<pair<double, double> > leftPoint; vector<pair<double, double> > rightPoint; vector<pair<double, double> > leftMaxPoint; vector<pair<double, double> > rightMaxPoint; vector<pair<double, double> >::iterator it1; vector<pair<double, double> >::iterator it2; int a; /*如果点集个数为1,直接加入极大值集中*/ if (num == 1) maxPoint.push_back(point[0]); else { /*考虑点集个数为奇数的情况*/ if (num % 2 == 1) { for (int i = 0; i < ((num / 2) + 1); i++)//拆分为两部分(左) { leftPoint.push_back(point[i]); } for (int j = (num / 2)+1; j < num; j++)//拆分为两部分(右) { rightPoint.push_back(point[j]); } leftMaxPoint = SecondMethod(leftPoint, (num / 2)+1);//递归调用左边的点集 rightMaxPoint = SecondMethod(rightPoint, num / 2); //递归调用右边的点集 } /*考虑点集个数为偶数的情况*/ else { for (int i = 0; i < num / 2; i++) { leftPoint.push_back(point[i]); } for (int j = (num / 2); j < num; j++) { rightPoint.push_back(point[j]); } leftMaxPoint = SecondMethod(leftPoint, num / 2); rightMaxPoint = SecondMethod(rightPoint, num / 2); } /*将左边点集的极大点集扫描,如果存在y值小于 右边点集的极大集点中y值的,删掉*/ for (it1 = leftMaxPoint.begin(); it1 != leftMaxPoint.end();) { a = leftMaxPoint.size();//保存原点集的大小 for (it2 = rightMaxPoint.begin(); it2 != rightMaxPoint.end(); it2++) { if ((*it1).second <= (*it2).second) { it1 = leftMaxPoint.erase(it1);//删除元素,点集大小减1,跳出循环 break; } } if (leftMaxPoint.size() == a)//没有删除元素 it1++; } /*合并所有极大值点*/ for (int i = 0; i < leftMaxPoint.size(); i++) { maxPoint.push_back(leftMaxPoint[i]); } for (int i = 0; i < rightMaxPoint.size(); i++) { maxPoint.push_back(rightMaxPoint[i]); } } return maxPoint; } int main() { vector<pair<double, double> > myMaxPoint1; vector<pair<double, double> > myMaxPoint2; vector<pair<double, double> > myPoint; vector<pair<double, double> >::iterator it1; vector<pair<double, double> >::iterator it2; int num; cout << "输入点的个数:" << endl; cin >> num; myPoint.resize(num); cout << "输入所有点:" << endl; for (int i = 0; i < num; i++) { cin >> myPoint[i].first >> myPoint[i].second; } pair<double, double> temp; /*对平面的点按照x的大小升序排列*/ for (it1 = myPoint.begin(); it1 != myPoint.end(); it1++) for (it2 = (it1 + 1); it2 != myPoint.end(); it2++) { if ((*it2).first < (*it1).first) { temp = *it1; *it1 = *it2; *it2 = temp; } } myMaxPoint1 = FirstMethod(myPoint); cout << "第一种方法极大点集为:" << endl; for (int j = 0; j < myMaxPoint1.size(); j++) { cout << myMaxPoint1[j].first << "," << myMaxPoint1[j].second << endl; } myMaxPoint2 = SecondMethod(myPoint,num); cout << "第二种方法的极大点集为:" << endl; for (int j = 0; j < myMaxPoint2.size(); j++) { cout << myMaxPoint2[j].first << "," << myMaxPoint2[j].second << endl; } return 0; }