🐢 Programming/Algorithm

5. Search 검색

μ§€ 원 2022. 10. 19. 19:34

검색(Search)

검색

μ €μž₯λ˜μ–΄ μžˆλŠ” 자료 μ€‘μ—μ„œ μ›ν•˜λŠ” ν•­λͺ©μ„ μ°ΎλŠ” μž‘μ—…

 

λͺ©μ ν•˜λŠ” 탐색 ν‚€λ₯Ό κ°€μ§„ ν•­λͺ©μ„ μ°ΎλŠ” 것

  • 탐색 ν‚€(search key) : 자료λ₯Ό κ΅¬λ³„ν•˜μ—¬ 인식할 수 μžˆλŠ” ν‚€

 

κ²€μƒ‰μ˜ μ’…λ₯˜

  • 순차 검색 (sequential search)
  • 이진 검색 (binary search)
  • 해쉬 (hash)

 

순차 검색

일렬둜 λ˜μ–΄ μžˆλŠ” 자료λ₯Ό μˆœμ„œλŒ€λ‘œ κ²€μƒ‰ν•˜λŠ” 방법

  • κ°€μž₯ κ°„λ‹¨ν•˜κ³  직관적인 검색 방법
  • λ°°μ—΄μ΄λ‚˜ μ—°κ²° 리슀트 λ“± 순차ꡬ쑰둜 κ΅¬ν˜„λœ μžλ£Œκ΅¬μ‘°μ—μ„œ μ›ν•˜λŠ” ν•­λͺ©μ„ 찾을 λ•Œ μœ μš©ν•¨
  • μ•Œκ³ λ¦¬μ¦˜μ΄ λ‹¨μˆœν•˜μ—¬ κ΅¬ν˜„μ΄ μ‰½μ§€λ§Œ, 검색 λŒ€μƒμ˜ μˆ˜κ°€ λ§Žμ€ κ²½μš°μ—λŠ” μˆ˜ν–‰μ‹œκ°„μ΄ κΈ‰κ²©νžˆ μ¦κ°€ν•˜μ—¬ λΉ„νš¨μœ¨μ μž„

 

2κ°€μ§€ 경우

  • μ •λ ¬λ˜μ–΄ μžˆμ§€ μ•Šμ€ 경우
  • μ •λ ¬λ˜μ–΄ μžˆλŠ” 경우

 

μ •λ ¬λ˜μ–΄ μžˆμ§€ μ•Šμ€ 경우

검색과정

  • 첫 번째 μ›μ†ŒλΆ€ν„° μˆœμ„œλŒ€λ‘œ 검색 λŒ€μƒκ³Ό ν‚€ 값이 같은 μ›μ†Œκ°€ μžˆλŠ”μ§€ λΉ„κ΅ν•˜λ©° μ°ΎλŠ”λ‹€.
  • ν‚€ 값이 λ™μΌν•œ μ›μ†Œλ₯Ό 찾으면 κ·Έ μ›μ†Œμ˜ 인덱슀λ₯Ό λ°˜ν™˜ν•œλ‹€.
  • 자료ꡬ쑰의 λ§ˆμ§€λ§‰μ— 이λ₯Ό λ•ŒκΉŒμ§€ 검색 λŒ€μƒμ„ μ°Ύμ§€ λͺ»ν•˜λ©΄ 검색 μ‹€νŒ¨

 

찾고자 ν•˜λŠ” μ›μ†Œμ˜ μˆœμ„œμ— 따라 λΉ„κ΅νšŒμˆ˜κ°€ 결정됨

첫번째 μ›μ†Œλ₯Ό 찾을 λ•ŒλŠ” 1번 비ꡐ, λ‘λ²ˆμ§Έ μ›μ†Œλ₯Ό 찾을 λ•ŒλŠ” 2번 비ꡐ

μ •λ ¬λ˜μ§€ μ•Šμ€ μžλ£Œμ—μ„œμ˜ 순차 κ²€μƒ‰μ˜ 평균 비ꡐ 회수

= (1/n) * (1+2+3+…+n) = (n+1)/2

 

μ‹œκ°„λ³΅μž‘λ„

O(n)

 

μ •λ ¬λ˜μ–΄ μžˆμ§€ μ•Šμ€ 경우 순차 검색

def sequentialSearch(a, n, key):
    i <- 0
    while i<n and a[i]!=key : 
        i <- i+1
    if i<n : return 
    else : return -1

 

μ •λ ¬ λ˜μ–΄ μžˆλŠ” 경우

검색과정

μžλ£Œκ°€ μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬λœ μƒνƒœμ—μ„œ 검색을 μ‹€μ‹œν•œλ‹€κ³  κ°€μ •ν•˜μž

자료λ₯Ό 순차적으둜 κ²€μƒ‰ν•˜λ©΄μ„œ ν‚€ 값을 λΉ„κ΅ν•˜μ—¬, μ›μ†Œμ˜ ν‚€ 값이 검색 λŒ€μƒμ˜ ν‚€ 값보닀 크면 μ›μ†Œκ°€ μ—†λ‹€λŠ” κ²ƒμ΄λ―€λ‘œ 더 이상 κ²€μƒ‰ν•˜μ§€ μ•Šκ³  검색을 μ’…λ£Œν•œλ‹€.

 

