[Guide] Data Structures: Create a Priority Queue Class (#19618)

* feat: added priority queue

* Corrected a few misspellings, added some white space between functions
pull/29632/head
Aditya 2018-10-26 21:07:48 +05:30 committed by Christopher McCormack
parent 35c77e345a
commit 2928dc250c
1 changed files with 118 additions and 3 deletions

View File

@ -3,8 +3,123 @@ title: Create a Priority Queue Class
---
## Create a Priority Queue Class
This is a stub. <a href='https://github.com/freecodecamp/guides/tree/master/src/pages/certifications/coding-interview-prep/data-structures/create-a-priority-queue-class/index.md' target='_blank' rel='nofollow'>Help our community expand it</a>.
### Method:
- Priority Queue is an Abstract Data Type.
- It can be implemented using other Data Structures but is commonly implemented using a Heap.
- Each node contains a priority. When we enqueue a node to the queue, it's "bubbled up" to its place in the queue.
- In this challenge we need to create a Priority Queue class based on Min-Heap with a few methods:
- enqueue() - It enqueue's the new node to it's appropriate place in queue.
- dequeue() - It removes the first node from the queue.
- front() - This method returns the first node to be dequeued.
- size() - Returns the size of the queue.
- isEmpty() - Returns if the queue is empty.
- | DS | Access | Search | Insert | Delete |
| ----- | ------ | ------ | ------ | ------ |
| Priority Queue | 1 | 1 | logn | logn |
<a href='https://github.com/freecodecamp/guides/blob/master/README.md' target='_blank' rel='nofollow'>This quick style guide will help ensure your pull request gets accepted</a>.
<!-- The article goes here, in GitHub-flavored Markdown. Feel free to add YouTube videos, images, and CodePen/JSBin embeds -->
### Solution:
```js
//function which swaps elements in array, using ES6 syntax
function swap(arr, i, j) {
[arr[i], arr[j]] = [arr[j], arr[i]];
}
class PriorityQueue {
constructor() {
//initializing queue
this.collection = [];
}
printCollection() {
console.log(this.collection);
}
//enqueues the node to the queue
enqueue(node) {
this.collection.push(node);
//calling the helper method which bubbles up the node to the correct position
this.bubbleUp();
}
//helper method which bubbles the node to its correct position
bubbleUp() {
let i = this.size() - 1;
let node = this.collection[i];
while (true) {
//getting the parent node's index
let parent = Math.floor((i - 1) / 2);
if (parent < 0) return;
//comparing with parent, if the node is smaller then swapping
if (this.collection[parent][1] > node[1]) {
swap(this.collection, parent, i);
i = parent;
} else break;
}
}
//dequeues the node and returns its value
dequeue() {
if (this.isEmpty()) return;
if (this.size() === 1) {
return this.collection.pop()[0];
}
//getting the first element from the queue
let pop = this.collection[0];
//replacing the first element by last
this.collection[0] = this.collection.pop();
//calling the buubleDown method which bubbles down the node to the correct position
this.bubbleDown();
return pop[0];
}
//helper method which bubble's down the node to the correct position
bubbleDown() {
let node = this.collection[0];
let i = 0;
while (true) {
//getting the two child node's index
let child1 = 2 * i + 1;
let child2 = 2 * i + 2;
//edge case
if (child2 >= this.size()) return;
//getting the minimum of two child
let min =
this.collection[child1][1] > this.collection[child2][1]
? child2
: child1;
//if the child is smaller than node then swap
if (this.collection[min][1] < node[1]) {
swap(this.collection, i, min);
i = min;
} else break;
}
}
//returns the first element from queue
front() {
return this.collection[0];
}
// returns the size of the queue
size() {
return this.collection.length;
}
// returns if the queue is empty
isEmpty() {
return this.size() === 0;
}
}
```
- [Run Code](https://repl.it/@ezioda004/Priority-Queue)
### References:
- [Wikipedia](https://en.wikipedia.org/wiki/Priority_queue)