rbtree-ruby 0.1.4 → 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: 3d5898bb2e8aaea4617747c5f4024ab023a1afeabba3abafeaf2b86bb6afa986
4
- data.tar.gz: c6651a33b8e66ee3528dc8ab3abf2359f3e2647fc27491e8bd5083ef08844d77
3
+ metadata.gz: bf6eb0a695ef93f89f9af8ceea5928c549785ea0110992f061b00ecdc76e3d64
4
+ data.tar.gz: 458cbee1ded3e8e0686ec495392bffbaf881ac0bc798d68790240abb0a3011b7
5
5
  SHA512:
6
- metadata.gz: e7d1619486160150a91842631953842f3bddcb90213d415ec9aaca846184220ada9494cdae1eadf05ae5d523c5646b1ce19590d0b60c9df8ddd0c0f01a40ede7
7
- data.tar.gz: ed2f20ab619e64c6daf16f4484fc52b0bc724e3b9b0f8b08c3a61921cbde5077f99beace823afbf3133c74ab3dfd838b48c5b09392bcaaee4fc0a930eb507589
6
+ metadata.gz: 48ee9755aad89802b6cb1b6af19a7919151e14531f2c6e2f2dfbb07062c5e1060490e8d5244d0fd960f44d4eb8b00e84ee9f24e5b3be6319c808f212dde848c2
7
+ data.tar.gz: aeadf12c689069742c8cc05c569a84bbb6a87b3736f2f7e6351b68fb2aae5dbc24eca80e65a97455b50dae82b47c3ade7b8b70a171d86f879a179865eab9182d
data/CHANGELOG.md CHANGED
@@ -5,6 +5,21 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.1.6] - 2026-01-13
9
+
10
+ ### Changed
11
+ - **Performance**: Standardized on Boolean colors (`true`/`false`) instead of Symbols (`:red`/`:black`) for faster checks.
12
+ - **Optimization**: `insert` operations now check the internal hash index first, allowing O(1) updates for existing keys (RBTree) and O(1) appends (MultiRBTree).
13
+
14
+ ## [0.1.5] - 2026-01-13
15
+
16
+ ### Changed
17
+ - **Iterative Traversal**: Replaced recursive tree traversal with iterative approach
18
+ - `each`, `reverse_each`, and other traversal methods now use an explicit stack
19
+ - Prevents `SystemStackError` (stack overflow) on extremely deep trees
20
+ - Slightly improves iteration performance by removing recursion overhead
21
+ - Applies to both `RBTree` and `MultiRBTree`
22
+
8
23
  ## [0.1.4] - 2026-01-13
9
24
 
10
25
  ### Changed
@@ -68,6 +83,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
68
83
  - ASCII diagrams for tree rotation operations
69
84
  - MIT License (Copyright © 2026 Masahito Suzuki)
70
85
 
86
+ [0.1.6]: https://github.com/firelzrd/rbtree-ruby/releases/tag/v0.1.6
87
+ [0.1.5]: https://github.com/firelzrd/rbtree-ruby/releases/tag/v0.1.5
71
88
  [0.1.4]: https://github.com/firelzrd/rbtree-ruby/releases/tag/v0.1.4
72
89
  [0.1.3]: https://github.com/firelzrd/rbtree-ruby/releases/tag/v0.1.3
73
90
  [0.1.2]: https://github.com/firelzrd/rbtree-ruby/releases/tag/v0.1.2
@@ -2,5 +2,5 @@
2
2
 
3
3
  class RBTree
4
4
  # The version of the rbtree-ruby gem
5
- VERSION = "0.1.4"
5
+ VERSION = "0.1.6"
6
6
  end
data/lib/rbtree.rb CHANGED
@@ -174,6 +174,11 @@ class RBTree
174
174
  # tree.insert(1, 'uno', overwrite: false) # => nil (no change)
175
175
  # tree[2] = 'two' # using alias
176
176
  def insert(key, value, overwrite: true)
177
+ if (node = @hash_index[key])
178
+ return nil unless overwrite
179
+ node.value = value
180
+ return true
181
+ end
177
182
  y = @nil_node
178
183
  x = @root
179
184
  while x != @nil_node
@@ -465,10 +470,17 @@ class RBTree
465
470
  # @yield [key, value] each key-value pair in ascending order
