存在n個點,如果用窮舉所有距離(n(n-1)/2個點對),時間輔助度為o(nlogn)。書上有嚴格的證明能分治在nlogn的時間界完成。
#include
#include
using namespace std;
#define maxn 100
struct point//點結構體
;//得到兩個點的距離
double distance(point a, point b)
//按x排序
bool cmp1(point a, point b)
//按y排序
bool cmp2(point a, point b)
//計算最小距離函式(分治)
double closepoints(point s, int low, int high, point rec)//傳入點集陣列,low,high和儲存兩個點的結果陣列rec
if (high - low == 2)//三個點
else if (d2 < d1&&d2 < d3)
else if (d3 < d1&&d3 < d2)
}mid = (low + high) / 2;//取中間
d1 = closepoints(s, low, mid, rec);//左遞迴
temp1[0] = rec[0];//儲存左邊結果陣列
temp1[1] = rec[1];
d2 = closepoints(s, mid + 1, high, rec);//右遞迴
temp2[0] = rec[0];//儲存右邊結果陣列
temp2[1] = rec[1];
//找到最小的距離在左邊還是在右邊
if (d1 < d2)
else
index = 0;
//遍歷mid的兩邊找到小於d的點集儲存在p陣列中
for (i = mid; (i >= low) && (s[mid].x - s[i].x) < d; i--)
for (i = mid; (i <= high) && (s[i].x - s[mid].x) < d; i++)
sort(p, p + index, cmp2);//按y排序
for (i = 0; i < index; i++)//遍歷p陣列中的點集}}
}return d;//返回最小距離
}int main()
sort(p, p + n, cmp2);//按x座標排序
cout << endl;
for (int i = 0; i < n; i++)
cout << endl;
point rec[2];
int mindistance = closepoints(p, 0, n - 1, rec);
cout << "(" << rec[0].x << "," << rec[0].y << ") ";
cout << "(" << rec[1].x << "," << rec[1].y << ")";
cout << endl;
cout << mindistance << endl;
return 0;
}
資料結構和演算法分析
1.1本書討論的內容 1.2數學知識的複習 1.3遞迴簡論 了解程式在適當輸入和巨大 輸入時的差別,明白優化代 碼採取適當資料結構的重要 指數 對數 級數 模運 算 歸納法反證法證明 指在函式的定義中使用 函式自身的方法,還較常 用於描述以自相似方法 重複事物的過程。也可 以理解為自我複製的過程。在...
資料結構 演算法和演算法分析
一 演算法的基本概念 1.什麼是演算法 演算法 演算法是對特定問題的求解步驟,是指令的有限序列。演算法的特徵 1 演算法有0或多個輸入 2 演算法至少有乙個輸出 3 演算法的每一條指令都可以執行 4 演算法的每一條指令都有確切的定義,沒有二義。5 演算法必須總能在執行有限步以後終止。2.演算法的描述...
資料結構(2) 演算法和演算法分析
資料結構與演算法之間存在著本質聯絡。演算法的定義及特性 演算法是為了解決某類為而規定的乙個有限長的操作序列。乙個演算法必須滿足一下五個重要特性。演算法的時間複雜度 一般情況下,演算法中基本語句重複執行的次數是問題規模n的某個函式f n 演算法的時間量度記作t n o f n 它表示雖問題規模n的增大...