Just keep coding ...

[자료ꡬ쑰] 트리(Tree)와 μš°μ„ μˆœμœ„ 큐(Priority Queue)

2024. 10. 27. 11:44γ†μžλ£Œκ΅¬μ‘°

728x90

πŸ‘‰ 트리(Tree)

  • νŠΈλ¦¬λŠ” 가계도와 같이 계측적인 ꡬ쑰λ₯Ό ν‘œν˜„ν•  λ•Œ μ‚¬μš©ν•  수 μžˆλŠ” 자료ꡬ쑰
  • λ‚˜λ¬΄(tree)의 ν˜•νƒœλ₯Ό 뒀집은 것과 같이 생김
  • 루트 λ…Έλ“œ (root node) : λΆ€λͺ¨κ°€ μ—†λŠ” μ΅œμƒμœ„ λ…Έλ“œ
  • 단말 λ…Έλ“œ (leaf node): μžμ‹μ΄ μ—†λŠ” λ…Έλ“œ
  • νŠΈλ¦¬μ—μ„œλŠ” λΆ€λͺ¨μ™€ μžμ‹ 관계가 μ„±λ¦½ν•œλ‹€.
  • ν˜•μ œ 관계: 5 값을 κ°€μ§€λŠ” λ…Έλ“œμ™€ 23 값을 κ°€μ§€λŠ” λ…Έλ“œμ‚¬μ΄μ˜ 관계

  • 깊이(depth): 루트 λ…Έλ“œμ—μ„œμ˜ 길이(length)
  • μ΄λ•Œ κΈΈμ΄λž€ 좜발 λ…Έλ“œμ—μ„œ λͺ©μ μ§€ λ…Έλ“œκΉŒμ§€ 거쳐야 ν•˜λŠ” κ°„μ„ μ˜ 수λ₯Ό 의미
  • 트리의 높이(height)λŠ” 루트 λ…Έλ“œμ—μ„œ κ°€μž₯ κΉŠμ€ λ…Έλ“œκΉŒμ§€μ˜ 길이λ₯Ό 의미

 

πŸ‘‰ 이진 트리(Binary Tree)

  • 이진 νŠΈλ¦¬λŠ” μ΅œλŒ€ 2개의 μžμ‹μ„ κ°€μ§ˆ 수 μžˆλŠ” 트리λ₯Ό 말함

πŸ‘‰ μš°μ„ μˆœμœ„ 큐(Priority Queue)

  • μš°μ„ μˆœμœ„μ— λ”°λΌμ„œ 데이터λ₯Ό μΆ”μΆœν•˜λŠ” 자료ꡬ쑰
  • μš°μ„ μˆœμœ„ νλŠ” 일반적으둜 νž™(heap)을 μ΄μš©ν•΄ κ΅¬ν˜„
  • 컴퓨터 운영체제, μ˜¨λΌμž„ κ²Œμž„ 맀칭 λ“±μ—μ„œ ν™œμš©
자료ꡬ쑰 μΆ”μΆœλ˜λŠ” 데이터
μŠ€νƒ(Stack) κ°€μž₯ λ‚˜μ€‘μ— μ‚½μž…λœ 데이터
큐(Queue) κ°€μž₯ λ¨Όμ € μ‚½μž…λœ 데이터
μš°μ„ μˆœμœ„ 큐(Priority queue) κ°€μž₯ μš°μ„ μˆœμœ„κ°€ 높은 데이터

 

  • μš°μ„ μˆœμœ„ νλŠ” λ‹€μ–‘ν•œ λ°©λ²•μœΌλ‘œ κ΅¬ν˜„ κ°€λŠ₯
μš°μ„ μˆœμœ„ 큐 κ΅¬ν˜„λ°©μ‹ μ‚½μž… μ‹œκ°„ μ‚­μ œ  μ‹œκ°„
리슀트 μžλ£Œν˜• O(1) O(N)
νž™ (Heap) O(log N) O(log N)

 

  • 일반적인 ν˜•νƒœμ˜ νλŠ” μ„ ν˜•μ μΈ ꡬ쑰
  • λ°˜λ©΄μ— μš°μ„ μˆœμœ„ νλŠ” μ΄μ§„νŠΈλ¦¬ (binary queue)ꡬ쑰λ₯Ό μ‚¬μš©ν•¨ (λΉ„μ„ ν˜•μ μΈ 자료ꡬ쑰)

