[μ•Œκ³ λ¦¬μ¦˜] 이진 탐색 기법

2021. 9. 17. 08:00ㆍ코딩 ν…ŒμŠ€νŠΈ μ€€λΉ„/μ•Œκ³ λ¦¬μ¦˜

728x90
λ°˜μ‘ν˜•

μ•ˆλ…•ν•˜μ„Έμš”? μ£Όλ‹ˆν•˜λž‘ μž…λ‹ˆλ‹€.

μ˜€λŠ˜μ€ μ•Œκ³ λ¦¬μ¦˜μ˜ 이진 탐색에 λŒ€ν•΄μ„œ κ³΅λΆ€ν•˜λŠ” μ‹œκ°„μΈ κ²ƒμ΄μ—μš”.

μ½”ν…Œλ₯Ό 유λŠ₯ν•œ κ°œλ°œμžκ°€ 되기 μœ„ν•΄ μ—΄μ‹¬νžˆ 곡뢀 ν•΄ λ³΄κ² μŠ΅λ‹ˆλ‹€!

μ†ŒμŠ€ μ½”λ“œμ— λŒ€ν•΄μ„œ 확인 ν•˜κ³  μ‹ΆμœΌμ‹  λΆ„λ“€κ»˜μ„œλŠ” μ£Όλ‹ˆν•˜λž‘μ˜ Git hub에 관심을 μ£Όμ„Έμš”!

 


 

 

πŸ“Œ Binary Search (이진 탐색) λž€?


 

탐색할 자료의 ν‹€ ν˜Ήμ€ List 등을 λ‘˜λ‘œ λ‚˜λˆ„μ–΄ ν•΄λ‹Ή Dataκ°€ μžˆμ„ λ§Œν•œ 곳을 νƒμƒ‰ν•˜λŠ” 기법인 κ²ƒμ΄μ—μš”.

μ‰½κ²Œ 말해 λ‚΄κ°€ 찾을 값을 μ°ΎκΈ° μœ„ν•΄ 계속 두 개둜 μͺΌκ°œμ„œ ν•„μš” μ—†λŠ” 뢀뢄은 버리고λ₯Ό λ°˜λ³΅ν•˜λŠ” 방법인 κ²ƒμ΄μ—μš”!

 

λ°˜μ‘ν˜•

좜처 : 패슀트 캠퍼슀 - μ•Œκ³ λ¦¬μ¦˜ κΈ°μˆ λ©΄μ ‘ μ™„μ „ 정볡

 

μœ„μ˜ λ¬Έμ œλŠ” 이진 탐색을 μ‚¬μš©ν•˜μ—¬ μ²˜λ¦¬ν•˜λŠ” 것이 κ°€μž₯ λΉ λ₯΄λ‹€κ³  ν•©λ‹ˆλ‹€.

단! μ—¬κΈ°μ„œ μ€‘μš”ν•œ 것은 정렬이 λ˜μ–΄ μžˆμ–΄μ•Ό ν•œλ‹€λŠ” μ μ΄μ—μš”!

 

  πŸ“μ΄μ§„ νƒμƒ‰μ˜ 이해 (순차 탐색과 λΉ„κ΅ν•˜λ©° μ΄ν•΄ν•˜κΈ°)

 

