求點集中存在的點,滿足:其x、y座標值不同時小於點集中任意一點的x、y座標值

問題描述

對於平面上的兩個點p1=(x1, y1)和p2=(x2,y2),如果x1<=x2且y1<=y2,則p2支配p1,給定平面上的n個點,請設計算法求其中沒有被任何其他點支配的點。

  • 換句話說,即:
    • 求點集中存在的點,滿足:其x、y座標值不同時小於點集中任意一點的x、y座標值

思路

  • O(n2)O(n^2)算法即:對於每個點分別和其他所有點比較,根據條件判斷即可
  • 考慮O(nlog2n)O(nlog_2n)算法

  • 任意一個點A,對於所有x座標大於A的x座標的點,當且僅當A的y座標是這些點中最大的y座標時,點A纔是滿足題目要求的“沒有被其他任何點支配的點”。
  • 想要快速的找出所有x座標大於A的x座標的點,可以通過排序;以x座標的關鍵字、從小到大排序時,數組下標大於A在排序後的數組下標的點就是所要找的點。
  • 一般情況下,判斷任意一點(假設爲排序後第i個)的y座標是否是i到n中最大的y座標(或者說該y座標大於i+1到n中最大的y座標),複雜度是O(n2)O(n^2)
  • 若倒序找區間最大值,則通過遞推可以降低複雜度到O(n)O(n)

  • 這是基於:倒序找最大值時,第i-n個點y座標最大值,僅與第i個點y座標、第i+1~n中y座標最大值有關

完整解法

  • 以x座標值爲關鍵字排序
  • 從第n個開始倒序比較,確定對於任意i,i<n,排序後的第i到n點的最大值
  • 在比較的過程中,已知第i+1到n點的最大值,若第i點的y座標大於該最大值,則該點爲滿足要求的點
  • 輸出所有滿足要求的點

複雜度

  • 排序爲O(nlog2n)O(nlog_2n),比較爲O(n)O(n)

代碼

  • 存儲點
struct point{
	double x, y;
}a[N];
  • 算法
sort(a+1,a+n+1);
int maxy = a[n];
for (int i=n-1;i>0;i--)
{
	if (a[i]>maxy)
	{
		printf("%d\n", i);
		maxy = a[i];
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章