오늘은 자료구조 Heap
에 대해서 알아보자.
Heap
의 특징에 대해 먼저 알아보자.
Heap
은 완전 이진 트리로 구성되어 있다.Heap
은 값들 중에서 최댓값이나 최솟값을 빠르게 찾을 수 있는 자료구조이다.Heap
은 중복된 값을 허용한다.
Heap
그림으로 위의 특징들을 이해해보자.
위의 그림을 보면 완전 이진 트리로 구성되어 있고 중복된 값을 허용함을 알 수 있다.
root에서부터 내려오다보면 한 가지 규칙을 알 수 있는데 부모 노드 값 <= 자식 노드 값임을 알 수 있다.
이처럼 부모 노드 값이 자식 노드 값보다 값이 작은 형태의 Heap
을 최소 힙(min Heap)이라고 한다.
반대로 부모 노드 값이 자식 노드 값보다 값이 큰 형태의 Heap
을 최대 힙(max Heap)이라고 한다.
Heap
의 삽입이 어떻게 이뤄지는지 확인해보자.
Heap
에 새로운 노드가 들어오면 Heap
의 마지막 노드 뒤에 삽입한다.Heap
이 되도록 교환해나간다.위와 같은 최소힙에 2를 추가해보자.
swap
한다.swap
한다.Heap
구성을 마친다.Heap
의 삭제가 어떻게 이뤄지는지 확인해보자.
(위에서 구성한 Heap
에서 삭제를 해보자.)
Heap
의 삭제는 Heap
의 루트를 삭제하는 것이다.
즉, 최대 힙에서의 삭제는 최대 값을 삭제하는 것이고, 최소 힙에서의 삭제는 최소 값을 삭제하는 것이다.
위와 같이 구성된 Heap
에서 루트인 1을 삭제해보자.
swap
한다.swap
한다.public struct Heap<T> {
var nodes: [T] = []
let comparer: (T,T) -> Bool
var isEmpty: Bool {
return nodes.isEmpty
}
init(comparer: @escaping (T,T) -> Bool) {
self.comparer = comparer
}
func peek() -> T? {
return nodes.first
}
mutating func insert(_ element: T) {
var index = nodes.count
nodes.append(element)
while index > 0, !comparer(nodes[index],nodes[(index-1)/2]) {
nodes.swapAt(index, (index-1)/2)
index = (index-1)/2
}
}
mutating func delete() -> T? {
guard !nodes.isEmpty else {
return nil
}
if nodes.count == 1 {
return nodes.removeFirst()
}
let result = nodes.first
nodes.swapAt(0, nodes.count-1)
_ = nodes.popLast()
var index = 0
while index < nodes.count {
let left = index * 2 + 1
let right = left + 1
if right < nodes.count {
if comparer(nodes[left], nodes[right]),
!comparer(nodes[right], nodes[index]) {
nodes.swapAt(right, index)
index = right
} else if !comparer(nodes[left], nodes[index]){
nodes.swapAt(left, index)
index = left
} else {
break
}
} else if left < nodes.count {
if !comparer(nodes[left], nodes[index]) {
nodes.swapAt(left, index)
index = left
} else {
break
}
} else {
break
}
}
return result
}
}
extension Heap where T: Comparable {
init() {
self.init(comparer: <)
}
}
(출처: https://gist.github.com/JCSooHwanCho/a3f070c2160bb8c0047a5ddbb831f78e)
오늘은 자료구조 힙에 대해서 알아봤다.
역시... 코드로 자료구조 구현은 어려워..
그럼 이만👋