假设我有n
分
(x,y1),(x2,y2),.....(xn,yn)
我的目标是以这种方式连接这些点,我得到一个没有自相交的样条。我的方法是通过增加x值的排序来对这些元素进行排序,如果它们相等,则比较y值。这是我的方法:
#include<iostream>
#include<ctime>
using namespace std;
#define N 1000
struct Point
{
int x;
int y;
}point[N];
int main()
{
int start=clock();
int n;
cout<<" enter number of coordinantes " <<endl;
cin>>n;
for(int i=1;i<=n;i++)
cin>>point[i].x>>point[i].y;
for(int i=1;i<=n-1;i++){
for(int j=i+1;j<=n;j++)
{
if(point[i].x>point[j].x)
{
int t=point[i].x;
point[i].x=point[j].x;
point[j].x=t;
}
if( point[i].x==point[j].x)
{
if(point[i].y>point[j].y)
{
int s=point[i].y;
point[i].y=point[j].y;
point[j].y=s;
}
}
}
}
int end=clock();
cout<<"coordinantes are :"<<endl;
for(int i=1;i<=n;i++)
cout<<point[i].x<<" "<<point[i].y<<endl;
cout<<(end-start)/(float)CLOCKS_PER_SEC<<endl;
return 0;
}
当我输入等于20的元素时,花了102.59毫秒(笔记本电脑有2.5 RAM,1.87 GH)。我的方法是最优的还是存在更好的方法?
答案 0 :(得分:3)
算法中的瓶颈是排序 - 即O(n^2)
。它可以在O(nlogn)
中完成 - 这渐渐好多了。
您应首先使用更快的排序对数据进行排序,然后迭代调用算法第二阶段的元素。
另请注意,从设计角度来说 - 通常这是一个很好的做法,在您的程序的各个部分之间分开 - 在您的情况下 - 在分类和之后分开遍历。
要进行排序,您可能需要查看std::sort()
,并且您可能希望熟悉quicksort
答案 1 :(得分:1)
如果你担心表现,我会指出这些事情:
1)您正在使用1000个元素 - 内存浪费。
使用* point&amp;请malloc
获取所需数量的元素。
2)你当前的实现中没有使用point [0] - 内存浪费! ; - )
3)正如其他人所说,你的排序算法不是最好的选择。
当我输入元素20的数量时,花了102.59毫秒(笔记本电脑 2.5 RAM,1.87 GH),所以它是最佳方式
处理20个元素并不能说明算法的效率。样本需要足够大才能合理地对程序进行基准测试。
答案 2 :(得分:0)
继续排序,您可以按照自己的比较标准进行排序。
boolean compare(Point A, Point B) {
return ((A.x > B.x)||((A.x==B.x)&&(A.y>B.y)));
}
(为语法道歉...我的C ++生锈了)
然后使用一个运行良好的算法(如std :: sort)和此函数作为比较顺序进行排序。