[์ž๋ฃŒ๊ตฌ์กฐ] ๊ธฐ๋ง๊ณ ์‚ฌ Summary

2023. 7. 21. 00:37ใ†ComputerScience

 

 

 

 

# 7. Recursion

- ์žฌ๊ท€ ํ˜ธ์ถœ  ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜์™€ ๋™์ผํ•œ ํ•จ์ˆ˜ ํ˜ธ์ถœ -> ์ฆ‰ ์ž๊ธฐ ์ž์‹ ์„ ํ˜ธ์ถœ

- ๋ฌดํ•œ ํ•จ์ˆ˜ ํ˜ธ์ถœ(๋ฌดํ•œ ์žฌ๊ท€) ํ”ผํ•ด์•ผ ํ•จ -> ํƒˆ์ถœ ์กฐ๊ฑด ์ง€์ •

- recursion์€ ๋ฐ˜๋ณต๋ฌธ(iteration)์— ๋น„ํ•ด ์†๋„๊ฐ€ ๋Š๋ฆฌ๋‹ค.

 

- ๊ฐ ์—ฐ์†์ ์ธ ์žฌ๊ท€ ํ˜ธ์ถœ์€ ์‘๋‹ต์ด ์•Œ๋ ค์ง„ ์ƒํ™ฉ(๊ธฐ๋ณธ ์ƒํ™ฉ)์— ๋” ๊ฐ€๊นŒ์ด ๋‹ค๊ฐ€๊ฐ€์•ผ ํ•จ 

- ๊ธฐ๋ณธ ์‚ฌ๋ก€, base case: ๋‹ต์ด ์•Œ๋ ค์ง„ (์žฌ๊ท€ ์—†์ด ํ‘œํ˜„๋  ์ˆ˜ ์žˆ๋Š”) ๊ฒฝ์šฐ 

-> ํ•จ์ˆ˜์—์„œ ๋น„ ์žฌ๊ท€์ ์ธ ๋ฐฉ๋ฒ•์ด ์žˆ๋‚˜? 

- ๊ฐ ์žฌ๊ท€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—๋Š” ํ•˜๋‚˜ ์ด์ƒ์˜ ๊ธฐ๋ณธ ์‚ฌ๋ก€์™€, ์ผ๋ฐ˜ ์‚ฌ๋ก€(general case, ์žฌ๊ท€ ๊ตฌ๋ฌธ)๊ฐ€ ์žˆ์–ด์•ผ ํ•œ๋‹ค. // solution๊นŒ์ง€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์ƒ๊ฐํ•ด์•ผ ํ•จ

+ base case๊ฐ€ ๊ผญ ํ•˜๋‚˜์ผ ํ•„์š”๋Š” X -> ex) Quick Sort 

 

Ex) factorial์˜ base case๋Š” number == 0 -> return 1

- n * (n – 1) * … * 1  =  n * Factorial (n – 1)

-> ์žฌ๊ท€ ํ˜ธ์ถœ์€ Factorial (0)์˜ ๊ธฐ๋ณธ ์‚ฌ๋ก€, base case์— ๋” ๊ฐ€๊นŒ์ด ๋„๋‹ฌํ•จ

 

* ์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ -> ๋น„์žฌ๊ท€์ ์ธ ๋ฐฉ๋ฒ•๋„ ์žˆ์„๊นŒ? 

-> tail recursion์€ ๊ฐ€๋Šฅ

- ์žฌ๊ท€ ํ•จ์ˆ˜ ํ˜ธ์ถœ -> ๋น„์šฉ์ด ํผ 

 

* ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด 

An = An-1 + An-2  (A1, A0 = 1)

์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ 2๋ฒˆ ํ˜ธ์ถœ ์‹œ, ๋ณต์žก๋„๊ฐ€ 2^n์œผ๋กœ ์˜ฌ๋ผ๊ฐ -> ํ•จ์ˆ˜๊ฐ€ ์—ฌ๋Ÿฌ ๋ฒˆ ํ˜ธ์ถœ๋˜๋Š” ๊ฒƒ ์ง€์–‘

์˜ˆ์™ธ - ex) Quick Sort // pivot ๊ธฐ์ค€์œผ๋กœ ์ ˆ๋ฐ˜์”ฉ ๊ตฌ๊ฐ„ ๋‚˜๋ˆ„๊ธฐ ๋•Œ๋ฌธ์—, ํšจ์œจ์„ฑ ๋†’์Œ

 

* ์ˆœ์ฐจ ํƒ์ƒ‰์„ ์žฌ๊ท€ ํ•จ์ˆ˜๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜๋„ ์žˆ์Œ  ์˜ˆ์ œ๋ฅผ ์œ„ํ•œ ์˜ˆ์ œ

- base case๊ฐ€ 2๊ฐœ ์žˆ์–ด๋„ ๊ฐ€๋Šฅํ•จ์„ ๋ณด์—ฌ์คŒ – if else ๊ตฌ๋ฌธ์œผ๋กœ 1๋ฒˆ๋งŒ ํ˜ธ์ถœ๋จ (๋‘˜ ์ค‘ ํ•˜๋‚˜๋งŒ)

 

- ๋ฐ˜๋ณต๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์žฌ๊ท€ ์—†์ด ์ž‘์„ฑ๋  ์ˆ˜ ์žˆ์Œ 

- ๋ฐ˜๋ณต๋ฌธ์€ Loop (while) ์‚ฌ์šฉ, ์žฌ๊ท€๋Š” if ์กฐ๊ฑด๋ฌธ ์‚ฌ์šฉ

- ์—ฐ์‚ฐ ์†๋„ ์ธก๋ฉด์—์„œ ์ผ๋ฐ˜์ ์œผ๋กœ ์žฌ๊ท€๋Š” ๋ฐ˜๋ณต๋ฌธ๋ณด๋‹ค ํšจ์œจ์ด ๋–จ์–ด์ง 

-> ํŠน์ • ๊ฒฝ์šฐ, ์žฌ๊ท€๊ฐ€ ๊ฐ€์žฅ ํšจ์œจ์ ์ž„ (reverse print = ์†๋„ ์ธก๋ฉด์—์„œ ์žฌ๊ท€๊ฐ€ ์ด๋“์ž„)

Ex) ํฌ์ธํ„ฐ ๋ณ€์ˆ˜๊ฐ€ ์‚ฌ์šฉ๋  ๋•Œ ์ข…์ข… ๋ฐœ์ƒํ•œ๋‹ค.

 

- RevPoint – ์—ญ๋ฐฉํ–ฅ์œผ๋กœ ํ”„๋ฆฐํŠธ 

- ๋‹จ์ˆœํžˆ ๋ฐ˜๋ณต์œผ๋กœ ๊ตฌํ˜„ ์‹œ, indirection ์—ฐ์‚ฐ ๋งค์šฐ ๋งŽ์Œ -> ์žฌ๊ท€๊ฐ€ ๊ตฌํ˜„๋„ ๊น”๋”ํ•จ 

- next๊ฐ€ null์ผ ๊ฒฝ์šฐ, return ๋˜์–ด ์•„๋ž˜ line์ด ์‹คํ–‰๋จ (listPrt -> info ์ถœ๋ ฅ) 

 

* ์ด์ง„ ํƒ์ƒ‰๋„ ์žฌ๊ท€๋กœ ๊ตฌํ˜„ ๊ฐ€๋Šฅ 

Found = BinarySearch (info, 25, 0, 14) // item = 25, first = 0, last = 14

- ์ด ํ•จ์ˆ˜๋„ else if ๊ตฌ๋ฌธ์œผ๋กœ BinarySearch๊ฐ€ 2๊ฐœ ์žˆ์œผ๋‚˜, ํ•œ ๋ฒˆ์— ํ•˜๋‚˜๋งŒ ํ˜ธ์ถœ๋จ

 

* Call stack – ํ•จ์ˆ˜ ํ˜ธ์ถœ์€ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ํฌ๋‹ค 

- ์žฌ๊ท€๋Š” ์ด๋Ÿฌํ•œ ํ•จ์ˆ˜๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ, ๋˜๋„๋ก์ด๋ฉด ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒŒ ์ข‹์Œ 

- ํ•จ์ˆ˜์™€ ๋ช…๋ น์–ด๋“ค๋„ ๋ฉ”๋ชจ๋ฆฌ์— ์žˆ๋‹ค  ํ•จ์ˆ˜ ์‹คํ–‰ ์ดํ›„, return ์‹œ ๊ธฐ์กด ์œ„์น˜๋กœ ๋Œ์•„๊ฐ€์•ผ ํ•จ 

- ํ•ด๋‹น ์žฅ์†Œ๋ฅผ ๋ฐ˜ํ™˜ ์ฃผ์†Œ๋ผ๊ณ  ํ•จ

- ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ ๋Ÿฐํƒ€์ž„ ์Šคํƒ์ด ์‚ฌ์šฉ๋จ (actual params -> former params ๋„˜๊ฒจ์ค˜์•ผ ํ•จ)

+ ํ•จ์ˆ˜๋Š” only 1 copy 

- ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜ ๊ฐ’์€ ํ˜ธ์ถœ ๋ธ”๋ก ๋ฐ˜ํ™˜ ์ฃผ์†Œ๋กœ ๋‹ค์‹œ ๊ฐ€์ ธ์™€์„œ ์‚ฌ์šฉํ•จ  ๋ฐ˜ํ™˜์€ ๋ฌด์กฐ๊ฑด ๋จ

 

* ab ๊ณ„์‚ฐํ•˜๋Š” ์˜ˆ์ œ (a๋งŒํผ ๊ณ„์† (b๋ฒˆ) ๋”ํ•œ๋‹ค) 

- ์ฒซ ์ฝœ์Šคํƒ์—์„œ๋Š” ์™ธ๋ถ€์—์„œ ์ด ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ช…๋ น์–ด์˜ ์ฃผ์†Œ 100์„ ์ €์žฅํ•จ (return adr)

