{"id":13411609,"url":"https://github.com/mhib/pairing_heap","last_synced_at":"2025-03-14T17:31:00.019Z","repository":{"id":56887318,"uuid":"339477363","full_name":"mhib/pairing_heap","owner":"mhib","description":"Performant priority queue in pure Ruby with support for changing priority using pairing heap data structure","archived":false,"fork":false,"pushed_at":"2024-02-11T15:05:34.000Z","size":83,"stargazers_count":17,"open_issues_count":0,"forks_count":0,"subscribers_count":4,"default_branch":"master","last_synced_at":"2024-09-16T10:40:41.495Z","etag":null,"topics":["dijkstra-algorithm","pairing-heap","prim-algorithm","priority","priority-queue"],"latest_commit_sha":null,"homepage":"","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mhib.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-02-16T17:31:55.000Z","updated_at":"2023-12-18T09:56:52.000Z","dependencies_parsed_at":"2024-01-27T15:28:02.267Z","dependency_job_id":"a22c4c84-2009-4b6e-b921-b2b40f3e55ac","html_url":"https://github.com/mhib/pairing_heap","commit_stats":{"total_commits":49,"total_committers":1,"mean_commits":49.0,"dds":0.0,"last_synced_commit":"375465c34822749e291d049fd5881ef54a588bb9"},"previous_names":[],"tags_count":8,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mhib%2Fpairing_heap","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mhib%2Fpairing_heap/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mhib%2Fpairing_heap/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mhib%2Fpairing_heap/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mhib","download_url":"https://codeload.github.com/mhib/pairing_heap/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243618648,"owners_count":20320270,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dijkstra-algorithm","pairing-heap","prim-algorithm","priority","priority-queue"],"created_at":"2024-07-30T20:01:14.962Z","updated_at":"2025-03-14T17:30:59.673Z","avatar_url":"https://github.com/mhib.png","language":"Ruby","funding_links":[],"categories":["Ruby"],"sub_categories":[],"readme":"# PairingHeap\n[![Ruby Style Guide](https://img.shields.io/badge/code_style-standard-brightgreen.svg)](https://github.com/testdouble/standard)\n\nPairingHeap is a pure Ruby priority queue implementation using a pairing heap as the underlying data structure. While a pairing heap is asymptotically less efficient than the Fibonacci heap, it is usually faster in practice. This makes it a popular choice for Prim's MST or Dijkstra's algorithm implementations.\n\nPairingHeap is currently being used as the priority queue data structure in [RGL](https://github.com/monora/rgl/).\n\nAlso implementation without priority change support is provided(`SimplePairingHeap`), while the asymptotical complexity of the methods stay the same, bookkeeping of elements is not needed making, the constant smaller.\n\n## Installation\n\nAdd this line to your application's Gemfile:\n\n```ruby\ngem 'pairing_heap'\n```\n\nAnd then execute:\n\n    $ bundle install\n\nOr install it yourself as:\n\n    $ gem install pairing_heap\n\n\n## Documentation\nhttps://rubydoc.info/gems/pairing_heap\n\n## Usage\n```ruby\nrequire 'pairing_heap'\n\n# Simple PairingHeap\nsimple_heap = PairingHeap::SimplePairingHeap.new\nsimple_heap.push(:a, 1)\nsimple_heap.push(:b, 2)\nsimple_heap.push(:c, 3)\nsimple_heap.peek # =\u003e :a\nsimple_heap.peek_priority # =\u003e 1\nsimple_heap.pop_with_priority # =\u003e [:a, 1]\nsimple_heap.pop # =\u003e :b\n\n# Min priority queue\nbest_defenses = PairingHeap::MinPriorityQueue.new\nbest_defenses.push('Chelsea', 24)\nbest_defenses.push('City', 30)\nbest_defenses.push('Tottenham', 25)\nbest_defenses.any? # =\u003e true\nbest_defenses.size # =\u003e 3\nbest_defenses.decrease_key('City', 15)\nbest_defenses.min # =\u003e 'City'\nbest_defenses.pop # =\u003e 'City'\nbest_defenses.extract_min # =\u003e 'Chelsea'\nbest_defenses.extract_min # =\u003e 'Tottenham'\nbest_defenses.any? # =\u003e false\n\n# Max priority queue\nbest_teams = PairingHeap::MaxPriorityQueue.new\nbest_teams.push('City', 56)\nbest_teams.push('United', 46)\nbest_teams.push('Leicester', 46)\nbest_teams.increase_key('Leicester', 47)\nbest_teams.max # =\u003e 'City'\nbest_teams.pop # =\u003e 'City'\nbest_teams.extract_max # =\u003e 'Leicester'\n\n# Custom comparator(it defaults to :\u003c=.to_proc)\ncompare_by_length = PairingHeap::PairingHeap.new { |l, r| l.length \u003c= r.length }\ncompare_by_length.push(:a, '11')\ncompare_by_length.push(:b, '1')\ncompare_by_length.push(:c, '11')\ncompare_by_length.change_priority(:c, '')\ncompare_by_length.peek # =\u003e :c\ncompare_by_length.pop # =\u003e :c\ncompare_by_length.pop # =\u003e :b\ncompare_by_length.pop # =\u003e :a\n\n# SafeChangePriortyQueue\nqueue = PairingHeap::SafeChangePriorityQueue.new\nqueue.push(:a, 1)\nqueue.push(:b, 2)\nqueue.change_priority(:a, 3) # This works and does not throw an exception\nqueue.peek # =\u003e :b\n```\nSee also [test/performance_dijkstra.rb](./test/performance_dijkstra.rb) for a Dijkstra algorithm implementation.\n### Changes from lazy_priority_queue\nThis API is a drop-in replacement of [lazy_priority_queue](https://github.com/matiasbattocchia/lazy_priority_queue) with the following differences:\n\n* Custom comparator provided to constructur, compares weights, not internal nodes\n* `change_priority` returns `self` instead of the first argument\n* `enqueue` returns `self` instead of the first argument\n* Queue classes are in the `PairingHeap` namespace, so `require 'pairing_heap` does not load `MinPriorityQueue` to the global scope\n* `top_condition` constructor argument is removed\n\n## Time Complexity\n| Operation         | Time complexity | Amortized time complexity |\n| ---------------   | --------------- | ------------------------- |\n| enqueue           | O(1)            | O(1)                      |\n| peek              | O(1)            | O(1)                      |\n| dequeue           | O(n)            | O(log n)                  |\n| * change_priority | O(1)            | o(log n)                  |\n| * delete          | O(n)            | O(log n)                  |\n| ^ merge           | O(1)            | O(1)                      |\n\n`*` Not available in `SimplePairingHeap`\n\n`^` Only available in `SimplePairingHeap`\n\n## Benchmarks\nI picked the three fastest pure Ruby priority queue implementations I was aware of for the comparison:\n\n* [lazy_priority_queue](https://github.com/matiasbattocchia/lazy_priority_queue) that uses a lazy binomial heap. This is probably the most popular option. It was used in [RGL](https://github.com/monora/rgl/) until PairingHeap replaced it.\n* Pure Ruby implementation of Fibonacci Heap from [priority-queue](https://github.com/supertinou/priority-queue) ([link to source](https://github.com/supertinou/priority-queue/blob/master/lib/priority_queue/ruby_priority_queue.rb))\n* [rb_heap](https://github.com/florian/rb_heap) that uses a binary heap. Note however that this implementation does not support change_priority operation.\n\nAll tests except for the third one were executed by [benchmark-ips](https://github.com/evanphx/benchmark-ips) with parameters `time = 60` and `warmup = 15`, on an `Intel(R) Core(TM) i7-10700K CPU @ 3.80GHz`.\n### Stress test without changing priority test(N = 1000) [source code](./test/performance.rb)\nOriginal performance test from [lazy_priority_queue](https://github.com/matiasbattocchia/lazy_priority_queue)\n\u003e A stress test of 1,000,000 operations: starting with 1,000 pushes/0 pops, following 999 pushes/1 pop, and so on till 0 pushes/1000 pops.\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003cth colspan=\"4\"\u003eruby 3.3.0 (2023-12-25 revision 5124f9ac75) [x86_64-darwin23]\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003cth\u003eLibrary\u003c/th\u003e\n    \u003cth\u003eIterations\u003c/th\u003e\n    \u003cth\u003eSeconds\u003c/th\u003e\n    \u003cth\u003eIterations per second\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003epairing_heap (SimplePairingHeap)\u003c/td\u003e\n    \u003ctd\u003e26\u003c/td\u003e\n    \u003ctd\u003e62.249427\u003c/td\u003e\n    \u003ctd\u003e0.419\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003epairing_heap (PairingHeap)\u003c/td\u003e\n    \u003ctd\u003e17\u003c/td\u003e\n    \u003ctd\u003e61.624806\u003c/td\u003e\n    \u003ctd\u003e0.276(1.52x slower)\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003erb_heap\u003c/td\u003e\n    \u003ctd\u003e16\u003c/td\u003e\n    \u003ctd\u003e63.656502\u003c/td\u003e\n    \u003ctd\u003e0.251(1.67x slower)\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003elazy_priority_queue\u003c/td\u003e\n    \u003ctd\u003e7\u003c/td\u003e\n    \u003ctd\u003e63.339192\u003c/td\u003e\n    \u003ctd\u003e0.111(3.79x slower)\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eFibonacci\u003c/td\u003e\n    \u003ctd\u003e5\u003c/td\u003e\n    \u003ctd\u003e69.010737\u003c/td\u003e\n    \u003ctd\u003e0.073(5.77x slower)\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003cth colspan=\"4\"\u003eruby 3.3.0 (2023-12-25 revision 5124f9ac75) +YJIT [x86_64-darwin23]\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003cth\u003eLibrary\u003c/th\u003e\n    \u003cth\u003eIterations\u003c/th\u003e\n    \u003cth\u003eSeconds\u003c/th\u003e\n    \u003cth\u003eIterations per second\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003epairing_heap (SimplePairingHeap)\u003c/td\u003e\n    \u003ctd\u003e39\u003c/td\u003e\n    \u003ctd\u003e60.725689\u003c/td\u003e\n    \u003ctd\u003e0.642\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003erb_heap\u003c/td\u003e\n    \u003ctd\u003e31\u003c/td\u003e\n    \u003ctd\u003e60.370348\u003c/td\u003e\n    \u003ctd\u003e0.514(1.25x slower)\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003epairing_heap (PairingHeap)\u003c/td\u003e\n    \u003ctd\u003e25\u003c/td\u003e\n    \u003ctd\u003e62.269577\u003c/td\u003e\n    \u003ctd\u003e0.402(1.6x slower)\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003elazy_priority_queue\u003c/td\u003e\n    \u003ctd\u003e9\u003c/td\u003e\n    \u003ctd\u003e62.144710\u003c/td\u003e\n    \u003ctd\u003e0.145(4.43x slower)\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eFibonacci\u003c/td\u003e\n    \u003ctd\u003e8\u003c/td\u003e\n    \u003ctd\u003e65.064385\u003c/td\u003e\n    \u003ctd\u003e0.123(5.22x slower)\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003cth colspan=\"4\"\u003ejruby 9.4.5.0 (3.1.4) 2023-11-02 1abae2700f OpenJDK 64-Bit Server VM 21+35-2513 on 21+35-2513 +indy +jit [x86_64-darwin]\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003cth\u003eLibrary\u003c/th\u003e\n    \u003cth\u003eIterations\u003c/th\u003e\n    \u003cth\u003eSeconds\u003c/th\u003e\n    \u003cth\u003eIterations per second\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003epairing_heap (SimplePairingHeap)\u003c/td\u003e\n    \u003ctd\u003e43\u003c/td\u003e\n    \u003ctd\u003e60.734661\u003c/td\u003e\n    \u003ctd\u003e0.709\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003erb_heap\u003c/td\u003e\n    \u003ctd\u003e34\u003c/td\u003e\n    \u003ctd\u003e61.677228\u003c/td\u003e\n    \u003ctd\u003e0.552(1.28x slower)\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003epairing_heap (PairingHeap)\u003c/td\u003e\n    \u003ctd\u003e28\u003c/td\u003e\n    \u003ctd\u003e61.284382\u003c/td\u003e\n    \u003ctd\u003e0.458(1.55x slower)\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eFibonacci\u003c/td\u003e\n    \u003ctd\u003e22\u003c/td\u003e\n    \u003ctd\u003e61.396897\u003c/td\u003e\n    \u003ctd\u003e0.359(1.97x slower)\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003elazy_priority_queue\u003c/td\u003e\n    \u003ctd\u003e20\u003c/td\u003e\n    \u003ctd\u003e61.841463\u003c/td\u003e\n    \u003ctd\u003e0.324(2.19x slower)\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003cth colspan=\"4\"\u003etruffleruby 23.1.2, like ruby 3.2.2, Oracle GraalVM JVM [x86_64-darwin]\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003cth\u003eLibrary\u003c/th\u003e\n    \u003cth\u003eIterations\u003c/th\u003e\n    \u003cth\u003eSeconds\u003c/th\u003e\n    \u003cth\u003eIterations per second\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003epairing_heap (SimplePairingHeap)\u003c/td\u003e\n    \u003ctd\u003e202\u003c/td\u003e\n    \u003ctd\u003e60.225639\u003c/td\u003e\n    \u003ctd\u003e3.388\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003erb_heap\u003c/td\u003e\n    \u003ctd\u003e140\u003c/td\u003e\n    \u003ctd\u003e60.190881\u003c/td\u003e\n    \u003ctd\u003e2.357(1.44x slower)\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003epairing_heap (PairingHeap)\u003c/td\u003e\n    \u003ctd\u003e100\u003c/td\u003e\n    \u003ctd\u003e60.373610\u003c/td\u003e\n    \u003ctd\u003e1.692(2x slower)\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003elazy_priority_queue\u003c/td\u003e\n    \u003ctd\u003e31\u003c/td\u003e\n    \u003ctd\u003e61.179244\u003c/td\u003e\n    \u003ctd\u003e0.510(6.65x slower)\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eFibonacci\u003c/td\u003e\n    \u003ctd\u003e11\u003c/td\u003e\n    \u003ctd\u003e64.413419\u003c/td\u003e\n    \u003ctd\u003e0.171(19.81x slower)\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n### Stress test with changing priority(N = 1000) [source code](./test/performance_with_change_priority.rb)\nA stress test of 1,501,500 operations: starting with 1,000 pushes/1000 change_priorities/0 pops, following 999 pushes/999 change_priorities/1 pop, and so on till 0 pushes/0 change_priorities/1000 pops.\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003cth colspan=\"4\"\u003eruby 3.3.0 (2023-12-25 revision 5124f9ac75) [x86_64-darwin23]\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003cth\u003eLibrary\u003c/th\u003e\n    \u003cth\u003eIterations\u003c/th\u003e\n    \u003cth\u003eSeconds\u003c/th\u003e\n    \u003cth\u003eIterations per second\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003epairing_heap\u003c/td\u003e\n    \u003ctd\u003e15\u003c/td\u003e\n    \u003ctd\u003e60.817878\u003c/td\u003e\n    \u003ctd\u003e0.247\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003elazy_priority_queue\u003c/td\u003e\n    \u003ctd\u003e7\u003c/td\u003e\n    \u003ctd\u003e63.990376s\u003c/td\u003e\n    \u003ctd\u003e0.109(2.26x slower)\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eFibonacci\u003c/td\u003e\n    \u003ctd\u003e5\u003c/td\u003e\n    \u003ctd\u003e70.148980s\u003c/td\u003e\n    \u003ctd\u003e0.071(3.47x slower)\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003cth colspan=\"4\"\u003eruby 3.3.0 (2023-12-25 revision 5124f9ac75) +YJIT [x86_64-darwin23]\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003cth\u003eLibrary\u003c/th\u003e\n    \u003cth\u003eIterations\u003c/th\u003e\n    \u003cth\u003eSeconds\u003c/th\u003e\n    \u003cth\u003eIterations per second\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003epairing_heap\u003c/td\u003e\n    \u003ctd\u003e22\u003c/td\u003e\n    \u003ctd\u003e62.429264\u003c/td\u003e\n    \u003ctd\u003e0.353\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003elazy_priority_queue\u003c/td\u003e\n    \u003ctd\u003e9\u003c/td\u003e\n    \u003ctd\u003e63.464818\u003c/td\u003e\n    \u003ctd\u003e0.142(2.49x slower)\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eFibonacci\u003c/td\u003e\n    \u003ctd\u003e8\u003c/td\u003e\n    \u003ctd\u003e67.908812\u003c/td\u003e\n    \u003ctd\u003e0.118(2.99x slower)\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003cth colspan=\"4\"\u003ejruby 9.4.5.0 (3.1.4) 2023-11-02 1abae2700f OpenJDK 64-Bit Server VM 21+35-2513 on 21+35-2513 +indy +jit [x86_64-darwin]\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003cth\u003eLibrary\u003c/th\u003e\n    \u003cth\u003eIterations\u003c/th\u003e\n    \u003cth\u003eSeconds\u003c/th\u003e\n    \u003cth\u003eIterations per second\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003epairing_heap\u003c/td\u003e\n    \u003ctd\u003e27\u003c/td\u003e\n    \u003ctd\u003e61.709517\u003c/td\u003e\n    \u003ctd\u003e0.438\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eFibonacci\u003c/td\u003e\n    \u003ctd\u003e20\u003c/td\u003e\n    \u003ctd\u003e61.495636\u003c/td\u003e\n    \u003ctd\u003e0.326(1.34x slower)\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003elazy_priority_queue\u003c/td\u003e\n    \u003ctd\u003e19\u003c/td\u003e\n    \u003ctd\u003e63.401601\u003c/td\u003e\n    \u003ctd\u003e0.309(1.46x slower)\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003cth colspan=\"4\"\u003etruffleruby 23.1.2, like ruby 3.2.2, Oracle GraalVM JVM [x86_64-darwin]\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003cth\u003eLibrary\u003c/th\u003e\n    \u003cth\u003eIterations\u003c/th\u003e\n    \u003cth\u003eSeconds\u003c/th\u003e\n    \u003cth\u003eIterations per second\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003epairing_heap\u003c/td\u003e\n    \u003ctd\u003e93\u003c/td\u003e\n    \u003ctd\u003e60.125750\u003c/td\u003e\n    \u003ctd\u003e1.577\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003elazy_priority_queue\u003c/td\u003e\n    \u003ctd\u003e26\u003c/td\u003e\n    \u003ctd\u003e62.372660s\u003c/td\u003e\n    \u003ctd\u003e0.419(3.77x slower)\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eFibonacci\u003c/td\u003e\n    \u003ctd\u003e11\u003c/td\u003e\n    \u003ctd\u003e62.620172s\u003c/td\u003e\n    \u003ctd\u003e0.177(8.92x slower)\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n### Stress test with changing priority or push/pop(test ignored in summary) [source code](./test/performance_pop_versus_change_priority.rb)\nStart with 500 pushes, then:\n  * If queue supports changing priority 500 change_priority calls, then 500 pops\n  * If does not support changing priority 500 push calls, then 1000 pops\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003cth colspan=\"4\"\u003eruby 3.3.0 (2023-12-25 revision 5124f9ac75) [x86_64-darwin23]\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003cth\u003eLibrary\u003c/th\u003e\n    \u003cth\u003eIterations per second\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003epairing_heap (PairingHeap)\u003c/td\u003e\n    \u003ctd\u003e748.9\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003elazy_priority_queue\u003c/td\u003e\n    \u003ctd\u003e388.6(1.93x slower)\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003epairing_heap (SimplePairingHeap)\u003c/td\u003e\n    \u003ctd\u003e336.2(2.23x slower)\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eFibonacci\u003c/td\u003e\n    \u003ctd\u003e225.9(3.31x slower)\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003erb_heap\u003c/td\u003e\n    \u003ctd\u003e215.2(3.48x slower)\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003cth colspan=\"4\"\u003eruby 3.3.0 (2023-12-25 revision 5124f9ac75) +YJIT [x86_64-darwin23]\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003cth\u003eLibrary\u003c/th\u003e\n    \u003cth\u003eIterations per second\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003epairing_heap\u003c/td\u003e\n    \u003ctd\u003e1276\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003epairing_heap(SimplePairingHeap)\u003c/td\u003e\n    \u003ctd\u003e625.6(2.04x slower)\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003elazy_priority_queue\u003c/td\u003e\n    \u003ctd\u003e533.36(2.39x slower)\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eFibonacci\u003c/td\u003e\n    \u003ctd\u003e495.519(2.57x slower)\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003erb_heap\u003c/td\u003e\n    \u003ctd\u003e453.323(2.81x slower)\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003cth colspan=\"4\"\u003ejruby 9.4.5.0 (3.1.4) 2023-11-02 1abae2700f OpenJDK 64-Bit Server VM 21+35-2513 on 21+35-2513 +indy +jit [x86_64-darwin]\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003cth\u003eLibrary\u003c/th\u003e\n    \u003cth\u003eIterations per second\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003epairing_heap(PairingHeap)\u003c/td\u003e\n    \u003ctd\u003e1377\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eFibonacci\u003c/td\u003e\n    \u003ctd\u003e1088(1.27x slower)\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003elazy_priority_queue\u003c/td\u003e\n    \u003ctd\u003e953.935(1.44x slower)\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003epairing_heap(SimplePairingHeap)\u003c/td\u003e\n    \u003ctd\u003e621.35(2.22x slower)\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003erb_heap\u003c/td\u003e\n    \u003ctd\u003e595.11(2.31x slower)\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003cth colspan=\"4\"\u003etruffleruby 23.1.2, like ruby 3.2.2, Oracle GraalVM JVM [x86_64-darwin]\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003cth\u003eLibrary\u003c/th\u003e\n    \u003cth\u003eIterations per second\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003epairing_heap(PairingHeap)\u003c/td\u003e\n    \u003ctd\u003e12712\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003epairing_heap(SimplePairingHeap)\u003c/td\u003e\n    \u003ctd\u003e9447(1.35x slower)\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003erb_heap\u003c/td\u003e\n    \u003ctd\u003e4009(3.17x slower)\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eFibonacci\u003c/td\u003e\n    \u003ctd\u003e2793(4.55x slower)\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003elazy_priority_queue\u003c/td\u003e\n    \u003ctd\u003e1188(10.7x slower)\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n### Simple Dijkstra's algorithm implementation [source code](./test/performance_dijkstra.rb)\nHeaps that support change_priority operation use it. Heaps that do not support it use dijkstra implementation that do not rely on change_priority instead and do additional pops and pushes instead(see Dijkstra-NoDec from [Priority Queues and Dijkstra’s Algorithm](https://www3.cs.stonybrook.edu/~rezaul/papers/TR-07-54.pdf)).\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003cth colspan=\"4\"\u003eruby 3.3.0 (2023-12-25 revision 5124f9ac75) [x86_64-darwin23]\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003cth\u003eLibrary\u003c/th\u003e\n    \u003cth\u003eIterations\u003c/th\u003e\n    \u003cth\u003eSeconds\u003c/th\u003e\n    \u003cth\u003eIterations per second\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003epairing_heap (SimplePairingHeap)\u003c/td\u003e\n    \u003ctd\u003e41\u003c/td\u003e\n    \u003ctd\u003e60.100316\u003c/td\u003e\n    \u003ctd\u003e0.682\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003epairing_heap (PairingHeap)\u003c/td\u003e\n    \u003ctd\u003e38\u003c/td\u003e\n    \u003ctd\u003e61.003607\u003c/td\u003e\n    \u003ctd\u003e0.623(1.09x slower)\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003erb_heap\u003c/td\u003e\n    \u003ctd\u003e30\u003c/td\u003e\n    \u003ctd\u003e61.486216\u003c/td\u003e\n    \u003ctd\u003e0.488(1.40x slower)\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003elazy_priority_queue\u003c/td\u003e\n    \u003ctd\u003e23\u003c/td\u003e\n    \u003ctd\u003e60.251764\u003c/td\u003e\n    \u003ctd\u003e0.382(1.79x slower)\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eFibonacci\u003c/td\u003e\n    \u003ctd\u003e13\u003c/td\u003e\n    \u003ctd\u003e61.158622\u003c/td\u003e\n    \u003ctd\u003e0.213(3.21x slower)\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003cth colspan=\"4\"\u003eruby 3.3.0 (2023-12-25 revision 5124f9ac75) +YJIT [x86_64-darwin23]\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003cth\u003eLibrary\u003c/th\u003e\n    \u003cth\u003eIterations\u003c/th\u003e\n    \u003cth\u003eSeconds\u003c/th\u003e\n    \u003cth\u003eIterations per second\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003epairing_heap (SimplePairingHeap)\u003c/td\u003e\n    \u003ctd\u003e65\u003c/td\u003e\n    \u003ctd\u003e60.805882\u003c/td\u003e\n    \u003ctd\u003e1.070\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003epairing_heap (PairingHeap)\u003c/td\u003e\n    \u003ctd\u003e60\u003c/td\u003e\n    \u003ctd\u003e60.790842\u003c/td\u003e\n    \u003ctd\u003e0.987(1.08x slower)\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003erb_heap\u003c/td\u003e\n    \u003ctd\u003e54\u003c/td\u003e\n    \u003ctd\u003e60.917679\u003c/td\u003e\n    \u003ctd\u003e0.887(1.21x slower)\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003elazy_priority_queue\u003c/td\u003e\n    \u003ctd\u003e30\u003c/td\u003e\n    \u003ctd\u003e60.712786\u003c/td\u003e\n    \u003ctd\u003e0.495(2.16x slower)\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eFibonacci\u003c/td\u003e\n    \u003ctd\u003e24\u003c/td\u003e\n    \u003ctd\u003e61.900715\u003c/td\u003e\n    \u003ctd\u003e0.388(2.76x slower)\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003cth colspan=\"4\"\u003ejruby 9.4.5.0 (3.1.4) 2023-11-02 1abae2700f OpenJDK 64-Bit Server VM 21+35-2513 on 21+35-2513 +indy +jit [x86_64-darwin]\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003cth\u003eLibrary\u003c/th\u003e\n    \u003cth\u003eIterations\u003c/th\u003e\n    \u003cth\u003eSeconds\u003c/th\u003e\n    \u003cth\u003eIterations per second\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003erb_heap\u003c/td\u003e\n    \u003ctd\u003e70\u003c/td\u003e\n    \u003ctd\u003e60.077928\u003c/td\u003e\n    \u003ctd\u003e1.168\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003epairing_heap (SimplePairingHeap)\u003c/td\u003e\n    \u003ctd\u003e66\u003c/td\u003e\n    \u003ctd\u003e60.420935\u003c/td\u003e\n    \u003ctd\u003e1.094(1.07x slower)\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003epairing_heap (PairingHeap)\u003c/td\u003e\n    \u003ctd\u003e64\u003c/td\u003e\n    \u003ctd\u003e60.114467\u003c/td\u003e\n    \u003ctd\u003e1.066(1.1x slower)\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eFibonacci\u003c/td\u003e\n    \u003ctd\u003e54\u003c/td\u003e\n    \u003ctd\u003e60.426971\u003c/td\u003e\n    \u003ctd\u003e0.898(1.30x slower)\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003elazy_priority_queue\u003c/td\u003e\n    \u003ctd\u003e49\u003c/td\u003e\n    \u003ctd\u003e60.636963\u003c/td\u003e\n    \u003ctd\u003e0.809(1.44x slower)\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003cth colspan=\"4\"\u003etruffleruby 23.1.2, like ruby 3.2.2, Oracle GraalVM JVM [x86_64-darwin]\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003cth\u003eLibrary\u003c/th\u003e\n    \u003cth\u003eIterations\u003c/th\u003e\n    \u003cth\u003eSeconds\u003c/th\u003e\n    \u003cth\u003eIterations per second\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003epairing_heap (SimplePairingHeap)\u003c/td\u003e\n    \u003ctd\u003e288\u003c/td\u003e\n    \u003ctd\u003e60.102278\u003c/td\u003e\n    \u003ctd\u003e4.936\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003epairing_heap (PairingHeap)\u003c/td\u003e\n    \u003ctd\u003e232\u003c/td\u003e\n    \u003ctd\u003e60.159057\u003c/td\u003e\n    \u003ctd\u003e3.936(1.25x slower)\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003erb_heap\u003c/td\u003e\n    \u003ctd\u003e227\u003c/td\u003e\n    \u003ctd\u003e60.082482\u003c/td\u003e\n    \u003ctd\u003e3.881(1.27x slower)\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eFibonacci\u003c/td\u003e\n    \u003ctd\u003e101\u003c/td\u003e\n    \u003ctd\u003e60.076691\u003c/td\u003e\n    \u003ctd\u003e1.721(2.87x slower)\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003elazy_priority_queue\u003c/td\u003e\n    \u003ctd\u003e66\u003c/td\u003e\n    \u003ctd\u003e60.771569\u003c/td\u003e\n    \u003ctd\u003e1.1(4.49x slower)\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n### Summary\n#### Change priority required\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003cth colspan=\"4\"\u003eruby 3.3.0 (2023-12-25 revision 5124f9ac75) [x86_64-darwin23]\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003cth\u003eLibrary\u003c/th\u003e\n    \u003cth\u003eSlower geometric mean\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003epairing_heap\u003c/td\u003e\n    \u003ctd\u003e1\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003elazy_priority_queue\u003c/td\u003e\n    \u003ctd\u003e2.1x slower\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eFibonacci\u003c/td\u003e\n    \u003ctd\u003e3.38x slower\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003cth colspan=\"4\"\u003eruby 3.3.0 (2023-12-25 revision 5124f9ac75) +YJIT [x86_64-darwin23]\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003cth\u003eLibrary\u003c/th\u003e\n    \u003cth\u003eSlower geometric mean\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003epairing_heap\u003c/td\u003e\n    \u003ctd\u003e1\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003elazy_priority_queue\u003c/td\u003e\n    \u003ctd\u003e2.55x slower\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eFibonacci\u003c/td\u003e\n    \u003ctd\u003e2.74x slower\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003cth colspan=\"4\"\u003ejruby 9.4.5.0 (3.1.4) 2023-11-02 1abae2700f OpenJDK 64-Bit Server VM 21+35-2513 on 21+35-2513 +indy +jit [x86_64-darwin]\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003cth\u003eLibrary\u003c/th\u003e\n    \u003cth\u003eSlower geometric mean\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003epairing_heap\u003c/td\u003e\n    \u003ctd\u003e1\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eFibonacci\u003c/td\u003e\n    \u003ctd\u003e1.267x slower\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003elazy_priority_queue\u003c/td\u003e\n    \u003ctd\u003e1.396x slower\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003cth colspan=\"4\"\u003etruffleruby 23.1.2, like ruby 3.2.2, Oracle GraalVM JVM [x86_64-darwin]\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003cth\u003eLibrary\u003c/th\u003e\n    \u003cth\u003eSlower geometric mean\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003epairing_heap\u003c/td\u003e\n    \u003ctd\u003e1\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003elazy_priority_queue\u003c/td\u003e\n    \u003ctd\u003e3.54x slower\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eFibonacci\u003c/td\u003e\n    \u003ctd\u003e5.86x slower\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n#### Change priority not required\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003cth colspan=\"4\"\u003eruby 3.3.0 (2023-12-25 revision 5124f9ac75) [x86_64-darwin23]\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003cth\u003eLibrary\u003c/th\u003e\n    \u003cth\u003eSlower geometric mean\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003epairing_heap (SimplePairingHeap)\u003c/td\u003e\n    \u003ctd\u003e1\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003epairing_heap (PairingHeap)\u003c/td\u003e\n    \u003ctd\u003e1.29x slower\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003erb_heap\u003c/td\u003e\n    \u003ctd\u003e1.53x slower\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003elazy_priority_queue\u003c/td\u003e\n    \u003ctd\u003e2.6x slower\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eFibonacci\u003c/td\u003e\n    \u003ctd\u003e4.29x slower\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003cth colspan=\"4\"\u003eruby 3.3.0 (2023-12-25 revision 5124f9ac75) +YJIT [x86_64-darwin23]\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003cth\u003eLibrary\u003c/th\u003e\n    \u003cth\u003eSlower geometric mean\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003epairing_heap (SimplePairingHeap)\u003c/td\u003e\n    \u003ctd\u003e1\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003erb_heap\u003c/td\u003e\n    \u003ctd\u003e1.227x slower\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003epairing_heap (PairingHeap)\u003c/td\u003e\n    \u003ctd\u003e1.316x slower\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003elazy_priority_queue\u003c/td\u003e\n    \u003ctd\u003e3.094x slower\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eFibonacci\u003c/td\u003e\n    \u003ctd\u003e3.79x slower\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003cth colspan=\"4\"\u003ejruby 9.4.5.0 (3.1.4) 2023-11-02 1abae2700f OpenJDK 64-Bit Server VM 21+35-2513 on 21+35-2513 +indy +jit [x86_64-darwin]\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003cth\u003eLibrary\u003c/th\u003e\n    \u003cth\u003eSlower geometric mean\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003epairing_heap (SimplePairingHeap)\u003c/td\u003e\n    \u003ctd\u003e1.033x slower\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003erb_heap\u003c/td\u003e\n    \u003ctd\u003e1.133x slower\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003epairing_heap (PairingHeap)\u003c/td\u003e\n    \u003ctd\u003e1.302x slower\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eFibonacci\u003c/td\u003e\n    \u003ctd\u003e1.602x slower\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003elazy_priority_queue\u003c/td\u003e\n    \u003ctd\u003e1.777x slower\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003cth colspan=\"4\"\u003etruffleruby 23.1.2, like ruby 3.2.2, Oracle GraalVM JVM [x86_64-darwin]\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003cth\u003eLibrary\u003c/th\u003e\n    \u003cth\u003eSlower geometric mean\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003epairing_heap (SimplePairingHeap)\u003c/td\u003e\n    \u003ctd\u003e1\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003erb_heap\u003c/td\u003e\n    \u003ctd\u003e1.35x slower\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003epairing_heap (PairingHeap)\u003c/td\u003e\n    \u003ctd\u003e1.58x slower\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003elazy_priority_queue\u003c/td\u003e\n    \u003ctd\u003e5.46x slower\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eFibonacci\u003c/td\u003e\n    \u003ctd\u003e7.54x slower\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n## Development\n\nAfter checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.\n\nTo install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and the created tag, and push the `.gem` file to [rubygems.org](https://rubygems.org).\n\n## Contributing\n\nBug reports and pull requests are welcome on GitHub at https://github.com/mhib/pairing_heap.\n\n## License\n\nThe gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmhib%2Fpairing_heap","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmhib%2Fpairing_heap","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmhib%2Fpairing_heap/lists"}