heapify
Version:
Blazing fast priority queue
1 lines • 2.43 kB
JavaScript
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.Heapify=t():e.Heapify=t()}(this,(function(){return(()=>{"use strict";var e={};return(()=>{var t=e;Object.defineProperty(t,"__esModule",{value:!0}),t.MinQueue=void 0,t.MinQueue=class{constructor(e=64,t=[],i=[],s=Uint32Array,h=Uint32Array){if(this._capacity=e,this._keys=new s(e+1),this._priorities=new h(e+1),this._hasPoppedElement=!1,t.length!==i.length)throw new Error("Number of keys does not match number of priorities provided.");if(e<t.length)throw new Error("Capacity less than number of provided keys.");for(let e=0;e<t.length;e++)this._keys[e+1]=t[e],this._priorities[e+1]=i[e];this.length=t.length;for(let e=t.length>>>1;e>=1;e--)this.bubbleDown(e)}get capacity(){return this._capacity}clear(){this.length=0,this._hasPoppedElement=!1}bubbleUp(e){const t=this._keys[e],i=this._priorities[e];for(;e>1;){const t=e>>>1;if(this._priorities[t]<=i)break;this._keys[e]=this._keys[t],this._priorities[e]=this._priorities[t],e=t}this._keys[e]=t,this._priorities[e]=i}bubbleDown(e){const t=this._keys[e],i=this._priorities[e],s=1+(this.length>>>1),h=this.length+1;for(;e<s;){const t=e<<1;let s=this._priorities[t],r=this._keys[t],o=t;const n=t+1;if(n<h){const e=this._priorities[n];e<s&&(s=e,r=this._keys[n],o=n)}if(s>=i)break;this._keys[e]=r,this._priorities[e]=s,e=o}this._keys[e]=t,this._priorities[e]=i}push(e,t){if(this.length===this._capacity)throw new Error("Heap has reached capacity, can't push new items");if(this._hasPoppedElement)this._keys[1]=e,this._priorities[1]=t,this.length++,this.bubbleDown(1),this._hasPoppedElement=!1;else{const i=this.length+1;this._keys[i]=e,this._priorities[i]=t,this.length++,this.bubbleUp(i)}}pop(){if(0!==this.length)return this.removePoppedElement(),this.length--,this._hasPoppedElement=!0,this._keys[1]}peekPriority(){return this.removePoppedElement(),this._priorities[1]}peek(){return this.removePoppedElement(),this._keys[1]}removePoppedElement(){this._hasPoppedElement&&(this._keys[1]=this._keys[this.length+1],this._priorities[1]=this._priorities[this.length+1],this.bubbleDown(1),this._hasPoppedElement=!1)}get size(){return this.length}dumpRawPriorities(){this.removePoppedElement();const e=Array(this.length-1);for(let t=0;t<this.length;t++)e[t]=this._priorities[t+1];return`[${e.join(" ")}]`}}})(),e})()}));