λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Algorithm

[μ•Œκ³ λ¦¬μ¦˜] 탐색 μ•Œκ³ λ¦¬μ¦˜ (μ„ ν˜•, 이뢄, ν•΄μ‹œ, BST)

by bba_dda 2020. 8. 31.
λ°˜μ‘ν˜•

νƒμƒ‰λ¬Έμ œ?

μ €μž₯된 데이터듀 쀑에 μ›ν•˜λŠ” 값을 μ°ΎλŠ” λ¬Έμ œμ΄λ‹€.

 

1. μ„ ν˜• 탐색 μ•Œκ³ λ¦¬μ¦˜ (Linear Search Algorithm)

  • 맨 μ•žμ΄λ‚˜, 맨 λ’€λΆ€ν„° μˆœμ„œλŒ€λ‘œ ν•˜λ‚˜ν•˜λ‚˜ μ°Ύμ•„λ³΄λŠ” μ•Œκ³ λ¦¬μ¦˜μ΄λ‹€.

  • κ°€μž₯ λ‹¨μˆœν•˜κ³  κ°„λ‹¨ν•œ 탐색 μ•Œκ³ λ¦¬μ¦˜μ΄λ‹€.

  1. 맨 끝뢀터 ν•˜λ‚˜ν•˜λ‚˜ μ›ν•˜λŠ” 값을 μ°Ύμ•„λ³Έλ‹€.
  2. μ›ν•˜λŠ” 값을 찾으면, 탐색을 μ’…λ£Œν•œλ‹€.

μ˜ˆμ‹œ

5λ₯Ό 찾을 λ•Œ, 맨 μ™Όμͺ½μ— μžˆλŠ” 1λΆ€ν„° μ‹œμž‘ν•΄μ„œ ν•˜λ‚˜μ”© νƒμƒ‰ν•œλ‹€.

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

길이 n짜리의 리슀트λ₯Ό 탐색할 λ•Œ,

μ΅œμ„ μ˜ 경우

  • 리슀트의 첫 번째 μ›μ†Œκ°€ 정닡인 경우 : 1번

μ΅œμ•…μ˜ 경우

  • 리슀트의 맨 λ§ˆμ§€λ§‰ μ›μ†Œκ°€ μ •λ‹΅μ΄κ±°λ‚˜, λ¦¬μŠ€νŠΈμ— 정닡이 없을 λ•Œ : n번

λ”°λΌμ„œ O(n)의 μ‹œκ°„λ³΅μž‘λ„λ₯Ό 가진닀.

2. 이진 탐색 μ•Œκ³ λ¦¬μ¦˜ (Binary Search Algorithm)

쀑간지점을 κΈ°μ€€μœΌλ‘œ 데이터λ₯Ό λ°˜μ”© λ‚˜λˆ μ„œ νƒμƒ‰ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜μ΄λ‹€.

  1. 쀑간지점을 μ„ νƒν•œ λ’€, 쀑간지점을 κΈ°μ€€μœΌλ‘œ μ™Όμͺ½ ν˜Ήμ€ 였λ₯Έμͺ½ λΆ€λΆ„λ§Œ 남긴닀.
  2. 남긴 λΆ€λΆ„ μ€‘μ—μ„œ λ‹€μ‹œ 쀑간지점을 μ„ νƒν•œ λ’€, μ™Όμͺ½ ν˜Ήμ€ 였λ₯Έμͺ½λ§Œ 남긴닀.
  3. μœ„ 과정을 μ›ν•˜λŠ” 값을 찾을 λ•Œ κΉŒμ§€ λ°˜λ³΅ν•œλ‹€

μ˜ˆμ‹œ

5λ₯Ό 찾을 λ•Œ,

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

μ΅œμ„ μ˜ 경우

  • 리슀트의 쀑간뢀뢄이 정닡일 λ•Œ : 1번

μ΅œμ•…μ˜ 경우

  • λ¦¬μŠ€νŠΈμ— 정닡이 μ—†λŠ” 경우 : log2(n) 번

λ”°λΌμ„œ O(logn)의 μ‹œκ°„ λ³΅μž‘λ„λ₯Ό 가진닀