- b๊ฐ€ 0์ด ๋  ๋•Œ ๊นŒ์ง€ 1์”ฉ ์ค„์ด๋ฉฐ, ์žฌ๊ท€์ ์œผ๋กœ ์Šคํƒ์— ์Œ“์•„ ํ˜ธ์ถœํ•จ

- return ๋˜๋ฉด์„œ 5์”ฉ ๋”ํ•ด์ง„ ๊ฐ’์ด ๋„˜์–ด๊ฐ„๋‹ค -> ์ตœ์ข…์œผ๋กœ 10์„ ๋ฐ˜ํ™˜ (์ฃผ์†Œ 100์œผ๋กœ)

 

* Tail recursion 

- ํ•จ์ˆ˜๊ฐ€ ๋‹จ์ผ ์žฌ๊ท€ ํ˜ธ์ถœ๋งŒ ํฌํ•จ + ํ•จ์ˆ˜์—์„œ ๋งˆ์ง€๋ง‰์œผ๋กœ ์‹คํ–‰๋˜๋Š” ๋ช…๋ น๋ฌธ์ธ ๊ฒฝ์šฐ 

- tail recursion์„ ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ๋Œ€์ฒดํ•˜์—ฌ, ์žฌ๊ท€๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Œ 

 

* ์–ธ์ œ ์žฌ๊ท€๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ ์ข‹์„๊นŒ? 

- ์žฌ๊ท€ ํ˜ธ์ถœ์˜ ๊นŠ์ด๊ฐ€ ์ƒ๋Œ€์ ์œผ๋กœ ์–•์„ ๋•Œ (๊นŠ์œผ๋ฉด ์‚ฌ์šฉํ•˜๋ฉด X) 

- ๋น„์žฌ๊ท€(๋ฐ˜๋ณต) ๋ฒ„์ „๊ณผ ๊ฑฐ์˜ ๊ฐ™์€ ์–‘์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ

- ์žฌ๊ท€ ๋ฒ„์ „์ด ๋น„ ์žฌ๊ท€ ์†”๋ฃจ์…˜๋ณด๋‹ค ์งง๊ณ  ๊ฐ„๊ฒฐํ•  ๋•Œ // ๋”ฐ๋ผ์„œ ์ˆœ์ฐจํƒ์ƒ‰์€ ๋น„์žฌ๊ท€๊ฐ€ ์˜ฌ๋ฐ”๋ฆ„

 

* Quick Sort – n log n

- pivot์„ ๊ธฐ์ค€์œผ๋กœ ๋‘˜๋กœ ๋‚˜๋ˆˆ๋‹ค  ๋‚ด๋ถ€ ๋™์ž‘ ์ค‘ ์žฌ๊ท€์ ์ธ ๊ตฌ์กฐ๊ฐ€ ์žˆ๋‹ค

- ์ด์ƒ์ ์œผ๋กœ pivot์ด ์ค‘๊ฐ„ ๊ฐ’์œผ๋กœ ๋‚˜์˜ฌ ๊ฒฝ์šฐ n log n, ์ตœ์•…์˜ ๊ฒฝ์šฐ(๋ ๊ฐ’)  n^2

- 1๋ฒˆ์งธ ๊ฐ’์„ (0๋ฒˆ index) pivot์œผ๋กœ ์žก๊ณ , ์™ผ์ชฝ์—์„œ๋ถ€ํ„ฐ ํฐ ๊ฐ’์„ (์•ˆ ์–ด์šธ๋ฆฌ๋Š”) first๋กœ ํƒ์ƒ‰, ์˜ค๋ฅธ์ชฝ ๋๋ถ€ํ„ฐ pivot๋ณด๋‹ค ์ž‘์€ ๊ฐ’์„last๋กœ ์ฐพ์•„ swap

- last๊ฐ€ first๋ณด๋‹ค ๋” ์™ผ์ชฝ์— ์žˆ์œผ๋ฉด (์ถ”์›”) -> ํƒ์ƒ‰ ์ข…๋ฃŒ // ์ „์ฒด ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด ๋น„๊ต ์™„๋ฃŒ 

- last์™€ pivot์„ ๊ต์ฒดํ•œ๋‹ค. 

 

- splitPoint๋กœ ๋‚˜๋‰˜๊ธฐ ๋•Œ๋ฌธ์—, ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด๊ณผ๋Š” ๋‹ฌ๋ฆฌ ๋ฌธ์ œ ์‚ฌ์ด์ฆˆ๊ฐ€ ์ ˆ๋ฐ˜์”ฉ ์ค„์–ด๋“ค์–ด ํšจ์œจ

 

 

 

 

 

# 8. Binary Search Tree 

- Graph – Tree – Binary Tree – Binary Search Tree 

 

- root node – ์ตœ์ƒ์œ„ node 

- leaf node - ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์—†๋Š”, ๋ฐ‘์— ๋”ธ๋ฆฐ ๋…ธ๋“œ๊ฐ€ ์—†๋Š” ๋…ธ๋“œ 

- level – root๋Š” level 0, root๋กœ๋ถ€ํ„ฐ ๋ฉ€์–ด์งˆ์ˆ˜๋ก level +1, ํ•ด๋‹น ๊นŠ์ด depth๋ฅผ ์˜๋ฏธ 

- Tree์˜ ๋†’์ด๋Š”? Root๋ถ€ํ„ฐ ๊ฐ€์žฅ ์•„๋ž˜์˜ leaf๊นŒ์ง€์˜ ๊นŠ์ด -> leaf์˜ level (๋†’์ด)

* height = number of levels (์ตœ๋Œ€ level์ด 3 -> height 0,1,2,3 -> 4)

 

* SubTree – ์ขŒ์ธก ์„œ๋ธŒํŠธ๋ฆฌ – root node๊ธฐ์ค€์œผ๋กœ ์ขŒ์ธก์˜ ๋ชจ๋“  ๋…ธ๋“œ์™€ ์—ฃ์ง€๋“ค

- ์šฐ์ธก ์„œ๋ธŒํŠธ๋ฆฌ – root ๊ธฐ์ค€ ์˜ค๋ฅธ์ชฝ ๋…ธ๋“œ์™€ ์—ฃ์ง€๋“ค (์ผ๋ถ€๋ถ„๋„ ๊ฐ€๋Šฅ)

 

* ์ด์ง„ ํŠธ๋ฆฌ์˜ ๊ตฌ์กฐ Binary Tree (!= tree)

- ๊ฐ ๋…ธ๋“œ๋Š” ์ตœ๋Œ€ 2๊ฐœ์˜ ์ž์‹ / ๊ผญ 2๊ฐœ์˜ ํ•„์š”๋Š” ์—†๋‹ค 

- ๋ฃจํŠธ๋ถ€ํ„ฐ ๋‹ค๋ฅธ ๋…ธ๋“œ๊นŒ์ง€์˜ ๊ฒฝ๋กœ๊ฐ€ ๊ณ ์œ ํ•˜๋‹ค (์—ฌ๋Ÿฌ ๊ฒฝ๋กœ, cycle ๋ถˆ๊ฐ€๋Šฅ  ํŠธ๋ฆฌ์˜ ํŠน์„ฑ)

- n๊ฐœ์˜ node -> n-1๊ฐœ์˜ edge

 

* Binary Tree // ์ด์ง„ ํŠธ๋ฆฌ๋ผ๋ฉด, ๊ผญ ์ •๋ ฌ๋  ํ•„์š”๋Š” X 

- n๊ฐœ์˜ node๋กœ ๊ตฌ์„ฑ๋œ tree์˜ ์ตœ๋Œ€, ์ตœ์†Œ height – ์ตœ๋Œ€ n-1, ์ตœ์†Œ n = 2^(h+1) – 1 

Ex) ๋†’์ด๊ฐ€ 2๋ผ๋ฉด, max๋กœ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋Š” node๊ฐ€ 7๊ฐœ 

- N level tree๊ฐ€ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ๋…ธ๋“œ ์ˆ˜ = 2^n๊ฐœ (๊ฐ€๋กœ ํ•œ ์ค„, ํš์„ ์˜๋ฏธ) 

- level์ด ํด ์ˆ˜๋ก ํƒ์ƒ‰ ํšจ์œจ์€ ์ค„์–ด๋“ ๋‹ค 

 

* class TreeType ADT -> BinarySearchTree – ๋“œ๋””์–ด ์ •๋ ฌ๋œ ์ƒํƒœ! 

* BinarySearchTree – ํŠน๋ณ„ํ•œ ์ด์ง„ ํŠธ๋ฆฌ

1) ๊ฐ ๋…ธ๋“œ์—๋Š” ๊ณ ์œ ํ•œ ๋ฐ์ดํ„ฐ ๊ฐ’์ด ์กด์žฌ

2) ํŠธ๋ฆฌ์˜ ํ‚ค ๊ฐ’์€ ๋ณด๋‹ค ํผ๊ณผ ๋ณด๋‹ค ์ž‘์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๊ต ๊ฐ€๋Šฅ 

3) ๊ฐ ๋…ธ๋“œ์˜ ํ‚ค ๊ฐ’์€ ์˜ค๋ฅธ์ชฝ ํ•˜์œ„ ํŠธ๋ฆฌ์˜ ๋ชจ๋“  ํ‚ค ๊ฐ’๋ณด๋‹ค ์ž‘๊ณ , 
์™ผ์ชฝ ํ•˜์œ„ ํŠธ๋ฆฌ์˜ ๋ชจ๋“  ๊ฐ’๋ณด๋‹ค ํผ // ๋งˆ์น˜ ๋ฃจํŠธ ์ž…์žฅ์—์„œ ๋‚ด๋ ค๋‹ค๋ณด๋ฉด 

* Left tree < Right tree (์™ผ์ชฝ ์•„๋ฌด ๊ฐ’ < ์˜ค๋ฅธ์ชฝ ์•„๋ฌด๊ฑฐ๋‚˜) 

 

