2020-1ํ•™๊ธฐ, ๋Œ€ํ•™์—์„œ โ€˜์•Œ๊ณ ๋ฆฌ์ฆ˜โ€™ ์ˆ˜์—…์„ ๋“ฃ๊ณ  ๊ณต๋ถ€ํ•œ ๋ฐ”๋ฅผ ์ •๋ฆฌํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค. ์ง€์ ์€ ์–ธ์ œ๋‚˜ ํ™˜์˜์ž…๋‹ˆ๋‹ค :) ์ „์ฒด ํฌ์ŠคํŠธ๋Š” Algorithm ํฌ์ŠคํŠธ์—์„œ ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

6 minute read

2020-1ํ•™๊ธฐ, ๋Œ€ํ•™์—์„œ โ€˜์•Œ๊ณ ๋ฆฌ์ฆ˜โ€™ ์ˆ˜์—…์„ ๋“ฃ๊ณ  ๊ณต๋ถ€ํ•œ ๋ฐ”๋ฅผ ์ •๋ฆฌํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค. ์ง€์ ์€ ์–ธ์ œ๋‚˜ ํ™˜์˜์ž…๋‹ˆ๋‹ค :) ์ „์ฒด ํฌ์ŠคํŠธ๋Š” Algorithm ํฌ์ŠคํŠธ์—์„œ ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

MST๋Š” weighted undirected graph G=(V,E,W)๊ฐ€ ์ž…๋ ฅ์œผ๋กœ ๋“ค์–ด์˜ฌ ๋•Œ, ์•„๋ž˜์˜ ์‹์„ ๋งŒ์กฑํ•˜๋Š” tree T=(V,Eโ€ฒ)๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

argminEโ€ฒโˆ‘eโˆˆEโ€ฒwe

Kruskalโ€™s AlgorithmPermalink

<Kruskalโ€™s Algorithm>์€ empty graph์—์„œ ์‹œ์ž‘ํ•ด ์•„๋ž˜์˜ ์ˆœ์„œ๋Œ€๋กœ Greedy ๋ฐฉ์‹์œผ๋กœ edge๋ฅผ ์„ ํƒํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

๋‚จ์€ edge ์ค‘์— ๊ฐ€์žฅ lightํ•œ edge๋ฅผ ๊ทธ๋ž˜ํ”„์— ์ถ”๊ฐ€ํ•œ๋‹ค. ๋‹จ, edge๋ฅผ ์ถ”๊ฐ€ํ–ˆ์„ ๋•Œ, ๊ทธ๋ž˜ํ”„์—์„œ cycle์ด ์ƒ๊ธฐ์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค.

ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ correctness๋Š” <cut property>์— ์˜ํ•ด ๋ณด์žฅ๋œ๋‹ค.

Theorem. Cut Property

Supp. edges in XโŠ‚E are part of a MST T of G=(V,E).

Pick any subset of nodes S for which no edge in X crosses btw S and Vโˆ–S,

and let e be the lighstest edge across this partition.

Then Xโˆช{e} is part of some MST.

ํ•ด์„ค์„ ์ข€ ํ•˜์ž๋ฉด, X๊ฐ€ MST T์˜ ๋ถ€๋ถ„์ง‘ํ•ฉ์ด๋ผ๊ณ  ํ•˜์ž. ์ด๋•Œ, ์ด X์— ๋‹จ ํ•˜๋‚˜์˜ edge๋ฅผ ์ถ”๊ฐ€ํ–ˆ์„ ๋•Œ์—๋„ ์—ฌ์ „ํžˆ MST T์˜ ๋ถ€๋ถ„์ง‘ํ•ฉ์ด ๋˜๊ฒŒ ๋งŒ๋“ค๊ณ ์ž ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด, X์˜ ๋ชจ๋“  edge๊ฐ€ cross ํ•˜์ง€ ์•Š๋„๋ก ์ง‘ํ•ฉ S, Vโˆ–S๋ฅผ ์žก์•˜์„ ๋•Œ, ๋‘ ์ง‘ํ•ฉ์„ ๊ฐ€๋กœ์ง€๋ฅด๋Š” edge ์ค‘ ๊ฐ€์žฅ lightํ•œ edge e๋ฅผ ์„ ํƒํ•ด X์— ์ถ”๊ฐ€ํ•œ๋‹ค๋ฉด, Xโˆช{e}๊ฐ€ ์—ฌ์ „ํžˆ MST์˜ ๋ถ€๋ถ„์ง‘ํ•ฉ์ด ๋œ๋‹ค๋Š” ์ •๋ฆฌ์ด๋‹ค.

