๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ”‘ ์•Œ๊ณ ๋ฆฌ์ฆ˜/์•Œ๊ณ ๋ฆฌ์ฆ˜ & ์ž๋ฃŒ๊ตฌ์กฐ

[์•Œ๊ณ ๋ฆฌ์ฆ˜] ์ด๋ถ„ํƒ์ƒ‰ (Binaray Search)

by Tamii 2021. 7. 11.
๋ฐ˜์‘ํ˜•

์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ’€๋‹ค ๋ณด๋ฉด ์‹œ๊ฐ„๋ณต์žก๋„์˜ ๋Šช์— ๋น ์งˆ ๋•Œ๊ฐ€ ์žˆ๋‹ค.

 

 

ํŠนํžˆ ์ˆ˜์˜ ๋ฒ”์œ„๊ฐ€ ํฌ๋ฉด  ๋ฐฐ์—ด ๋‚ด ํŠน์ •ํ•œ ๊ฐ’์„ ์ฐพ์„ ๋•Œ 

์•„๋ž˜์™€ ๊ฐ™์€ ๋ฐฉ์‹์€ ๋ชจ๋“  ๋ฐฐ์—ด์„ ํƒ์ƒ‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์—„์ฒญ๋‚œ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๊ฒŒ ๋œ๋‹ค.,

 

i in arr

 

 

 

 

 

 

 

 

 

์ด๋Ÿด๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ด๋ถ„ํƒ์ƒ‰!

์ด๋ถ„ํƒ์ƒ‰์€ ๋ฐฐ์—ด์—์„œ ํŠน์ •ํ•œ ๊ฐ’์„ ์ฐพ์„ ๋•Œ ์ˆœ์ฐจ ํƒ์ƒ‰์ฒ˜๋Ÿผ  ๋งค๋ฒˆ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์ฒดํฌํ•˜์—ฌ ๊ฐ’์„ ์ฐพ๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ,

ํƒ์ƒ‰๋ฒ”์œ„๋ฅผ ์ ˆ๋ฐ˜์”ฉ ์ค„์—ฌ๊ฐ€๋ฉฐ ์ฐพ์•„๊ฐ€๋Š” search ๋ฐฉ๋ฒ•์ด๋‹ค.

 

๊ทธ๋ฆผ์„ ์—‰์„ฑํ•˜๊ฒŒ ๊ทธ๋ ธ์ง€๋งŒ ์ด๋ถ„ํƒ์ƒ‰์„ ์•„์ฃผ ์ง๊ด€์ ์ด๊ฒŒ ํ‘œํ˜„ํ•ด๋ณด์•˜๋‹ค. ๐Ÿ˜Ž

 

 

๊ทธ๋ ‡๋‹ค๋ฉด ์ฝ”๋“œ ๊ตฌํ˜„ ์‹œ์— ์–ด๋–ป๊ฒŒ ํ‘œํ˜„๋ ๊นŒ?

 


 

 

์ง€๊ทนํžˆ ๊ฐœ์ธ์ ์ด์ง€๋งŒ  ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ๋ฅผ ๋งŒ๋‚ฌ์„ ๋•Œ ์ ์šฉํ• ๋งŒํ•œ ์œ ํ˜•์„ ํฌ๊ฒŒ 3๊ฐ€์ง€๋กœ ๋ถ„๋ฆฌํ–ˆ๋Š”๋ฐ,

1) ๋ฐฐ์—ด๋‚ด ํŠน์ •ํ•œ ๊ฐ’์˜ idx๋ฅผ ์ฐพ์„ ๋•Œ  2) ๋ฐฐ์—ด๋‚ด์—์„œ ํŠน์ •ํ•œ ๊ฐ’์ด ์ถ”๊ฐ€๋  ๋•Œ์˜ ๊ทธ idx  3) 

 

 

 

 

1) ๋ฐฐ์—ด๋‚ด ํŠน์ •ํ•œ ๊ฐ’์˜ idx๋ฅผ ์ฐพ์„ ๋•Œ

arr = [1,2,4,5,7] 

def bin_search(target,data):
    start = 0
    end = len(data)-1
    findSuc = 0
    while start <= end:
        mid = (start+end)//2
        if data[mid] == target:
            return mid
            break
        elif data[mid] <= target:
            start = mid +1
        else:
            end = mid-1
    return -1
    
    

print(bin_search(4,arr)); // 2

 

 