- ์น˜๋ช…์  ๋‹จ์   ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๋„, ์‚ฝ์ž… ์ˆœ์„œ์— ๋”ฐ๋ผ ํšจ์œจ์ด ๋‹ฌ๋ผ์ง

- ์ตœ์•… – 1์ž ๋ชจ์–‘ (n๊ฐœ์˜ node์™€ n – 1 ๊ฐœ์˜ edge)

- ๋™์ผํ•œ data๋ฅผ ๋‹ค๋ฃจ๋”๋ผ๋„, ๊นŠ์ด์— ๋Œ€ํ•œ balancing์„ ๋ณด์žฅํ•˜์ง€ ์•Š์Œ 

 

+ ์‚ฝ์ž…ํ•  ๊ฐ’์€ ๋ฃจํŠธ ๋…ธ๋“œ์™€ ๋น„๊ตํ•˜์—ฌ, ๋” ์ž‘์œผ๋ฉด ์™ผ์ชฝ์œผ๋กœ, ํฌ๋ฉด ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ด๋™ํ•˜๋ฉฐ ์‹œ์ž‘

- ์ƒˆ๋กœ์šด leaf๋กœ ์‚ฝ์ž…๋  ๋•Œ ๊นŒ์ง€ ๋ฐ˜๋ณตํ•œ๋‹ค. 

 

* LengthIs ํ•จ์ˆ˜ – countNodes 

1) if ( (Left(tree) == NULL) and (Right(tree) == NULL)) -> ์•ž์ด ๊ฑฐ์ง“์ด๋ฉด, ๋’ค๋ฅผ ๋ณด์ง€๋„ ์•Š์Œ

-> Right tree๊ฐ€ ํ˜ธ์ถœ๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ ๋ฐœ์ƒ 

2) ์ „์ฒด tree๊ฐ€ ๋น„์—ˆ์„ ๋•Œ์—๋Š” run time error ๋ฐœ์ƒ 

3) ์ง€์ €๋ถ„ํ•˜๊ณ  ์ค‘๋ณต๋˜๋Š” ์ฝ”๋“œ๊ฐ€ ๋งŽ๋‹ค 

4) ์ตœ์ข… ๋ฒ„์ „ 

If tree is Null

return 0;

Else 

             Return CountNodes(Left(tree)) + CountNodes(Right(tree)) + 1

             // ๋งˆ์ง€๋ง‰์€ root ๊ฐœ์ˆ˜ ์ถ”๊ฐ€ 

             // ์žฌ๊ท€ ํ˜ธ์ถœ์ด ๋‚ด๋ถ€์— ๊ตฌํ˜„๋œ lengthIs ํ•จ์ˆ˜

 

* Binary Search Tree์˜ ์žฅ์   ํƒ์ƒ‰ ํšจ์œจ 

- retrieve ์‹œ, ptr->left์™€ ptr->right ๋กœ ๋‚˜๋ˆ„์–ด if else๊ตฌ๋ฌธ์œผ๋กœ ํ•œ ๋ฒˆ ํ˜ธ์ถœ Retrieve

- ์žฌ๊ท€์˜ interface ์—ญํ• ๋กœ, Wrapper ํ•จ์ˆ˜๊ฐ€ ์‚ฌ์šฉ๋œ๋‹ค. 

- i = info[midpoint]๋ฅผ ์ฐพ๋Š” ๊ฒƒ์ด ๋ชฉ์ 

 

* Binary Search Tree – Insertion -  *& ptr 

- leaf ๋…ธ๋“œ์˜ ์šฐ์ธก or ์ขŒ์ธก์œผ๋กœ ์ƒˆ๋กœ์šด node๊ฐ€ ๋™์  ํ• ๋‹น๋˜์–ด ๋“ค์–ด๊ฐ€์•ผ ํ•จ 

- ํ•ด๋‹น ํฌ์ธํ„ฐ์— ๋™์ ํ• ๋‹น ๊ฐ’์ด ๋“ค์–ด๊ฐ€์•ผ ํ•œ๋‹ค -> *& ptr ์‚ฌ์šฉ

- ํฌ์ธํ„ฐ์˜ ์ฐธ์กฐ ๋ณ€์ˆ˜ ์ „๋‹ฌ

 

Void Insert (TreeNode <itemType> * & ptr, itemType item) 

- ptr = new TreeNode <itemType>

 

- & ์ด ์—†๋‹ค๋ฉด, ์ฃผ์†Œ๊ฐ’ *ptr ์ด ์ง€์—ญ ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌ๋œ๋‹ค -> ๋™์  ํ• ๋‹น์€ ํ•ด ๋‘์—ˆ๋Š”๋ฐ, ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ๊ฐ€ ์œ ์‹ค๋จ (์ง€์—ญ ๋ณ€์ˆ˜๋Š” ํ•จ์ˆ˜ ์ข…๋ฃŒ ์‹œ ์‚ฌ๋ผ์ง€๊ธฐ ๋•Œ๋ฌธ์—)

 ๋”ฐ๋ผ์„œ ์ž์‹ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ฌ ptr์„ ์ฐธ์กฐ ๋ณ€์ˆ˜๋กœ ๋„˜๊ธฐ๋Š” ๊ฒƒ 

- ํฌ์ธํ„ฐํ˜• ๋ณ€์ˆ˜์˜ ์ฐธ์กฐ ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ ธ์˜ค๊ฒ ๋‹ค! 

 

* Delete – ์ขŒ์ธก subtree ์ค‘ ๊ฐ€์žฅ ํฐ ์šฐ์ธก ๊ฐ’์„ ์ฐพ๋Š”๋‹ค (๋‚˜์™€ ๊ฐ€์žฅ ์œ ์‚ฌํ•œ, ์ž‘์€ ๊ฐ’)

- root์™€ ๊ฐ€์žฅ ์œ ์‚ฌํ•œ ๊ฐ’ – root์™€ node์˜ ์œ„์น˜๋ฅผ ๊ตํ™˜ํ•ด๋„, ํŠธ๋ฆฌ๊ฐ€ ์œ ์ง€๋จ (delete ์‹œ)

 

* ์ˆœํšŒ ๋ฐฉ์‹ 3๊ฐ€์ง€ 

// ๊ธฐ์ค€  ์ค‘๊ฐ„ (root)๊ฐ€ ์–ธ์ œ ์Šค์น˜๋ƒ!

// ํ•ญ์ƒ left๋Š”right๋ณด๋‹ค ๋จผ์ € ์ฒ˜๋ฆฌ๋จ

// ๊ธฐ๋ณธ์ ์œผ๋กœ ์ˆœํšŒ๋Š” ์žฌ๊ท€ ๊ตฌ๋ฌธ์ด ํ™œ์šฉ๋œ๋‹ค. 

 

1) Inorder Traversal – ์™ผ์ชฝ  ์ค‘๊ฐ„  ์˜ค๋ฅธ์ชฝ 

- Print (ptr -> left, outFile)

- outFile << ptr -> info ;

- Print (ptr -> right, outFile)

 

// ์‹คํ–‰๋ฌธ์˜ ์œ„์น˜๊ฐ€ ์ค‘์š”ํ•˜๋‹ค  ์ขŒ์ธก ํ•˜๋‹จ๋ถ€ํ„ฐ / ๊ฐ€์šด๋ฐ ์ถœ๋ ฅ / ์šฐ์ธก subtree ์ถœ๋ ฅ 

// ์ •๋ ฌ๋œ ์ˆœ์„œ๋Œ€๋กœ print ํ•  ๋•Œ, inorder ์ ํ•ฉํ•˜๋‹ค. 

 

2) Preorder Traversal – ์ค‘๊ฐ„  ์™ผ์ชฝ  ์˜ค๋ฅธ์ชฝ 

- outFile << ptr -> info;

- Print (ptr -> left, outFile);

- Print (ptr -> right, outFile);

 

// ๋Œ€์ž… ์—ฐ์‚ฐ์ž, ๋ณต์‚ฌ ์ƒ์„ฑ์ž ๋“ฑ ์ฐจ๊ทผ์ฐจ๊ทผ ์ƒ์„ฑ ์‹œ, root ๋ถ€ํ„ฐ ์ ‘๊ทผํ•ด์„œ ์ƒ์„ฑํ•  ๋•Œ 

// ๊ฐ€์žฅ ์ฒซ๋ฒˆ์งธ ์ค„์— ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” Out file ์ฝ”๋“œ๋ฅผ ๋‘”๋‹ค. 

 

3) Postorder Traversal

- Print (ptr -> left, outFile);

- Print (ptr -> right, outFile);

- outFile << ptr -> info;                            // delete ptr ; 

 

// delete – ๋ง๋‹จ ๋…ธ๋“œ๋ถ€ํ„ฐ ์ ‘๊ทผํ•˜์—ฌ ์ฒ˜๋ฆฌ (์‚ญ์ œ) 

 

 

 

 

 

# 9. Complete tree, Heap, Priority Queue, Graph

* Binary Expression Tree 

- leaf ๋…ธ๋“œ์—๋Š” operand (ํ”ผ์—ฐ์‚ฐ์ž, ์ˆซ์ž), ๋น„ leaf node์—๋Š” operator(๋‹จ์ผ ์ด์ง„ ์—ฐ์‚ฐ์ž)

- ์™ผ or ์˜ค subtree -> root์—์„œ ์—ฐ์‚ฐ์ž๋ฅผ ํ‘œํ˜„ํ•˜๊ธฐ ์ „, ๋จผ์ € ๊ณ„์‚ฐ๋˜์–ด์•ผ ํ•˜๋Š” ์ˆ˜์‹ 

- ํŠธ๋ฆฌ์˜ Level – ์ƒ๋Œ€์  ํ‰๊ฐ€ ์šฐ์„ ์ˆœ์œ„ (์—ฐ์‚ฐ ์šฐ์„ ์ˆœ์œ„) – ์†Œ๊ด„ํ˜ธ๊ฐ€ ์—†์–ด๋„ ์šฐ์„ ์ˆœ์œ„ ํ‘œํ˜„ O