466
471
  # @return [void]
467
472
  def traverse_asc(node, &block)
468
- return if node == @nil_node
469
- traverse_asc(node.left, &block)
470
- yield node.key, node.value
471
- traverse_asc(node.right, &block)
473
+ stack = []
474
+ current = node
475
+ while current != @nil_node || !stack.empty?
476
+ while current != @nil_node
477
+ stack << current
478
+ current = current.left
479
+ end
480
+ current = stack.pop
481
+ yield current.key, current.value
482
+ current = current.right
483
+ end
472
484
  end
473
485
 
474
486
  # Traverses the tree in descending order (reverse in-order traversal).
@@ -477,10 +489,17 @@ class RBTree
477
489
  # @yield [key, value] each key-value pair in descending order
478
490
  # @return [void]
479
491
  def traverse_desc(node, &block)
480
- return if node == @nil_node
481
- traverse_desc(node.right, &block)
482
- yield node.key, node.value
483
- traverse_desc(node.left, &block)
492
+ stack = []
493
+ current = node
494
+ while current != @nil_node || !stack.empty?
495
+ while current != @nil_node
496
+ stack << current
497
+ current = current.right
498
+ end
499
+ current = stack.pop
500
+ yield current.key, current.value
501
+ current = current.left
502
+ end
484
503
  end
485
504
 
486
505
  # Traverses nodes with keys less than the specified key.
@@ -1038,6 +1057,10 @@ class MultiRBTree < RBTree
1038
1057
  # tree.insert(1, 'first')
1039
1058
  # tree.insert(1, 'second') # adds another value for key 1
1040
1059
  def insert(key, value)
1060
+ if (node = @hash_index[key])
1061
+ node.value << value
1062
+ return true
1063
+ end
1041
1064
  y = @nil_node
1042
1065
  x = @root
1043
1066
  while x != @nil_node
@@ -1166,17 +1189,31 @@ class MultiRBTree < RBTree
1166
1189
  private
1167
1190
 
1168
1191
  def traverse_asc(node, &block)
1169
- return if node == @nil_node
1170
- traverse_asc(node.left, &block)
1171
- node.value.each { |v| yield node.key, v }
1172
- traverse_asc(node.right, &block)
1192
+ stack = []
1193
+ current = node
1194
+ while current != @nil_node || !stack.empty?
1195
+ while current != @nil_node
1196
+ stack << current
1197
+ current = current.left
1198
+ end
1199
+ current = stack.pop
1200
+ current.value.each { |v| yield current.key, v }
1201
+ current = current.right
1202
+ end
1173
1203
  end
1174
1204
 
1175
1205
  def traverse_desc(node, &block)
1176
- return if node == @nil_node
1177
- traverse_desc(node.right, &block)
1178
- node.value.reverse_each { |v| yield node.key, v }
1179
- traverse_desc(node.left, &block)
1206
+ stack = []
1207
+ current = node
1208
+ while current != @nil_node || !stack.empty?
1209
+ while current != @nil_node
1210
+ stack << current
1211
+ current = current.right
1212
+ end
1213
+ current = stack.pop
1214
+ current.value.reverse_each { |v| yield current.key, v }
1215
+ current = current.left
1216
+ end
1180
1217
  end
1181
1218
 
1182
1219
  def traverse_lt(node, key, &block)
@@ -1260,16 +1297,16 @@ end
1260
1297
  class RBTree::Node
1261
1298
  attr_accessor :key, :value, :color, :left, :right, :parent
1262
1299
 
1263
- # Red color constant
1264
- RED = :red
1265
- # Black color constant
1266
- BLACK = :black
1300
+ # Red color constant (true)
1301
+ RED = true
1302
+ # Black color constant (false)
1303
+ BLACK = false
1267
1304
 
1268
1305
  # Creates a new Node.
1269
1306
  #
1270
1307
  # @param key [Object] the key
1271
1308
  # @param value [Object] the value
1272
- # @param color [Symbol] the color (:red or :black)
1309
+ # @param color [Boolean] the color (true=red, false=black)
1273
1310
  # @param left [Node] the left child
1274
1311
  # @param right [Node] the right child
1275
1312
  # @param parent [Node] the parent node
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rbtree-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.1.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Masahito Suzuki