๊ตญ๋ฏผ๋ํ๊ต์์ "์ฝ๊ฒ ๋ฐฐ์ฐ๋ ์๊ณ ๋ฆฌ์ฆ" ๊ต์ฌ๋ฅผ ์ด์ฉํ
๋ฐํ๋ช ๊ต์๋์ ๊ฐ์ ๊ต์์ ์ด์ฉํ์ฌ ์์ ๋ด์ฉ์ ์ ๋ฆฌํ์์ต๋๋ค
Lower Bounds of Comparision Sorting
๋น๊ต ๊ธฐ๋ฐ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ (Comparision sort) ์์ Worst case์ O(nlogn) ๋ณด๋ค ๋น ๋ฅธ๊ฒ ์กด์ฌํ ๊น?
์ ๋ ฌ ๋ฌธ์ ์ ์ํ์ O(nlogn) ์
=> quicksort ๋ผ๋ O(nlogn) ์๊ณ ๋ฆฌ์ฆ์ด ์กด์ฌํ๊ธฐ ๋๋ฌธ
์ ๋ ฌ ๋ฌธ์ ์ ํํ์ Ω(n log n) ์
=> ๋ชจ๋ ์๊ณ ๋ฆฌ์ฆ์ด Ω(n log n) ์ธ ๊ฒ์ ์ฆ๋ช ํด์ผํจ
Comparison Sort๋ฅผ Decision Tree๋ก ์ถ์ํ ๊ฐ๋ฅํจ
์ ๊ทธ๋ฆผ ์ฒ๋ผ ๋ชจ๋ sort์ process๋ฅผ Decision Tree ํํ๋ก ์ถ์ํ๊ฐ ๊ฐ๋ฅํจ!
=> Tree-height์ ์๋ฏธ๋ ๋น๊ตํ๋ ํ์๋ก ๋ณผ ์ ์์!
(Non-leaf nodes๋ ๋น๊ต์ฐ์ฐ)
๊ทธ๋ผ n๊ฐ์ ์๋ก ๋ค๋ฅธ ๊ฐ์ ์ ๋ ฌํ๋ ๋ชจ๋ ์๊ณ ๋ฆฌ์ฆ์ Decision Tree๊ฐ Ω(n log n)์ Height๋ฅผ ๊ฐ๋์ง ํ์ธํ๋ฉด ํํ์ ๊ตฌํ ์ ์์
DecisionTree์ Leaf node ์ = n!
(๋ง์ฝ 1, 2, 3์ ์ ๋ ฌํ๋ค๊ณ ํ์ ๋ ๋์ฌ ์ ์๋ ์ ๋ ฌ์ ์๋ 3! = 3 * 2 * 1 ์ธ 6๊ฐ์ง์)
๊ทธ๋ ๋ค๋ฉด Decision Tree์ ์ต์ Height? (์ต์ ์ ๊น์ด๊ฐ ์ต์์ธ ๊ฒฝ์ฐ = ์์ฃผ ๊ท ๋ฑํ ํธ๋ฆฌ๊ฐ ๋ง๋ค์ด ์ก์ ๋)
์ ๊ทธ๋ฆผ์์ 1 = n! / 2^k ์ด๋ฏ๋ก ํธ๋ฆฌ์ ๋์ด k = log_2(n!) ์!
์ฆ, ๊ฐ์ฅ ๊ท ๋ฑํ ๋์ height ๊ฐ log_2(n!) ์ด๋ฏ๋ก
Tree Height ์ธ h๋ h >= log_2(n!) ๋ผ๊ณ ๋ณผ ์ ์์
log n! = log n * log (n - 1) * ... log 1 = log n + log (n - 1) + ... + log 2 + log 1 ์ด๋ฏ๋ก
์์ ๊ฐ์ ๊ทธ๋ฆผ์ ๊ทธ๋ ค๋ณผ ์ ์์
์ฆ, ์ด๋ฐ์์ผ๋ก ํํ์ด ๊ฐ๋ฅํ๊ณ
์ด๋ ๊ณง Ω(nlogn) ์ ์๋ฏธํจ!
(์์ ์ฌ๋ผ์ง๋ฏ๋ก)
์ ๋ฆฌ๋ฅผ ํด๋ณด๋ฉด
๋ชจ๋ ๋น๊ต ๊ธฐ๋ฐ ์๊ณ ๋ฆฌ์ฆ์ Decision Tree์ ํํ๋ก ๋ง๋ค ์ ์๋๋ฐ
์ด Decision Tree์ Height๊ฐ ์ต์ n/2 log_2 (n/2) ๋ณด๋ค๋ ํฌ๋ค๋๊ฑธ ์ฆ๋ช ํจ
๋ฐ๋ผ์, ์ด๋ค ๋น๊ต ๊ธฐ๋ฐ ์๊ณ ๋ฆฌ์ฆ์ด๋ผ๊ณ ํ๋๋ผ๋ Decision Tree์ Height๋ Ω(nlogn) ๋ณด๋ค๋ ํด ์ ๋ฐ์ ์์!!
Non-comparison Sorting
์ต์ ์ ๊ฒฝ์ฐ ์ ๋ ฌ ์๊ฐ์ด Θ(n log n) ๋ณด๋ค ๋น ๋ฅผ ์ ์์๊น?
๋น๊ต ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ๊ฒฝ์ฐ ์์์ ์๋์ ๋์ ๊ด๊ณ๋ง ๊ณ ๋ คํจ
=> ์์์ ๋ถํฌ๋ ์๋ฆฟ์ ๋ฑ์ ๊ณ ๋ คํ๋ค๋ฉด ๋ ๋น ๋ฅผ ์ ์์
Counting Sort : ๊ฐ๋ค์ด r ์ดํ์ ์์ด ์๋ ์ ์์ผ ๋
Radix Sort : ๊ฐ๋ค์ด ๋ชจ๋ k ์๋ฆฟ์ ์ดํ์ ์์ด ์๋ ์ ์์ผ ๋
Counting Sort
์กฐ๊ฑด : ๊ฐ๋ค์ด r ์ดํ์ ์์ด ์๋ ์ ์์ผ ๋
(์ค๋ณต์ ํ์ฉ)
Key idea๋ ๊ฐ ๊ฐ์ ๊ฐ์๋ฅผ ์ธ์ด, ๊ฐ๋ง๋ค ๋ค์ด๊ฐ ์์น๋ฅผ ๋ฏธ๋ฆฌ ๊ณ์ฐํ๋ ๊ฒ์ด๋ค!
pseudocode ๋ฅผ ํจ๊ป ์ดํด๋ณด๋ฉด
์ฐ์ ์ฃผ์ด์ง ๋ฐฐ์ด์์ ๊ฐ ๊ฐ์ ๊ฐ์๋ฅผ ์ธ์ด cnts ๋ฐฐ์ด์ ์ ์ฅํ๊ณ
cnts ๋ฐฐ์ด์ count ๊ฐ์ ์ด์ count ๊ฐ์ ๋์ ์์ผ์ ๊ณ์ ๋ํ๊ณ ์์
=> ์ด๋ cnts ๋ฐฐ์ด์ ๊ฐ ๋์ ๊ฐ์ ํด๋น ์์๊ฐ ๋ค์ด๊ฐ ๋ง์ง๋ง ์์น์ + 1์ ๊ฐ๋ฆฌํด
๊ทธ๋ ๋ค๋ฉด ์ ๋ ฌ์ ์ด๋ป๊ฒ?
์ ๋ ฌํด์ผ ํ ๋ฐฐ์ด์ ๋ค์์๋ถํฐ ๊ฑฐ๊พธ๋ก scan ํ๋ฉฐ ๋ฏธ๋ฆฌ ์ ์ํด๋ sorted ๋ฐฐ์ด์ ํด๋น ์์์ ์๋ฆฌ๋ฅผ ์ฐพ์์ ๋ฃ์ด์ค
(์์์ ๋งํ๋ฏ์ด count๋ฅผ ์ธ๋ ๋ฐฐ์ด์์์ ๋์ ๊ฐ์ด ์์๊ฐ ๋ค์ด๊ฐ ๋ง์ง๋ง ์์น์ +1์ ๊ฐ๋ฆฌํค๋ ์๋ฆฌ๋ก ์๋ฆฌ๋ฅผ ์ฐพ์ ์ ์์)
์ฆ, ์ ๊ทธ๋ฆผ์์ ์์ 5์ ๋์ ๊ฐ์ด 10์ด๋ฉด ์ด๊ฒ ๋ง์ง๋ง ์์น์ +1์ ๊ฐ๋ฆฌํค๋ฏ๋ก 9๋ฒ ์๋ฆฌ์ ์์ 5๋ฅผ ์ฐ๋ฉด๋จ
์ด ๋ ํด๋น ์์์ ๋์ ๊ฐ์ -1 ํด์ฃผ๋ฉด ์ ๋ ฌํด์ผ ํ ๋ฐฐ์ด์์ ๋ค์์ ํด๋น ์์๊ฐ ๋ ๋์์ ๊ฒฝ์ฐ (์ค๋ณต ๊ฐ ํ์ฉ์ด๋ฏ๋ก) ์ ์ ํด๋น ์์๋ฅผ ์ผ๋ ๊ณณ ๋ณด๋ค ํ ์นธ ์์ ์ ์ด์ค ์ ์์
์ด๋ฐ์์ผ๋ก ๋ฐ๋ณตํ๋ฉฐ ์ ๋ ฌํด์ผ ํ ๋ฐฐ์ด์ ์ฒ์ ๋ฑ์ฅํ๋ ์์๊น์ง ๊ฑฐ๊พธ๋ก scan์ ํ๊ฒ ๋๋ฉด sorted ๋ฐฐ์ด์ ์ํ๋๋๋ก ์ ๋ ฌ์ด ๋์ด ์์!
Complexity Analysis of Counting Sort
์ฌ๊ธฐ์ r์ ๋ฐฐ์ด์ ์ต๋๊ฐ์ผ๋ก ์์์ ๋์จ Counting Sort ์์ ๋ฅผ ๊ธฐ์ค์ผ๋ก 0~5๊น์ง์ ์ซ์๊ฐ ์์ผ๋ r์ 6์ด ๋จ!
count ํ๋ ๋ถ๋ถ์์์ ์๊ฐ ๋ณต์ก๋๋ Θ(n) ์ผ๋ก ๋ณผ ์ ์์
=> ์ด์ฉํผ ์ฃผ์ด์ง ๋ฐฐ์ด์ ํ ๋ฒ sacn ํ๋ฉด์ count ํ๋ฏ๋ก
cumulate ํ๋ ๋ถ๋ถ์์์ ์๊ฐ ๋ณต์ก๋๋ Θ(r) ๋ก ๋ณผ ์ ์์
=> count๋ฅผ ์ธ๋ ๋ฐฐ์ด์์ ์ด์ ๋์ ๊ฐ์ ์ฐจ๋ก๋ก ๋ํ๋ ๊ณผ์ ์ r - 1 ๋ฒ ์ํํ๋ฏ๋ก
sort ํ๋ ๋ถ๋ถ์์์ ์๊ฐ ๋ณต์ก๋๋ Θ(n) ๋ก ๋ณผ ์ ์์
=> ์ฃผ์ด์ง ๋ฐฐ์ด์ ๊ฑฐ๊พธ๋ก ํ ๋ฒ scan ํ๋ ๊ฒ์ด๋ฏ๋ก
=> ์ถ๊ฐ์ ์ผ๋ก ์ ๋ ฌํด๋์ sorted ๋ฐฐ์ด์ ์๋์ ๋ฐฐ์ด arr์ ๋ณต์ฌํ๋ ๊ณผ์ ๋ Θ(n) ์
์ต์ ์ ๊ฒฝ์ฐ๋ก ์๊ฐํ์ ๋ ์๊ฐ ๋ณต์ก๋๊ฐ Θ(r + n) ์ด๊ณ ๋ณดํต r์ด n๋ณด๋ค ์๋ค๊ณ ๋ณด๋๊น Θ(n)์ด ๋๋ค!
r์ด nlogn ์ด๋ผ๋ฉด Θ(n log n) ์ด๋ฏ๋ก ์จ์ผํ ๋ฉ๋ฆฌํธ๊ฐ ์์!
Radix Sort
์กฐ๊ฑด : ๊ฐ๋ค์ด ๋ชจ๋ k ์๋ฆฟ์ ์ดํ์ ์์ด ์๋ ์ ์ ์ผ ๋
Key Idea : ๋ฎ์ ์๋ฆฟ์(LSD) ๋ถํฐ ๋์ ์๋ฆฟ์ (MSD) ์์๋๋ก ์๋ฆฟ์๋ฅผ ๊ธฐ์ค์ผ๋ก ์์ ์ ๋ ฌ(stable sort)
Stable sort ๋ ๊ฐ์ ๊ฐ๋ค๊ฐ ์๋์ ์ธ ์์๋ฅผ ์ ์งํ๋ฉฐ ์ ๋ ฌํ๋ ๊ฒ์
ex. Bubble sort, Insertion sort, Merge sort, Counting sort
์์ ๊ฐ์ด LSD ๋ถํฐ ์์ํ์ฌ ์ฐจ๋ก๋ก ์์ ์ ๋ ฌ์ ์คํํจ
ํ์ง๋ง, ์์ ์ ๋ ฌ์ ํ ๋ Bubble Sort ๊ฐ์ ์๊ณ ๋ฆฌ์ฆ์ n^2 ๋งํผ ๊ฑธ๋ฆฌ๋ฏ๋ก
=> ์ด ๋ Counting Sort ๋ฅผ ์ฌ์ฉํ ์ ์์
(10์ง์ ๊ธฐ์ค์ผ๋ก 0~9๊น์ง์ ์ซ์๋ง ์ฌ์ฉํ๋ฏ๋ก ๋ฌธ์ ๋ ๊ฒ ์์)
์๊น ๋งํ๋ฏ์ด ์๋ฆฟ์๋ฅผ ๊ธฐ์ค์ผ๋ก stable sort๋ฅผ ์งํํ๊ธฐ ๋๋ฌธ์ ๊ทธ ๋ค์ ์๋ฆฟ์์์ ๊ฒน์น๋ ์ซ์๊ฐ ์๋๋ผ๋ ์ด๋ฏธ ๋ฎ์ ์๋ฆฟ์์์ ์ ๋ ฌ์ ํ์ผ๋ฏ๋ก ์์๊ฐ ์ ์ง๋จ!
๊ฐ ์๋ฆฟ์๋ก ์ ๋ ฌํ ๋ Counting Sort๋ฅผ ํ์ฉํ๋๋ฐ r์ด ์์๋ฉด Θ(n + r) = Θ(n)๋ก ๋งค์ฐ ํจ์จ์ ์!!
=> code๋ฅผ ์ดํด๋ณด๋ฉด Counting Sort์ ๋น์ทํ์ง๋ง rtok ๋ฅผ ์ด์ฉํ์ฌ LSD ๋ถํฐ MSD๊น์ง ์ฐจ๋ก๋ก (์์ )์ ๋ ฌ์ ์ ์ฉํจ
Complexity Analysis of Radix Sort
Θ(r + n)์ธ counting sort๋ฅผ k๋ฒ ๋ฐ๋ณตํ๋ฏ๋ก
=> ์ต์ ์ ๊ฒฝ์ฐ ์๊ฐ ๋ณต์ก๋๋ Θ(rk + nk)๋ก ๋ณผ ์ ์์!
(๋ณดํต r, k๊ฐ ์์๊ฐ ๋๋ฏ๋ก Θ(n)์ผ๋ก ๋ณผ ์ ์์)
์ฃผ์ด์ง ๊ฐ๋ค์ด ๋ชจ๋ ๋ค๋ฅผ ๊ฒฝ์ฐ ๋ณต์ก๋๋?
์ฐ์ ์๊ฐํด๋ด์ผํ ๊ฒ์ ์ค๋ณต์ ํ์ฉํ์ง ์๋๋ค๊ณ ํ์ ๋ n์ด 1000๋ง์ด๋ฉด ์๋ฆฟ์์ ์ต๋๊ฐ์ log_10(n) = 7 ์๋ฆฌ๊ฐ ๋จ
์ฆ, k = log_r(n)
(10์ง์๋ผ๊ณ ํ์ ๋ r์ 9 + 1 = 10 ์ด๋ฏ๋ก log_10 ์ผ๋ก ๊ณ์ฐํ์)
๋ฐ๋ผ์ Radix Sort์ ๋ณต์ก๋ Θ(rk + nk) ์์ k์ ์๋ฆฌ์ log(n)์ ๋ฃ์ผ๋ฉด
Θ(rk + nk) = Θ(rlog_r(n) + nlog_r(n))
์ฌ๊ธฐ์ r์ด ์์๋ผ๋ฉด Θ(n log n) ๋ก ๋ณผ ์ ์์
๊ฒฐ๊ตญ Radix Sort๋ ๋น๊ต๊ธฐ๋ฐ ์ ๋ ฌ์ด ์๋๋๋ผ๋ ์ค๋ณต์ ํ์ฉํ์ง ์๋๋ค๋ฉด ์๊ฐ ๋ณต์ก๋๊ฐ Θ(n log n) ๊ฐ ๋จ!
'๐ฅ Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
L09 - Greedy Algorithms (1) | 2024.11.03 |
---|---|
L07 - Selection (4) | 2024.10.13 |
L05 - Heapsort (2) | 2024.10.06 |
L04 - Merge Sort & Quicksort (2) | 2024.09.27 |
L03 - Basic Sorting Algorithms (1) | 2024.09.25 |