- ๋” ๋†’์€ ์ˆ˜์ค€์˜ ํŠธ๋ฆฌ์—์„œ์˜ ๊ณ„์‚ฐ์€, ๊ทธ ์•„๋ž˜ ์ž‘์—…๋ณด๋‹ค ๋‚˜์ค‘์— ๊ณ„์‚ฐ๋จ / ๋ฃจํŠธ์—์„œ์˜ ๊ณ„์‚ฐ์€ ํ•ญ์ƒ ๋งˆ์ง€๋ง‰์œผ๋กœ ๊ณ„์‚ฐ๋œ ๋‚ด์šฉ (์•„๋ž˜์—์„œ๋ถ€ํ„ฐ ์œ„๋กœ ์˜ฌ๋ผ๊ฐ€๋ฉด์„œ ๊ณ„์‚ฐ)

 

* root ( - ) , ์™ผ์ชฝ Leaf 8, ์˜ค๋ฅธ์ชฝ leaf 5์ธ ์ƒํ™ฉ 

// root์˜ ์œ„์น˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํŒ๋ณ„ํ•˜๊ธฐ

- inorder –> 8 – 5 (์‚ฌ๋žŒ์ด ์ฝ๋Š” ์ˆœ์„œ, ์—ฐ์‚ฐ์ž๊ฐ€ ๊ฐ€์šด๋ฐ ์œ„์น˜)

- preorder -> - 8 5 (์Šคํƒ์œผ๋กœ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ, ๋จผ์ € ์‚ฝ์ž…๋œ ์—ฐ์‚ฐ์ž๊ฐ€ ๋‚˜์ค‘์— ์ฒ˜๋ฆฌ)

- post -> 8 5 – (Queue๋กœ ์ฒ˜๋ฆฌ, ๋‚˜์ค‘์— ์‚ฝ์ž…๋œ ์—ฐ์‚ฐ์ž๊ฐ€ ๋‚˜์ค‘์— ์ฒ˜๋ฆฌ)

 

* Infonode – union type 

- ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ๊ณต์šฉ์œผ๋กœ ์”€ -> ๊ฐ€์žฅ ํฐ ํƒ€์ž… ๊ธฐ์ค€์œผ๋กœ ์ €์žฅ 

- ํƒ€์ž…์— ๋”ฐ๋ผ ํ•ด์„์„ ๋‹ฌ๋ฆฌํ•˜๋Š” ๊ฒƒ – operator -> 4 byte ์ค‘ char๋‹ˆ๊นŒ 1 byte๋งŒ ๊ฐ€์ ธ์˜ด

- binary tree -> ์ขŒ ์šฐ(๊ฐ๊ฐ ํ•˜์œ„ subtree root node)๋กœ link ๋จ

- ์žฌ๊ท€ ํ˜ธ์ถœ์„ ํ†ตํ•ด subtree๋กœ ๋‚ด๋ฆฌ๋ฉฐ ์ฒ˜๋ฆฌ, ๋‚ด๋ถ€์ ์œผ๋กœ ์žฌ๊ท€๋Š” stack ์‚ฌ์šฉ 

- ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ syntax error ๊ฒ€์‚ฌ ์‹œ ์‚ฌ์šฉํ•œ๋‹ค. 

 

* Full binary tree – ์™„๋ฒฝํ•œ ์‚ผ๊ฐํ˜• ๊ตฌ์กฐ  ํ’€ ์ด์ง„ ํŠธ๋ฆฌ 

- ๋ชจ๋“  ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด ์„ฑ๋ฆฝํ•˜์ง€ X (only 2^n – 1 ๊ฐœ๋งŒ ์ˆ˜์šฉ)

- ๋ชจ๋“  ๋ฆฌํ”„ ๋…ธ๋“œ๊ฐ€ ๊ฐ™์€ level, ๋ชจ๋“  ๋น„ ๋ฆฌํ”„ ๋…ธ๋“œ์—๋Š” 2๊ฐœ์˜ ์ž์‹์ด ์žˆ๋Š” ์ด์ง„ ํŠธ๋ฆฌ

 

* Complete binary tree – ์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ

- ๋งˆ์ง€๋ง‰ level์˜ ๋ฆฌํ”„ ๋…ธ๋“œ๋Š” ๊ฐ€๋Šฅํ•œ ํ•œ ์™ผ์ชฝ์— ์œ„์น˜ 

- ๋ฐ์ดํ„ฐ ์ˆ˜์™€ ๋ฌด๊ด€ํ•˜๊ฒŒ ์–ธ์ œ๋‚˜ ์„ฑ๋ฆฝ ๊ฐ€๋Šฅ 

- ๋งˆ์ง€๋ง‰ level ์ œ์™ธํ•œ ์œ—๋ถ€๋ถ„์€ full binary tree

 

* Heap 

- Complete binary tree (์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ) 

- ๊ฐ node๋“ค์— ๋Œ€ํ•ด, ํ•˜์œ„์˜ ๊ฐ’๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์Œ (๋ถ€๋ชจ >= ์ž์‹)

- root๊ฐ€ ๊ฐ€์žฅ ํฐ ๊ฐ’ -> max heap 

- root๊ฐ€ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’ – min heap (๋ฐ์ดํ„ฐ์— - ์ทจํ•ด์„œ max heap์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋ฉด ๋จ)

// ์ „์ฒด ๋ฐ์ดํ„ฐ ์ค‘ ๊ฐ€์žฅ ํฐ ๊ฐ’์„ ์›ํ•œ๋‹ค๋ฉด root๋ฅผ ๊บผ๋‚ด์˜ค๋ฉด ๋จ

 

* ์šฐ์„  ์ˆœ์œ„ ํ๋กœ ์—ฌ๊ธด๋‹ค๋ฉด? 

- ์„ ์ž…์„ ์ถœ (FIFO) – ๊ธฐ์กด ํ 

- ์‘๊ธ‰์‹ค์—์„œ์˜ ์ƒํ™ฉ  ์šฐ์„ ์ˆœ์œ„ ์ˆœ์„œ๋กœ ์ฒ˜๋ฆฌ / ๋„์ฐฉ ์ˆœ์„œ์™€ ๋ฌด๊ด€ 

-> root์˜ max ๊ฐ’์ด ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๊ฐ€์žฅ ๋†’์€ ๊ฒƒ์œผ๋กœ ํŒ๋ณ„ํ•œ๋‹ค๋ฉด, (์‘๊ธ‰ ํ™˜์ž) key ๊ฐ’

-> ์—ฌ๊ธฐ์— ๋‹ค์–‘ํ•œ ๊ฐ’๋“ค์ด node์— ๋”ธ๋ ค์˜ค๋Š” ๊ฒƒ

 

* Linked list vs array

1) ๋ฐฐ์—ด์˜ ๋‹จ์  

 ์น˜์šฐ์นœ tree ๋ชจ์–‘ -> complete binary tree๋กœ ํ•ด๊ฒฐ ๊ฐ€๋Šฅ 

- ๋นˆ ๊ณต๊ฐ„์ด ๋‚จ๋Š”๋‹ค  ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„ -> heap์ด๋ฉด complete binary tree – ๋‚ญ๋น„๊ฐ€ ๊ฑฐ์˜ X

 

2) ๋ฐฐ์—ด์˜ ์žฅ์  – index random access ๊ฐ€๋Šฅ (indirection ์—ฐ์‚ฐX) 

- root * 2 + 1 -> ์™ผ์ชฝ left subtree root 

- root * 2 + 2 -> ์˜ค๋ฅธ์ชฝ right subtree root

-> ์ž๊ธฐ ์ธ๋ฑ์Šค * 2 + 1 = ์™ผ์ชฝ ์ž์‹, *2+2 = ์˜ค๋ฅธ์ชฝ ์ž์‹

- ๋ถ€๋ชจ ์ธ๋ฑ์Šค๋กœ ๊ฐ€๊ณ  ์‹ถ๋‹ค๋ฉด? == (์ž๊ธฐ ์ธ๋ฑ์Šค – 1) / 2

 

+ complete binary tree๋Š” ๋†’์ด๊ฐ€ ๊ฐ€์žฅ ์ตœ์†Œ๊ฐ€ ๋˜๋„๋ก ํ˜•ํƒœ ์œ ์ง€  ๋น„๊ต ์—ฐ์‚ฐ ํšจ์œจ์  

 

* insertion (์ƒˆ element 71 ์ถ”๊ฐ€, Enqueue) 

 ์šฐ์„  ์ œ์ผ ํ•˜๋‹จ (์šฐํ•˜๋‹จ)์— ๋ฐฐ์น˜ 

- heap์ด๋ผ๋Š” ํŠน์„ฑ์ด ๊นจ์ง€๋ฉด ์•ˆ ๋จ

- ๋ถ€๋ชจ์™€ ์ž์‹์˜ ๊ฐ’์„ ๋น„๊ตํ•œ ํ›„, ์ž์‹์ด ๋” ํฌ๋ฉด(๋ถ€๋ชจ๊ฐ€ ๋‚˜๋ณด๋‹ค ์ž‘์œผ๋ฉด), ์„œ๋กœ ์œ„์น˜ ๋ฐ”๊ฟˆ
// (
์กฐ์ƒ๊ณผ ๋น„๊ตํ•˜๋ ค๊ณ ) ์œ„๋กœ ์ฐจ๊ทผ์ฐจ๊ทผ ์˜ฌ๋ผ๊ฐ€๋Š” ๊ณผ์ • // ReheapUp

 

* delete (max element, root ์ œ๊ฑฐ ๊ณผ์ •, Dequeue)

- ์šฐํ•˜๋‹จ ๊ฐ’ 12(min์€ ์•„๋‹ ์ˆ˜ ์žˆ์Œ)์™€ root๋ฅผ ๊ต์ฒดํ•จ (root๋Š” ์‚ฌ๋ผ์ง„ ๊ฒƒ) 

