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 +4 -4
- data/CHANGELOG.md +17 -0
- data/lib/rbtree/version.rb +1 -1
- data/lib/rbtree.rb +58 -21
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: bf6eb0a695ef93f89f9af8ceea5928c549785ea0110992f061b00ecdc76e3d64
|
|
4
|
+
data.tar.gz: 458cbee1ded3e8e0686ec495392bffbaf881ac0bc798d68790240abb0a3011b7
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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
|
data/lib/rbtree/version.rb
CHANGED
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
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
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
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
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
|
-
|
|
1170
|
-
|
|
1171
|
-
|
|
1172
|
-
|
|
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
|
-
|
|
1177
|
-
|
|
1178
|
-
|
|
1179
|
-
|
|
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 =
|
|
1265
|
-
# Black color constant
|
|
1266
|
-
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 [
|
|
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
|