data_structures_rmolinari 0.5.4 → 0.5.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b194edc412e6bce073e73f874c4a392dd821f333e4ba9b07908af397819cdffa
4
- data.tar.gz: 5dabb2d689cb0b0ebacf2b804e6c27ece1e3e7f7db604f5722d1657915bf0bda
3
+ metadata.gz: 1fbafd7af3c7bd2d1eee3303fd8b8a759b0d67fc29bfdca3b7f67b626e9fe175
4
+ data.tar.gz: 5a870554e38c61b1e1af64d2205bc002cf7cb731e5412606543ffdce014342b4
5
5
  SHA512:
6
- metadata.gz: cf36912f4242d7a91e8227464993ac634441bdcff30d7b6ec5a10149cfdc0a14a132fa5c319f2edafdc9d9ab6b11ee0af2354fdd45f2638d0099ccdb84eff436
7
- data.tar.gz: a1ce15decbc869b9f26902d391f27967778032f54d2543b914d93bbe15ab1ceb7aae5c576cc93f99c80aa8f62d8f23c747591a6beb520d7c756facb125a5a72d
6
+ metadata.gz: fcdaae719324c5b8b7914eb6a982563d58ee10170d52280c58429e8d9b5a7e5224079350ab15ad618b5cacbcdf340c17feec2b34616e17847d5b0e16a7569d50
7
+ data.tar.gz: 446e2190ff33f65c9cb6cedd6043af506aa6f395f279e54520b2ba1c0c04fbd8504615f1a94e09232edefee9b0cb0d55363aa20b6504467d70f6766b19698464
data/CHANGELOG.md CHANGED
@@ -2,6 +2,15 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [0.5.6] 2024-01-04
6
+
7
+ - Heap
8
+ - add update_by_delta method
9
+
10
+ ## [0.5.5] 2023-12-19
11
+
12
+ Support Ruby v3.2.
13
+
5
14
  ## [0.5.4] 2023-12-12
6
15
 
7
16
  (Unfortunately this note was added long after the changes were made and my memory of the changes is poor.)
data/README.md CHANGED
@@ -56,14 +56,15 @@ operations:
56
56
  - `top`, returning the element with smallest priority
57
57
  - `pop`, return the element with smallest priority and remove it from the structure
58
58
  - `update(item, priority)`, update the priority of the given item, which must already be in the heap
59
+ - `update_by_delta(item, delta)`, update the priorityof the given item by adding delta to the priority; the item must already be in the heap
59
60
 
60
61
  `top` is O(1). The others are O(log n) where n is the number of items in the heap.
61
62
 
62
63
  By default we have a min-heap: the top element is the one with smallest priority. A configuration parameter at construction can make
63
64
  it a max-heap.
64
65
 
65
- Another configuration parameter allows the creation of a "non-addressable" heap. This makes it impossible to call `update`, but
66
- allows the insertion of duplicate items (which is sometimes useful) and slightly faster operation overall.
66
+ Another configuration parameter allows the creation of a "non-addressable" heap. This makes it impossible to call `update` or
67
+ `update_by_delta`, but allows the insertion of duplicate items (which is sometimes useful) and slightly faster operation overall.
67
68
 
68
69
  See https://en.wikipedia.org/wiki/Binary_heap and the paper by Edelkamp, Elmasry, and Katajainen [[EEK2017]](#references).
69
70
 
@@ -137,6 +137,21 @@ class DataStructuresRMolinari::Heap
137
137
  check_heap_property if @debug
138
138
  end
139
139
 
140
+ # Update the priority of the given element by changing the priority by the given amount.
141
+ #
142
+ # @param element the item whose priority we are updating. It is an error to update the priority of an element not already in the
143
+ # heap
144
+ # @param the amount by which to change the priority. The existing priority must respond sensibly to += with this value
145
+ def update_by_delta(element, delta)
146
+ raise LogicError, 'Cannot update priorities in a non-addressable heap' unless @addressable
147
+ raise DataError, "Cannot update priority for value #{element} not already in the heap" unless contains?(element)
148
+
149
+ idx = @index_of[element]
150
+ old = @data[idx].priority
151
+
152
+ update(element, old + delta)
153
+ end
154
+
140
155
  # Filter the value at index up to its correct location. Algorithm from Edelkamp et. al.
141
156
  private def sift_up(idx)
142
157
  return if idx == root
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: data_structures_rmolinari
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.4
4
+ version: 0.5.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rory Molinari
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-12-12 00:00:00.000000000 Z
11
+ date: 2024-01-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: must_be
@@ -113,7 +113,7 @@ require_paths:
113
113
  - lib
114
114
  required_ruby_version: !ruby/object:Gem::Requirement
115
115
  requirements:
116
- - - "~>"
116
+ - - ">="
117
117
  - !ruby/object:Gem::Version
118
118
  version: 3.1.3
119
119
  required_rubygems_version: !ruby/object:Gem::Requirement