์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- ์๋ฐ
- ๊ฐ์์ ์
- ๊ฐ๋ฐ
- ์ค๋ธ์
- ํ์ด์ฌ
- html
- Java
- css
- ์ ๋ฆฌํธ๋ฆฌํธ
- ํ์ฒ์ ๋ฆฌํธ๋ฆฌํธ
- ํฐ์คํ ๋ฆฌ์ฑ๋ฆฐ์ง
- ์๋ฐ์คํฌ๋ฆฝํธ
- Python
- ๋ฐ์ดํฐ๋ฒ ์ด์ค
- ์นํผ๋ธ๋ฆฌ์ฑ
- ์ฑ
- dmz๊ตฌ์ฑ
- ์ฝ๋ฉ
- ๋ ์
- ๋ฐฉํ๋ฒฝdmz
- ์ํ
- JavaScript
- ๋คํธ์ํฌdmz
- dmz๋
- ํ๋ก๊ทธ๋๋ฐ
- ๋๊ฐ
- database
- ์นดํ๋๊ฐ
- dmz๋คํธ์ํฌ
- ์ค๋ผํด
- Today
- Total
JiYoung Dev ๐ฅ
[ํ์ด์ฌ] ์๊ณ ๋ฆฌ์ฆ ํจ๋ฌ๋ค์ : Divide and Conquer (ํฉ๋ณ ์ ๋ ฌ, ํต ์ ๋ ฌ) ๋ณธ๋ฌธ
[ํ์ด์ฌ] ์๊ณ ๋ฆฌ์ฆ ํจ๋ฌ๋ค์ : Divide and Conquer (ํฉ๋ณ ์ ๋ ฌ, ํต ์ ๋ ฌ)
Shinjio 2023. 2. 26. 18:492023.02.25 ~ 2023.02.26 ์ฝ๋์ ํ์ต๋ด์ฉ
๐ Divide and Conquer ๋ถํ ์ ๋ณต
๋ถํ ์ ๋ณต ์๊ณ ๋ฆฌ์ฆ(Divide and Conquer algorithm)์ ๊ทธ๋๋ก ํด๊ฒฐํ ์ ์๋ ๋ฌธ์ ๋ฅผ ์์ ๋ฌธ์ ๋ก ๋ถํ ํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ์๊ณ ๋ฆฌ์ฆ. ํต ์ ๋ ฌ์ด๋ ํฉ๋ณ ์ ๋ ฌ๋ก ๋ํ๋๋ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ์ ์ด์ง ํ์ ์๊ณ ๋ฆฌ์ฆ, ํ๋ ฌ ๊ณฑ์ ๋ฑ์ด ๋ถํ ์ ๋ณต ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉ
๋ถํ ์ ๋ณต ์๊ณ ๋ฆฌ์ฆ์ ๋ณดํต ์ฌ๊ท ํจ์(recursive function)๋ฅผ ํตํด ์์ฐ์ค๋ฝ๊ฒ ๊ตฌํ๋จ. ๋ฐ๋ผ์ ๋ถํ ์ ๋ณต์ ์ดํดํ๊ธฐ ์ํด์๋ ์ฌ๊ท ๊ฐ๋ ์ ๋ํ ์ดํด๊ฐ ์ฐ์ ํจ.
function F(x) :
# base case
if F(x)์ ๋ฌธ์ ๊ฐ ๊ฐ๋จ:
return F(x)์ ์ง์ ๊ณ์ฐํ ๊ฐ
# ์ฌ๊ทํจ์
x๋ฅผ y1๊ณผ y2๋ก ๋ถํ
F(y1)๊ณผ F(y2)๋ฅผ ํธ์ถ
return F(y1), F(y2)๋ก๋ถํฐ F(x)๋ฅผ ๊ตฌํ ๊ฐ
์์ ๊ฐ์ด ๊ธฐ์กด ๋ฌธ์ ๋ฅผ ์์ ๋ถ๋ถ ๋ฌธ์ ๋ก ๋๋์ด ๊ฐ ๋ถ๋ถ ๋ฌธ์ ๋ฅผ ํ๊ณ ๋ถ๋ถ ๋ฌธ์ ์ ์๋ฃจ์ ์ ์ด์ฉํด ๊ธฐ์กด์ ํฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ์
Divide and Conquer 3 steps
1. Divide
๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ฝ๊ฒ ํ๊ธฐ ์ํด ๋ ์์ ๋ถ๋ถ ๋ฌธ์ ๋ก ๋๋.
์ด ๋จ๊ณ๋ ๋ถ๋ถ ๋ฌธ์ ๊ฐ ์ง์ ํด๊ฒฐ์ด ๊ฐ๋ฅํ ๋๊น์ง(base case) ์ถฉ๋ถํ ์๊ฒ ์ฌ๊ท์ ์ผ๋ก ํํด์ง
2. Conquer
๋ถ๋ถ ๋ฌธ์ ๋ฅผ ๋ ๋ฆฝ์ ์ผ๋ก ํธ๋ ๋จ๊ณ.
์ด ๋จ๊ณ์์๋ ๋ฌธ์ ์ ๋ฐ๋ผ ๋ณ๋ ฌ ํน์ ์์ฐจ์ ์ผ๋ก ์ํ
3. Combine
์๋์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ถ๋ถ ๋ฌธ์ ์ ํด๊ฒฐ์ฑ ์ ๊ฒฐํฉํ๋ ๋จ๊ณ
๋ถํ ์ ๋ณต ์๊ณ ๋ฆฌ์ฆ์ ์ข ์ข ์๊ณ ๋ฆฌ์ฆ์ ์๊ฐ ๋ณต์ก์ฑ์ ์ง์์์ ๋คํญ์, ๋ก๊ทธ ๋๋ ์ ํ ์๊ฐ ๋ณต์ก์ฑ์ผ๋ก ์ค์ด๊ธฐ ๋๋ฌธ์ ํจ์จ์ฑ์ ์๋นํ ํฅ์์ํฌ ์ ์์. ๊ทธ๋ฌ๋ ํ์ ๋ฌธ์ ์ ํด๊ฒฐ์ฑ ์ ์ถ์ ํ๊ธฐ ์ํด ์ถ๊ฐ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ์ํ ์ ์์.
๐ Divide and Conquer ๋ฌธ์
โ start ๋ถํฐ end๊น์ง์ ํฉ ๊ตฌํ๊ธฐ
โ ๋ฌธ์ ๋ฅผ ์ต๋ํ ์๊ฒ ์ชผ๊ฐ์ด base case๋ฅผ ๊ตฌํ๋ค.
โก ๋ฌธ์ ๋ฅผ ๋ถ๋ถ์ผ๋ก ๋๋๋ค : start๋ถํฐ end๊น์ง์ ํฉ = start๋ถํฐ mid๊น์ง์ ํฉ + (mid+1)๋ถํฐ end๊น์ง์ ํฉ
โข ๋ถ๋ถ ๋ฌธ์ ๋ฅผ ํ๊ณ ๋ถ๋ถ ๋ฌธ์ ์ ํฉ์ ์๋ก ๋ํ๋ค. (์ฌ๊ทํจ์ : ์๊ธฐ ์์ ์ ํธ์ถํ๋ ํจ์)
๐ ํฉ๋ณ ์ ๋ ฌ (Merge Sort)
1945๋ ์กด ํฐ ๋ ธ์ด๋ง์ ์ํด ๊ฐ๋ฐ๋ ํฉ๋ณ ์ ๋ ฌ์ O(n log n) ๋น๊ต ๊ธฐ๋ฐ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๋ถํ ์ ๋ณต ์๊ณ ๋ฆฌ์ฆ์ ํ๋.
ํฉ๋ณ ์ ๋ ฌ์์ ๊ถ๊ทน์ ์ธ ๋ชฉํ๋ ์ ์ฒด ๋ฆฌ์คํธ๋ฅผ ์ ๋ ฌํ๋ ๊ฒ. ํ์ ๋ฌธ์ ๋ ํ์ ๋ฆฌ์คํธ๋ฅผ ์ ๋ ฌํ๋ ๊ฒ.
โผโผ ํฉ๋ณ ์ ๋ ฌ ์ ๊ฐ ๊ณผ์ โผโผ
ํฉ๋ณ ์ ๋ ฌ ์๋ ๋ฐฉ์
1. base case (ํ์ถ ์กฐ๊ฑด)
๋ฆฌ์คํธ์ ๊ธธ์ด๊ฐ 1 ์ดํ์ด๋ฉด ์ด๋ฏธ ์ ๋ ฌ๋ ๊ฒ์ผ๋ก ๋ด
2. Divide
์ ๋ ฌ๋์ง ์์ ๋ฆฌ์คํธ๋ฅผ ์ ๋ฐ์ผ๋ก ์๋ผ ๋น์ทํ ํฌ๊ธฐ์ ๋ ๋ถ๋ถ ๋ฆฌ์คํธ๋ก ๋๋
3. Conquer
๊ฐ ๋ถ๋ถ ๋ฆฌ์คํธ๋ฅผ ์ฌ๊ท์ ์ผ๋ก ํฉ๋ณ ์ ๋ ฌ์ ์ด์ฉํด ์ ๋ ฌ
4. Combine
๋ ๋ถ๋ถ ๋ฆฌ์คํธ๋ฅผ ๋ค์ ํ๋์ ์ ๋ ฌ๋ ๋ฆฌ์คํธ๋ก ํฉ๋ณ
โ Combine์ ์ํ merge ํจ์ ์์ฑํ๊ธฐ
๋ ๊ฐ์ ๋ฆฌ์คํธ๋ฅผ ์ ๋ ฌ๋ ํ๋์ ๋ฆฌ์คํธ๋ก ํฉ์น๋ ํจ์
ํฉ๋ณ ์ ๋ ฌ์์ combine์ ํด๋น
โ ๋ ๊ฐ์ ๋ฆฌ์คํธ๋ฅผ ์์๋๋ก ์ ๋ ฌํ ๋น ๋ฆฌ์คํธ ์์ฑ (merged_list)
โก ๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉํ์ฌ list1๊ณผ list2์ ๊ฐ์ ํ๋์ฉ ๋น๊ตํ๋ฉด์ ํ์ธ
→ list1[i] ์ list2[j]์ ๊ฐ์ ๋น๊ตํ์ฌ ๋ ์์ ๊ฐ์ merged-list์ ์ถ๊ฐํ๊ณ , ์ถ๊ฐ๋ list๋ ๋ค์ ์ธ๋ฑ์ค๋ก ๋์ด๊ฐ
โข ๋ง์ฝ, list1์ด๋ list2์์ ์ ๋ ฌ์ ๋คํ์ฌ i(j) == len(list1(2))๊ฐ ๋๋ฉด ์์ง ์ ๋ ฌ์ด ๋์ง ์์ list๋ฅผ merged_list์ ์ถ๊ฐ
โฃ merged_list ๋ฆฌํด
ํฉ๋ณ ์ ๋ ฌ์์๋ ์์ ๊ฐ์ด combine์์ ๋ง์ ์ผ์ ์ํ
โผโผโผ merge ํจ์ ์คํ ๊ณผ์ โผโผโผ
โ ํฉ๋ณ ์ ๋ ฌ ํจ์ merge_sort ์์ฑํ๊ธฐ
โ base case ํ์ถ ์กฐ๊ฑด ์์ฑ : my_list์ ๊ธธ์ด๊ฐ 1 ์ดํ์ด๋ฉด ์ด๋ฏธ ์ ๋ ฌ๋ ๊ฒ์ผ๋ก ๋ณด์ my_list ๋ฆฌํด
โก my_list๋ 2๊ฐ์ ๋ฆฌ์คํธ๋ก divide
โข ์ฌ๊ท ํจ์์ merge ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ ๋ถ๋ถ ๋ฆฌ์คํธ๋ฅผ ํ๋์ ์ ๋ ฌ๋ ๋ฆฌ์คํธ๋ก ํฉ๋ณ
๐ ํต์ ๋ ฌ (Quicksort)
combine ๋จ๊ณ์์ ๋ง์ ์ผ์ ์ํํ๋ ํฉ๋ณ ์ ๋ ฌ๊ณผ ๋ฌ๋ฆฌ ํต ์ ๋ ฌ์์๋ pivot๊ณผ partition์ ์ฌ์ฉํ๋ฉฐ divide์์ ๋ง์ ์ผ์ ์ํ
ํต ์ ๋ ฌ์์ ๋ฆฌ์คํธ๋ฅผ ๋๋๋ ๊ณผ์ (divide)์ partition์ด๋ผ๊ณ ํจ
โ ํต ์ ๋ ฌ์ ์ํ partition(divide) ํจ์ ์์ฑํ๊ธฐ
partition์ 2๋จ๊ณ
โ ๋ฆฌ์คํธ์์ pivot ์ฆ, ๊ธฐ์ค์ ์ ํ๊ธฐ (๋ณดํต ์ฒซ ๋ฒ์งธ ํน์ ๋ง์ง๋ง ๊ฐ์ pivot์ผ๋ก ์ค์ )
โก pivot์ ๊ธฐ์ค์ผ๋ก ๊ฐ๋ค์ ์๋กญ๊ฒ ๋ฐฐ์น : pivot ๋ณด๋ค ์์ ๊ฐ์ ์ผ์ชฝ์ผ๋ก, ํฐ ๊ฐ์ ์ค๋ฅธ์ชฝ์ ๋ฐฐ์น
partition ์๋ ๋ฐฉ์
def partition(my_list, start, end) :
# pivot ๊ธฐ์ค์ : ๊ธฐ์ค์ pivot์ ๋ง์ง๋ง ๊ฐ์ผ๋ก ์ค์
p = end
# big ๊ทธ๋ฃน์ด ์์๋๋ ๋ถ๋ถ (pivot ๋ณด๋ค ํฐ ๊ฐ)
b = start # ๋งจ ์ฒ์ ์ธ๋ฑ์ค์์ ์์
# unknown(์์ง pivot๊ณผ ๋น๊ตํ์ง ์์ ๋ถ๋ถ)์ ์์์
i = start # ๋งจ ์ฒ์ ์ธ๋ฑ์ค์์ ์์
if list[i] > p:
big ๊ทธ๋ฃน์ ์ํจ
i += 1
else:
small ๊ทธ๋ฃน์ ์ํจ → b์ ์์์ ๊ณผ i์ ์์น๋ฅผ ๋ฐ๊ฟ
i += 1, b += 1
# i๊ฐ pivot ์์น๊น์ง ์ค๋ฉด
i์ ์์น์ b์ ์์น๋ฅผ ๋ฐ๊ฟ
โผโผโผ partition ํจ์ ์ ์ โผโผโผ
โผโผโผ ๋ด๊ฐ ์์ฑํ ์ฝ๋ โผโผโผ
์ฐจ์ด์ : while๋ฌธ ์๊ณผ ๋ฐ์์ if ๋ฌธ์ ์ฌ์ฉํ์ฌ ์์ฑ → while๋ฌธ ๋ฐ ์กฐ๊ฑด๋ฌธ, while๋ฌธ ์ else๋ ๊ตณ์ด ์์ฑํ์ง ์์๋ ๋จ
์? i += 1์ ์กฐ๊ฑด์ ๋ง์กฑํ ๋๋ ๋ง์กฑํ์ง ์์ ๋ ๋ชจ๋ ์คํ๋์ด์ผ ํ๋ฏ๋ก if๋ฌธ์ my_list[i] <= my_list[p]ํ๋๋ก ์์ฑํ๊ณ if ์กฐ๊ฑด๋ฌธ์ด ๋๋๋ฉด i += 1์ ์คํํ๋๋ก ์์ฑํ๋ฉด ์ฝ๋ ํ ์ค์ ์ค์ผ ์ ์์
๋ํ, i == end๋ while๋ฌธ์ด ๋๋ฌ๋ค๋ ๊ฒ์ ์๋ฏธํ๋ฏ๋ก if๋ฌธ์ด ์๋๋ผ๋ ์คํ์ด ๋๊ฒ ๋์ด ์์
โ ํต ์ ๋ ฌ ํจ์(quick sort) ์์ฑํ๊ธฐ
Quicksort ์๋ ๋ฐฉ์
1. Divide : partition
2. Conquer : pivot ์ผ์ชฝ์ ์๋ ๊ฐ๊ณผ pivot ์ค๋ฅธ์ชฝ์ ์๋ ๊ฐ์ ๊ฐ๊ฐ ์ ๋ ฌ
3. Combine : ํ ์ผ์ด ์์
4. base case : ๋ฆฌ์คํธ์ ๊ฐ์ด ํ๋๋ฐ์ ์์ ๋
ํต ์ ๋ ฌ ํจ์๋ ํฉ๋ณ ์ ๋ ฌ๊ณผ ๋ฌ๋ฆฌ ์ ๋ ฌ๋ ์๋ก์ด ๋ฆฌ์คํธ๋ฅผ ๋ฆฌํดํ๋ ๊ฒ ์๋๋ผ, ํ๋ผ๋ฏธํฐ๋ก ๋ฐ๋ ๋ฆฌ์คํธ ์์ฒด๋ฅผ ์ ๋ ฌํจ
โ base case ์์ฑ : quicksortํจ์๋ ์ฌ๊ท์ ์ผ๋ก ํธ์ถ๋๋ฉด์ ํ๋ผ๋ฏธํฐ start์ end๋ง ๋ฐ๋
๋ฐ๋ผ์ end - start < 0 (๋ฆฌ์คํธ์ ๊ธธ์ด๊ฐ 0 ๋๋ 1์ธ ๊ฒฝ์ฐ) ์ด๋ฉด return
ํต ์ ๋ ฌ์ ์๋ก์ด ๋ฆฌ์คํธ๋ฅผ ๋ฆฌํดํ๋ ๊ฒ์ด ์๋๊ธฐ ๋๋ฌธ์ return๋ง ์์ฑํ์ฌ ํจ์ ํธ์ถ์ ๋๋
โก Divide : partition ๊ณผ์ ์ ํตํด, pivot์ ๊ธฐ์ค์ผ๋ก ๋ฆฌ์คํธ๋ฅผ ๋๋
โข Conquer : pivot ์ผ์ชฝ ๋ถ๋ถ๊ณผ pivot ์ค๋ฅธ์ชฝ ๋ถ๋ถ์ ๊ฐ๊ฐ quicksort ํจ์๋ก ์ ๋ ฌ
→ ์ด๋ถ๋ถ์์ ๋งํ์. ์ด๋ ๊ฒ ์์ฑํ๋ค๊ณ ์๊ฐํ๋๋ฐ ์ ์ ๋์ง...??
โฃ Combine : ์์
โค ์ถ๊ฐ : quicksort์์ start์ end ํ๋ผ๋ฏธํฐ๊ฐ ์์ ๋์๋ ์๋ํ๋๋ก ๋ง๋ค๊ธฐ (์ต์ ๋ ํ๋ผ๋ฏธํฐ ์ฌ์ฉํ๊ธฐ)
์ต์ ๋ ํ๋ผ๋ฏธํฐ
ํ๋ผ๋ฏธํฐ ์์ด ํจ์๋ฅผ ํธ์ถํ ์ ์์ → ๋ ๊น๋ํ ์ฝ๋ ์์ฑ ๊ฐ๋ฅ
์ฌ์ฉ ๋ฐฉ๋ฒ
ํ๋ผ๋ฏธํฐ = "๊ฐ"
ํจ์ ๋ด ํ๋ผ๋ฏธํฐ๋ฅผ ๋ณ์๋ก ํ๋ ๊ฐ์ ์ฌ์ฉํ๊ณ ์ถ์ผ๋ฉด ํ๋ผ๋ฏธํฐ = None ์ฌ์ฉ ํ
ํจ์ ์์ if ํ๋ผ๋ฏธํฐ == None: ์ฌ์ฉํ์ฌ ๊ธฐ๋ณธ๊ฐ ์ง์
references
[์๊ณ ๋ฆฌ์ฆ] ํฉ๋ณ ์ ๋ ฌ(merge sort)์ด๋ - Heee's Development Blog
Step by step goes a long way.
gmlwjd9405.github.io
ํฉ๋ณ ์ ๋ ฌ - ์ํค๋ฐฑ๊ณผ, ์ฐ๋ฆฌ ๋ชจ๋์ ๋ฐฑ๊ณผ์ฌ์
์ํค๋ฐฑ๊ณผ, ์ฐ๋ฆฌ ๋ชจ๋์ ๋ฐฑ๊ณผ์ฌ์ . ํฉ๋ณ ์ ๋ ฌ ๋๋ ๋ณํฉ ์ ๋ ฌ(์์ด: merge sort ๋จธ์ง ์ํธ[*])์ O(n log n) ๋น๊ต ๊ธฐ๋ฐ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์ผ๋ก ๊ตฌํํ์ ๋ ์ด ์ ๋ ฌ์ ์์ ์ ๋ ฌ์ ์ํ๋ฉฐ,
ko.wikipedia.org
๋ณํฉ ์ ๋ ฌ์ด๋? (๊ฐ๋ ์ดํดํ๊ธฐ) | ์๊ณ ๋ฆฌ์ฆ | Khan Academy
์ํ, ์์ , ์ปดํจํฐ ํ๋ก๊ทธ๋๋ฐ, ๊ฒฝ์ , ๋ฌผ๋ฆฌํ, ํํ, ์๋ฌผํ, ์ํ, ๊ธ์ต, ์ญ์ฌ ๋ฑ์ ๋ฌด๋ฃ๋ก ํ์ตํด ๋ณด์ธ์. ์นธ์์นด๋ฐ๋ฏธ๋ ์ด๋์์๋ ๋๊ตฌ์๊ฒ๋ ์ธ๊ณ ์ต๊ณ ์ ๋ฌด๋ฃ ๊ต์ก์ ์ ๊ณตํ๋ ๋ฏธ์ ์ ๊ฐ์ง
ko.khanacademy.org