LookAtMySuitBot/js/node_modules/mineflayer-pathfinder/lib/heap.js

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