Repository files navigation

Priority Queue

A priority queue is a data structure with these operations:

OperationSyntax (js-priority-queue)Description
Createvar queue = new PriorityQueue();Creates a priority queue
Queuequeue.queue(value);Inserts a new value in the queue
Lengthvar length = queue.length;Returns the number of elements in the queue
Peekvar firstItem = queue.peek();Returns the smallest item in the queue and leaves the queue unchanged
Dequeuevar firstItem = queue.dequeue();Returns the smallest item in the queue and removes it from the queue
Clearqueue.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:

  1. It's easier to use than an Array, and it's clearer.
  2. It can make your code execute more quickly.

Installing

You can npm install js-priority-queue or bower install js-priority-queue. Alternatively, just download priority-queue.js from this directory.

Include it through RequireJS or Browserify. Or, to pollute your global scope, insert this 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

Options

How exactly will these elements be ordered? Let's use the comparator option. This is the argument we would pass to Array.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's faster to load them all at once than one at a time.

varqueue=newPriorityQueue({initialValues: [1,2,3]})

Strategies

We can implement this with a regular Array. We'll keep it sorted inversely, so queue.dequeue() maps to array.pop(). Each queue() is a splice(), which rewrites the entire array. This is fast for tiny queues.

An alternative is a Binary Heap: it modifies just a few array elements when queueing (though each modification has a cost).

Finally, we can use a B-Heap. It's like a binary heap, except its modifications often occur close together in memory. Unfortunately, calculating where in memory the modifications should occur is slower. (It costs a function call instead of a bit-shift.) So while B-heap is fast 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:

OperationArrayBinary heapB-Heap
CreateO(n lg n)O(n)O(n)
QueueO(n) (often slow)O(lg n) (fast)O(lg n)
PeekO(1)O(1)O(1)
DequeueO(1) (fast)O(lg n)O(lg n)

According to JsPerf, the fastest strategy for most cases is BinaryHeapStrategy. Use ArrayStrategy in edge cases, after performance-testing your specific data. Don't use BHeapStrategy: it's a lesson that a miracle in C can flop in JavaScript.

The default strategy is BinaryHeapStrategy.

Contributing

  1. Fork this repository
  2. Run npm install
  3. Write the behavior you expect in spec-coffee/
  4. Edit files in coffee/ until gulp test says you're done
  5. Run gulp to update priority-queue.js and priority-queue.min.js
  6. Submit a pull request

License

I, Adam Hooper, the sole author of this project, waive all my rights to it and release it under the Public Domain. Do with it what you will.

About

Priority queues in JavaScript

Resources

Stars

239 stars

Watchers

4 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Priority Queue

A priority queue is a data structure with these operations:

OperationSyntax (js-priority-queue)Description
Createvar queue = new PriorityQueue();Creates a priority queue
Queuequeue.queue(value);Inserts a new value in the queue
Lengthvar length = queue.length;Returns the number of elements in the queue
Peekvar firstItem = queue.peek();Returns the smallest item in the queue and leaves the queue unchanged
Dequeuevar firstItem = queue.dequeue();Returns the smallest item in the queue and removes it from the queue
Clearqueue.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:

  1. It's easier to use than an Array, and it's clearer.
  2. It can make your code execute more quickly.

Installing

You can npm install js-priority-queue or bower install js-priority-queue. Alternatively, just download priority-queue.js from this directory.

Include it through RequireJS or Browserify. Or, to pollute your global scope, insert this 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

Options

How exactly will these elements be ordered? Let's use the comparator option. This is the argument we would pass to Array.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's faster to load them all at once than one at a time.

varqueue=newPriorityQueue({initialValues: [1,2,3]})

Strategies

We can implement this with a regular Array. We'll keep it sorted inversely, so queue.dequeue() maps to array.pop(). Each queue() is a splice(), which rewrites the entire array. This is fast for tiny queues.

An alternative is a Binary Heap: it modifies just a few array elements when queueing (though each modification has a cost).

Finally, we can use a B-Heap. It's like a binary heap, except its modifications often occur close together in memory. Unfortunately, calculating where in memory the modifications should occur is slower. (It costs a function call instead of a bit-shift.) So while B-heap is fast 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:

