@datastructures-js/priority-queue
Advanced tools
Comparing version 4.0.0 to 4.1.0
@@ -9,2 +9,6 @@ # Changelog | ||
## [4.1.0] - 2020-04-22 | ||
### Added | ||
- allow passing a priority callback in constructor. | ||
## [4.0.0] - 2020-04-13 | ||
@@ -11,0 +15,0 @@ ### Changed |
{ | ||
"name": "@datastructures-js/priority-queue", | ||
"version": "4.0.0", | ||
"version": "4.1.0", | ||
"description": "priority queue implementation in javascript using a Min Heap", | ||
@@ -5,0 +5,0 @@ "main": "index.js", |
@@ -48,12 +48,15 @@ # @datastructures-js/priority-queue | ||
### Construction | ||
The constructor can accept a callback to get the priority from the queued element. If not passed, the priortiy should be passed with `.enqueue`. | ||
#### Example | ||
```js | ||
// the priority not part of the enqueued element | ||
const patientsQueue = new MinPriorityQueue(); | ||
const biddersQueue = new MaxPriorityQueue(); | ||
// the priority is a prop of the queued element | ||
const biddersQueue = new MaxPriorityQueue({ priority: (bid) => bid.value }); | ||
``` | ||
### .enqueue(element, priority) | ||
adds an element with a priority (number) to the queue. | ||
adds an element with a priority (number) to the queue. Priority is not required here if a priority callback has been defined in the constructor. If passed here in addition to an existing constructor callback, it will override the callback one. | ||
@@ -85,7 +88,7 @@ <table> | ||
// MaxPriorityQueue Example, where priority is the bid for example | ||
biddersQueue.enqueue('bidder y', 1000); // lowest priority | ||
biddersQueue.enqueue('bidder w', 2500); | ||
biddersQueue.enqueue('bidder z', 3500); // highest priority | ||
biddersQueue.enqueue('bidder x', 3000); | ||
// MaxPriorityQueue Example, where priority is the bid for example. Priority is obtained from the callback. | ||
biddersQueue.enqueue({ name: 'bidder y', value: 1000 }); // lowest priority | ||
biddersQueue.enqueue({ name: 'bidder w', value: 2500 }); | ||
biddersQueue.enqueue({ name: 'bidder z', value: 3500 }); // highest priority | ||
biddersQueue.enqueue({ name: 'bidder x', value: 3000 }); | ||
``` | ||
@@ -118,3 +121,3 @@ | ||
console.log(biddersQueue.front()); // { priority: 3500, element: 'bidder z' } | ||
console.log(biddersQueue.front()); // { priority: 3500, element: { name: 'bidder z', value: 3500 } } | ||
``` | ||
@@ -133,3 +136,2 @@ | ||
<table> | ||
@@ -151,5 +153,5 @@ <tr> | ||
biddersQueue.enqueue('bidder m', 1000); // lowest priority | ||
biddersQueue.enqueue('bidder c', 1000); // lowest priority | ||
console.log(biddersQueue.back()); // { priority: 1000, element: 'bidder y' } | ||
biddersQueue.enqueue({ name: 'bidder m', value: 1000 }); // lowest priority | ||
biddersQueue.enqueue({ name: 'bidder c', value: 1000 }); // lowest priority | ||
console.log(biddersQueue.back()); // { priority: 1000, element: { name: 'bidder y', value: 1000 } } | ||
``` | ||
@@ -183,4 +185,4 @@ | ||
console.log(biddersQueue.dequeue()); // { priority: 3500, element: 'bidder z' } | ||
console.log(biddersQueue.front()); // { priority: 3000, element: 'bidder x' } | ||
console.log(biddersQueue.dequeue()); // { priority: 3500, element: { name: 'bidder z', value: 3500 } } | ||
console.log(biddersQueue.front()); // { priority: 3000, element: { name: 'bidder x', value: 3000 } } | ||
``` | ||
@@ -278,7 +280,7 @@ | ||
[ | ||
{ priority: 3000, element: 'bidder x' }, | ||
{ priority: 2500, element: 'bidder w' }, | ||
{ priority: 1000, element: 'bidder y' }, | ||
{ priority: 1000, element: 'bidder m' }, | ||
{ priority: 1000, element: 'bidder c' } | ||
{ priority: 3000, element: { name: 'bidder x', value: 3000 } }, | ||
{ priority: 2500, element: { name: 'bidder w', value: 2500 } }, | ||
{ priority: 1000, element: { name: 'bidder y', value: 1000 } }, | ||
{ priority: 1000, element: { name: 'bidder m', value: 1000 } }, | ||
{ priority: 1000, element: { name: 'bidder c', value: 1000 } } | ||
] | ||
@@ -285,0 +287,0 @@ */ |
@@ -15,4 +15,4 @@ /** | ||
class MaxPriorityQueue extends PriorityQueue { | ||
constructor() { | ||
super(); | ||
constructor(options) { | ||
super(options); | ||
this._heap = new MaxHeap(); | ||
@@ -19,0 +19,0 @@ } |
@@ -15,4 +15,4 @@ /** | ||
class MinPriorityQueue extends PriorityQueue { | ||
constructor() { | ||
super(); | ||
constructor(options) { | ||
super(options); | ||
this._heap = new MinHeap(); | ||
@@ -19,0 +19,0 @@ } |
@@ -12,2 +12,10 @@ /** | ||
class PriorityQueue { | ||
constructor(options = {}) { | ||
const { priority } = options; | ||
if (priority !== undefined && typeof priority !== 'function') { | ||
throw new Error('invalid priority callback'); | ||
} | ||
this._getPriority = typeof priority === 'function' ? priority : null; | ||
} | ||
/** | ||
@@ -67,6 +75,11 @@ * @public | ||
enqueue(element, priority) { | ||
if (Number.isNaN(+priority) || priority < 1) { | ||
throw new Error('priority should be a positive none-zero number'); | ||
if (priority && (Number.isNaN(+priority) || priority < 1)) { | ||
throw new Error('invalid priority number'); | ||
} | ||
this._heap.insert(priority, element); | ||
if (!priority && this._getPriority === null) { | ||
throw new Error('missing priority number or constructor callback'); | ||
} | ||
this._heap.insert(priority || this._getPriority(element), element); | ||
} | ||
@@ -73,0 +86,0 @@ |
14193
146
316