๐ป Computer Science/Algorithm
์ด๋ถ ํ์(Binary Search)
kkh1902
2023. 1. 19. 21:32
728x90
๋ฐ์ํ
์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ๋ ๋ฐฐ์ด์์ ์ํ๋ ์ซ์(target)์ ์ฐพ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค.
๋ฐฐ์ด ์ ์ฒด์ ์ค๊ฐ๊ฐ์ target ๊ฐ๊ณผ ๋น๊ต
์ค๊ฐ๊ฐ์ด target ๊ฐ๋ณด๋ค ํฌ๋ฉด ์ผ์ชฝ ๋ถ๋ถ๋ง ์ ํ
์ผ์ชฝ๋ถ๋ถ์ ์ค๊ฐ๊ฐ์ ๋ค์ target ๊ณผ ๋น๊ต
์ ๋ฐฉํฅ์ผ๋ก ํธ๋ ๋ฐฉ๋ฒ๊ณผ ์ฌ๊ท๋ก ํธ๋ ๋ฐฉ๋ฒ ๋ ๊ฐ์ง๊ฐ ์์ต๋๋ค.
์ ๋ฐฉํฅ๋ ์ด๋ป๊ฒ ๋ณด๋ฉด ๊ฐ๋
์ ์ผ๋ก๋ ์ฌ๊ท๋ก ํธ๋ ๋ฐฉ๋ฒ๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์
๋๋ค.
๊ฐ๋
- ์ ๋ ฌ๋ ์๋ฃ๋ฅผ ๋ฐ์ผ๋ก ๋๋์ด ํ์ํ๋ ๋ฐฉ๋ฒ
- ์ฃผ์์ : ์๋ฃ๋ ์ค๋ฆ์ฐจ์ ์ผ๋ก ์ ๋ ฌ๋ ์๋ฃ์ฌ์ผ ํ๋ค.
- ์ด์งํธ๋ฆฌ, ๋ฐ์ด๋๋ฆฌ์์น๋ ์ฝ๋ฉ ์ธํฐ๋ทฐ ๋จ๊ณจ๋ฌธ์
- ํผํฌ๋จผ์ค๊ฐ ์์ฃผ ์ข๊ณ ๊ตฌํํ๋ ์ค์ dynamic programming, recursion์ ๋ณผ ์ ์๋ค.
ํน์ง
- linear search (์์ฐจ๊ฒ์) : ์์๋๋ก ์ฐพ๋๋ค. ์ฑ๋ฅํ๊ฐ์ ๋น๊ต๋์์ผ๋ก ์ฌ์ฉํ๋ค.
- linear search๋ ์ ๋ ฌ ๋ฐฉ์์ด ์๊ด ์๋ค.
- binary search (์ด์งํ์) : ๋ฐ๋์ ์ ๋ ฌ๋ ์ํ์์ ์์ํด์ผํ๋ค. ๋ก๊ทธ์คํ์๊ฐ์ ๋ณด์ฅํ๋ค.
- ์ฐธ๊ณ ๋ก insert sort (์ฝ์ ์ ๋ ฌ), bubble sort, selection sort๋ O(n^2)์ ์ฑ๋ฅ์ ๊ฐ๊ณ ์๋ค. (์ฐธ๊ณ )
์ฒ์๋ถํฐ ๋๊น์ง ๋๋ฉด์ ํ์ํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๋น ๋ฅธ ์ฅ์ ์ ์ง๋
* ์๊ฐ๋ณต์ก๋
์ ์ฒด ํ์ : O(N)
์ด๋ถ ํ์ : O(logN)
์งํ ์์
- ์ฐ์ ์ ๋ ฌ์ ํด์ผ ํจ
- left์ right๋ก mid ๊ฐ ์ค์
- mid์ ๋ด๊ฐ ๊ตฌํ๊ณ ์ ํ๋ ๊ฐ๊ณผ ๋น๊ต
- ๊ตฌํ ๊ฐ์ด mid๋ณด๋ค ๋์ผ๋ฉด : left = mid+1 ๊ตฌํ ๊ฐ์ด mid๋ณด๋ค ๋ฎ์ผ๋ฉด : right = mid - 1
- left > right๊ฐ ๋ ๋๊น์ง ๊ณ์ ๋ฐ๋ณตํ๊ธฐ
source code
์ ๋ฐฉํฅ
target = 25
m_list = [30, 94, 27, 92, 21, 37, 25, 47, 25, 53, 98, 19, 32, 32, 7]
length = len(m_list)
m_list.sort()
left = 0
right = length-1
while left<=right:
mid = (left+right)//2
if m_list[mid] == target:
print(mid+1)
break
elif m_list[mid]>target:
right = mid-1
else :
left = mid+1
์ฌ๊ท(Recursive)
def binarySearch(array, target, left, right):
middle_idx = (left+right)//2
print(middle_idx)
middle = array[middle_idx]
if target == middle:
print('answer {}'.format(middle_idx))
elif middle > target:
binarySearch(array, target,left,middle_idx-1)
elif middle < target:
binarySearch(array, target,middle_idx+1,right)
else:
return False
target = 25
m_list = [30, 94, 27, 92, 21, 37, 25, 47, 25, 53, 98, 19, 32, 32, 7]
length = len(m_list)
m_list.sort()
left = 0
right = length-1
binarySearch(m_list,target,0,right)
์ถ์ฒ
https://wayhome25.github.io/cs/2017/04/15/cs-16/
728x90
๋ฐ์ํ