min_max 0.1.5 → 0.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6d739946dcb0939e2e05893222c927f4dea0eda65da5c0a00156402de3e49c29
4
- data.tar.gz: 61b4453a94b93bb2ccefd0787a751cef5d3ef380ac0ed591c73c3b0afddc394b
3
+ metadata.gz: 012d1e5c570db138f41f8ac8556dde89598878d15fc9176a7006bdd33e5deaf5
4
+ data.tar.gz: 70a8c3a7bb6afdaf23260ccd56c87acd1bd85e49d40d9231fbb316bf6beb4917
5
5
  SHA512:
6
- metadata.gz: 70dd4402ca82a60cffbc451ea134ca9fc34391f28311d23726d22055bfc01db9ba62002f0d54c76282888993613f2bf5618dcfa7a964da39c6995747401f3a3f
7
- data.tar.gz: 31ada4f8ed50624701e389c6a1d50b83b75a585ef703d2f18c6511498dc9373647fa1f88d959ccdcbf56336d38dc550e1ce96710644f65970f2341549f843d53
6
+ metadata.gz: bc3d399e2eae53e244c0bb3a5d502cf725e3b4d4b0d941e1c96d9f0ceeee367a4688ec191116c75d94bed5bbc4470c59626e53da13c85afb24fd44df1f6668bc
7
+ data.tar.gz: d98bef37722feef1534e85f709f95dcaf314dc5f9013b32e10d667c653b97c3274e8f210fa42d2fdeb6f1fdb63c9f4a62da2d1cfd44ae2178b1439d79c56e8a8
data/README.md CHANGED
@@ -100,3 +100,14 @@ heap.count(item)
100
100
  heap.contains?(item)
101
101
  ```
102
102
 
103
+ ## Performance
104
+ You can run the `benchmarks/benchmarks.rb` file inside this repository for comparison to other popular heap libraries:
105
+ * [rb_heap](https://github.com/florian/rb_heap)
106
+ * [algorithms](https://github.com/kanwei/algorithms)
107
+ * [ruby-heap](https://github.com/general-CbIC/ruby-heap)
108
+ * [pqueue](https://github.com/rubyworks/pqueue)
109
+
110
+ min-max should be the fastest to pop from a large heap, often by a significant margin, while also offering both min and max operations from a single heap.
111
+ Some options are faster at pushing individual items, but the difference is within the same order of magnitude.
112
+ Batch pushing to min-max also significantly increases insert speed.
113
+
@@ -73,13 +73,13 @@ pqueue = PQueue.new()
73
73
  mm_hp = MinMax[]
74
74
 
75
75
  Benchmark.bm do |x|
76
- x.report("push_algos_heap"){ data.each{|d| pqueue.push(d) } }
76
+ x.report("push_pqueue_heap"){ data.each{|d| pqueue.push(d) } }
77
77
  x.report("push_mm_heap"){ data.each{|d| mm_hp.push(d) } }
78
78
  x.report("push_mm_heap_batches"){ mm_hp = MinMax[]; data.each_slice(1000){|d| mm_hp.push(*d) } }
79
79
  end
80
80
 
81
81
  Benchmark.bm do |x|
82
- x.report("pop_algos_heap"){ 100_000.times{|d| minheap.pop } }
82
+ x.report("pop_pqueue_heap"){ 100_000.times{|d| pqueue.pop } }
83
83
  x.report("pop_mm_heap"){ 100_000.times{|d| mm_hp.pop_min } }
84
84
  x.report("pop_mm_heap_batches"){ 1000.times{|d| mm_hp.pop_min(100) } }
85
85
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class MinMax
4
- VERSION = "0.1.5"
4
+ VERSION = "0.1.6"
5
5
  end
data/lib/min_max.rb CHANGED
@@ -6,7 +6,7 @@ require_relative "min_max/min_max"
6
6
  class MinMax
7
7
  class Error < StandardError; end
8
8
 
9
- attr_reader :priority_blk, :storage, :mtx
9
+ attr_reader :priority_blk, :storage
10
10
 
11
11
  def self.[](*args, &blk)
12
12
  new(*args, &blk)
@@ -17,7 +17,6 @@ class MinMax
17
17
  s.instance_eval{
18
18
  @priority_blk = (blk || proc{|x| x.respond_to?(:priority) ? x.priority : x.to_i })
19
19
  @storage = Hash.new{|h,k| h[k] = [0, nil] }
20
- @mtx ||= Mutex.new
21
20
  }
22
21
  s.push(*args)
23
22
  }
@@ -51,19 +50,27 @@ class MinMax
51
50
  popped.kind_of?(Array) ? popped.map{|p| retrieve(p) } : retrieve(popped)
52
51
  end
53
52
 
54
- def peek_min(*args)
55
- peeked = _peek_min(*args)
56
- peeked.kind_of?(Array) ? peeked.map{|p| retrieve(p, false) } : retrieve(popped, false)
53
+ def peek_min
54
+ retrieve(_peek_min, false)
57
55
  end
58
56
 
59
- def peek_max(*args)
60
- peeked = _peek_max(*args)
61
- peeked.kind_of?(Array) ? peeked.map{|p| retrieve(p, false) } : retrieve(popped, false)
57
+ def peek_max
58
+ retrieve(_peek_max, false)
59
+ end
60
+
61
+ def first
62
+ peek_min
63
+ end
64
+
65
+ def last
66
+ peek_max
62
67
  end
63
68
 
64
69
  def each(*args, &blk)
65
70
  if block_given?
66
- mtx.synchronize { _each(*args).map{|p| blk[retrieve(p, false)] } }
71
+ _each(*args) do |p|
72
+ blk[retrieve(p, false)]
73
+ end
67
74
  else
68
75
  to_enum(:each, *args)
69
76
  end
@@ -82,15 +89,15 @@ class MinMax
82
89
  end
83
90
 
84
91
  def to_a_asc
85
- mtx.synchronize { _to_a_asc.map{|p| retrieve(p, false) } }
92
+ _to_a_asc.map{|p| retrieve(p, false) }
86
93
  end
87
94
 
88
95
  def to_a_desc
89
- mtx.synchronize { _to_a_desc.map{|p| retrieve(p, false) } }
96
+ _to_a_desc.map{|p| retrieve(p, false) }
90
97
  end
91
98
 
92
99
  def inspect
93
- "MinMax[#{_each.first(10).map{|v| retrieve(v, false).to_s }.join(", ")}#{size > 10 ? ", ..." : ""}]"
100
+ "MinMax[#{each.first(10).map(&:to_s).join(", ")}#{size > 10 ? ", ..." : ""}]"
94
101
  end
95
102
 
96
103
  private
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: min_max
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 0.1.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Wouter Coppieters
@@ -94,7 +94,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
94
94
  - !ruby/object:Gem::Version
95
95
  version: 3.3.11
96
96
  requirements: []
97
- rubygems_version: 3.4.19
97
+ rubygems_version: 3.5.6
98
98
  signing_key:
99
99
  specification_version: 4
100
100
  summary: A min max heap extension for Ruby