πŸ”— 순차 탐색 μ•Œκ³ λ¦¬μ¦˜κ³Ό 이진 탐색 μ•Œκ³ λ¦¬μ¦˜

μ΄μž¬ν™˜Β·2024λ…„ 10μ›” 8일
0

μ˜€λŠ˜μ€ 두 가지 탐색 μ•Œκ³ λ¦¬μ¦˜μΈ 순차 탐색과 이진 탐색에 λŒ€ν•΄ μ•Œμ•„λ³΄λ €κ³  ν•©λ‹ˆλ‹€. 두 μ•Œκ³ λ¦¬μ¦˜ λͺ¨λ‘ 데이터λ₯Ό νƒμƒ‰ν•˜λŠ” λ°©λ²•μ΄μ§€λ§Œ, κ·Έ μž‘λ™ 방식과 νš¨μœ¨μ„±μ— 큰 차이가 μžˆμŠ΅λ‹ˆλ‹€. μ–΄λ–€ μƒν™©μ—μ„œ μ–΄λ–€ μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•΄μ•Ό ν•˜λŠ”μ§€ ν•¨κ»˜ μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.


1️⃣ 순차 탐색 μ•Œκ³ λ¦¬μ¦˜

순차 탐색은 κ°€μž₯ 기본적인 탐색 λ°©λ²•μž…λ‹ˆλ‹€. λ¦¬μŠ€νŠΈλ‚˜ λ°°μ—΄μ˜ 첫 번째 μš”μ†ŒλΆ€ν„° ν•˜λ‚˜μ”© μ°¨λ‘€λŒ€λ‘œ νƒμƒ‰ν•˜μ—¬ 찾고자 ν•˜λŠ” 값을 찾을 λ•ŒκΉŒμ§€ 계속 μ§„ν–‰ν•©λ‹ˆλ‹€.

πŸ› οΈ 순차 탐색 κ³Όμ •:

  1. 리슀트의 첫 번째 μš”μ†ŒλΆ€ν„° μ‹œμž‘ν•©λ‹ˆλ‹€.
  2. 각 μš”μ†Œλ₯Ό μˆœμ„œλŒ€λ‘œ ν™•μΈν•˜λ©΄μ„œ 찾고자 ν•˜λŠ” κ°’κ³Ό λΉ„κ΅ν•©λ‹ˆλ‹€.
  3. 찾으면 탐색을 μ’…λ£Œν•˜κ³  ν•΄λ‹Ή μœ„μΉ˜λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
  4. 리슀트의 λκΉŒμ§€ 찾아도 μ—†μœΌλ©΄ 탐색 μ‹€νŒ¨λ‘œ μ²˜λ¦¬ν•©λ‹ˆλ‹€.

πŸ“ˆ μ‹œκ°„ λ³΅μž‘λ„:

  • μ΅œμ„ μ˜ 경우: O(1) (찾고자 ν•˜λŠ” 값이 첫 번째 μœ„μΉ˜μ— μžˆμ„ λ•Œ)
  • μ΅œμ•…μ˜ 경우: O(n) (리슀트의 λκΉŒμ§€ 탐색해야 ν•  λ•Œ)

βœ… μž₯점:

  • μ •λ ¬λ˜μ§€ μ•Šμ€ λ¦¬μŠ€νŠΈμ—μ„œλ„ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • κ΅¬ν˜„μ΄ κ°„λ‹¨ν•©λ‹ˆλ‹€.

❌ 단점:

  • 데이터가 λ§Žμ•„μ§ˆμˆ˜λ‘ 탐색 μ‹œκ°„μ΄ 였래 κ±Έλ¦½λ‹ˆλ‹€.

μ½”λ“œ μ˜ˆμ‹œ:

def sequential_search(arr, target):
    for i in range(len(arr)):
        if arr[i] == target:
            return i  # 찾은 경우 인덱슀 λ°˜ν™˜
    return -1  # 찾지 λͺ»ν•œ 경우