μ„ ν˜•νƒμƒ‰μ€ n이 증가함에 따라 μ‹œκ°„λ³΅μž‘λ„κ°€ μ„ ν˜•μ μœΌλ‘œ μ¦κ°€ν•˜μ§€λ§Œ, 이진탐색은 n이 증가해도 μ‹œκ°„λ³΅μž‘λ„κ°€ μ•„μ£Ό 천천히 μ¦κ°€ν•œλ‹€.

보톡 μ •λ ¬λœ λ¦¬μŠ€νŠΈμ—λŠ” 이진탐색을 μ‚¬μš©ν•˜κ³ ,

μ •λ ¬λ˜μ§€ μ•Šμ€ λ¦¬μŠ€νŠΈμ—λŠ” μ„ ν˜•νƒμƒ‰μ„ μ‚¬μš©ν•œλ‹€.

3. ν•΄μ‹œ 탐색 μ•Œκ³ λ¦¬μ¦˜ (Hash Search Algorithm)

μ„ ν˜•νƒμƒ‰μ΄λ‚˜ 이진탐색은, μ–΄λ–€ 값이 μ–΄λ–€ index에 λ“€μ–΄μžˆλŠ”μ§€μ— λŒ€ν•œ 정보가 μ—†λŠ” μƒνƒœμ—μ„œ 탐색할 λ•Œ μ‚¬μš©ν•˜λŠ” λ°©μ‹μ΄μ—ˆλ‹€.

λ°˜λ©΄μ— ν•΄μ‹œ 탐색은 κ°’κ³Ό indexλ₯Ό 미리 μ—°κ²°ν•΄ λ‘ μœΌλ‘œμ¨ 짧은 μ‹œκ°„μ— 탐색할 수 μžˆλŠ” μ•Œκ³ λ¦¬μ¦˜μ΄λ‹€.

ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ 데이터λ₯Ό λ³΄κ΄€ν•œ 후에

λ³΄κ΄€ν•˜λŠ”λ° μ‚¬μš©λœ ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ ν•œ λ²ˆμ— 데이터λ₯Ό νƒμƒ‰ν•œλ‹€.

아이디어

  • 1μ°¨ 아이디어

    • μ²˜μŒμ—λŠ” 데이터와 같은 index에 μ €μž₯ν–ˆλ‹€

      ex) 데이터 24λŠ” 24번 index에 μ €μž₯

      데이터 30은 30번 index에 μ €μž₯

      • λ‚­λΉ„λ‹€ !!
    • μ΅œμ†Œν•œ λ°μ΄ν„°μ˜ μ’…λ₯˜ 만큼의 index ν•„μš”
  • 2μ°¨ 아이디어

    • 데이터에 ν•¨μˆ˜(일정 계산)을 μ μš©ν•˜μ—¬ λ‚˜μ˜¨ 값을 index둜 ν•˜μ—¬ λ³΄κ΄€ν•˜λŠ” 방법.

      ex) data MOD 10 에 μ €μž₯ν•˜λŠ” 방식을 μ΄μš©ν•˜λ©΄,

      0~9 κΉŒμ§€μ˜ 10개의 indexλ₯Ό μ‚¬μš©ν•˜μ—¬ 값을 μ €μž₯ν•  수 μžˆλ‹€.

    • ν•΄μ‹œ ν•¨μˆ˜

      • μ–΄λ–€ 값이 μ£Όμ–΄μ‘Œμ„ λ•Œ, κ·Έ 값을 λŒ€ν‘œν•˜λŠ” 값을 κ³„μ‚°ν•˜λŠ” ν•¨μˆ˜
    • ν•΄μ‹œ κ°’

      • ν•΄μ‹œ ν•¨μˆ˜μ˜ κ³„μ‚°μœΌλ‘œ λ‚˜μ˜¨ κ°’

μ•Œκ³ λ¦¬μ¦˜

ν•΄μ‹œ 탐색을 μœ„ν•΄μ„œλŠ” 총 λ‘κ°œμ˜ μ•Œκ³ λ¦¬μ¦˜μ΄ ν•„μš”ν•˜λ‹€

  • 데이터λ₯Ό μ €μž₯ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜
  • 데이터λ₯Ό κ²€μƒ‰ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜

