82 lines
2.1 KiB
JavaScript
82 lines
2.1 KiB
JavaScript
class BinaryHeapOpenSet {
|
|
constructor () {
|
|
// Initialing the array heap and adding a dummy element at index 0
|
|
this.heap = [null]
|
|
}
|
|
|
|
size () {
|
|
return this.heap.length - 1
|
|
}
|
|
|
|
isEmpty () {
|
|
return this.heap.length === 1
|
|
}
|
|
|
|
push (val) {
|
|
// Inserting the new node at the end of the heap array
|
|
this.heap.push(val)
|
|
|
|
// Finding the correct position for the new node
|
|
let current = this.heap.length - 1
|
|
let parent = current >>> 1
|
|
|
|
// Traversing up the parent node until the current node is greater than the parent
|
|
while (current > 1 && this.heap[parent].f > this.heap[current].f) {
|
|
[this.heap[parent], this.heap[current]] = [this.heap[current], this.heap[parent]]
|
|
current = parent
|
|
parent = current >>> 1
|
|
}
|
|
}
|
|
|
|
update (val) {
|
|
let current = this.heap.indexOf(val)
|
|
let parent = current >>> 1
|
|
|
|
// Traversing up the parent node until the current node is greater than the parent
|
|
while (current > 1 && this.heap[parent].f > this.heap[current].f) {
|
|
[this.heap[parent], this.heap[current]] = [this.heap[current], this.heap[parent]]
|
|
current = parent
|
|
parent = current >>> 1
|
|
}
|
|
}
|
|
|
|
pop () {
|
|
// Smallest element is at the index 1 in the heap array
|
|
const smallest = this.heap[1]
|
|
|
|
this.heap[1] = this.heap[this.heap.length - 1]
|
|
this.heap.splice(this.heap.length - 1)
|
|
|
|
const size = this.heap.length - 1
|
|
|
|
if (size < 2) return smallest
|
|
|
|
const val = this.heap[1]
|
|
let index = 1
|
|
let smallerChild = 2
|
|
const cost = val.f
|
|
do {
|
|
let smallerChildNode = this.heap[smallerChild]
|
|
if (smallerChild < size - 1) {
|
|
const rightChildNode = this.heap[smallerChild + 1]
|
|
if (smallerChildNode.f > rightChildNode.f) {
|
|
smallerChild++
|
|
smallerChildNode = rightChildNode
|
|
}
|
|
}
|
|
if (cost <= smallerChildNode.f) {
|
|
break
|
|
}
|
|
this.heap[index] = smallerChildNode
|
|
this.heap[smallerChild] = val
|
|
index = smallerChild
|
|
|
|
smallerChild *= 2
|
|
} while (smallerChild <= size)
|
|
|
|
return smallest
|
|
}
|
|
}
|
|
|
|
module.exports = BinaryHeapOpenSet
|