Proof.

(๊ท€๋ฅ˜๋ฒ•) Assume e=(u,v)โˆ‰T.
[1] ์ด๋•Œ์˜ e๋Š” ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ S, Vโˆ–S๋ฅผ ์ž‡๋Š” ๊ฐ€์žฅ lightํ•œ edge๋‹ค.
[2] ์ด๋•Œ์˜ T๋Š” true MST T๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

We can construct a different MST Tโ€ฒ containing Xโˆช{e} by altering T slightly.

u and v are connected by a path in T which contains an edge eโ€ฒ crossing S and Vโˆ–S.

Construct a new tree Tโ€ฒ from T by removing eโ€ฒ and adding e.

Then, Tโ€ฒ is a spanning tree with cost(Tโ€ฒ)โ‰คcost(T) (์™œ๋ƒํ•˜๋ฉด, weโ‰คweโ€ฒ์ด๊ธฐ ๋•Œ๋ฌธ.) ์ด๊ฒƒ์€ ST T๊ฐ€ MST๋ผ๋Š” ์‚ฌ์‹ค์— ๋ชจ์ˆœ์ด๋‹ค. ๋”ฐ๋ผ์„œ, ์ฒ˜์Œ์— ๊ฐ€์ •ํ•œ e=(u,v)โˆ‰T๋Š” ๊ฑฐ์ง“์ด๋‹ค.

๋”ฐ๋ผ์„œ, S, Vโˆ–S๋ฅผ ์—ฐ๊ฒฐํ•  ๋•Œ, the lightest edge e๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์‹ค์ œ๋กœ MST๊ฐ€ ๋จ์ด ๋ณด์žฅ๋œ๋‹ค.


<Kruskal Algorithm>์€ <set> ์ž๋ฃŒํ˜•์„ ์‚ฌ์šฉํ•ด ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค! ๐Ÿคฉ

Algorithm: Kruskal(G, w)
(G=(V,E) is a connected undirected graph with edge weights we.)


// initialization
for all uโˆˆV do
โ€ƒโ€ƒ makeset(u)
end for

// construct empty MST
X={}

Sort the edges E by weight.

// greedy process!
for all edges {u,v}โˆˆE, in increasing order of weight
โ€ƒโ€ƒif find(u)โ‰ find(v) // cycle check!
โ€ƒโ€ƒโ€ƒโ€ƒadd edge {u,v} to X
โ€ƒโ€ƒโ€ƒโ€ƒunion(u,v) // merge two sets!
โ€ƒโ€ƒend if
end for

์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ์‚ดํŽด๋ณด๋ฉด,

  • Weight์— ๋”ฐ๋ผ ์ •๋ ฌ: O(ElogโกE)
  • makeset: V ๋ฒˆ
  • find: E ๋ฒˆ
  • union: Vโˆ’1 ๋ฒˆ

makeset, find, union ์—ฐ์‚ฐ์— ๋Œ€ํ•œ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” ์ถ”ํ›„์— Disjoint Set ํฌ์ŠคํŠธ์—์„œ ์‚ดํŽด๋ณด๊ฒ ๋‹ค.



Primโ€™s AlgorithmPermalink

<Primโ€™s Algorithm>์œผ๋กœ๋„ MST๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค. ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์•„์ด๋””์–ด๋„ ์•„์ฃผ ๊ฐ„๋‹จํ•˜๋‹ค!

<Primโ€™s Algorithm>์€ ๊ทธ๋ž˜ํ”„ G์—์„œ ๊ฐ€์žฅ lightํ•œ edge๋ฅผ ์„ ํƒํ•˜๋ฉฐ, intermediate MST X๋ฅผ grow ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค. ์ด๋•Œ, ํฌ๋ฃจ์Šค์ปฌ ๋•Œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์„ ํƒํ•œ edge๋กœ ์ธํ•ด cycle์ด ํ˜•์„ฑ๋˜์–ด์„œ๋Š” ์•ˆ ๋œ๋‹ค.

Algorithm: Prime(G, w)
(G=(V,E) is a connected undirected graph with edge weights we.)


