Non-Linear Data Structure

μ΄λ²ˆμ—λŠ” λΉ„μ„ ν˜• μžλ£Œκ΅¬μ‘°μ— λŒ€ν•΄ μ‚΄νŽ΄λ³΄μž.

λΉ„μ„ ν˜• μžλ£Œκ΅¬μ‘°λŠ” 1:N λ˜λŠ” N:N의 관계λ₯Ό κ°€μ§„ μžλ£Œκ΅¬μ‘°μ΄λ‹€. λŒ€ν‘œμ μœΌλ‘œ νŠΈλ¦¬μ™€ κ·Έλž˜ν”„ν˜• μžλ£Œκ΅¬μ‘°κ°€ λ°”λ‘œ λΉ„μ„ ν˜• μžλ£Œκ΅¬μ‘°μ΄λ‹€.

Tree

1개 μ΄μƒμ˜ λ…Έλ“œλ‘œ κ΅¬μ„±λ˜μ–΄ 마치 λ‚˜λ¬΄μ˜ λͺ¨μ–‘을 ν•˜κ³  μžˆκΈ°μ— νŠΈλ¦¬λΌλŠ” 이름이 뢙은 μžλ£Œκ΅¬μ‘°μ΄λ‹€. μš°λ¦¬μ—κ²Œ κ°€μž₯ μ΅μˆ™ν•œ 트리 ν˜• μžλ£Œκ΅¬μ‘°κ°€ λ°”λ‘œ μ»΄ν“¨ν„°μ˜ 폴더 ꡬ쑰이닀.

μœ„ κ·Έλ¦Όκ³Ό 같이 ν•˜λ‚˜μ˜ μ΅œμƒμœ„ λΆ€λͺ¨ λ…Έλ“œλ‘œ(root) λΆ€ν„° μžμ‹ λ…Έλ“œ 듀이 νŒŒμƒλ˜λŠ” ν˜•νƒœλ₯Ό κ°€μ§€κ³  μžˆλ‹€. λΉ„μ„ ν˜• 자료 ꡬ쑰이기 λ•Œλ¬Έμ— 각각의 λ…Έλ“œ 듀에 순차적으둜 데이터가 μ €μž₯λ˜μ§€ μ•ŠμœΌλ©°, 트리 내에 νŠΈλ¦¬κ°€ μžˆλŠ” μž¬κ·€μ  ν˜•νƒœμ˜ μžλ£Œκ΅¬μ‘°μ΄λ‹€.

트리 쀑, ν•œ λ°©ν–₯으둜만 μžμ‹ λ…Έλ“œλ₯Ό κ°€μ§ˆ 경우 편ν–₯ 트리라고 ν•˜λ©°, λΆ€λͺ¨ λ…Έλ“œμ˜ μžμ‹ λ…Έλ“œκ°€ 2개 μ΄ν•˜μΈ 트리λ₯Ό 이진 트리라고 ν•œλ‹€. 이진 트리 쀑 자주 μ‚¬μš©λ˜λŠ” νŠΈλ¦¬κ°€ λ°”λ‘œ νž™ κ³Ό 이진 탐색 νŠΈλ¦¬μ΄λ‹€.

Heap (νž™)

νž™μ€ μ™„μ „ μ΄μ§„νŠΈλ¦¬λ‘œμ¨, μ΅œλŒ€/μ΅œμ†Œ 값을 μ°ΎλŠ” 연산을 νŽΈλ¦¬ν•˜κΈ° μœ„ν•΄ κ³ μ•ˆλœ μžλ£Œκ΅¬μ‘°μ΄λ‹€.

μ™„μ „ 이진 νŠΈλ¦¬λž€ λͺ¨λ“  λ…Έλ“œ 듀이 2개 μ΄ν•˜μ˜ μžμ‹λ…Έλ“œλ₯Ό κ°€μ§„ 트리λ₯Ό λ§ν•œλ‹€.

νž™μ€ λΆ€λͺ¨ λ…Έλ“œκ°€ μžμ‹ λ…Έλ“œμ˜ ν•© 보닀 큰 μ΅œλŒ€ νž™ (parent node >= childs node1 + childs node2)κ³Ό