- ๋Œ์–ด์˜ฌ๋ฆฐ ์ž‘์€ ๊ฐ’ root์—์„œ leaf ๋ฐฉํ–ฅ์œผ๋กœ ๋‚ด๋ฆฌ๋ฉฐ, ์ ์ ˆํ•œ ๊ฐ’์„ ์ฐพ์Œ

- ์ž์‹ ์˜ ์ขŒ์ธก, ์šฐ์ธก ์ž์‹ node ์ค‘ ๋” ํฐ ๊ฐ’๊ณผ swap (maxchild๋ณด๋‹ค๋„ root๊ฐ€ ํด ๊ฒฝ์šฐ ๋ฉˆ์ถค)
// (
์†์ž์™€ ๋น„๊ตํ•˜๋ ค๊ณ ) ์•„๋ž˜๋กœ ๋‚ด๋ ค๊ฐ€๋Š” ๊ณผ์ • // ReheapDown

// ์ƒˆ๋กœ์šด root๊ฐ€ maxChild

 

+ ์ด๋•Œ tail recursion -> ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. 

- ํ•จ์ˆ˜ ํ˜ธ์ถœ์— ๋“ค์–ด๊ฐ€๋Š” overhead๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค. 

 

* Priority Queue (max heap ๊ธฐ๋ฐ˜)

- ์šฐ์„ ์ˆœ์œ„ ํ  ์–ธ์ œ๋‚˜ ๊ฐ€์žฅ ๋†’์€ ์šฐ์„  ์ˆœ์œ„์˜ ์š”์†Œ์—๋งŒ ์—‘์„ธ์Šค ๊ฐ€๋Šฅํ•œ ํŠน์„ฑ์„ ๊ฐ€์ง„ ํž™

- array ๋ฐฐ์—ด ๊ธฐ๋ฐ˜ ๊ตฌํ˜„  ์ „์ฒด ํฌ๊ธฐ/ํ•œ๋„ ์ €์žฅ (๋ฐฐ์—ด์ด๋ผ max index need)

 

* Dequeue – 0๋ฒˆ์งธ index๋ฅผ ์ œ๊ฑฐ – root node (์ฆ‰ pritority๊ฐ€ ๊ฐ€์žฅ ๋†’์€ ์š”์†Œ ์ œ๊ฑฐ)

- ๊ฐ€์žฅ ์šฐ์ธก ํ•˜๋‹จ์˜ Leaf๋ฅผ root๋กœ ์˜ฌ๋ฆฌ๊ณ , length 1 ์ค„์ž„ 

- ReheapDown (ํž™์˜ ํŠน์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด, min root๋ฅผ ๋‚ด๋ ค๊ฐ€๋ฉฐ ์ ์ ˆํ•œ leaf๋กœ ์œ„์น˜ ์กฐ์ •)

 

* Enqueue – length๋ฅผ 1 ๋Š˜๋ฆฌ๊ณ , ์ƒˆ๋กœ์šด ์š”์†Œ๋ฅผ ๋ฐฐ์—ด ๋์— ์ €์žฅ 

- ReheapUp (ํž™์˜ ํŠน์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด, root์— ๋„๋‹ฌํ•˜๊ฑฐ๋‚˜, ์ ๋‹นํ•œ ๋ถ€๋ชจ๋ฅผ ๋งŒ๋‚  ๋•Œ ๊นŒ์ง€ ์œ„์น˜ ์ด๋™) 

 

* Priority Queue๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ, heap ๋ง๊ณ  ๋‹ค๋ฅธ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ (9 – 39p.g)

- complete binary tree (max) – logN (enqueue, dequeue ํšจ์œจ) 

- linked list – N

- Binary Search Tree (์•„์ง complete binary tree๋Š” ์•„๋‹ˆ๊ธฐ์—, ํฌํ‚ค ๊ฐœ๋… O, but ๋ชจ์–‘ ๊ฐœ๋… X)

-> data๊ฐ€ ๊ณ ๋ฅด๊ฒŒ ๋ถ„ํฌ๋  ๊ฒฝ์šฐ (logN, heap๊ณผ ๋™์ผ) / ์ตœ์•…์˜ ์น˜์šฐ์นœ ๊ฒฝ์šฐ N (์ˆœ์ฐจํƒ์ƒ‰ same)

 

* Graph – ๊ทธ๋ž˜ํ”„ ์ž๋ฃŒ๊ตฌ์กฐ

- ๋…ธํŠธ ์„ธํŠธ์™€ edge ์„ธํŠธ๋กœ ๊ตฌ์„ฑ๋œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ 

- G = [ V, E ] / V(G) = ์œ ํ•œํ•˜๊ณ , ๋น„์–ด ์žˆ์ง€ ์•Š์€ ์ •์  ์„ธํŠธ (๊ทธ๋ž˜ํ”„์˜ node๋“ค์˜ ์ง‘ํ•ฉ) 

                   E(G) = edge๋“ค์˜ ์ง‘ํ•ฉ

- ์ •์  – vertex – ๊ทธ๋ž˜ํ”„์˜ ๋…ธ๋“œ 

- edge or ํ˜ธ  ๊ทธ๋ž˜ํ”„์˜ ๋…ธ๋“œ ๊ฐ„ ์—ฐ๊ฒฐ์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ •์  ์Œ (๋ฐฉํ–ฅ์„ฑ์„ ๊ฐ€์ง€๋ฉด arc) 

                  - ์‹œ์ž‘๊ณผ ๋ node๋“ค์˜ ์Œ -> edge  ex) (1, 2) – node 1๊ณผ 2๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” edge

 

- ๊ทธ๋ž˜ํ”„ > ํŠธ๋ฆฌ (๊ทธ๋ž˜ํ”„๊ฐ€ ๋” ๋ฒ”์šฉ์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜) 

- ์œ ํ–ฅ ๊ทธ๋ž˜ํ”„ > ๋ฌดํ–ฅ ๊ทธ๋ž˜ํ”„ (์œ ํ–ฅ์ด ๋” ๋ฒ”์šฉ์ )

* ์œ ํ–ฅ ๊ทธ๋ž˜ํ”„  ์—ฃ์ง€์— ๋ฐฉํ–ฅ์„ฑ์ด ์—†๋Š” ๊ทธ๋ž˜ํ”„ (undirected graph)

* ๋ฌดํ–ฅ ๊ทธ๋ž˜ํ”„  ๊ฐ ๋ชจ์„œ๋ฆฌ๊ฐ€ ํ•œ ์ •์ €์—์„œ ๋‹ค๋ฅธ ์ •์ ์œผ๋กœ ํ–ฅํ•˜๋Š” ๊ทธ๋ž˜ํ”„ (directed graph)

-> ๋น„๋ฐฉํ–ฅ edge๋ฅผ ์–‘๋ฐฉํ–ฅ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋ฉด ๋จ, ๋ฐฉํ–ฅ์„ฑ ๊ทธ๋ž˜ํ”„๊ฐ€ ๋” ๋ฒ”์šฉ์ ์ด๋‹ค. 

 

- ์ธ์ ‘ ์ •์   ํ•˜๋‚˜์˜ edge๋กœ ์—ฐ๊ฒฐ๋œ ๋‘ ๊ทธ๋ž˜ํ”„์˜ node (vertex)๋“ค (๋ฐ”๋กœ ์—ฐ๊ฒฐ๋œ ๊ฒƒ๋งŒ ํ•ด๋‹น)

- ๊ฒฝ๋กœ path  ๊ทธ๋ž˜ํ”„์—์„œ ๋‘ ๊ฐœ์˜ ๋…ธ๋“œ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ์ผ๋ จ์˜ vertex, ๋…ธ๋“œ๋“ค์˜ ๋‚˜์—ด 

- Complete Graph  ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  edge๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ทธ๋ž˜ํ”„ // ๋ชจ๋“  ์ •์ ์ด ๋‹ค๋ฅธ ์ •์ ์— ์ง์ ‘ ์—ฐ๊ฒฐ๋œ ๊ทธ๋ž˜ํ”„ (๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ ์˜๋ฏธ -> K)

- ๊ฐ€์ค‘ ๊ทธ๋ž˜ํ”„ – Weighted Graph – ๊ฐ edge์— ๊ฐ’์ด ์žˆ๋Š” ๊ทธ๋ž˜ํ”„ 

* Weighted ๊ทธ๋ž˜ํ”„๊ฐ€ ๋” ๋ฒ”์šฉ์  (unweighted -> ๋ชจ๋‘ ๋™์ผํ•œ Weight๋ฅผ ์ฃผ๋ฉด ๋˜๋‹ˆ๊นŒ)

-> ์ •๋ณด๊ฐ€ ์†Œ์‹ค๋˜๋ฉด ์•ˆ๋œ๋‹ค๋Š” ๊ด€์ ์—์„œ ๋ฒ”์šฉ์„ฑ์„ checkํ•˜๋ฉด ์‰ฌ์›€ 

 

- Complete Graph – ์™„์ „ ๊ทธ๋ž˜ํ”„

- edge์˜ ์ˆ˜ ๊ณ„์‚ฐ = n ( n-1 ) / 2  // N^2์— ๋น„๋ก€

-> ๋น„๋ฐฉํ–ฅ์„ฑ์„ ๊ณ ๋ คํ•˜์—ฌ ๋‚˜๋ˆ„๊ธฐ 2, ๋ฐฉํ–ฅ์„ฑ ๊ทธ๋ž˜ํ”„๋ผ๋ฉด ์„œ๋กœ ๋‹ค๋ฅธ ๊ฒฝ์šฐ๋ผ n ( n-1 )

- K(4) -> ํ•ญ์ƒ ๋„ค๋ชจ + 12๊ฐœ์˜ edge ๋ชจ์–‘ ๊ณ ์ • (4 * 3, ๋ฐฉํ–ฅ์„ฑ ๊ณ ๋ ค ์‹œ) Complete directed G

 