OperationArrayBinary heapB-Heap
CreateO(n lg n)O(n)O(n)
QueueO(n) (often slow)O(lg n) (fast)O(lg n)
PeekO(1)O(1)O(1)
DequeueO(1) (fast)O(lg n)O(lg n)

According to JsPerf, the fastest strategy for most cases is BinaryHeapStrategy. Use ArrayStrategy in edge cases, after performance-testing your specific data. Don't use BHeapStrategy: it's a lesson that a miracle in C can flop in JavaScript.

The default strategy is BinaryHeapStrategy.

Contributing

  1. Fork this repository
  2. Run npm install
  3. Write the behavior you expect in spec-coffee/
  4. Edit files in coffee/ until gulp test says you're done
  5. Run gulp to update priority-queue.js and priority-queue.min.js
  6. Submit a pull request

License

I, Adam Hooper, the sole author of this project, waive all my rights to it and release it under the Public Domain. Do with it what you will.

About

Priority queues in JavaScript

Resources

Stars

239 stars

Watchers

4 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Priority Queue

A priority queue is a data structure with these operations:

OperationSyntax (js-priority-queue)Description
Createvar queue = new PriorityQueue();Creates a priority queue
Queuequeue.queue(value);Inserts a new value in the queue
Lengthvar length = queue.length;Returns the number of elements in the queue
Peekvar firstItem = queue.peek();Returns the smallest item in the queue and leaves the queue unchanged
Dequeuevar firstItem = queue.dequeue();Returns the smallest item in the queue and removes it from the queue
Clearqueue.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:

  1. It's easier to use than an Array, and it's clearer.
  2. It can make your code execute more quickly.

Installing

You can npm install js-priority-queue or bower install js-priority-queue. Alternatively, just download priority-queue.js from this directory.

Include it through RequireJS or Browserify. Or, to pollute your global scope, insert this 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

Options

How exactly will these elements be ordered? Let's use the comparator option. This is the argument we would pass to Array.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's faster to load them all at once than one at a time.

varqueue=newPriorityQueue({initialValues: [1,2,3]})

Strategies

We can implement this with a regular Array. We'll keep it sorted inversely, so queue.dequeue() maps to array.pop(). Each queue() is a splice(), which rewrites the entire array. This is fast for tiny queues.

An alternative is a Binary Heap: it modifies just a few array elements when queueing (though each modification has a cost).

Finally, we can use a B-Heap. It's like a binary heap, except its modifications often occur close together in memory. Unfortunately, calculating where in memory the modifications should occur is slower. (It costs a function call instead of a bit-shift.) So while B-heap is fast 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:

OperationArrayBinary heapB-Heap
CreateO(n lg n)O(n)O(n)
QueueO(n) (often slow)O(lg n) (fast)O(lg n)
PeekO(1)O(1)O(1)
DequeueO(1) (fast)O(lg n)O(lg n)

According to JsPerf, the fastest strategy for most cases is BinaryHeapStrategy. Use ArrayStrategy in edge cases, after performance-testing your specific data. Don't use BHeapStrategy: it's a lesson that a miracle in C can flop in JavaScript.

The default strategy is BinaryHeapStrategy.

Contributing

  1. Fork this repository
  2. Run npm install
  3. Write the behavior you expect in spec-coffee/
  4. Edit files in coffee/ until gulp test says you're done
  5. Run gulp to update priority-queue.js and priority-queue.min.js
  6. Submit a pull request

License

I, Adam Hooper, the sole author of this project, waive all my rights to it and release it under the Public Domain. Do with it what you will.

About

Priority queues in JavaScript

Resources

Stars

239 stars

Watchers

4 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Priority Queue

A priority queue is a data structure with these operations:

OperationSyntax (js-priority-queue)Description
Createvar queue = new PriorityQueue();Creates a priority queue
Queuequeue.queue(value);Inserts a new value in the queue
Lengthvar length = queue.length;Returns the number of elements in the queue
Peekvar firstItem = queue.peek();Returns the smallest item in the queue and leaves the queue unchanged
Dequeuevar firstItem = queue.dequeue();Returns the smallest item in the queue and removes it from the queue
Clearqueue.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:

  1. It's easier to use than an Array, and it's clearer.
  2. It can make your code execute more quickly.