λ°˜λŒ€λ‘œ λΆ€λͺ¨ λ…Έλ“œκ°€ μžμ‹ λ…Έλ“œμ˜ ν•© 보닀 μž‘μ€ μ΅œμ†Œ νž™ (parent node <= childs node1 + childs node2) 으둜 λ‚˜λ‰œλ‹€.

곡톡점은 λΆ€λͺ¨ λ…Έλ“œμ˜ 값이 항상 μ΅œλŒ€ νž™ μ—μ„œλŠ” μ΅œλŒ€, μ΅œμ†Œ νž™ μ—μ„œλŠ” μ΅œμ†Ÿκ°’μ„ κ°€μ§„λ‹€λŠ” 점이닀.

일반적으둜 배열을 ν†΅ν•˜μ—¬ νž™μ„ κ΅¬ν˜„ν•˜λ©°, μ΅œλŒ€ / μ΅œμ†Œ νž™ 에 λ…Έλ“œλ₯Ό μ‚½μž… μ‹œ, μ•„λž˜μ™€ 같은 과정을 λ”°λ₯Έλ‹€.

  • 데이터λ₯Ό λ§ˆμ§€λ§‰ μΈλ±μŠ€μ— μΆ”κ°€

  • λΆ€λͺ¨ λ…Έλ“œμ™€ 비ꡐ해 λΆ€λͺ¨ λ…Έλ“œλ³΄λ‹€ (μž‘λ‹€λ©΄/ 크닀면) κ·ΈλŒ€λ‘œ

  • 비ꡐ μ‹œ λΆ€λͺ¨ λ…Έλ“œλ³΄λ‹€ (크닀면 / μž‘λ‹€λ©΄) λΆ€λͺ¨ λ…Έλ“œμ™€ μœ„μΉ˜λ₯Ό λ°”κΎΌλ‹€.

λ°˜λŒ€λ‘œ λ…Έλ“œ μ‚­μ œ μ‹œ

  • 루트 λ…Έλ“œ μ‚­μ œ

  • 루트 λ…Έλ“œκ°€ 있던 μžλ¦¬μ— λ§ˆμ§€λ§‰ λ…Έλ“œ μœ„μΉ˜ μ‹œν‚΄

  • νž™μ„ μž¬κ΅¬μ„± -> λ§Œμ•½ μžμ‹ λ…Έλ“œλ³΄λ‹€ 루트 λ…Έλ“œκ°€ (크닀면 / μž‘λ‹€λ©΄) κ·ΈλŒ€λ‘œ, (μž‘λ‹€λ©΄ / 크닀면) μžμ‹ λ…Έλ“œμ™€ μœ„μΉ˜ λ³€κ²½

이진 탐색 트리 (Binary Search Tree)

이름 κ·ΈλŒ€λ‘œ 탐색을 μœ„ν•΄ μ‚¬μš©λ˜λŠ” 이진 트리의 ν˜•νƒœλ₯Ό κ°€μ§„ μžλ£Œκ΅¬μ‘°μ΄λ‹€. λ”°λΌμ„œ, 탐색을 μœ„ν•΄ 각 λ…Έλ“œλŠ” μœ μΌν•œ ν‚€ 값을 κ°€μ§€λ©°, λ…Έλ“œμ˜ μ™Όμͺ½ μžμ‹ λ…Έλ“œλŠ” ν•΄λ‹Ή λ…Έλ“œμ˜ ν‚€ 값보닀 항상 μž‘μ€ 값을, 였λ₯Έμͺ½ λ…Έλ“œλŠ” 큰 값을 κ°€μ§„λ‹€. λ¬Όλ‘ , μžμ‹ λ…Έλ“œ 듀도 이진 탐색 νŠΈλ¦¬μ—¬μ•Ό ν•œλ‹€.

이진 탐색 νŠΈλ¦¬λŠ” μ•„λž˜μ™€ 같은 과정을 λ°˜λ³΅ν•˜λ©° 탐색을 μ‹€ν–‰ν•œλ‹€.

  • 루트 λ…Έλ“œ (ν˜„μž¬ λ…Έλ“œ)와 λͺ©μ  ν‚€ κ°’ 비ꡐ (μΌμΉ˜ν•˜λ©΄ μ’…λ£Œ)

  • λͺ©μ  ν‚€ 값보닀 ν˜„μž¬ λ…Έλ“œ 값이 크닀면 μ™Όμͺ½ μžμ‹ λ…Έλ“œλ‘œ 탐색 μ§„ν–‰

  • λͺ©μ  ν‚€ 값보닀 ν˜„μž¬ λ…Έλ“œ 값이 μž‘λ‹€λ©΄ 였λ₯Έμͺ½ μžμ‹ λ…Έλ“œλ‘œ 탐색 μ§„ν–‰

