[Guide] Data Structures: Create a Priority Queue Class (#19618)
* feat: added priority queue * Corrected a few misspellings, added some white space between functionspull/29632/head
parent
35c77e345a
commit
2928dc250c
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue