728x90
νμ λ ¬μ΄λ
2022.10.13 - [π μλ£κ΅¬μ‘° λ° μκ³ λ¦¬μ¦/ν] - [μλ£κ΅¬μ‘°] ν(Heap)μ΄λ?
[μλ£κ΅¬μ‘°] ν(Heap)μ΄λ?
νμ΄λ? μμ μ΄μ§νΈλ¦¬μ μΌμ’ μ΄λ€. νμ μ€λ³΅λ κ°μ νμ©νλ€. μ¬λ¬ κ°λ€ μ€ μ΅λκ° νΉμ μ΅μκ°μ λΉ λ₯΄κ² μ°Ύμλ΄κΈ° μν μλ£κ΅¬μ‘°μ΄λ€. Max heapμ κ°μ₯ ν° κ°μ λΉ λ₯΄κ² μ°ΎκΈ° μν κ²μ΄κ³ Min Heap
linerate.tistory.com
ν©λ³ μ λ ¬λ°©μμ λΉλ‘ μ΅μ μ κ²½μ° μ°μ° μκ°κ³Ό νκ· μ°μ° μκ° λͺ¨λ O(nlogn)μ΄μ§λ§, μ λ ¬ν λ μ½λ μμ λΉλ‘νμ¬ μ μ₯ 곡κ°μ΄ μΆκ°λ‘ νμνλ€. ν μ λ ¬(heap sort)μ μΌμ ν μμ μ μ₯ 곡κ°λ§ μΆκ°μ μΌλ‘ νμν λμμ, μ΅μ μ κ²½μ° νκ· μ°μ° μκ°μ΄ O(n log n)μ΄λ€. νμ§λ§, ν μ λ ¬μ ν©λ³ μ λ ¬λ³΄λ€ μ½κ° λ리λ€. ν μ λ ¬μ ν΅μ¬ μλ‘리μ¦μ μ΄λ¦μ²λΌ νλ₯Ό μ¬μ©νλ€. κ·Έμ€μμλ μ΅λ ν ꡬ쑰λ₯Ό μ΄μ©νλ€. λ°λΌμ, μ΅λ ννκ° λλλ‘ λ μ½λλ₯Ό μ¬μ‘°μ ν 루νΈλ₯Ό νλμ© λΉΌλ΄λ©΄μ μ λ ¬μ νλ κΈ°λ²μ΄λ€.

