[ํ์ด์ฌ/python] ์ด์ง ํ์ (Binary Search)
์ด์ง ํ์์ด๋ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ๋ ๋ฐฐ์ด์์ ์ํ๋ ์ซ์๋ฅผ ์ฐพ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
๋ฐ๋์ ์ ๋ ฌ๋ ์ํ์์ ์์ํด์ผํ๊ณ ๋ก๊ทธ์คํ์๊ฐ(O(log N))์ ๋ณด์ฅํ๋ค.
- target : ์ฐพ์ ๊ฐ
- start : ์์ ์ธ๋ฑ์ค
- end : ๋ง์ง๋ง ์ธ๋ฑ์ค
- pivot : ์ค๊ฐ ์ธ๋ฑ์ค
์ 4๊ฐ์ง๋ฅผ ์ด์ฉํ์ฌ ๊ตฌํํ๋ค.
๋ฆฌ์คํธ์ ์ค๊ฐ ์ธ๋ฑ์ค pivot ๊ฐ์ด ์ฐพ๊ณ ์ํ๋ ๊ฐ target๊ณผ ๊ฐ์์ง ๋น๊ตํ๋ฉด์ ์งํ๋๋ค.
๊ฐ์ง ์๋ค๋ฉด start ๊ฐ๊ณผ end ๊ฐ์ ์ ์ ํ ์กฐ์ ํ์ฌ pivot ๊ฐ์ ๋ฐ๊ฟ๊ฐ๋ฉฐ ๋ค์ target๊ณผ ๋น๊ตํ๋ค.
์๋ฅผ ๋ฐ๋ณตํ๋ฉด ๋ฐ๋ณตํ ๋๋ง๋ค ๋ฒ์๊ฐ ๋ฐ์ฉ ์ค์ด๋ค๊ฒ๋๋ฏ๋ก logN์ ์๊ฐ์ ๊ฐ๋๋ค.
์๋ฅผ ๋ค์ด 1๋ถํฐ 10๊น์ง์ ์ ์ค target 8์ ์ฐพ์ผ๋ ค ํ๋ค.
1์ start๋ก 10์ end๋ก ์ค์ ํ๊ณ ๊ทธ ์ค๊ฐ ๊ฐ์ธ 5๋ฅผ pivot์ผ๋ก ์ค์ ํ๋ค.
5์ 8์ด ๊ฐ์ง ์์ผ๋ฏ๋ก start ๊ฐ์ pivot๋ณด๋ค ํฌ๊ฒ ์กฐ์ ํ์ฌ ๋ฒ์๋ฅผ ์ค์ธ๋ค.
start๋ฅผ 6์ผ๋ก ๋ฐ๊พธ๊ณ end๋ ๊ทธ๋๋ก 10์ผ๋ก ์ค์ ํ๋ค. ๊ทธ๋ผ ๊ทธ ์ค๊ฐ ๊ฐ์ธ 8์ด pivot์ด ๋๋ค.
pivot 8๊ณผ target 8์ด ๊ฐ์ผ๋ฏ๋ก ์ด์งํ์์ด ๋๋๋ค.
ํ์ด์ฌ์ผ๋ก ๊ตฌํํ๊ธฐ
while end >= start:
pivot = (end + start) // 2
if pivot < target:
start = pivot + 1
elif pivot > target:
end = pivot - 1
else:
break
end๊ฐ๊ณผ start๊ฐ์ด ๊ณ์ ๋ฐ๋๋ฏ๋ก start ๊ฐ์ด end ๊ฐ์ ๋์ง ์์ ๋๊น์ง ๋ฐ๋ณตํ๋ค.
pivot์ ์ค๊ฐ๊ฐ์ผ๋ก ์ก์์ฃผ๊ณ target๊ณผ ๋น๊ตํ๋ค.
๋ง์ฝ pivot ๊ฐ์ด ๋ ์๋ค๋ฉด target์ ์์ ๊ฐ๋ฅํ ์ต์๊ฐ์ pivot +1์ด๋ฏ๋ก start๋ฅผ pivot + 1๋ก ์ค์ ํ๋ค.
๋ง์ฝ pivot ๊ฐ์ด ๋ ํฌ๋ค๋ฉด target์ ์์ ๊ฐ๋ฅํ ์ต๋๊ฐ์ pivot - 1์ด๋ฏ๋ก end๋ฅผ pivot - 1๋ก ์ค์ ํ๋ค.
pivot ๊ฐ๊ณผ target ๊ฐ์ด ๊ฐ๋ค๋ฉด break๋ฅผ ํตํด ๋ฐ๋ณต๋ฌธ์ ๋น ์ ธ๋๊ฐ๋ค.
'๐์๊ณ ๋ฆฌ์ฆ > ๐ ๊ฐ๋ ์ ๋ฆฌ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํ์ด์ฌ/python] ํ (Queue) (0) | 2021.03.19 |
---|---|
[ํ์ด์ฌ/python] ์ ๋ ฌ - sort(), sorted() (0) | 2021.03.17 |
[ํ์ด์ฌ/python] ๋์ ๋๋ฆฌ (dictionary) (0) | 2021.03.12 |
[ํ์ด์ฌ/python] ๋๋คํจ์ (lambda) (0) | 2021.03.12 |
[ํ์ด์ฌ/python] ์๋ผํ ์คํ ๋ค์ค์ ์ฒด (0) | 2021.03.10 |