찾고자 ν•˜λŠ” μ›μ†Œμ˜ μˆœμ„œμ— 따라 λΉ„κ΅νšŒμˆ˜κ°€ 결정됨

정렬이 λ˜μ–΄μžˆμœΌλ―€λ‘œ, 검색 μ‹€νŒ¨λ₯Ό λ°˜ν™˜ν•˜λŠ” 경우 평균 비ꡐ νšŒμˆ˜κ°€ 반으둜 쀄어든닀.

 

μ‹œκ°„λ³΅μž‘λ„

O(n)

 

μ •λ ¬λ˜μ–΄ μžˆλŠ” 경우 순차 검색

def sequentialSearch2(a, n, key):
    i <- 0
    while i<n and a[i] < key : 
        i <- i+1
    if i<n and a[i] == key : 
        return i 
    else : return -1

 

이진 검색(Binary Search)

자료의 κ°€μš΄λ°μ— μžˆλŠ” ν•­λͺ©κ³Ό ν‚€ κ°’κ³Ό λΉ„κ΅ν•˜μ—¬ λ‹€μŒ κ²€μƒ‰μ˜ μœ„μΉ˜λ₯Ό κ²°μ •ν•˜κ³  검색을 계속 μ§„ν–‰ν•˜λŠ” 방법

λͺ©μ  ν‚€λ₯Ό 찾을 λ•ŒκΉŒμ§€ 이진 검색을 μˆœν™˜μ μœΌλ‘œ 반볡 μˆ˜ν–‰ν•¨μœΌλ‘œμ¨ 검색 λ²”μœ„λ₯Ό 밀으둜 μ€„μ—¬κ°€λ©΄μ„œ 보닀 λΉ λ₯΄κ²Œ 검색을 μˆ˜ν–‰ν•¨

 

이진 검색을 ν•˜κΈ° μœ„ν•΄μ„œλŠ” μžλ£Œκ°€ μ •λ ¬λœ μƒνƒœμ—¬μ•Ό ν•œλ‹€.

 

검색과정

자료의 쀑앙에 μžˆλŠ” μ›μ†Œλ₯Ό κ³ λ₯Έλ‹€.

쀑앙 μ›μ†Œμ˜ κ°’κ³Ό 찾고자 ν•˜λŠ” λͺ©ν‘œ 값을 λΉ„κ΅ν•œλ‹€.

자료의 쀑앙 μ›μ†Œμ˜ 값보닀 μž‘μœΌλ©΄ 자료의 μ™Όμͺ½ λ°˜μ— λŒ€ν•΄μ„œ μƒˆλ‘œ 검색을 μˆ˜ν–‰ν•˜κ³ , 크닀면 자료의 였λ₯Έμͺ½ λ°˜μ— λŒ€ν•΄μ„œ μƒˆλ‘œ 검색을 μˆ˜ν–‰ν•œλ‹€.

찾고자 ν•˜λŠ” 값을 찾을 λ•ŒκΉŒμ§€ 1 ~ 3의 과정을 λ°˜λ³΅ν•œλ‹€.

 

κ΅¬ν˜„

검색 λ²”μœ„μ˜ μ‹œμž‘μ κ³Ό μ’…λ£Œμ μ„ μ΄μš©ν•˜μ—¬ 검색을 반볡 μˆ˜ν–‰ν•œλ‹€.

이진 κ²€μƒ‰μ˜ 경우, μžλ£Œμ— μ‚½μž…μ΄λ‚˜ μ‚­μ œκ°€ λ°œμƒ ν–ˆμ„ λ•Œ λ°°μ—΄μ˜ μƒνƒœλ₯Ό 항상 μ •λ ¬ μƒνƒœλ‘œ μœ μ§€ν•˜λŠ” μΆ”κ°€ μž‘μ—…μ΄ ν•„μš”ν•˜λ‹€.

def binarySearch(a, N, key):
    start = 0
    end = N-1
    while start <= end:
        middle = (start + end) //2
        if a[middle] == key: # 검색 성곡
            return True
        elif a[middle] < key:
            end = middle - 1
        else :
            start = middle + 1
    return False # 검색 μ‹€νŒ¨

 

μž¬κ·€ ν•¨μˆ˜λ₯Ό μ΄μš©ν•œ κ΅¬ν˜„

μ•„λž˜μ™€ 같이 μž¬κ·€ ν•¨μˆ˜λ₯Ό μ΄μš©ν•˜μ—¬ 이진 검색을 κ΅¬ν˜„ν•  μˆ˜λ„ μžˆλ‹€.

이진탐색은 λ°˜λ³΅λ¬Έμ„ μ‚¬μš©ν•˜λŠ” 것이 훨씬 νš¨μœ¨μ μ΄λ‹€.

def binarySearch(a, low, high, key):
    if low > high: #검색 μ‹€νŒ¨
        return False
    else :
        middle = (low + high) //2
        if key == a[middle] : # 검색 성곡
            return True
        elif key < a[middle] :
            return binarySearch2(a, low, middle-1, key)
        elif a[middle] < key :
            return binarySearch2(a, middle+1, high, key)

'🐢 Programming > Algorithm' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

4. Array Extra λ°°μ—΄  (0) 2022.10.15
3. Sort μ •λ ¬  (0) 2022.10.02
2. Array λ°°μ—΄  (2) 2022.10.01
1. Algorithm μ•Œκ³ λ¦¬μ¦˜  (4) 2022.09.29