// initialization
for all uโˆˆV
โ€ƒโ€ƒcost(u)=โˆž, and prev(u)=nil

Pick any initial node u0 and set cost(u0)=0 // ๋‹น์—ฐํ•˜๊ฒŒ๋„ ์–ด๋–ค ๋…ธ๋“œ๋ฅผ ์‹œ์ž‘์œผ๋กœ ์‚ผ๋“  ์ „ํ˜€ ์ƒ๊ด€์ด ์—†๋‹ค!

H=makequeue(V) // priority queue, using (cost, value) pair

// greedy process!
while H is not empty
โ€ƒโ€ƒv=deletemin(H)
โ€ƒโ€ƒfor each {v,z}โˆˆE
โ€ƒโ€ƒโ€ƒโ€ƒif cost(z)>w(v,z)
โ€ƒโ€ƒโ€ƒโ€ƒโ€ƒโ€ƒcost(z)=w(v,z), and prev(z)=v
โ€ƒโ€ƒโ€ƒโ€ƒโ€ƒโ€ƒdecreasekey(H,z)

ํฌ๋ฃจ์Šค์ปฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ๋‹ฌ๋ฆฌ ์ •๋ ฌ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์—, ํ”„๋ฆผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” Priority Queue๋ฅผ ์“ฐ๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” Eร—O(logโกV)=O(ElogโกV)์ด๋‹ค.

ํ”„๋ฆผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ํ˜•ํƒœ๋ฅผ ์ž˜ ์‚ดํŽด๋ณด๋ฉด, ์•ž์—์„œ ๋ดค๋˜ Dijkstraโ€™s Algorithm๊ณผ ์ƒ๋‹นํžˆ ๋น„์Šทํ•˜๋‹ค! ๋‘˜์˜ ์ฐจ์ด์ ์€ cost(โ‹…) ์—…๋ฐ์ดํŠธ rule์—์„œ ์žˆ๋Š”๋ฐ,

๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„  ์ถœ๋ฐœ ๋…ธ๋“œ s์—์„œ ๋„๋‹ฌํ•˜๋Š”๋ฐ ๋“œ๋Š” ์ตœ์†Œ ๋น„์šฉ์„ cost(โ‹…)์— ๊ธฐ๋กํ•˜๊ณ , ํ”„๋ฆผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ๋Š” ๋…ธ๋“œ v๋ฅผ MST์— ํฌํ•จ์‹œํ‚ฌ ๋•Œ์˜ ๋น„์šฉ์„ cost(โ‹…)์— ๊ธฐ๋กํ•œ๋‹ค.


ํฌ๋ฃจ์Šค์ปฌ๊ณผ ํ”„๋ฆผ์„ ๋น„๊ตํ•œ๋‹ค๋ฉด, ๊ฐœ์ธ์ ์œผ๋ก  ํ”„๋ฆผ์ด ๋” ์‰ฌ์šด ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ์™œ๋ƒํ•˜๋ฉด, ํ”„๋ฆผ์—์„œ๋Š” cycle์„ ํŒ๋‹จํ•  ํ•„์š”๋„ ์—†๊ณ , ์ •๋ง greedy์— ์ถฉ์‹คํ•˜๊ฒŒ ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•ด๋‚˜๊ฐ€๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค!


์ด์–ด์ง€๋Š” ํฌ์ŠคํŠธ์—์„œ๋Š” <Kruskalโ€™s Algorithm>์—์„œ ์–ธ๊ธ‰๋˜์—ˆ๋˜ <Disjoint Set>์— ๋Œ€ํ•ด ์‚ดํŽด๋ณธ๋‹ค. ์ด ๋ถ€๋ถ„์€ Greedy Algorithm๊ณผ ์ง์ ‘์ ์œผ๋กœ ์—ฐ๊ด€๋œ ๋ถ€๋ถ„์€ ์•„๋‹ˆ๋ฉฐ, <Disjoint Set>์ด๋ผ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๊ณ , ๊ทธ๋ฆฌ๊ณ  ๊ทธ๋•Œ์— ์‚ฌ์šฉ๋˜๋Š” ํ…Œํฌ๋‹‰์— ๋Œ€ํ•ด ๋‹ค๋ฃฌ๋‹ค.

๐Ÿ‘‰ Disjoint Set


์ถ”์ฒœ ๋ฌธ์ œPermalink

Categories:

Updated: