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 ์ ๋ ฌ)
- ์ฃผ์ด์ง ์กฐ๊ฑด์ด ๋ ๋ง์ ๊ฒฝ์ฐ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค. (์ด ์ ๋ณด๋ฅผ ํตํด ์ฑ๋ฅ์ ๋ ๋์ด๋ ๊ฒ)
- ๋์ผํ ์๋ฆฟ์์ ๋ฐ์ดํฐ๋ค์ ๋ํด ์ ์ฉ
'ComputerScience' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[RaspberryPi] ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด๋ก NAS ์๋ฒ ๋ง๋ค๊ธฐ (0) | 2024.05.16 |
---|---|
2022. 11. 04 : Architecture Kick - off (0) | 2022.11.07 |