Bibi's DevLog πŸ€“πŸŽ

[Hello Coding μ•Œκ³ λ¦¬μ¦˜] 1μž₯. μ•Œκ³ λ¦¬μ¦˜μ˜ μ†Œκ°œ λ³Έλ¬Έ

ν”„λ‘œκ·Έλž˜λ°/Algorithm μ•Œκ³ λ¦¬μ¦˜

[Hello Coding μ•Œκ³ λ¦¬μ¦˜] 1μž₯. μ•Œκ³ λ¦¬μ¦˜μ˜ μ†Œκ°œ

λΉ„λΉ„ bibi 2021. 6. 28. 16:23

[210628]

Hello Coding μ•Œκ³ λ¦¬μ¦˜

1μž₯. μ•Œκ³ λ¦¬μ¦˜μ˜ μ†Œκ°œ

λ“€μ–΄κ°€λŠ” κΈ€

  • μ•Œκ³ λ¦¬μ¦˜ : μ–΄λ–€ 일을 ν•˜κΈ° μœ„ν•œ λͺ…λ Ήμ˜ 집합
  • μ„±λŠ₯
    • μ—¬λŸ¬ μ•Œκ³ λ¦¬μ¦˜λ“€μ˜ μž₯단점과 차이점을 μ΄ν•΄ν•˜κ³  μ“Έ 쀄 μ•Œμ•„μ•Ό ν•œλ‹€.
    • λ‹€λ₯Έ 자료ꡬ쑰 / μ•Œκ³ λ¦¬μ¦˜μ„ μ“°λŠ” κ²ƒλ§ŒμœΌλ‘œλ„ μ„±λŠ₯이 크게 λ‹¬λΌμ§ˆ 수 μžˆλ‹€.

λ‹¨μˆœ 탐색 simple search

탐색 문제λ₯Ό ν’€ λ•Œ μ‚¬μš©.

  • λ™μž‘ : λ‹¨μˆœνžˆ μ›μ†Œ ν•˜λ‚˜ν•˜λ‚˜λ₯Ό λ§žλŠ”μ§€ μ•„λ‹Œμ§€ 일일이 ν™•μΈν•˜λŠ” 방식
  • n개의 μ›μ†Œ λ¦¬μŠ€νŠΈμ—μ„œ μ΅œλŒ€ nλ²ˆλ§Œμ— 정닡을 찾음

이진 탐색 binary search

탐색 문제 search λ₯Ό ν’€ λ•Œ μ‚¬μš©.

이진 탐색은 맀 λ‹¨κ³„λ§ˆλ‹€ 절반의 후보듀을 없앨 수 μžˆλ‹€.

  • input : μ •λ ¬λœ μ›μ†Œ 리슀트
  • output : μ›ν•˜λŠ” μ›μ†Œκ°€ 있으면 κ·Έ μœ„μΉ˜λ₯Ό λ°˜ν™˜. μ•„λ‹ˆλ©΄ null λ°˜ν™˜.
  • λ™μž‘
    • μ •λ ¬λœ 리슀트의 쀑간값뢀터 탐색 μ‹œμž‘.
      • ν™€μˆ˜μΌ λ–„λŠ” (ν™€μˆ˜ + 1) / 2 둜 계산
    • νƒμƒ‰λŒ€μƒμ΄ 쀑간값보닀 μž‘μ€μ§€ 큰지 νŒλ‹¨
    • μž‘μ€/큰 λ‚˜λ¨Έμ§€ 절반 리슀트의 쀑간뢀터 λ‹€μ‹œ 탐색 μ‹œμž‘ - 이 과정을 반볡
  • n개의 μ›μ†Œ λ¦¬μŠ€νŠΈμ—μ„œ μ΅œλŒ€ log2n번 λ§Œμ— 정닡을 찾음

이진 탐색 μ½”λ“œ

def binary_search(list, item):
    low = 0
    high = len(list)-1

    while low <= high:
        mid = (low + high) / 2
        guess = list[mid]

        if guess == item: ## μΆ”μΈ‘ν•œ 값이 μ •λ‹΅μž„ 
            return mid
        if guess > item: ## guessκ°€ λ„ˆλ¬΄ 큼 - 탐색 천μž₯을 mid-1둜 μ„€μ •
            high = mid - 1
        else:   ## guessκ°€ λ„ˆλ¬΄ μž‘μŒ
            low = mid - 1
    return None ## μ•„μ΄ν…œμ΄ λ¦¬μŠ€νŠΈμ— μ—†μŒ

my_list = [1, 3, 5, 7, 9]

print binary_search(my_list, 3) ## return = 1
print binary_search(my_list, -1) ## return = None

둜그의 κ°œλ…

  • λ‘œκ·ΈλŠ” κ±°λ“­μ œκ³±μ˜ λ°˜λŒ€λ§μ΄λ‹€.
  • λΉ…μ˜€ ν‘œκΈ°λ²•μ—μ„œ - λͺ¨λ“  logν•¨μˆ˜λŠ” log2λ₯Ό λœ»ν•œλ‹€ (밑이 2인 둜그).
  • 밑이 10인 λ‘œκ·Έμ— λŒ€ν•΄μ„œλŠ” 밑을 μƒλž΅ν•œλ‹€.
  • logb(a) = bλ₯Ό λͺ‡ 번 κ±°λ“­μ œκ³±ν•΄μ•Ό aκ°€ λ‚˜μ˜¬κΉŒμš”?