이진 탐색은 μ •λ ¬λœ λ¦¬μŠ€νŠΈμ—μ„œλ§Œ μ‚¬μš©ν•  수 μžˆλŠ” 맀우 효율적인 탐색 λ°©λ²•μž…λ‹ˆλ‹€. 탐색 λ²”μœ„λ₯Ό 절반으둜 λ‚˜λˆ„λ©΄μ„œ 찾고자 ν•˜λŠ” 값을 μ°ΎμŠ΅λ‹ˆλ‹€.

πŸ› οΈ 이진 탐색 κ³Όμ •:

λ¦¬μŠ€νŠΈκ°€ μ •λ ¬λ˜μ–΄ μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.
쀑간 μš”μ†Œλ₯Ό ν™•μΈν•˜κ³ , 찾고자 ν•˜λŠ” 값이 쀑간 μš”μ†Œλ³΄λ‹€ μž‘μœΌλ©΄ μ™Όμͺ½μœΌλ‘œ, 크면 였λ₯Έμͺ½μœΌλ‘œ 탐색 λ²”μœ„λ₯Ό μ€„μ—¬λ‚˜κ°‘λ‹ˆλ‹€.
탐색 λ²”μœ„λ₯Ό 계속 μ ˆλ°˜μ”© μ€„μ—¬κ°€λ©΄μ„œ 값을 μ°ΎμŠ΅λ‹ˆλ‹€.
값을 찾으면 탐색을 μ’…λ£Œν•˜κ³ , 찾지 λͺ»ν•˜λ©΄ 탐색 λ²”μœ„λ₯Ό λͺ¨λ‘ ν™•μΈν–ˆμœΌλ―€λ‘œ 탐색 μ‹€νŒ¨λ‘œ μ²˜λ¦¬ν•©λ‹ˆλ‹€.

πŸ“ˆ μ‹œκ°„ λ³΅μž‘λ„:

μ΅œμ•…μ˜ 경우: O(log n) (탐색 λ²”μœ„λ₯Ό μ ˆλ°˜μ”© μ€„μ—¬λ‚˜κ°€κΈ° λ•Œλ¬Έ)

βœ… μž₯점:

맀우 λΉ λ₯Έ 탐색이 κ°€λŠ₯ν•©λ‹ˆλ‹€.
데이터가 클수둝 κ·Έ νš¨μœ¨μ„±μ΄ κ·ΉλŒ€ν™”λ©λ‹ˆλ‹€.

❌ 단점:

μ •λ ¬λœ λ¦¬μŠ€νŠΈμ—μ„œλ§Œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
μ •λ ¬λ˜μ§€ μ•Šμ€ λ¦¬μŠ€νŠΈμ—μ„œ μ‚¬μš©ν•˜λ €λ©΄ λ¨Όμ € 정렬을 ν•΄μ•Ό ν•˜λ―€λ‘œ μΆ”κ°€ μ‹œκ°„μ΄ ν•„μš”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
μ½”λ“œ μ˜ˆμ‹œ:

def binary_search(arr, target):
    left, right = 0, len(arr) - 1
    while left <= right:
        mid = (left + right) // 2
        if arr[mid] == target:
            return mid  # 찾은 경우 인덱슀 λ°˜ν™˜
        elif arr[mid] < target:
            left = mid + 1
        else:
            right = mid - 1
    return -1  # 찾지 λͺ»ν•œ 경우

마무리 🎯

순차 탐색과 이진 탐색은 각기 λ‹€λ₯Έ μž₯단점을 가지고 μžˆμŠ΅λ‹ˆλ‹€. μž‘μ€ λ°μ΄ν„°μ…‹μ΄λ‚˜ μ •λ ¬λ˜μ§€ μ•Šμ€ λ°μ΄ν„°μ…‹μ—μ„œλŠ” 순차 탐색이 μ ν•©ν•˜μ§€λ§Œ, 큰 λ°μ΄ν„°μ…‹μ΄λ©΄μ„œ 정렬이 λ˜μ–΄ μžˆλ‹€λ©΄ 이진 탐색을 μ‚¬μš©ν•˜λŠ” 것이 훨씬 더 νš¨μœ¨μ μž…λ‹ˆλ‹€.

0개의 λŒ“κΈ€