πŸ‘‰ 포화 이진 트리(Full Binary Tree)

  • 포화 이진 νŠΈλ¦¬λŠ” 리프 λ…Έλ“œλ₯Ό μ œμ™Έν•œ λͺ¨λ“  λ…Έλ“œκ°€ 두 μžμ‹μ„ 가지고 μžˆλŠ” 트리

πŸ‘‰ μ™„μ „ 이진 트리(Complete Binary Tree)

  • μ™„μ „ 이진 νŠΈλ¦¬λŠ” λͺ¨λ“  λ…Έλ“œκ°€ μ™Όμͺ½ μžμ‹λΆ€ν„° μ°¨κ·Όμ°¨κ·Ό μ±„μ›Œμ§„ 트리

πŸ‘‰ 높이 κ· ν˜• 트리(Height Balanced Tree)

  • μ™Όμͺ½ μžμ‹ νŠΈλ¦¬μ™€ 였λ₯Έμͺ½ μžμ‹ 트리의 높이가 1 이상 차이 λ‚˜μ§€ μ•ŠλŠ” 트리

πŸ‘‰ νž™ (Heap)

  • νž™μ€ μ›μ†Œλ“€ μ€‘μ—μ„œ μ΅œλŒ“κ°’ ν˜Ήμ€ μ΅œμ†Ÿκ°’μ„ λΉ λ₯΄κ²Œ μ°Ύμ•„λ‚΄λŠ” 자료ꡬ쑰
  • μ΅œλŒ€ νž™(max heap): 값이 큰 μ›μ†ŒλΆ€ν„° μΆ”μΆœ
  • μ΅œμ†Œ νž™(min heap): 값이 μž‘μ€ μ›μ†ŒλΆ€ν„° μΆ”μΆœ
  • νž™μ€ μ›μ†Œμ˜ μ‚½μž…κ³Ό μ‚­μ œλ₯Ό μœ„ν•΄ O(log N)의 μˆ˜ν–‰μ‹œκ°„μ„ μš”κ΅¬
  • λ‹¨μˆœν•œ N개의 데이터λ₯Ό νž™μ— λ„£μ—ˆλ‹€κ°€ λͺ¨λ‘ κΊΌλ‚΄λŠ” μž‘μ—…μ€ μ •λ ¬κ³Ό 동일 - O(NlogN)

πŸ‘‰ μ΅œλŒ€ (Max Heap)

  • μ΅œλŒ€ νž™(max heap)은 λΆ€λͺ¨ λ…Έλ“œκ°€ μžμ‹ λ…Έλ“œλ³΄λ‹€ 값이 큰 μ™„μ „ 이진 트리λ₯Ό 의미
  • κ·Έλž˜μ„œ μ΅œλŒ€ νž™μ˜ 루트 λ…Έλ“œλŠ” 전체 트리 쀑 κ°€μž₯ 큰 값을 가진닀

 

πŸ‘‰ νž™ (Heap)의 νŠΉμ§•

  • νž™μ€ μ™„μ „ 이진 트리 자료ꡬ쑰λ₯Ό λ”°λ₯Έλ‹€
  • νž™μ—μ„œλŠ” μš°μ„ μˆœμœ„κ°€ 높은 λ…Έλ“œκ°€ 루트(root)에 μœ„μΉ˜ν•œλ‹€
  • μ΅œλŒ€ νž™(max heap)
    • λΆ€λͺ¨ λ…Έλ“œμ˜ ν‚€ 값이 μžμ‹ λ…Έλ“œμ˜ ν‚€ 값보닀 항상 크닀
    • 루트 λ…Έλ“œκ°€ κ°€μž₯ 크며, 값이 큰 데이터가 μš°μ„ μˆœμœ„λ₯Ό 가진닀
  • μ΅œμ†Œ νž™(min heap)
    • λΆ€λͺ¨ λ…Έλ“œμ˜ ν‚€ 값이 μžμ‹ λ…Έλ“œμ˜ ν‚€ 값보닀 항상 μž‘λ‹€
    • 루트 λ…Έλ“œκ°€ κ°€μž₯ μž‘μœΌλ©°,값이 μž‘μ€ 데이터가 μš°μ„ μˆœμœ„λ₯Ό 가진닀