ν•΄μ‹œν•¨μˆ˜λ‘œλŠ” λ‚˜λˆ„κΈ° μ—°μ‚°, λ‚˜λ¨Έμ§€ μ—°μ‚° λ“± λ‹€μ–‘ν•œ 연산을 μ΄μš©ν•  수 μžˆλ‹€.

ν•΄μ‹œ ν•¨μˆ˜λ‘œ 데이터λ₯Ό μ €μž₯ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜

  • λ°°μ—΄ 2개λ₯Ό μ€€λΉ„ν•œλ‹€
    • 주어진 값듀을 ν•΄μ‹œν•¨μˆ˜λ₯Ό μ΄μš©ν•˜μ—¬ λ³„λ„μ˜ 배열에 λ‹€μ‹œ μ €μž₯ν•˜κΈ° λ•Œλ¬Έ
    • λ‹€λ₯Έ 탐색 μ•Œκ³ λ¦¬μ¦˜μ—μ„œλŠ” λ°°μ—΄ 크기λ₯Ό 데이터 수 만큼만 μ€€λΉ„ν•˜λ©΄ μΆ©λΆ„ν•˜μ§€λ§Œ, ν•΄μ‹œ 탐색법은 데이터 수의 1.5~2배의 크기의 배열을 μ€€λΉ„ν•΄μ•Ό ν•œλ‹€.

ex) 데이터가 10개이면, 데이터λ₯Ό 15으둜 λ‚˜λˆˆ λ‚˜λ¨Έμ§€λ₯Ό ν•΄μ‹œκ°’μœΌλ‘œ μ„€μ •ν•œλ‹€.

λ§Œμ•½, 같은 ν•΄μ‹œκ°’μ„ 가진 데이터가 μžˆλ‹€λ©΄ (좩돌이 μΌμ–΄λ‚œλ‹€λ©΄) λΉ„μ–΄μžˆλŠ” μ˜† 칸에 λ³΄κ΄€ν•œλ‹€.

ν•΄μ‹œ ν•¨μˆ˜λ‘œ 데이터λ₯Ό κ²€μƒ‰ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜

  • μ €μž₯ν•  λ•Œ μ‚¬μš©ν•œ 것과 같은 ν•΄μ‹œ ν•¨μˆ˜λ₯Ό μ‚¬μš©
  • μ›ν•˜λŠ” 데이터가 μ‘΄μž¬ν•˜μ§€ μ•Šμ„ κ²½μš°μ— μ–΄λ–»κ²Œ μ²˜λ¦¬ν•  것인지 μ •ν•΄μ•Ό ν•œλ‹€

μž₯점

데이터λ₯Ό μ €μž₯ν•˜κ±°λ‚˜, νƒμƒ‰ν•˜κ³ μž ν•˜λŠ” μœ„μΉ˜λ₯Ό μ¦‰μ‹œ! μ°Έμ‘°ν•  수 있기 λ•Œλ¬Έμ— λΉ λ₯Έ μ†λ„λ‘œ μ²˜λ¦¬κ°€ κ°€λŠ₯ν•˜λ‹€.

4. 이진 탐색 트리 (BST / Binary Search Tree)

트리 자료ꡬ쑰λ₯Ό μ΄μš©ν•œ 탐색 νŠΈλ¦¬μ΄λ‹€.

μ •μ˜

  • μ™Όμͺ½ μ„œλΈŒνŠΈλ¦¬μ˜ 킀값듀은 root의 킀값보닀 μž‘λ‹€
  • 였λ₯Έμͺ½ μ„œλΈŒνŠΈλ¦¬μ˜ 킀값듀은 root의 킀값보닀 크닀
  • μ™Όμͺ½, 였λ₯Έμͺ½ μ„œλΈŒνŠΈλ¦¬λ“€μ€ 각각 λͺ¨λ‘ BSTμ •μ˜λ₯Ό λ§Œμ‘±ν•œλ‹€
  • BST의 λͺ¨λ“  nodeλ“€μ˜ 킀값은 uniqueν•˜λ‹€.
  • μœ„μ˜ 4가지λ₯Ό λͺ¨λ‘ λ§Œμ‘±ν•΄μ•Ό ν•œλ‹€.

탐색 μ•Œκ³ λ¦¬μ¦˜

μ–΄λ– ν•œ BSTμ—μ„œ μ›ν•˜λŠ” 값을 μ°Ύκ³ μžν•  λ•Œ,