좜처 : 패슀트 캠퍼슀 - μ•Œκ³ λ¦¬μ¦˜ κΈ°μˆ λ©΄μ ‘ μ™„μ „ 정볡

 

 

 

  πŸ“λΆ„ν•  정볡 μ•Œκ³ λ¦¬μ¦˜κ³Ό 이진 탐색

 

  1. λΆ„ν•  정볡 μ•Œκ³ λ¦¬μ¦˜(Divide and Conquer)
    • Divide: 문제λ₯Ό ν•˜λ‚˜ λ˜λŠ” λ‘˜ μ΄μƒμœΌλ‘œ λ‚˜λˆˆλ‹€.
    • Conquer: λ‚˜λˆ μ§„ λ¬Έμ œκ°€ μΆ©λΆ„νžˆ μž‘κ³ , 해결이 κ°€λŠ₯ν•˜λ‹€λ©΄ ν•΄κ²°, μ•„λ‹ˆλ©΄ λ‹€μ‹œ λ‚˜λˆˆλ‹€.
  2. 이진 탐색(Binary Search)
    • Divide : Listλ₯Ό 두 개의 Sub List둜 λ‚˜λˆˆλ‹€.
    • Conquer :
      • 검색할 숫자(search)κ°€ List의 쀑간값 보닀 크닀면 λ’· λΆ€λΆ„μ˜ Sub Listμ—μ„œ 검색할 숫자λ₯Ό μ°ΎλŠ”λ‹€.
      • 검색할 숫자(search)κ°€ List의 쀑간값 보닀 μž‘λ‹€λ©΄ μ•ž λΆ€λΆ„μ˜ Sub Listμ—μ„œ 검색할 숫자λ₯Ό μ°ΎλŠ”λ‹€.
  3. μ½”λ“œμ— λŒ€ν•œ 생각
    • 이진 탐색은 Dataκ°€ μ •λ ¬λ˜ μžˆλŠ” μƒνƒœμ—μ„œ 진행
    • Dataκ°€ [2, 3, 8, 12 ,20] 일 λ•Œ,
      • binary_search(data_list, search_num) ν•¨μˆ˜λ₯Ό λ§Œλ“ λ‹€.
        • find_dataλŠ” μ°ΎλŠ” μˆ«μžμ— λŒ€ν•œ λ³€μˆ˜
        • data_listλŠ” Dataλ₯Ό 담은 List
        • data_list의 쀑간값을 find_data와 λΉ„κ΅ν•œλ‹€.
          • λ§Œμ•½ find_dataκ°€ Data_list보닀 μž‘λ‹€λ©΄
            • 맨 μ•ž μͺ½λΆ€ν„° data_list의 μ€‘κ°„κΉŒμ§€ λ‹€μ‹œ find_dataλ₯Ό μ°ΎλŠ”λ‹€.
          • data_list의 쀑간값이 find_data보닀 크닀면
            • data_list 쀑간뢀터 맨 λκΉŒμ§€ λ‹€μ‹œ find_dataλ₯Ό μ°ΎλŠ”λ‹€.
          • λ‘˜ λ‹€ μ•„λ‹ˆλΌλ©΄, data_list의 쀑간값은 find_data인 κ²½μš°λ°–μ— μ—†μœΌλ―€λ‘œ, return으둜 data_list 쀑간에 ν•΄λ‹Ή κ°’ μœ„μΉ˜

 

 

 

 

  πŸ“μ•Œκ³ λ¦¬μ¦˜ 뢄석

이진 탐색은 n개의 Listλ₯Ό 맀번 2둜 λ‚˜λˆ„μ–΄ κ·Έ n이 κ²°κ΅­ 1이 될 λ•ŒκΉŒμ§€ 계~~~~~속 비ꡐ연산을 ν•˜μ—¬ k번(회)λ₯Ό μ§„ν–‰ν•˜λŠ” κ²ƒμ΄μ—μš”.

  • n X $\frac { 1 }{ 2 }$ X $\frac { 1 }{ 2 }$ X $\frac { 1 }{ 2 }$ ... = 1
  •  X $\frac { 1 }{ 2 }^k$ = 1
  • n = $2^k$ = $log_2 n$ = $log_2 2^k$
  • $log_2 n$ = k

Big O ν‘œκΈ°λ²•μœΌλ‘œλŠ” k + 1이 κ²°κ΅­ μ΅œμ’… μ‹œκ°„ λ³΅μž‘λ„κ°€ λ˜λŠ” κ²ƒμ΄μ—μš”. (1이 λ˜μ—ˆμ„ λ•Œλ„, 비ꡐ연산을 ν•œλ²ˆ μˆ˜ν–‰ν•˜κ²Œ λœλ‹΅λ‹ˆλ‹€!)

κ²°κ΅­ O($log_2 n$ + 1)이고, 2와 1은 μƒμˆ˜μ΄κΈ° λ•Œλ¬Έμ— μ‚­μ œκ°€ λ˜λ―€λ‘œ, κ²°κ³Όμ μœΌλ‘œλŠ” O($log n$)κ°€ λ˜κ² μŠ΅λ‹ˆλ‹€!

 

 

 


 

 

μ£Όλ‹ˆν•˜λž‘μ˜ 글이 λ§ˆμŒμ— λ“œμ…¨λ‚˜μš”? ꡬ독과 곡감! 그리고, λŒ“κΈ€ 그리고 λ°©λͺ…둝은 μ£Όλ‹ˆν•˜λž‘μ—κ²Œ λ§Žμ€ 힘이 λ©λ‹ˆλ‹€

728x90
λ°˜μ‘ν˜•