格雷厄姆演算法講解

2021-10-05 06:47:28 字數 1722 閱讀 3514

格雷厄姆演算法是找到點堆的最小凸包演算法

學習格雷厄姆演算法,需要你掌握兩個知識點

1.角排序

2.叉積

首先在一堆點裡選乙個點作為原點(我的選擇方式是橫座標最小或者縱座標最小,因為橫縱座標取極值的情況一定是在凸包上的,自己理解)。把這個點記做點o

然後把所有的點與o連線,根據所有線與水平線的夾角排序

談談個人對叉積的理解,如果有書的朋友可以參考《高等數學》(下)第七版同濟大學出版社。

在19頁記錄了向量a⃗×

b⃗

\vec \times \vec

a×b叉乘的公式。

書上記的是三維向量叉乘,其實我們只需要把第三維統一做0就可以,那麼這兩個向量叉乘的結果就是(ax

⋅by−

ay⋅b

x)k⃗

(a_x\cdot-a_y\cdot)\vec

(ax​⋅b

y​−a

y​⋅b

x​)k

那麼前面這個係數的正負就代表結果向量是向上還是向下,(這個方向就是我們高中物理學習的右手定則,根據右手定則判斷方向)

弄清楚叉積的正負與方向的關係(必須搞清楚),建議你在讀讀下方**,對於這個演算法的理解也就算差不多了

#include

using

namespace std;

typedef

struct point

point

(double _x,

double _y):x

(_x),y

(_y)

}point,line;

point o;

point operator

+(point &a,point &b)

point operator

-( point &a, point &b)

double

operator

*( point &a, point &b)

double

dis( point &a,point &b)

double

across

(line a,line b)

bool

cmp(point a,point b)

vector

graham

(point *p,

int n)

ret.

push_back

(p[i]);

}while

(across

(ret[ret.

size()

-1]-ret[ret.

size()

-2],o-ret[ret.

size()

-1])

<

0)ret.

erase

(ret.

end()-

1);return ret;

}int

main()

}swap

(p[0

],p[index]

);o=p[0]

;sort

(p+1

,p+n,cmp)

;

vectorans=

graham

(p,n-1)

; cout

auto x:ans)

cout<" "

}

貪心演算法之近似演算法(格雷厄姆演算法)初識

之前做了很多貪心演算法,他們都能找到最優解,這也是之所以用貪心演算法的原因。貪心演算法較之其他,最大的優勢體現在時間複雜度低,空間複雜度也比較低。對於試用貪心演算法的題型,有兩個重要特徵 貪心策略與最優子結構。貪心策略即每步採取策略的依據 最優子結構則是指問題的求解可以轉化為求解子問題的最優解。這點...

演算法 格雷編碼

二進位制的練習掌握 格雷編碼是乙個二進位制數字系統,在該系統中,兩個連續的數值僅有乙個位數的差異。要求 給乙個n,構建對應的格雷編碼 舉例 輸入 2輸出 0 1,3 2 解釋 00 001 1 11 310 2思路 觀察案例得知,格雷編碼是連續的二進位制數。規則有兩條 1,n 2,就是兩位二進位制,...

swift演算法 格雷編碼

1 描述 格雷編碼是乙個二進位制數字系統,在該系統中,兩個連續的數值僅有乙個位數的差異。給定乙個代表編碼總位數的非負整數n,列印其格雷編碼序列,格雷編碼序列必須以0開頭。例1 輸入 2 輸出 0,1,3,2 解釋 對於給定的n,其格雷編碼序列並不唯一,0,2,3,1 也是乙個有效的格雷編碼序列 00...