πŸ‘‰ μ΅œμ†Œ νž™ ꡬ성 ν•¨μˆ˜ : Heapify

  • νž™μ— μƒˆλ‘œμš΄ μ›μ†Œκ°€ μ‚½μž…λ  λ•Œ
    • (상ν–₯식) λΆ€λͺ¨λ‘œ 거슬러 μ˜¬λΌκ°€λ©°, λΆ€λͺ¨λ³΄λ‹€ μžμ‹ μ΄ 더 μž‘μ€ κ²½μš°μ— μœ„μΉ˜λ₯Ό ꡐ체
    • μƒˆλ‘œμš΄ μ›μ†Œκ°€ μ‚½μž…λ˜μ—ˆμ„ λ•Œ O(log N)의 μ‹œκ°„ λ³΅μž‘λ„λ‘œ νž™ μ„±μ§ˆμ„ μœ μ§€ 

  • νž™μ— μƒˆλ‘œμš΄ μ›μ†Œκ°€ μ‚­μ œλ  λ•Œ (1) 
    • μ›μ†Œκ°€ μ œκ±°λμ„ λ•Œ O(log N)의 μ‹œκ°„ λ³΅μž‘λ„λ‘œ νž™ μ„±μ§ˆμ„ μœ μ§€ν•  수 있음
    • μ›μ†Œλ₯Ό μ œκ±°ν•  λ•ŒλŠ” κ°€μž₯ λ§ˆμ§€λ§‰ λ…Έλ“œκ°€ 루트 λ…Έλ“œμ˜ μœ„μΉ˜μ— μ˜€λ„λ‘ν•¨
    • 루트 λ…Έλ“œλ₯Ό μ‚­μ œν•˜κ³  λ§ˆμ§€λ§‰ λ…Έλ“œκ°€ 루트 λ…Έλ“œμ˜ μœ„μΉ˜μ— 옴

  • νž™μ— μƒˆλ‘œμš΄ μ›μ†Œκ°€ μ‚­μ œλ  λ•Œ (2)
    • μ›μ†Œκ°€ μ œκ±°λ˜μ—ˆμ„ λ•Œ νž™ μ„±μ§ˆμ„ μœ μ§€ν•˜λ„λ‘ 함
    • 이후 루트 λ…Έλ“œμ—μ„œ ν•˜ν–₯μ‹μœΌλ‘œ(더 μž‘μ€ μžμ‹ λ…Έλ“œλ‘œ) heapify()λ₯Ό 진행함

πŸ‘‰ νž™(Heap)의 νŠΉμ§•

  • νž™μ˜ μ‚½μž…κ³Ό μ‚­μ œ 연산을 μˆ˜ν–‰ν•  λ•Œλ₯Ό κ³ λ €ν•΄λ³΄μž
  • μ§κ΄€μ μœΌλ‘œ, 거슬러 갈 λ•Œλ§ˆλ‹€ μ²˜λ¦¬ν•΄μ•Ό ν•˜λŠ” λ²”μœ„μ— ν¬ν•¨λœ μ›μ†Œμ˜ κ°œμˆ˜κ°€ μ ˆλ°˜μ”© 쀄어든닀
  • λ”°λΌμ„œ μ‚½μž…κ³Ό μ‚­μ œμ— λŒ€ν•œ μ‹œκ°„ λ³΅μž‘λ„λŠ” O(logN)이닀 

 

 

μš°μ„ μˆœμœ„ 큐 라이브러리

var PriorityQueue = require('priorityqueuejs');

var queue = new PriorityQueue(function(a, b) {
  return a.cash - b.cash;
});

queue.enq({ cash: 250, name: 'Valentina' });
queue.enq({ cash: 300, name: 'Jano' });
queue.enq({ cash: 150, name: 'Fran' });
queue.size(); // 3
queue.peek(); // { cash: 300, name: 'Jano' }
queue.deq(); // { cash: 300, name: 'Jano' }
queue.size(); // 2

https://github.com/ndb796/priorityqueuejs/tree/master

 

GitHub - ndb796/priorityqueuejs: A simple priority queue data structure for Node.js

A simple priority queue data structure for Node.js - ndb796/priorityqueuejs

github.com

 

 

 

좜처: https://fastcampus.co.kr/dev_online_upjscodingtest

 

JavaScript μ½”λ”©ν…ŒμŠ€νŠΈ 131개 예제 & CSμ§€μ‹μœΌλ‘œ 끝내기 | 패슀트캠퍼슀

25μ‹œκ°„ λŒ€λΉ„ κ³Όμ • / 'μ½”ν…Œ λ ˆμ „λ“œ' μœ νŠœλ²„ κ°•μ‚¬λ‹˜κ»˜ ν•΅μ‹¬λ§Œ 배우고 λΉ λ₯΄κ²Œ ν•©κ²©ν•˜μ„Έμš”.

fastcampus.co.kr

 

728x90