root값을 κΈ°μ€€μœΌλ‘œ

  • μ›ν•˜λŠ” κ°’ > root ν‚€ κ°’ : 였λ₯Έμͺ½ μ„œλΈŒνŠΈλ¦¬λ‘œ 이동
  • μ›ν•˜λŠ” κ°’ < root ν‚€ κ°’ : μ™Όμͺ½ μ„œλΈŒνŠΈλ¦¬λ‘œ 이동
  • μ›ν•˜λŠ” κ°’ = root ν‚€ κ°’ : 탐색 μ’…λ£Œ

이 것을 계속 λ°˜λ³΅ν•΄λ‚˜κ°€λ©΄ λœλ‹€.

μ‚½μž… μ•Œκ³ λ¦¬μ¦˜

μ–΄λ– ν•œ 값을 μ‚½μž…ν•˜κ³ μž ν•  λ•Œ,

  1. μœ„μ˜ νƒμƒ‰μ•Œκ³ λ¦¬μ¦˜μ„ λ¨Όμ € μˆ˜ν–‰ν•œλ‹€.
  2. 탐색 μ‹€νŒ¨μ‹œμ— , 탐색이 μ’…λ£Œλœ μœ„μΉ˜μ— ν•΄λ‹Ή λ…Έλ“œλ₯Ό μ‚½μž…ν•œλ‹€.
  3. 탐색 μ„±κ³΅μ‹œμ—, 이미 μ €μž₯λ˜μžˆλŠ” ν‚€κ°’μ΄λ―€λ‘œ μ‚½μž…μ— μ‹€νŒ¨ν•œλ‹€.

μ‚­μ œ μ•Œκ³ λ¦¬μ¦˜

μ–΄λ– ν•œ 값을 μ‚­μ œν•˜κ³ μž ν•  λ•Œ,

  1. μœ„μ˜ 탐색 μ•Œκ³ λ¦¬μ¦˜μ„ λ¨Όμ € μˆ˜ν–‰ν•œλ‹€.

  2. μ‚­μ œν•˜λ €λŠ” λ…Έλ“œμ˜ μ°¨μˆ˜μ— 따라

    • 차수 : 0 (leaf node)

      κ·Έλƒ₯ μ‚­μ œν•œλ‹€

    • 차수 : 1 (ν•œ 개의 μžμ‹ 쑴재)

      μ‚­μ œν•˜κ³  μžμ‹μ„ μ‚­μ œν•œ μžλ¦¬μ— 뢙인닀

    • 차수 : 2

      μžμ‹ μ„ λŒ€μ²΄ν•  λ…Έλ“œλ₯Ό μ°Ύμ•„μ•Ό ν•œλ‹€.

      μ‚­μ œν•  λ…Έλ“œμ˜

      ​ μ™Όμͺ½ μ„œλΈŒνŠΈλ¦¬μ—μ„œ κ°€μž₯ 큰 κ°’

      ​ 였λ₯Έμͺ½ μ„œλΈŒνŠΈλ¦¬μ—μ„œ κ°€μž₯ μž‘μ€ κ°’

      을 μžμ‹ μ„ λŒ€μ²΄ν•  λ…Έλ“œλ‘œ μ •ν•œλ‹€.

참고 자료

http://kocw.xcache.kinxcdn.com/KOCW/document/2018/wonkwang/leesangwon0409/11.pdf

http://kocw.xcache.kinxcdn.com/KOCW/document/2018/wonkwang/leesangwon0409/11.pdf

https://m.blog.naver.com/PostView.nhn?blogId=4717010&logNo=60209820587&proxyReferer=https:%2F%2Fwww.google.com%2F

 

자료ꡬ쑰(Data structure) - 이진 탐색 트리(Binary Search Tree,BST)의 탐색/μ‚½μž…/μ‚­μ œμ—°μ‚°

이진 탐색 트리(BST,binary search tree)λŠ” 탐색을 μœ„ν•œ μžλ£Œκ΅¬μ‘°μ΄λ‹€. μœ„ 그림은 μ΄μ§„νƒμƒ‰νŠΈλ¦¬(BST)...

blog.naver.com

 

λ°˜μ‘ν˜•

λŒ“κΈ€