2021. 9. 9. 08:01ใ์ฝ๋ฉ ํ ์คํธ ์ค๋น/์๊ณ ๋ฆฌ์ฆ
์๋ ํ์ธ์? ์ฃผ๋ํ๋ ์ ๋๋ค.
์ค๋์ ์๋ฃ๊ตฌ์กฐ์ ์๊ณ ๋ฆฌ์ฆ์ ์๊ณ ๋ฆฌ์ฆ์์ ๋ณํฉ์ ๋ ฌ์ ๋ํด ๊ณต๋ถ ํด ๋ณด๋๋ก ํ๋ ๊ฒ์ด์์.
๋ณํฉ ์ ๋ ฌ์ ๋ถํ ์ ๋ณต์ ๋ํ์ ์ธ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ธ ๊ฒ์ด์์. ๋ถํ ์ ๋ณต์ ๋ํด ์ ๋ชจ๋ฅด์ ๋ค๋ฉด Dynamic Programming(๋์ ๊ณํ๋ฒ)& Divide and Conquer(๋ถํ ์ ๋ณต)์ ๊ด์ฌ์ ์ฃผ์ธ์!
์์ค ์ฝ๋์ ๋ํด์ ํ์ธ ํ๊ณ ์ถ์ผ์ ๋ถ๋ค๊ป์๋ ์ฃผ๋ํ๋์ Git hub์ ๊ด์ฌ์ ์ฃผ์ธ์!
๐ ๋ณํฉ ์ ๋ ฌ (Merge sort)
๋ณํฉ ์ ๋ ฌ์ ์ฌ๊ท์ฉ๋ฒ์ ํ์ฉํ ์๊ณ ๋ฆฌ์ฆ ์น๊ตฌ ์ค ํ๋์ธ ๊ฒ์ด์์.
๋จผ์ , ๋ฆฌ์คํธ๋ฅผ ์ ๋ฐ์ผ๋ก ์๋ผ ๋น์ทํ ํฌ๊ธฐ์ ๋ ๋ถ๋ถ ๋ฆฌ์คํธ๋ก ๋๋๋ ์์ ์ ํฉ๋๋ค!
๊ทธ๋ฐ ๋ค, ๊ฐ ๋ถ๋ถ ๋ฆฌ์คํธ๋ฅผ ์ฌ๊ท์ ์ผ๋ก ํฉ๋ณ ์ ๋ ฌ์ ์ด์ฉํด ์ ๋ ฌ์ ํ๋ ๊ฒ์ด์์.
๋ง์ง๋ง์ผ๋ก ๋ ๋ถ๋ถ ๋ฆฌ์คํธ๋ฅผ ๋ค์ ํ๋์ ์ ๋ ฌ๋ ๋ฆฌ์คํธ๋ก ํฉ๋ณํ๋ฉด ๋๋ ์๊ณ ๋ฆฌ์ฆ์ด๋๋๋ค!
์ ์ดํด๊ฐ ๋์ง ์์ผ์ ๋ค๋ฉด ์ด ๊ณณ์ ํ๋ฒ ๋ด๋ณด์ ์!
๐ ์๊ณ ๋ฆฌ์ฆ ์ดํด
Data๊ฐ ๋ค ๊ฐ ์ผ๋, (Data ๊ฐ์์ ๋ฐ๋ผ ๋ณต์ก๋๊ฐ ๋จ์ด์ง๋ ๊ฒ์ ์๋๋ค. ๋ฐ๋ผ์ ๋ค ๊ฐ๋ก ๋ฐ๋ก Logic์ ์ดํดํด๋ณด๊ณ ์ ํ๋ค.)
- ์: data_list = [1, 9, 3, 2]
- ๋จผ์ [1, 9], [3, 2]๋ก ์ชผ๊ฐ ๋ค.
- ๋ค์ ์ ๋ถ๋ถ์ [1], [9]๋ก ์ชผ๊ฐ ๋ค.
- ๊ทธ๋ฐ ๋ค ์๊ณผ ๋ค์ ๊ฐ์ ๋น๊ตํ์ฌ ์์ ๊ฐ์ ์์ผ๋ก ์ค๋๋ก ํ์ฌ ํฉ์น๋ค. [1, 9]
- ๋ค ๋ถ๋ถ ์ญ์ [3], [2]๋ก ์ชผ๊ฐ ๋ค.
- ๊ทธ๋ฐ ๋ค ์๊ณผ ๋์ ๊ฐ์ ๋น๊ตํ์ฌ ์์ ๊ฐ์ ์์ผ๋ก ์ค๋๋ก ํ์ฌ ํฉ์น๋ค. [2, 3]
- ์ด์ ์, ๋ค ๋ฐฐ์ด ๋ชจ๋๋ฅผ ํฉ์น๋ค.
- 1 < 2 ์ด๊ธฐ์ [1]
- 9 > 2 ์ด๊ธฐ์ [1, 2]
- 9 > 3 ์ด๊ธฐ์ [1, 2, 3]
- 9 ํผ์ ๋จ์๊ธฐ ๋๋ฌธ์ [1, 2, 3, 9]
๐ ์๊ณ ๋ฆฌ์ฆ ๊ตฌํ
- merge_split ํจ์ ๋ง๋ค๊ธฐ
- ๋ง์ฝ ๋ฆฌ์คํธ ๊ฐ์๊ฐ ํ๊ฐ๋ผ๋ฉด ํด๋น ๊ฐ ๋ฐํ
- ๊ทธ๋ ์ง ์๋ค๋ฉด, ๋ฆฌ์คํธ๋ฅผ ์๊ณผ ๋ค๋ก ๋ ๊ฐ ๋๋๋ค.
- left = merge_split(์)
- right = merge_split(๋ค)
- merge(left, right)
- merge ํจ์ ๋ง๋ค๊ธฐ
- ๋ฆฌ์คํธ ๋ณ์ ํ๋ ๋ง๋ค๊ธฐ (sorted)
- left_index, right_index = 0
- while left_index < len(left) or right_index < len(right):
- ๋ง์ฝ left_index๋, right_index๊ฐ ์ด๋ฏธ left ๋๋ right ๋ฆฌ์คํธ๋ฅผ ๋ค ์ํํ๋ค๋ฉด, ๊ทธ ๋ฐ๋์ชฝ Data๋ฅผ ๋ฃ๊ณ , ํด๋น Index 1์ ์ฆ๊ฐ์ํจ๋ค.
- if left[left_index] < right[right_index]:
- sorted.append(left[left_index])
- left_index += 1
- else:
- sorted.append(right[right_index])
- right_index += 1
๐ ์๊ณ ๋ฆฌ์ฆ ๋ถ์
์๊ณ ๋ฆฌ์ฆ ๋ถ์์ ์ฌ์ค ์ฝ์ง ์์ ๊ฒ์ด์์.
๋จผ์ ๋ช ๋จ๊ณ ๊น์ด๊น์ง ๋ง๋ค์ด์ง๋์ง๋ฅผ depth๋ผ๊ณ ํ๊ณ , i๋ก ๋์ ๊ฒ์ด์์. ๊ทธ๋ฐ ๋ค ๋งจ ์๋จ๊ณ๋ 0์ผ๋ก ๋์๊ฒ์.
์๋ ๊ทธ๋ฆผ์์ n/$2^2$๋ฅผ 2๋จ๊ณ ๊น์ด๋ผ๊ณ ๊ฐ์ ํ์ ๋, ๊ฐ ๋จ๊ณ์ ์๋ ํ๋์ Node์์ ๋ฆฌ์คํธ ๊ธธ์ด๋ n/$2^2$๊ฐ ๋๋ ๊ฒ์ด์์.
๊ฐ ๋จ๊ณ์๋ $2^i$ ๊ฐ์ Node๊ฐ ์๋ ์ ์ด์์. ์ฝ๊ฒ ๋งํด์ ์๋ ๊ทธ๋ฆผ์์ n์ด 0๋จ๊ณ n/2๊ฐ 1๋จ๊ณ n/$2^2$๊ฐ 2๋จ๊ณ ์ผ ๋, 2๋จ๊ณ์์๋ $2^2$ ๊ฐ ์ฆ 4๊ฐ์ Node๊ฐ ์๋ ๊ฒ์ด๊ณ , 1๋จ๊ณ์์๋ $2^1$๊ฐ ์ฆ 2๊ฐ์ Node๊ฐ ์๋ ๊ฒ์ด์์.
๋ฐ๋ผ์ ๊ฐ ๋จ๊ณ๋ ํญ์ $2^i * \frac { n }{ 2^i } = O(n)$์ธ ๊ฒ์ด๊ณ , ๋จ๊ณ๋ ํญ์ $log_2 n$๊ฐ ๋งํผ ๋ง๋ค์ด์ง๋ ๊ฒ์ด์์.
๊ฒฐ๊ตญ ์๊ฐ ๋ณต์ก๋๋ O($log n$)์ด๊ณ , 2๋ ์ญ์ ์์์ด๊ธฐ ๋๋ฌธ์ ์ญ์ ๊ฐ ๋๋ ๊ฒ์ด์์.
๋ฐ๋ผ์ ๋จ๊ณ๋ณ ์๊ฐ ๋ณต์ก๋ O(n) * O($log n$) = O($n log n$)์ด ๋๋ ๊ฒ์ด์์.
์ฃผ๋ํ๋์ ๊ธ์ด ๋ง์์ ๋์ จ๋์? ๊ตฌ๋ ๊ณผ ๊ณต๊ฐ! ๊ทธ๋ฆฌ๊ณ , ๋๊ธ ๊ทธ๋ฆฌ๊ณ ๋ฐฉ๋ช ๋ก์ ์ฃผ๋ํ๋์๊ฒ ๋ง์ ํ์ด ๋ฉ๋๋ค
'์ฝ๋ฉ ํ ์คํธ ์ค๋น > ์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๊ณ ๋ฆฌ์ฆ] ์ด์ง ํ์ ๊ธฐ๋ฒ (0) | 2021.09.17 |
---|---|
[์๊ณ ๋ฆฌ์ฆ] Quick Sort (ํต ์ ๋ ฌ) (0) | 2021.09.09 |
[์๊ณ ๋ฆฌ์ฆ] Dynamic Programming(๋์ ๊ณํ๋ฒ)& Divide and Conquer(๋ถํ ์ ๋ณต) (0) | 2021.09.09 |
[์๊ณ ๋ฆฌ์ฆ] 02. ์ ํ ์ ๋ ฌ (0) | 2021.09.08 |
[์๊ณ ๋ฆฌ์ฆ] 01. ๋ฒ๋ธ์ ๋ ฌ (0) | 2021.09.07 |