Installing

You can npm install js-priority-queue or bower install js-priority-queue. Alternatively, just download priority-queue.js from this directory.

Include it through RequireJS or Browserify. Or, to pollute your global scope, insert this 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

Options

How exactly will these elements be ordered? Let's use the comparator option. This is the argument we would pass to Array.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's faster to load them all at once than one at a time.

varqueue=newPriorityQueue({initialValues: [1,2,3]})

Strategies

We can implement this with a regular Array. We'll keep it sorted inversely, so queue.dequeue() maps to array.pop(). Each queue() is a splice(), which rewrites the entire array. This is fast for tiny queues.

An alternative is a Binary Heap: it modifies just a few array elements when queueing (though each modification has a cost).

Finally, we can use a B-Heap. It's like a binary heap, except its modifications often occur close together in memory. Unfortunately, calculating where in memory the modifications should occur is slower. (It costs a function call instead of a bit-shift.) So while B-heap is fast 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:

OperationArrayBinary heapB-Heap
CreateO(n lg n)O(n)O(n)
QueueO(n) (often slow)O(lg n) (fast)O(lg n)
PeekO(1)O(1)O(1)
DequeueO(1) (fast)O(lg n)O(lg n)

According to JsPerf, the fastest strategy for most cases is BinaryHeapStrategy. Use ArrayStrategy in edge cases, after performance-testing your specific data. Don't use BHeapStrategy: it's a lesson that a miracle in C can flop in JavaScript.

The default strategy is BinaryHeapStrategy.

Contributing

  1. Fork this repository
  2. Run npm install
  3. Write the behavior you expect in spec-coffee/
  4. Edit files in coffee/ until gulp test says you're done
  5. Run gulp to update priority-queue.js and priority-queue.min.js
  6. Submit a pull request

License

I, Adam Hooper, the sole author of this project, waive all my rights to it and release it under the Public Domain. Do with it what you will.

About

Priority queues in JavaScript

Resources

Stars

239 stars

Watchers

4 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Priority Queue

A priority queue is a data structure with these operations:

OperationSyntax (js-priority-queue)Description
Createvar queue = new PriorityQueue();Creates a priority queue
Queuequeue.queue(value);Inserts a new value in the queue
Lengthvar length = queue.length;Returns the number of elements in the queue
Peekvar firstItem = queue.peek();Returns the smallest item in the queue and leaves the queue unchanged
Dequeuevar firstItem = queue.dequeue();Returns the smallest item in the queue and removes it from the queue
Clearqueue.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:

  1. It's easier to use than an Array, and it's clearer.
  2. It can make your code execute more quickly.

Installing

You can npm install js-priority-queue or bower install js-priority-queue. Alternatively, just download priority-queue.js from this directory.

Include it through RequireJS or Browserify. Or, to pollute your global scope, insert this 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

Options

How exactly will these elements be ordered? Let's use the comparator option. This is the argument we would pass to Array.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's faster to load them all at once than one at a time.

varqueue=newPriorityQueue({initialValues: [1,2,3]})

Strategies

We can implement this with a regular Array. We'll keep it sorted inversely, so queue.dequeue() maps to array.pop(). Each queue() is a splice(), which rewrites the entire array. This is fast for tiny queues.

An alternative is a Binary Heap: it modifies just a few array elements when queueing (though each modification has a cost).

Finally, we can use a B-Heap. It's like a binary heap, except its modifications often occur close together in memory. Unfortunately, calculating where in memory the modifications should occur is slower. (It costs a function call instead of a bit-shift.) So while B-heap is fast 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:

OperationArrayBinary heapB-Heap
CreateO(n lg n)O(n)O(n)
QueueO(n) (often slow)O(lg n) (fast)O(lg n)
PeekO(1)O(1)O(1)
DequeueO(1) (fast)O(lg n)O(lg n)

According to JsPerf, the fastest strategy for most cases is BinaryHeapStrategy. Use ArrayStrategy in edge cases, after performance-testing your specific data. Don't use BHeapStrategy: it's a lesson that a miracle in C can flop in JavaScript.

The default strategy is BinaryHeapStrategy.

