格雷厄姆演算法是找到點堆的最小凸包演算法
學習格雷厄姆演算法,需要你掌握兩個知識點
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...