μ¦, νμ λ ¬μ μκ³ λ¦¬μ¦μ
- μ λ ¬ν nκ°μ μμλ₯Ό μ΅λ νμ μ½μ
- νλ²μ νλμ© νμμ μμ νμ¬ μ μ₯
- ν ν¬κΈ° κ°μ λ° μ¬μ‘°μ
- n-1 λ°λ³΅
- νμ μ½μ νκ±°λ μμ ν λ μκ°μ΄ O(logN)λ§νΌ μμλκ³ μμμ κ°μκ° nκ°μ΄λ―λ‘ μ 체μ μΌλ‘ O(NlogN)μ μκ°μ΄ κ±Έλ¦°λ€.
- νμ λ ¬μ΄ μ΅λλ‘ μ μ©ν κ²½μ°λ μ 체 μλ£λ₯Ό μ λ ¬νλ κ²μ΄ μλλΌ κ°μ₯ ν° κ° λͺ κ°λ§ νμν λμ΄λ€.
Adjust ν¨μ
- μΌμͺ½ λ° μ€λ₯Έμͺ½ μλΈ νΈλ¦¬κ° λͺ¨λ ννμΈ μ΄μ§ νΈλ¦¬μμ μμν΄ μ΄μ§ νΈλ¦¬ μ μ²΄κ° μ΅λ ννκ° λλλ‘ μ¬μ‘°μ
- μ°μ° μκ° : O(d) (dλ νΈλ¦¬μ κΉμ΄)
// μ΅λ ν(max heap) μμ ν¨μ
element delete_max_heap(HeapType *h){
int parent, child;
element item, temp;
item = h->heap[1]; // λ£¨νΈ λ
Έλ κ°μ λ°ννκΈ° μν΄ itemμ ν λΉ
temp = h->heap[(h->heap_size)--]; // λ§μ§λ§ λ
Έλλ₯Ό tempμ ν λΉνκ³ ν ν¬κΈ°λ₯Ό νλ κ°μ
parent = 1;
child = 2;
while(child <= h->heap_size){
// νμ¬ λ
Έλμ μμ λ
Έλ μ€ λ ν° μμ λ
Έλλ₯Ό μ°Ύλλ€. (λ£¨νΈ λ
Έλμ μΌμͺ½ μμ λ
Έλ(index: 2)λΆν° λΉκ΅ μμ)
if( (child < h->heap_size) && ((h->heap[child].key) < h->heap[child+1].key) ){
child++;
}
// λ ν° μμ λ
Έλλ³΄λ€ λ§μ§λ§ λ
Έλκ° ν¬λ©΄, whileλ¬Έ μ€μ§
if( temp.key >= h->heap[child].key ){
break;
}
// λ ν° μμ λ
Έλλ³΄λ€ λ§μ§λ§ λ
Έλκ° μμΌλ©΄, λΆλͺ¨ λ
Έλμ λ ν° μμ λ
Έλλ₯Ό κ΅ν
h->heap[parent] = h->heap[child];
// ν λ¨κ³ μλλ‘ μ΄λ
parent = child;
child *= 2;
}
// λ§μ§λ§ λ
Έλλ₯Ό μ¬κ΅¬μ±ν μμΉμ μ½μ
h->heap[parent] = temp;
// μ΅λκ°(λ£¨νΈ λ
Έλ κ°)μ λ°ν
return item;
}
https://gmlwjd9405.github.io/2018/05/10/algorithm-heap-sort.html
- 루νΈκ°μ itemμ μμ μ μ₯
- tempμλ λ§μ§λ§ λ Έλμ κ°μ μ μ₯νκ³ size 1κ°μ
- νμ¬ λ£¨νΈ λ Έλμ μΌμͺ½ μμ λ ΈλλΆν° λΉκ΅ μμ
- λ§μ½ μΌμͺ½λ³΄λ€ μ€λ₯Έμͺ½ λ Έλκ° λ ν¬λ€λ©΄ childκ°μ μ¦κ°μμΌμ μ€λ₯Έμͺ½ λ Έλλ‘ λ³κ²½
- 2κ°μ μμλ³΄λ€ λ£¨νΈλ Έλκ° ν¬λ©΄ whileλ¬Έ νμΆ
- λΆλͺ¨λ Έλκ° μμλ Έλλ³΄λ€ μμΌλ©΄ κ·Έ μμλ Έλμ κ΅ν ( λΆλͺ¨λ Έλμ μμλ Έλκ° λμ )
- ν λ¨κ³ μλλ‘ μ΄λν΄μ£Όκ³ λ§μ§λ§λ Έλλ₯Ό μ¬κ΅¬μ±ν μμΉμ μ½μ
νμ λ ¬ μκ°λ³΅μ‘λ
ν νΈλ¦¬μ μ 체 λμ΄κ° κ±°μ logβn(μμ μ΄μ§ νΈλ¦¬μ΄λ―λ‘)μ΄λ―λ‘ νλμ μμλ₯Ό νμ μ½μ
νκ±°λ μμ ν λ νμ μ¬μ λΉνλ μκ°μ΄ logβnλ§νΌ μμλλ€. μμμ κ°μκ° nκ° μ΄λ―λ‘ μ 체μ μΌλ‘ O(nlogβn)μ μκ°μ΄ κ±Έλ¦°λ€.
T(n) = O(nlogβn)
728x90