+ GetToVertices – ์ž์ฃผ ํ˜ธ์ถœํ•  ํ•จ์ˆ˜ 

- vertex์— ์ธ์ ‘ํ•œ vertex(๋…ธ๋“œ)๋“ค์„ ํ์— ๋ฆฌํ„ด 

 

* ์šฐ์„  ํƒ์ƒ‰ ์ •๋ฆฌ // ์‚ฌ์šฉํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๊ฐ€ ๋‹ค๋ฅด๋‹ค

1) DFS - ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰ – stack

- post order์™€ ๊ฐ™์ด, ํŠธ๋ฆฌ์˜ ๊ฐ€์žฅ ๋ฐ‘๊นŒ์ง€ ๋‚ด๋ ค๊ฐ„ ๋‹ค์Œ, ์˜ฌ๋ผ์˜ค๋ฉฐ ๋ฐฉ๋ฌธ

2) BFS – ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰ – queue

- level ๋ณ„๋กœ ๋‚ด๋ ค๊ฐ€๋ฉด์„œ ์ฐจ๋ก€๋Œ€๋กœ ๋ฐฉ๋ฌธ 

3) ์ตœ๊ณ  ์šฐ์„  ํƒ์ƒ‰ – priority queue ์‚ฌ์šฉ

- shortest path ํƒ์ƒ‰ ์‹œ ํ™œ์šฉ, min heap ํ™œ์šฉ (์Œ์ˆ˜๋ฅผ ์ทจํ•ด๋ผ)

- ์ตœ๋‹จ ๊ฒฝ๋กœ ํƒ์ƒ‰ -> ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์‹œ๊ฐ„์— (์ •ํ™•ํ•˜์ง„ ์•Š์Œ) 

 

+ cycling์ด ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋ฐฉ๋ฌธํ•œ vertex๋ฅผ markํ•ด์•ผ ํ•œ๋‹ค.

- ๋ฐฉ๋ฌธ ์—ฌ๋ถ€๋ฅผ ์ €์žฅํ•  flag ํ•„์š”

- clear mark (์ดˆ๊ธฐํ™”), mark vertex (๋งˆํฌํ•˜๋Š” ๋ฉ”์†Œ๋“œ), ismarked (๋งˆํฌ ์—ฌ๋ถ€๋ฅผ ์ฒดํฌ)

 

* Array implementation – ๊ทธ๋ž˜ํ”„๋ฅผ ์ปดํ“จํ„ฐ๋กœ ๊ตฌํ˜„ํ•  ๋•Œ 

1) ์ธ์ ‘ ํ–‰๋ ฌ (array ์ฐจ์›, Matrix 2์ฐจ์› array๋กœ ๊ตฌํ˜„)

- N๊ฐœ์˜ ๋…ธ๋“œ, vertex๋“ค๋กœ ๊ตฌ์„ฑ๋œ ๊ทธ๋ž˜ํ”„๋ฅผ N*N adjacency matrix๋กœ ๊ตฌํ˜„ 

- 1 -> edge๊ฐ€ ์žˆ๋‹ค, 0 -> edge๊ฐ€ ์—†๋‹ค 

- ๋‹จ์ : edge๊ฐ€ ์—†๋Š” ๊ฒƒ๋“ค์— ๋Œ€ํ•ด์„œ๋„ ๋ชจ๋‘ 0์ด๋ผ๋Š” ์ •๋ณด๋ฅผ ์ €์žฅํ•ด์•ผ ํ•จ -> ๋‚ญ๋น„ ์‹ฌํ•จ 

 

2) ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ – adjacency list 

- ๊ฐ’์ด ์กด์žฌํ•˜๋Š” ๋„์‹œ ๊ฐ„ edge weight๋ฅผ ์ €์žฅ  ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ ์žฅ์ 

- ํ•˜์ง€๋งŒ ์—ฌ๋Ÿฌ ๋„์‹œ๊ฐ€ ์—ฐ๊ฒฐ๋œ ๊ฒฝ์šฐ, vertex ํ•˜๋‚˜ ํƒ์ƒ‰ํ•˜๋Š”๋ฐ (ex) ์‹œ์นด๊ณ ์™€ ์•„ํ‹€๋ž€ํƒ€ ์—ฐ๊ฒฐ๋จ?) ์‹œ์นด๊ณ ์™€ ์—ฐ๊ฒฐ๋œ 100๊ฐœ์˜ node ์ „์ฒด๋ฅผ indirection ์—ฐ์‚ฐ์œผ๋กœ ์ฐพ์•„๋ด์•ผ ํ•œ๋‹ค. -> ๋น„ํšจ์œจ

 

* ๊ทธ๋ž˜ํ”„์—์„œ ์ฃผ์–ด์ง„ ๋ฐ์ดํ„ฐ์˜ ํ˜•ํƒœ์— ๋”ฐ๋ผ ์ธ์ ‘ ํ–‰๋ ฌ / ๋ฆฌ์ŠคํŠธ ์ž˜ ํŒ๋‹จํ•˜๋ฉด ๋จ 

1) ์™„์ „ ์—ฐ๊ฒฐ graph – ๋งค์šฐ denseํ•œ ๋ฐ€๋„ ๋นฝ๋นฝ

- node ๋Œ€๋น„ edge ๋น„์œจ์ด ๋งค์šฐ ๋†’๋‹ค. Matrix ํ‘œํ˜„ ์‹œ ๋‚ญ๋น„๋˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฑฐ์˜ ์—†๋‹ค

- dense ํ• ์ˆ˜๋ก, matrix์—์„œ ์œ ํšจํ•จ == data (1) ์ €์žฅ

 

2) Sparse – tree์™€ ์œ ์‚ฌํ•œ ๊ทธ๋ž˜ํ”„ ํ˜•ํƒœ

- node n๊ฐœ -> edge n – 1 ๊ฐœ (์ตœ์†Œํ•œ์˜ ๊ฒฝ์šฐ)

- edge ๊ฐœ์ˆ˜๊ฐ€ ์ตœ์†Œ์ธ ๊ทธ๋ž˜ํ”„ (ํ•œ ์ค„ ํ˜•ํƒœ) 

- matrix – ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„ ๋‚ญ๋น„, ํšจ์œจ๋„ ๋‚ฎ์Œ

- ์ด๋Ÿฐ ๊ฒฝ์šฐ์—๋Š” ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ ํ˜•ํƒœ๊ฐ€ ํƒ์ƒ‰ ํšจ์œจ๋„ ์ข‹๋‹ค. 

 

 

 

 

 

# 10. ์ •๋ ฌ ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜, Hash

- ์ •๋ ฌ์˜ ๊ธฐ์ค€  ๊ณ ์œ ํ‚ค๋ฅผ ๊ฐ€์ •ํ•จ (unique key)

- ๋ฐฐ์—ด์— ์ €์žฅ๋œ ๊ฐ’์—๋Š” ๊ด€๊ณ„ ์—ฐ์‚ฐ์ž๊ฐ€ ์ •์˜๋œ ์œ ํ˜•์˜ Key๊ฐ€ ์žˆ์Œ

- ํ‚ค ๊ฐ’์˜ ํฌ๊ธฐ๋ฅผ ๋น„๊ตํ•  ์ˆ˜ ์žˆ์–ด์•ผ ์ •๋ ฌ์ด ๊ฐ€๋Šฅํ•จ 

- ์ •๋ ฌ์€ ๋ฐฐ์—ด ๋‚ด ์š”์†Œ๋ฅผ ์˜ค๋ฆ„์ฐจ์ˆœ or ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์žฌ ๋ฐฐ์—ด 

 

1. ์„ ํƒ ์ •๋ ฌ – selection sort 

- ๋ฐฐ์—ด์„ ์ •๋ ฌ๋œ ๋ถ€๋ถ„๊ณผ ์ •๋ ฌ๋˜์ง€ ์•Š์€ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆˆ๋‹ค.

- ์ •๋ ฌ๋˜์ง€ ์•Š์€ ๋ถ€๋ถ„ ์ค‘ ๊ฐ€์žฅ ์ž‘์€ ์š”์†Œ๋ฅผ ์ฐพ์•„, ์ •๋ ฌ๋œ part์— ์ถ”๊ฐ€ 

- smallest ๊ฐ’์„ ์ฐพ์„ ๋•Œ, ์–ธ์ œ๋‚˜ n – 1 ๋ฒˆ์˜ ๋น„๊ต ์—ฐ์‚ฐ์ด ํ•„์š” 

-> ์ตœ์•…๊ณผ ์ตœ์„ ์˜ ๊ฒฝ์šฐ ์ฐจ์ด๊ฐ€ ์—†๋‹ค. (๋ฌด์กฐ๊ฑด ๋๊นŒ์ง€ ๋‹ค ๋ด์•ผ ์ œ์ผ ์ž‘์€ ๊ฐ’ ์ฐพ์Œ)

 

+ N๊ฐœ์˜ ์š”์†Œ๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฐฐ์—ด์„ ์ •๋ ฌ ์‹œ ๋น„๊ต ์—ฐ์‚ฐ ํšŸ์ˆ˜ 

Sum = (n – 1) + (n – 2) + … + 2 + 1 = N (N – 2) / 2 

=> O(N^2) // 0.5 ๊ณ„์ˆ˜๋Š” ์˜๋ฏธ ์—†์Œ, ๋น„๊ต ์—ฐ์‚ฐ์„ ๋‹จ์œ„ ์—ฐ์‚ฐ์œผ๋กœ ํ•  ๋•Œ์˜ big-O

 

2. ๋ฒ„๋ธ” ์ •๋ ฌ – bubble sort 

- ๋งˆ์ง€๋ง‰ ๋ฐฐ์—ด ์š”์†Œ๋ถ€ํ„ฐ ์‹œ์ž‘ (์•„๋ž˜์—์„œ๋ถ€ํ„ฐ ์‹œ์ž‘), ์ธ์ ‘ ์š”์†Œ ์Œ์„ ๋น„๊ตํ•˜์—ฌ swap