즉, 트리의 λ†’μ΄λ§ŒνΌ 탐색이 μ§„ν–‰λ˜κ²Œ λ˜λŠ”λ°, μœ„ κ·Έλ¦Όμ—μ„œλŠ” μ΅œλŒ€ 3번의 탐색이 이루어진닀.

λ…Έλ“œ μ‚½μž… μ‹œμ—λŠ”

  • λͺ©ν‘œ 값을 루트 λ…Έλ“œ (ν˜„μž¬ λ…Έλ“œ) 와 비ꡐ해 κ°™λ‹€λ©΄ 쀑볡 κ°’ λ°œμƒμœΌλ‘œ μ’…λ£Œ

  • μ€‘λ³΅λ˜μ§€ μ•Šκ³  λͺ©ν‘œ 값이 ν˜„μž¬ λ…Έλ“œμ™€ 비ꡐ해 μž‘λ‹€λ©΄ μ™Όμͺ½ μžμ‹ λ…Έλ“œλ₯Ό 탐색해 λΉ„μ–΄ μžˆλ‹€λ©΄ μΆ”κ°€, λΉ„μ–΄μžˆμ§€ μ•Šλ‹€λ©΄ 1의 κ³Όμ •λΆ€ν„° 반볡

  • 쀑볡 λ˜μ§€ μ•Šκ³  λͺ©ν‘œ 값이 ν˜„μž¬ λ…Έλ“œμ™€ 비ꡐ해 크닀면 였λ₯Έμͺ½ μžμ‹ λ…Έλ“œλ₯Ό 탐색해 λΉ„μ–΄ μžˆλ‹€λ©΄ μΆ”κ°€, λΉ„μ–΄μžˆμ§€ μ•Šλ‹€λ©΄ 1의 κ³Όμ •λΆ€ν„° 반볡

의 연산을 μ‹€μ‹œν•œλ‹€.

Graph

μ—¬λŸ¬ 개의 λ…Έλ“œ(μ •)와 λ…Έλ“œ 듀을 μ—°κ²°ν•˜λŠ” κ°„μ„ μœΌλ‘œ 이루어진 μžλ£Œκ΅¬μ‘°μ΄λ‹€. μœ„μ—μ„œ μ‚΄νŽ΄λ³Έ νŠΈλ¦¬λ„ κ·Έλž˜ν”„μ˜ 일쒅이며, νŠΈλ¦¬μ™€ λ‹€λ₯΄κ²Œ λΆ€λͺ¨/μžμ‹ λ…Έλ“œμ˜ κ°œλ…μ΄ μ—†λ‹€.

κ·Έλž˜ν”„μ—λŠ” 두 정점을 μ—°κ²°ν•˜λŠ” 간선에 λ°©ν–₯이 μ—†λŠ” 무 λ°©ν–₯ κ·Έλž˜ν”„, λ°©ν–₯이 μžˆλŠ” λ°©ν–₯ κ·Έλž˜ν”„, κ·Έλž˜ν”„μ˜ λͺ¨λ“  정점이 μ—°κ²°λ˜μ–΄μžˆλŠ” μ™„μ „ κ·Έλž˜ν”„ λ“±μ˜ μ—¬λŸ¬ κ·Έλž˜ν”„ κ°€ μ‘΄μž¬ν•œλ‹€.

보톡 κ·Έλž˜ν”„ κ΅¬ν˜„ μ‹œ 인접 리슀트λ₯Ό μ‚¬μš©ν•˜μ—¬ κ΅¬ν˜„ν•œλ‹€. 인접 λ¦¬μŠ€νŠΈλž€, 각 정점에 μΈμ ‘ν•œ 정점 듀을 리슀트둜 ν‘œν˜„ν•œ 것을 λ§ν•œλ‹€.

Last updated