2) ๋ฐฐ์—ด ๋‚ด ํŠน์ •ํ•œ ๊ฐ’์ด ์ถ”๊ฐ€๋  ๋•Œ ๊ทธ idx (์˜ค๋ฆ„์ฐจ์ˆœ)

==

๋ฐฐ์—ด ๋‚ด ํŠน์ •ํ•œ ๊ฐ’์˜ ์˜ค๋ฅธ์ชฝ ์ธ๋ฑ์Šค ๊ตฌํ•˜๊ธฐ bisect_right

๋ฐฐ์—ด๋‚ด ํŠน์ •ํ•œ ๊ฐ’์ด ์ถ”๊ฐ€๋  ๋•Œ ๊ทธ ์ž๋ฆฌ๊ฐ€ ์ •๋ ฌ๋œ ์ˆœ์„œ์—์„œ ์–ด๋–ค idx์ธ์ง€ ์•Œ๋ ค์ฃผ๋Š” ๊ฒƒ์ธ๋ฐ,

target์ด ๋ฐฐ์—ด ๋‚ด์— ์—†์–ด๋„ ๊ทธ ์œ„์น˜๋ฅผ ์ฐพ์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

 

arr= [1,2,4,5,7]

def bin_search(target,data) :
    start=0
    end=len(data)-1

    while(start<=end):
        mid=(start+end)//2

        if data[mid] <=target:
            start=mid+1
        else:
            end=mid-1
            
    return start

print(bin_search(4,arr)); // 3
print(bin_search(3,arr)); // 2

 

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ ์‹œ

ํ•ด๋‹น ๋กœ์ง์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ๋„ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ bisect_right 

bisect_left(literable, value) : ์™ผ์ชฝ ์ธ๋ฑ์Šค๋ฅผ ๊ตฌํ•˜๊ธฐ

from bisect  import bisect_right 

arr= [1,2,4,5,7]

print(bisect_right(arr,4)) // 3
print(bisect_right(arr,3)) // 2

 

 

3) ๋ฐฐ์—ด ๋‚ด ํŠน์ •ํ•œ ๊ฐ’์˜ ์™ผ์ชฝ ์ธ๋ฑ์Šค ๊ตฌํ•˜๊ธฐ bisect_left

 

from bisect  import bisect_right 

arr= [1,2,4,5,7]

print(bisect_right(arr,4)) // 2
print(bisect_right(arr,3)) // 1

 

 

 


 

ํŠนํžˆ bisect_left ์™€ bisect_right๋Š” ์ •๋ง ํ—ท๊ฐˆ๋ ค์„œ ์–ด๋–ป๊ฒŒ ์ต์ˆ™ํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์„๊นŒ ๊ณ ๋ฏผ์„ ํ–ˆ๋Š”๋ฐ,

 

 

์˜ˆ์‹œ๋กœ 

arr=[1,2,4,5,7]

#right
bisect_right(arr,4) # ์žˆ์„ ๋•Œ
bisect_right(arr,3) # ์—†์„ ๋•Œ

#left
bisect_left(arr,4) # ์žˆ์„ ๋•Œ
bisect_left(arr,3) # ์—†์„ ๋•Œ

 

 

์ด๋ ‡๊ฒŒ ํ•ด๋‹นํ•˜๋Š” target ๊ฐ’์„ ๋ฐฐ์—ด์— ๋„ฃ์€ ํ›„์— ๊ทธ ์ธ๋ฑ์Šค๋ฅผ ๋น„๊ตํ•ด์„œ ์–ด๋–ค ๊ฐ’์ด ๋‚˜์˜ฌ์ง€ ๋น„๊ตํ•ด๋ณด๋ฉฐ ์ •๋ฆฌํ–ˆ๋”๋‹ˆ

ํ™•์‹คํ•˜๊ฒŒ ์ •๋ฆฌ๊ฐ€ ๋˜์—ˆ๋‹ค. ์ ˆ๋Œ€ ์žŠ์–ด๋ฒ„๋ฆฌ์ง€ ์•Š์„ ๊ฒƒ ๊ฐ™๋‹ค.

 

 

 

 

 

์ฐธ๊ณ : https://programming119.tistory.com/196 [๊ฐœ๋ฐœ์ž ์•„์ €์”จ๋“ค ํž˜์„๋ชจ์•„]

๋Œ“๊ธ€