- ๋น„๊ตํ•˜์—ฌ ์ž‘์€ ์š”์†Œ๊ฐ€, ์˜ฌ๋ฐ”๋ฅธ ์œ„์น˜๋กœ ๋ฒ„๋ธ” ์—… ๋œ๋‹ค. (swap์ด ์ž์ฃผ ๋ฐœ์ƒํ•œ๋‹ค)

- ์œ„์—์„œ๋ถ€ํ„ฐ ํ•˜๋‚˜์”ฉ ์š”์†Œ์˜ ์œ„์น˜๋ฅผ ๊ณ ์ •์‹œ์ผœ ๋‚˜๊ฐ„๋‹ค. 

- ๋‹ค๋ฅธ ๊ตฌํ˜„ ๋ฐฉ์‹ -> swap์ด ํ•œ ๋ฒˆ๋„ ์ผ์–ด๋‚˜์ง€ ์•Š์•˜๋‹ค๋ฉด ์ด๋ฏธ ์ •๋ ฌ๋œ ์ƒํƒœ๋ผ๋Š” ์˜๋ฏธ 

-> Boolean์œผ๋กœ flag๋ฅผ ํ†ตํ•ด ์ •๋ ฌ ๋งˆ๋ฌด๋ฆฌ -> ์ด๊ฑธ ์œ„ํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ

 

3. ์‚ฝ์ž… ์ •๋ ฌ – insertion sort 

- ๊ฐ path์—์„œ ์ •๋ ฌ๋œ ์š”์†Œ๊ฐ€ 1 ์”ฉ ์ฆ๊ฐ€ // Sorted ์˜์—ญ์ด ํ•œ ์นธ ์”ฉ ๋Š˜์–ด๋‚˜๋Š” ๊ฒƒ

- ์ƒˆ๋กœ์šด ์นด๋“œ๋ฅผ ์ด๋ฏธ ๋ถ„๋ฅ˜๋œ ์นด๋“œ๋“ค ์‚ฌ์ด์— ์‚ฝ์ž…ํ•˜๋Š” ์‚ฌ๋žŒ์ฒ˜๋Ÿผ ํ–‰๋™  

- ์„ ํƒ ์ •๋ ฌ๊ณผ ํ—ท๊ฐˆ๋ฆผ -> ์„ ํƒ ์ •๋ ฌ์€ min ๊ฐ’์„ ์ฐพ์•„ ์˜ฌ๋ฆผ / ์‚ฝ์ž… ์ •๋ ฌ์€ ๊ทธ๋ƒฅ ์˜ฌ๋ฆผ

 

* Sorting Algorithms and average case number of comparison -> ์žฅ ์ด๋ฆ„์ด ๊ธด ์ด์œ  ์ฃผ์˜!

- Quick Sort ๋•Œ๋ฌธ์— ํ‰๊ท ์ด๋ผ๋Š” ๋‹จ์–ด๊ฐ€ ์‚ฌ์šฉ๋œ ๊ฒƒ (ํ‰๊ท  NlogN, ์ตœ์•… N^2)

+ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜  ๋™์ผํ•œ input์— ๋Œ€ํ•œ ๋™์ผํ•œ output (์ •๋ ฌ ์‹œ๊ฐ„, ํšจ์œจ๋งŒ ๋‹ค๋ฅธ ๊ฒƒ)

 

1) Simple Sort (N^2) 

- selection sort / bubble sort / insertion sort 

2) more complex sort (NlogN)

- Quick sort / Merge sort / Heap sort 

 

4. ํž™ ์ •๋ ฌ – Heap Sort 

- ํž™์€ ๋…ํŠนํ•œ binary tree 1) complete binary tree 
2) 
๊ฐ ๋…ธ๋“œ์— ์ €์žฅ๋œ ๊ฐ’์ด ํ•˜์œ„ ๊ฐ’๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์Œ

 

- max ๊ฐ’ – root๋ฅผ ๋œฏ์–ด๋ƒ„ – heap์˜ ํŠน์„ฑ์„ ์œ ์ง€์‹œํ‚จ๋‹ค  ๋‹ค์‹œ root๋ฅผ ๋นผ๋ƒ„ -> ์ •๋ ฌ ์™„๋ฃŒ

- heap์„ ๋ณต์›ํ•˜๋Š” ์—ฐ์‚ฐ์ด log N , ์ด๊ฑธ ๊ฐ root๋งˆ๋‹ค ๋งค๋ฒˆ -> N * logN 

* ReheapDown (delete์™€ ์—ฐ๊ด€) -> heap์˜ ๊ตฌ์กฐ๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๋ถˆํ•„์š”ํ•œ ์ถ”๊ฐ€ ์—ฐ์‚ฐ ๋“ค์–ด๊ฐ

-> ๋‹ค๋ฅธ nlogn์— ๋น„ํ•ด ์กฐ๊ธˆ ๋Š๋ฆฐ ์ด์œ  

 

+ ๋จผ์ € ์ฃผ์–ด์ง„ ๋ฐฐ์—ด์„ heap์œผ๋กœ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค. 

- ์ •๋ ฌ์ด ์™„๋ฃŒ๋œ ์ดํ›„, ์ตœ์ข… ๋ชจ์–‘์ด min heap์œผ๋กœ ๋ฐ”๋€๋‹ค. 

 

* heap์„ ๋น„์ •๋ ฌ ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •  ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ์ผ๋‹จ ๋‹ค ์•„๋Š” ์ƒํƒœ

- ์ผ๋‹จ complete binary tree๋กœ ๋ฐ”๋กœ ๋ฐฐ์น˜ํ•œ๋‹ค

- ๊ฐ๊ฐ์˜ subtree๊ฐ€ heap์ด ๋˜๋„๋ก level์„ ์ฆ๊ฐ€์‹œ์ผœ๊ฐ€๋ฉฐ ์ฒ˜๋ฆฌ 

- ๊ฐ root๋ฅผ reheapdown / root node์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋งŒ ํ•˜๋ฉด ๋˜๊ธฐ์— ํšจ์œจ ๋†’์Œ

- leaf node์˜ level๋ถ€ํ„ฐ ์˜ฌ๋ผ๊ฐ€๋ฉด์„œ heap์„ ๊ตฌ์„ฑํ•œ๋‹ค. (๋งจ ๋ฐ‘ ์ค„์€ ๋‚ ๋ฆฌ๊ณ  ์‹œ์ž‘)

 

* heap sort๋Š” ๋น„๊ต ์—ฐ์‚ฐ์ด (reheapdown) logN ๋ณต์žก๋„๋ฅผ ๊ฐ–๋Š”๋‹ค. -> NํšŒ ์ˆ˜ํ–‰ -> NlogN

- ๊นŠ์ด ์ž์ฒด๊ฐ€ logN 

- ํž™ ๋งŒ๋“ค๊ธฐ NlogN, ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ์˜ ๋น„๊ต ์ด ๊ณผ์ • NlogN

 

5. ํ€ต ์ •๋ ฌ – Quick Sort

- pivot์„ ๊ธฐ์ค€์œผ๋กœ, ์ ˆ๋ฐ˜์œผ๋กœ ๋‚˜๋ˆ„๋ฉฐ ์žฌ๊ท€์ ์œผ๋กœ ์ •๋ ฌ

- splitVal – ๊ฐ€์žฅ ์ž‘๊ฑฐ๋‚˜ ๊ฐ€์žฅ ํฐ ๊ฐ’์ด ์žกํžˆ๋ฉด ์ •๋ ฌ ํšจ์œจ ๋งค์šฐ ๋–จ์–ด์ง 

- splitVal ์™ผ์ชฝ์—๋Š” splitVal๋ณด๋‹ค ์ž‘์€ ๋ชจ๋“  ๊ฐ’, splitVal ์˜ค๋ฅธ์ชฝ์—๋Š” ํฐ ๋ชจ๋“  ๊ฐ’์ด ์œ„์น˜

- ์ดํ›„ ๊ฐ๊ฐ์˜ ์ฒซ๋ฒˆ์งธ ์š”์†Œ๋ฅผ (0๋ฒˆ index) splitVal๋กœ ์ง€์ •ํ•˜์—ฌ ์ชผ๊ฐœ์ง„ 2 ์žฌ๊ท€ ๊ตฌ๋ฌธ์œผ๋กœ ์ฒ˜๋ฆฌ

 

* ๋‹ค๋ฅธ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋น„ํ•ด ํ€ต์†ŒํŠธ๊ฐ€ ๋น ๋ฆ„ -> cache hit ๋•Œ๋ฌธ์—

- ๋ฐฐ์—ด์˜ ๊ฐ™์€ ๋ถ€๋ถ„์„ ์ฐธ์กฐํ• ์ˆ˜๋ก cache hit ํ•  ํ™•๋ฅ  ๋†’์•„์ง„๋‹ค

- merge sort ๊ฒฝ์šฐ์—๋Š” ์ƒˆ ๋ฐฐ์—ด์„ ํ• ๋‹นํ•จ -> ์ฐธ์กฐ ํ™•๋ฅ  ๋‚ฎ์•„์ง 

- heap sort๋Š” heap ๊ตฌ์กฐ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์—์„œ ๋น„ํšจ์œจ ๋ฐœ์ƒ 

-> Quick sort๊ฐ€ ๊ฐ€์žฅ ์„ฑ๋Šฅ์ด ์šฐ์ˆ˜ํ•จ (ํ‰๊ท ์  ์ƒํ™ฉ์—์„œ)

 

6. ๋ณ‘ํ•ฉ ์ •๋ ฌ – merge sort

- 2๊ฐœ์˜ size๋กœ ์ชผ๊ฐœ์–ด, ๋ฐฐ์—ด์˜ ์™ผ์ชฝ ์ ˆ๋ฐ˜ ์ •๋ ฌ / ์˜ค๋ฅธ์ชฝ ์ ˆ๋ฐ˜ ์ •๋ ฌ / ์ดํ›„ ํ•˜๋‚˜๋กœ ๋ณ‘ํ•ฉ