Contributing

  1. Fork this repository
  2. Run npm install
  3. Write the behavior you expect in spec-coffee/
  4. Edit files in coffee/ until gulp test says you're done
  5. Run gulp to update priority-queue.js and priority-queue.min.js
  6. Submit a pull request

License

I, Adam Hooper, the sole author of this project, waive all my rights to it and release it under the Public Domain. Do with it what you will.

About

Priority queues in JavaScript

Resources

Stars

239 stars

Watchers

4 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Priority Queue

A priority queue is a data structure with these operations:

OperationSyntax (js-priority-queue)Description
Createvar queue = new PriorityQueue();Creates a priority queue
Queuequeue.queue(value);Inserts a new value in the queue
Lengthvar length = queue.length;Returns the number of elements in the queue
Peekvar firstItem = queue.peek();Returns the smallest item in the queue and leaves the queue unchanged
Dequeuevar firstItem = queue.dequeue();Returns the smallest item in the queue and removes it from the queue
Clearqueue.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:

  1. It's easier to use than an Array, and it's clearer.
  2. It can make your code execute more quickly.

Installing

You can npm install js-priority-queue or bower install js-priority-queue. Alternatively, just download priority-queue.js from this directory.

Include it through RequireJS or Browserify. Or, to pollute your global scope, insert this 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

Options

How exactly will these elements be ordered? Let's use the comparator option. This is the argument we would pass to Array.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's faster to load them all at once than one at a time.

varqueue=newPriorityQueue({initialValues: [1,2,3]})

Strategies

We can implement this with a regular Array. We'll keep it sorted inversely, so queue.dequeue() maps to array.pop(). Each queue() is a splice(), which rewrites the entire array. This is fast for tiny queues.

An alternative is a Binary Heap: it modifies just a few array elements when queueing (though each modification has a cost).

Finally, we can use a B-Heap. It's like a binary heap, except its modifications often occur close together in memory. Unfortunately, calculating where in memory the modifications should occur is slower. (It costs a function call instead of a bit-shift.) So while B-heap is fast 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:

OperationArrayBinary heapB-Heap
CreateO(n lg n)O(n)O(n)
QueueO(n) (often slow)O(lg n) (fast)O(lg n)
PeekO(1)O(1)O(1)
DequeueO(1) (fast)O(lg n)O(lg n)

According to JsPerf, the fastest strategy for most cases is BinaryHeapStrategy. Use ArrayStrategy in edge cases, after performance-testing your specific data. Don't use BHeapStrategy: it's a lesson that a miracle in C can flop in JavaScript.

The default strategy is BinaryHeapStrategy.

Contributing

  1. Fork this repository
  2. Run npm install
  3. Write the behavior you expect in spec-coffee/
  4. Edit files in coffee/ until gulp test says you're done
  5. Run gulp to update priority-queue.js and priority-queue.min.js
  6. Submit a pull request

License

I, Adam Hooper, the sole author of this project, waive all my rights to it and release it under the Public Domain. Do with it what you will.

About

Priority queues in JavaScript

Resources

Stars

239 stars

Watchers

4 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Priority Queue

A priority queue is a data structure with these operations:

OperationSyntax (js-priority-queue)Description
Createvar queue = new PriorityQueue();Creates a priority queue
Queuequeue.queue(value);Inserts a new value in the queue
Lengthvar length = queue.length;Returns the number of elements in the queue
Peekvar firstItem = queue.peek();Returns the smallest item in the queue and leaves the queue unchanged
Dequeuevar firstItem = queue.dequeue();Returns the smallest item in the queue and removes it from the queue
Clearqueue.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:

  1. It's easier to use than an Array, and it's clearer.
  2. It can make your code execute more quickly.

Installing

You can npm install js-priority-queue or bower install js-priority-queue. Alternatively, just download priority-queue.js from this directory.

Include it through RequireJS or Browserify. Or, to pollute your global scope, insert this 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

Options

How exactly will these elements be ordered? Let's use the comparator option. This is the argument we would pass to Array.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's faster to load them all at once than one at a time.

varqueue=newPriorityQueue({initialValues: [1,2,3]})

Strategies

