資料結構和演算法分析10 16(計算點對)

2021-09-10 15:42:17 字數 1604 閱讀 8334

存在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的增大...