μ‹€ν–‰ μ‹œκ°„ running time

μ‹œκ°„ λ˜λŠ” μ €μž₯곡간 λ©΄μ—μ„œ κ°€μž₯ 효율적인 μ•Œκ³ λ¦¬μ¦˜μ„ λ‚˜νƒ€λ‚Ό 수 μžˆλ‹€

  • μ„ ν˜• μ‹œκ°„ linear time
    • O(n)
    • n개의 μ›μ†Œκ°€ μžˆλ‹€λ©΄ n번 μΆ”μΈ‘ν•΄μ•Ό 함 (ex. λ‹¨μˆœνƒμƒ‰)
  • 둜그 μ‹œκ°„ logarithmic time
    • O(log n)
    • n개의 μ›μ†Œκ°€ μžˆλ‹€λ©΄ log n번 μΆ”μΈ‘ν•΄μ•Ό 함 (ex. 이진탐색)

λΉ…μ˜€ν‘œκΈ°λ²• Big O notation - 기초

μ–΄λ–€ μ•Œκ³ λ¦¬μ¦˜μ΄ μ–Όλ§ˆλ‚˜ λΉ λ₯Έμ§€ ν‘œκΈ°ν•˜λŠ” 방법. (μ‹œκ°„λ³΅μž‘λ„ ν‘œκΈ°)

μ™œ μ“°λŠ”κ°€?

  • λ‹¨μˆœν•œ 'μ•Œκ³ λ¦¬μ¦˜μ˜ μ‹€ν–‰ μ‹œκ°„' 이 μ•„λ‹Œ '리슀트 크기에 λ”°λ₯Έ μ•Œκ³ λ¦¬μ¦˜ μ‹€ν–‰μ‹œκ°„ μ¦κ°€μœ¨'을 νŒŒμ•…ν•˜κΈ° μœ„ν•΄.

νŠΉμ§•

  • μ•Œκ³ λ¦¬μ¦˜μ˜ μ†λ„λŠ” 'μ—°μ‚° μ‹œκ°„'이 μ•„λ‹Œ 'μ—°μ‚° 횟수 μ¦κ°€μœ¨'둜 μΈ‘μ •ν•œλ‹€.
    • μž…λ ₯ λ°μ΄ν„°μ˜ 크기가 λŠ˜μ–΄λ‚  λ•Œ, 싀행속도가 μ–Όλ§ˆλ‚˜ μ¦κ°€ν•˜λŠ”μ§€ μ•Œ 수 μžˆλ‹€.
  • μ–Έμ œλ‚˜ μ΅œμ•…μ˜ 경우λ₯Ό κ°€μ •ν•œλ‹€.
    • = μ΅œμ•…μ˜ κ²½μš°λΌλ„ 탐색이 κ·Έ μ‹œκ°„λ³΄λ‹€ λŠλ €μ§€μ§€ μ•ŠμŒμ„ 보μž₯ν•œλ‹€.

많이 μ“°μ΄λŠ” λΉ…μ˜€ μ‹€ν–‰μ‹œκ°„ 5가지

μœ„μͺ½μΌμˆ˜λ‘ λΉ λ₯΄κ³ , μ•„λž˜μͺ½μΌμˆ˜λ‘ 느림

  • O(log n) 둜그 μ‹œκ°„ (ex. 이진 탐색)
  • O(n) μ„ ν˜• μ‹œκ°„ (ex. λ‹¨μˆœ 탐색)
  • O(n * log n) (ex. 퀡 μ •λ ¬)
  • O(n제곱) (ex. 선택 μ •λ ¬)
  • O(n!) (ex. μ™ΈνŒμ› 문제)

O(n!) - μ™ΈνŒμ› 문제 traveling salesperson problem

μ‹€ν–‰μ‹œκ°„μ΄ O(n!)인 μ•Œκ³ λ¦¬μ¦˜. (μ™ΈνŒμ›=μ„ΈμΌμ¦ˆλ§¨)

  • 문제 : μ„ΈμΌμ¦ˆλ§¨μ΄ κ°€μž₯ 짧은 거리둜 n개의 λ„μ‹œλ₯Ό λͺ¨λ‘ λ°©λ¬Έν•˜λ € ν•  λ•Œ, λ„μ‹œλ₯Ό λ°©λ¬Έν•˜λŠ” λͺ¨λ“  경둜λ₯Ό μ‚΄νŽ΄λ³΄μ•„μ•Ό ν•œλ‹€.
  • λ„μ‹œμ˜ μˆ˜κ°€ n개일 λ•Œ, 경둜 탐색을 μœ„ν•œ μ—°μ‚° νšŸμˆ˜λŠ” n!둜 μ¦κ°€μœ¨μ΄ μ—„μ²­λ‚˜κ²Œ λ†’λ‹€.
    • 1개 = 1
    • 2개 = 2! = 1x2 = 2
    • 3개 = 3! = 1x2x3 = 6
    • 4개 = 4! = 1x2x3x4 = 24
    • 5개 = 5! = 1x2x3x4x5 = 120
    • ...