- ์ž‘๊ฒŒ ๋‚˜๋‰œ ๊ฐ’๋“ค์˜ ๋น„๊ต๋Š” ๋งค์šฐ ์‰ฝ๋‹ค -> ์ดํ›„ ์ •๋ ฌ ๋œ ๋‘ ๋ฐฐ์—ด์—์„œ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์„ ๊บผ๋‚ด์–ด ์ƒ์œ„ ๋ฐฐ์—ด ์ •๋ ฌ -> ํ•œ์ชฝ ํ•˜์œ„ ๋ฐฐ์—ด์ด ๋น„๋ฉด, ๋’ค๋Š” ์‹น ๋‹ค ๋ณต๋ถ™  ์ด๋ฏธ ์ •๋ ฌ๋œ ์ƒํƒœ๋‹ˆ๊นŒ

- ํ•œ ํ•˜์œ„ ๋ฐฐ์—ด์ด ๋นŒ ๋•Œ ๊นŒ์ง€๋Š”, ์„œ๋กœ ๊ฐ’๋“ค์„ ๋น„๊ตํ•ด๊ฐ€๋ฉฐ ์‚ฝ์ž… 

 

+ std sort -> quick sort // ์ œ์ž๋ฆฌ ์ •๋ ฌ – stable sort -> merge sort 

 

+ ์œ„์˜ 6๊ฐ€์ง€ ์ƒํƒœ๋กœ ๋ฐฐ์—ด์ด ์ •๋ ฌ๋œ ์ƒํƒœ์—์„œ ํƒ์ƒ‰ -> ์ด์ง„ ํƒ์ƒ‰ 

(๋น„์ •๋ ฌ data = ์ˆœ์ฐจ ํƒ์ƒ‰)

- ์ด์ง„ ํƒ์ƒ‰๋„ ์ ˆ๋ฐ˜์”ฉ ๋‚˜๋ˆ„์–ด ์ฐพ์•„, ์žฌ๊ท€ ๊ตฌ๋ฌธ์ด 2๊ฐœ๋กœ ๋ณด์ด์ง€๋งŒ, ์กฐ๊ฑด๋ฌธ์„ ๊ฑธ์–ด, ์‹ค์ œ๋กœ๋Š” 1ํšŒ๋งŒ ํ˜ธ์ถœ๋œ๋‹ค. 

- tail recursion -> ๋ฐ˜๋ณต๋ฌธ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ (์ธ๋ฑ์Šค์— ๋Œ€ํ•œ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•ด๋‘๊ณ , ์ ˆ๋ฐ˜์”ฉ ์ง„ํ–‰ํ•˜๋ฉฐ ๋ณ€๊ฒฝ)

 

* Stablity & inplace

1) Stablity - ์ค‘๋ณต๋˜๋Š” ๊ฐ’์ด ์žˆ์„ ๋•Œ, ์ •๋ ฌ ํ›„์—๋„ ์ž…๋ ฅ ์ˆœ์„œ๊ฐ€ ์œ ์ง€๋˜๋Š”๊ฐ€? Or ๋’ค์ง‘์–ด์ง€๋Š”๊ฐ€? 

- heap sort์™€ quick sort๋Š” ๋’ค์ง‘์–ด์ง„๋‹ค (unstable sort, ์„ ํƒ, ํ€ต, ํž™)

- merge sort๋Š” stable sort (๋ฒ„๋ธ”, ์‚ฝ์ž…, ๋ณ‘ํ•ฉ) 

 

2) inplace ์ œ์ž๋ฆฌ ์ •๋ ฌ  ์ถ”๊ฐ€์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ํ•„์š” X ์ •๋ ฌ 

- ์ž…๋ ฅ๋˜๋Š” ๋ฐ์ดํ„ฐ์˜ ๊ฐœ์ˆ˜์— ๋น„๋ก€ํ•˜์—ฌ ์ถ”๊ฐ€์ ์ธ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ -> merge sort 

 

* Hashing 

- O(1) = ์ž…๋ ฅ ๋ฐ์ดํ„ฐ์™€ ๋ฌด๊ด€ํ•˜๊ฒŒ, ์ƒ์ˆ˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ๋‹ค. 

- ํ‚ค ๊ฐ’์˜ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ, ๋ชฉ๋ก์˜ ์š”์†Œ๋ฅผ ๋น ๋ฅด๊ฒŒ ์ •๋ ฌํ•˜๊ณ  ์ ‘๊ทผํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์ˆ˜๋‹จ

- ํ‚ค ๊ฐ’์˜ function์„ ํ•ด์‹œ function์ด๋ผ๊ณ  ํ•œ๋‹ค. 

- ๋ณดํ†ต ์ „์ฒด size๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๋ฅผ ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ Hash function ์„ค์ •ํ•œ๋‹ค.

-> ์ด๋ฏธ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ์œ„์น˜์— ์ ‘๊ทผํ•˜์—ฌ collision์ด ๋ฐœ์ƒํ•˜๋ฉด? 

 

1) Closed hashing – ๋ฐ์ดํ„ฐ ๋ฒ”์œ„ ํ•œ์ •๋œ ํ•ด์‹œ 

2) Open hashing – ๋ฐ์ดํ„ฐ ๋ฒ”์œ„ ์ œํ•œ X, open

 

* linear probing 

- Closed hashing์—์„œ ์ถฉ๋Œ์„ ํ•ด๊ฒฐํ•˜๋Š” ๋Œ€ํ‘œ์ ์ธ ๋ฐฉ๋ฒ•, rehash ๊ธฐ๋Šฅ 

- ๋‹จ์ˆœํ•˜๊ฒŒ 1์นธ ์ฆ๊ฐ€ํ•˜์—ฌ, ๋‹ค์Œ ์œ„์น˜๋กœ ๋ณด๋‚ธ๋‹ค //  (hashValue + 1) / 100

 

* ๋ฌธ์ œ – rehash ๋œ ๊ฐ’์ด ์‚ญ์ œ๋  ๊ฒฝ์šฐ? -> deleted flag๋ฅผ ๋‚จ๊ฒจ์คŒ

- ๊ฐ’์ด ์—†๋Š” ์ƒํƒœ๋ผ๋ฉด, ๋นˆ ์ƒํƒœ๋กœ ๋‘๋ฉด ๋’ท๋ถ€๋ถ„์„ ๋”์ด์ƒ ์ฐพ์ง€ ์•Š์Œ 

- deleted๋กœ ๋’ค์˜ ๊ฐ’์„ ๋ณด๊ฒŒ ํ•œ๋‹ค (linear probing์˜ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์œผ๋‹ˆ) 

-> flag๋‚˜ ์•„๋‹ˆ๋ฉด ๊ฐ’์„ ํ•œ ์นธ ์”ฉ ๋‹น๊ธฐ๋Š” ๋ฐฉ๋ฒ•์ด๋‚˜ ๋‘˜ ๋‹ค ์ฉ ์ข‹์ง€ X -> ์˜คํ”ˆ ํ•ด์‹ฑ ์ฒ˜๋ฆฌ 

 

* Open Hashing์˜ ๋Œ€ํ‘œ์ ์ธ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ• 2๊ฐ€์ง€ (bucket, chain) 

1) bucket 

- ํ•˜๋‚˜์˜ key ๊ฐ’์— ๋Œ€ํ•ด, array matrix์˜ ํ˜•ํƒœ๋กœ ์—ฌ๋Ÿฌ ๊ฐ’์„ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ณ€๊ฒฝ 

- key index ๋‹น ํ•˜๋‚˜์˜ ๊ฐ’๋งŒ ์ €์žฅ ๊ฐ€๋Šฅํ–ˆ๋˜ 1์ฐจ์› ๋Œ€์‹ , 2์ฐจ์› array๋ฅผ ์“ฐ๋Š” ๊ฒƒ

- ๋ฌด์˜๋ฏธํ•œ empty ๋นˆ ๊ณต๊ฐ„์ด ๋งŽ์ด ๋ฐœ์ƒํ•œ๋‹ค. ์œ ๋™์ ์ธ ๊ฐ’์˜ ์ถ”๊ฐ€๋„ ์–ด๋ ต๋‹ค 

 

2) chain

- linked list๋กœ ๊ตฌํ˜„  ๋™์ผํ•œ hash (key)๊ฐ’์— ๋Œ€ํ•ด, ์ƒˆ๋กœ์šด ์š”์†Œ๊ฐ€ ์ถ”๊ฐ€ ์‹œ ๋™์ ์œผ๋กœ ํ• ๋‹น

- ๊ฐ’์ด ์น˜์šฐ์น  ๊ฒฝ์šฐ (ํ•˜๋‚˜์˜ key์— ๋งŽ์€ ์š”์†Œ๊ฐ€ ์ถ”๊ฐ€๋  ๊ฒฝ์šฐ) indirection ์—ฐ์‚ฐ ๋งŽ์•„์ง

 

+ hash function ์ตœ์ ํ™”? (์ค‘๋ณต๋˜๋Š” key ๊ฐ’์ด ์—†๋„๋ก)

- ํ•˜์ง€๋งŒ hash func์„ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆœ ์—†๋‹ค

 

+ ๊ธฐ์ˆ˜ ์ •๋ ฌ (Radix ์ •๋ ฌ) 

- ์ฃผ์–ด์ง„ ์กฐ๊ฑด์ด ๋” ๋งŽ์„ ๊ฒฝ์šฐ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค. (์ด ์ •๋ณด๋ฅผ ํ†ตํ•ด ์„ฑ๋Šฅ์„ ๋” ๋†’์ด๋Š” ๊ฒƒ)

- ๋™์ผํ•œ ์ž๋ฆฟ์ˆ˜์˜ ๋ฐ์ดํ„ฐ๋“ค์— ๋Œ€ํ•ด ์ ์šฉ