- Notifications
You must be signed in to change notification settings - Fork37
Priority queues in JavaScript
License
adamhooper/js-priority-queue
Folders and files
| Name | Name | Last commit message | Last commit date | |
|---|---|---|---|---|
Repository files navigation
A priority queue is a data structure with these operations:
| Operation | Syntax (js-priority-queue) | Description |
|---|---|---|
| Create | var queue = new PriorityQueue(); | Creates a priority queue |
| Queue | queue.queue(value); | Inserts a new value in the queue |
| Length | var length = queue.length; | Returns the number of elements in the queue |
| Peek | var firstItem = queue.peek(); | Returns the smallest item in the queue and leaves the queue unchanged |
| Dequeue | var firstItem = queue.dequeue(); | Returns the smallest item in the queue and removes it from the queue |
| Clear | queue.clear(); | Removes all values from the queue |
You cannot access the data in any other way: you must dequeue or peek.
Why use this library? Two reasons:
- It's easier to use than an Array, and it's clearer.
- It can make your code execute more quickly.
You cannpm install js-priority-queue orbower install js-priority-queue.Alternatively, just downloadpriority-queue.js from this directory.
Include it throughRequireJS orBrowserify. Or, to pollute your global scope, insertthis in your HTML:
<scriptsrc="priority-queue.js"></script>
Then write code like this:
varqueue=newPriorityQueue({comparator:function(a,b){returnb-a;}});queue.queue(5);queue.queue(3);queue.queue(2);varlowest=queue.dequeue();// returns 5
How exactly will these elements be ordered? Let's use thecomparator option.This is the argument we would pass toArray.prototype.sort:
varcompareNumbers=function(a,b){returna-b;};varqueue=newPriorityQueue({comparator:compareNumbers});
You can also pass initial values, in any order. With lots of values, it'sfaster to load them all at once than one at a time.
varqueue=newPriorityQueue({initialValues:[1,2,3]})
We can implement this with a regularArray. We'll keep it sorted inversely,soqueue.dequeue() maps toarray.pop(). Eachqueue() is asplice(),which rewrites the entire array. This is fast for tiny queues.
An alternative is aBinary Heap: itmodifies just a few array elements when queueing (though each modification hasa cost).
Finally, we can use aB-Heap. It's like abinary heap, except its modifications often occur close together in memory.Unfortunately, calculatingwhere in memory the modifications should occur isslower. (It costs a function call instead of a bit-shift.) So while B-heap isfast in theory, it's slow in practice.
Create the queues like this:
varqueue=newPriorityQueue({strategy:PriorityQueue.ArrayStrategy});// Arrayvarqueue=newPriorityQueue({strategy:PriorityQueue.BinaryHeapStrategy});// Defaultvarqueue=newPriorityQueue({strategy:PriorityQueue.BHeapStrategy});// Slower
You'll see running times like this:
| Operation | Array | Binary heap | B-Heap |
|---|---|---|---|
| Create | O(n lg n) | O(n) | O(n) |
| Queue | O(n) (often slow) | O(lg n) (fast) | O(lg n) |
| Peek | O(1) | O(1) | O(1) |
| Dequeue | O(1) (fast) | O(lg n) | O(lg n) |
According toJsPerf, thefastest strategy for most cases isBinaryHeapStrategy. UseArrayStrategyin edge cases, after performance-testing your specific data. Don't useBHeapStrategy: it's a lesson that a miracle in C can flop in JavaScript.
The default strategy isBinaryHeapStrategy.
- Fork this repository
- Run
npm install - Write the behavior you expect in
spec-coffee/ - Edit files in
coffee/untilgulp testsays you're done - Run
gulpto updatepriority-queue.jsandpriority-queue.min.js - Submit a pull request
I, Adam Hooper, the sole author of this project, waive all my rights to it andrelease it under thePublicDomain. Do with it what youwill.
About
Priority queues in JavaScript
Resources
License
Uh oh!
There was an error while loading.Please reload this page.
Stars
Watchers
Forks
Packages0
Uh oh!
There was an error while loading.Please reload this page.
Contributors6
Uh oh!
There was an error while loading.Please reload this page.