123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- "use strict";
- Object.defineProperty(exports, "__esModule", {
- value: true
- });
- // Binary min-heap implementation used for priority queue.
- // Implementation is stable, i.e. push time is considered for equal priorities
- class Heap {
- constructor() {
- this.heap = [];
- this.pushCount = Number.MIN_SAFE_INTEGER;
- }
- get length() {
- return this.heap.length;
- }
- empty() {
- this.heap = [];
- return this;
- }
- percUp(index) {
- let p;
- while (index > 0 && smaller(this.heap[index], this.heap[p = parent(index)])) {
- let t = this.heap[index];
- this.heap[index] = this.heap[p];
- this.heap[p] = t;
- index = p;
- }
- }
- percDown(index) {
- let l;
- while ((l = leftChi(index)) < this.heap.length) {
- if (l + 1 < this.heap.length && smaller(this.heap[l + 1], this.heap[l])) {
- l = l + 1;
- }
- if (smaller(this.heap[index], this.heap[l])) {
- break;
- }
- let t = this.heap[index];
- this.heap[index] = this.heap[l];
- this.heap[l] = t;
- index = l;
- }
- }
- push(node) {
- node.pushCount = ++this.pushCount;
- this.heap.push(node);
- this.percUp(this.heap.length - 1);
- }
- unshift(node) {
- return this.heap.push(node);
- }
- shift() {
- let [top] = this.heap;
- this.heap[0] = this.heap[this.heap.length - 1];
- this.heap.pop();
- this.percDown(0);
- return top;
- }
- toArray() {
- return [...this];
- }
- *[Symbol.iterator]() {
- for (let i = 0; i < this.heap.length; i++) {
- yield this.heap[i].data;
- }
- }
- remove(testFn) {
- let j = 0;
- for (let i = 0; i < this.heap.length; i++) {
- if (!testFn(this.heap[i])) {
- this.heap[j] = this.heap[i];
- j++;
- }
- }
- this.heap.splice(j);
- for (let i = parent(this.heap.length - 1); i >= 0; i--) {
- this.percDown(i);
- }
- return this;
- }
- }
- exports.default = Heap;
- function leftChi(i) {
- return (i << 1) + 1;
- }
- function parent(i) {
- return (i + 1 >> 1) - 1;
- }
- function smaller(x, y) {
- if (x.priority !== y.priority) {
- return x.priority < y.priority;
- } else {
- return x.pushCount < y.pushCount;
- }
- }
- module.exports = exports["default"];
|