We can implement this with a regular Array. We'll keep it sorted inversely, so queue.dequeue() maps to array.pop(). Each queue() is a splice(), which rewrites the entire array. This is fast for tiny queues.

An alternative is a Binary Heap: it modifies just a few array elements when queueing (though each modification has a cost).

Finally, we can use a B-Heap. It's like a binary heap, except its modifications often occur close together in memory. Unfortunately, calculating where in memory the modifications should occur is slower. (It costs a function call instead of a bit-shift.) So while B-heap is fast 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:

OperationArrayBinary heapB-Heap
CreateO(n lg n)O(n)O(n)
QueueO(n) (often slow)O(lg n) (fast)O(lg n)
PeekO(1)O(1)O(1)
DequeueO(1) (fast)O(lg n)O(lg n)

According to JsPerf, the fastest strategy for most cases is BinaryHeapStrategy. Use ArrayStrategy in edge cases, after performance-testing your specific data. Don't use BHeapStrategy: it's a lesson that a miracle in C can flop in JavaScript.

The default strategy is BinaryHeapStrategy.

Contributing

  1. Fork this repository
  2. Run npm install
  3. Write the behavior you expect in spec-coffee/
  4. Edit files in coffee/ until gulp test says you're done
  5. Run gulp to update priority-queue.js and priority-queue.min.js
  6. Submit a pull request

License

I, Adam Hooper, the sole author of this project, waive all my rights to it and release it under the Public Domain. Do with it what you will.

About

Priority queues in JavaScript

Resources

Stars

239 stars

Watchers

4 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Priority Queue

A priority queue is a data structure with these operations:

OperationSyntax (js-priority-queue)Description
Createvar queue = new PriorityQueue();Creates a priority queue
Queuequeue.queue(value);Inserts a new value in the queue
Lengthvar length = queue.length;Returns the number of elements in the queue
Peekvar firstItem = queue.peek();Returns the smallest item in the queue and leaves the queue unchanged
Dequeuevar firstItem = queue.dequeue();Returns the smallest item in the queue and removes it from the queue
Clearqueue.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:

  1. It's easier to use than an Array, and it's clearer.
  2. It can make your code execute more quickly.

Installing

You can npm install js-priority-queue or bower install js-priority-queue. Alternatively, just download priority-queue.js from this directory.

Include it through RequireJS or Browserify. Or, to pollute your global scope, insert this 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

Options

How exactly will these elements be ordered? Let's use the comparator option. This is the argument we would pass to Array.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's faster to load them all at once than one at a time.

varqueue=newPriorityQueue({initialValues: [1,2,3]})

Strategies

We can implement this with a regular Array. We'll keep it sorted inversely, so queue.dequeue() maps to array.pop(). Each queue() is a splice(), which rewrites the entire array. This is fast for tiny queues.

An alternative is a Binary Heap: it modifies just a few array elements when queueing (though each modification has a cost).

Finally, we can use a B-Heap. It's like a binary heap, except its modifications often occur close together in memory. Unfortunately, calculating where in memory the modifications should occur is slower. (It costs a function call instead of a bit-shift.) So while B-heap is fast 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:

OperationArrayBinary heapB-Heap
CreateO(n lg n)O(n)O(n)
QueueO(n) (often slow)O(lg n) (fast)O(lg n)
PeekO(1)O(1)O(1)
DequeueO(1) (fast)O(lg n)O(lg n)

According to JsPerf, the fastest strategy for most cases is BinaryHeapStrategy. Use ArrayStrategy in edge cases, after performance-testing your specific data. Don't use BHeapStrategy: it's a lesson that a miracle in C can flop in JavaScript.

The default strategy is BinaryHeapStrategy.

Contributing

  1. Fork this repository
  2. Run npm install
  3. Write the behavior you expect in spec-coffee/
  4. Edit files in coffee/ until gulp test says you're done
  5. Run gulp to update priority-queue.js and priority-queue.min.js
  6. Submit a pull request

License

I, Adam Hooper, the sole author of this project, waive all my rights to it and release it under the Public Domain. Do with it what you will.

About

Priority queues in JavaScript

Resources

Stars

239 stars

Watchers

4 watching

Forks

Releases

Packages

Used by

Contributors

Languages