tree-red_black 0.4.2 → 0.4.3
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/.gitignore +5 -0
- data/Gemfile +2 -0
- data/contrib/Graph Red-Black Tree.ipynb +163 -0
- data/contrib/Schedule Reservation.ipynb +561 -0
- data/contrib/graph_red-black_tree.rb +203 -0
- data/contrib/schedule_reservation.rb +242 -0
- data/lib/tree/red_black/version.rb +1 -1
- metadata +6 -4
- data/Gemfile.lock +0 -36
- data/contrib/iterate_dot_graphs.rb +0 -208
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tree-red_black
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew L. Moore
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-06-
|
11
|
+
date: 2020-06-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -84,11 +84,13 @@ files:
|
|
84
84
|
- ".travis.yml"
|
85
85
|
- CODE_OF_CONDUCT.md
|
86
86
|
- Gemfile
|
87
|
-
- Gemfile.lock
|
88
87
|
- LICENSE.txt
|
89
88
|
- README.md
|
90
89
|
- Rakefile
|
91
|
-
- contrib/
|
90
|
+
- contrib/Graph Red-Black Tree.ipynb
|
91
|
+
- contrib/Schedule Reservation.ipynb
|
92
|
+
- contrib/graph_red-black_tree.rb
|
93
|
+
- contrib/schedule_reservation.rb
|
92
94
|
- lib/tree-red_black.rb
|
93
95
|
- lib/tree/red_black.rb
|
94
96
|
- lib/tree/red_black/red_black_node.rb
|
data/Gemfile.lock
DELETED
@@ -1,36 +0,0 @@
|
|
1
|
-
PATH
|
2
|
-
remote: .
|
3
|
-
specs:
|
4
|
-
tree-red_black (0.4.2)
|
5
|
-
|
6
|
-
GEM
|
7
|
-
remote: https://rubygems.org/
|
8
|
-
specs:
|
9
|
-
diff-lcs (1.3)
|
10
|
-
rake (13.0.1)
|
11
|
-
rspec (3.9.0)
|
12
|
-
rspec-core (~> 3.9.0)
|
13
|
-
rspec-expectations (~> 3.9.0)
|
14
|
-
rspec-mocks (~> 3.9.0)
|
15
|
-
rspec-core (3.9.2)
|
16
|
-
rspec-support (~> 3.9.3)
|
17
|
-
rspec-expectations (3.9.2)
|
18
|
-
diff-lcs (>= 1.2.0, < 2.0)
|
19
|
-
rspec-support (~> 3.9.0)
|
20
|
-
rspec-mocks (3.9.1)
|
21
|
-
diff-lcs (>= 1.2.0, < 2.0)
|
22
|
-
rspec-support (~> 3.9.0)
|
23
|
-
rspec-support (3.9.3)
|
24
|
-
|
25
|
-
PLATFORMS
|
26
|
-
ruby
|
27
|
-
|
28
|
-
DEPENDENCIES
|
29
|
-
bundler (~> 2.0, >= 2.0.1)
|
30
|
-
rake (~> 13.0)
|
31
|
-
rspec (~> 3.8)
|
32
|
-
rspec-expectations (~> 3.8)
|
33
|
-
tree-red_black!
|
34
|
-
|
35
|
-
BUNDLED WITH
|
36
|
-
2.1.4
|
@@ -1,208 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require 'tree/red_black'
|
4
|
-
require 'benchmark'
|
5
|
-
|
6
|
-
values = [*0..10]
|
7
|
-
# values = [2, 10, 4, 5, 6, 3, 1, 0, 9, 8, 7]
|
8
|
-
# values = [0, 2, 6, 4, 5, 3, 7, 1, 9, 8, 10]
|
9
|
-
puts "values.size: #{values.size}"
|
10
|
-
|
11
|
-
# rbt = Tree::RedBlack.new
|
12
|
-
# values.each do |v|
|
13
|
-
# # rbt = rbt.insert_red_black(v)
|
14
|
-
# rbt.insert(v)
|
15
|
-
# end
|
16
|
-
|
17
|
-
|
18
|
-
rbt = rbt_copy = nil
|
19
|
-
Benchmark.bm do |benchmark|
|
20
|
-
benchmark.report("insert:") do
|
21
|
-
# rbt = values.reduce(Tree::RedBlackNode.new) do |acc, v|
|
22
|
-
# acc.insert_red_black(v)
|
23
|
-
# end
|
24
|
-
rbt = values.reduce(Tree::RedBlack.new) do |acc, v|
|
25
|
-
acc.insert(v)
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
# benchmark.report("dup:") do
|
30
|
-
# rbt_copy = rbt.dup
|
31
|
-
# end
|
32
|
-
end
|
33
|
-
|
34
|
-
|
35
|
-
# rbt = rbt.insert_red_black(values.size)
|
36
|
-
# rbt_copy = rbt_copy.insert_red_black(values.size).delete_red_black(rbt_copy.key)
|
37
|
-
# rbt.insert(values.size)
|
38
|
-
# rbt_copy.insert(values.size)
|
39
|
-
|
40
|
-
|
41
|
-
File.open('dot.txt', 'w') do |file|
|
42
|
-
file.write "graph \"\"\n{\n label=\"Red-Black Tree\"\n"
|
43
|
-
|
44
|
-
i = 0
|
45
|
-
rbt.each do |node|
|
46
|
-
file.write(" #{node.key} [style=filled,color=#{node.color.to_s.downcase},fontcolor=white];\n")
|
47
|
-
file.write(" #{node.key} -- %s;\n" % [node.left ? "#{node.left.key}" : 'NULL' + (i += 1).to_s])
|
48
|
-
file.write(" #{node.key} -- %s;\n" % [node.right ? "#{node.right.key}" : 'NULL' + (i += 1).to_s])
|
49
|
-
end
|
50
|
-
i.times do |n|
|
51
|
-
file.write(" NULL#{n + 1} [fontsize=6,shape=box,width=0.2,height=0.2,style=filled,color=gray,label=\"NULL\"];\n")
|
52
|
-
end
|
53
|
-
file.write("}\n")
|
54
|
-
end
|
55
|
-
|
56
|
-
system 'dot -Tpng -odot.png dot.txt'
|
57
|
-
system 'open dot.png'
|
58
|
-
|
59
|
-
# puts "root: #{rbt_copy.key}"
|
60
|
-
puts "root: #{rbt.root.key}"
|
61
|
-
puts "size: #{rbt.size}"
|
62
|
-
|
63
|
-
p rbt.each.map(&:key)
|
64
|
-
|
65
|
-
paths = {}
|
66
|
-
rbt.pre_order do |node; path, count, ancestor|
|
67
|
-
if node.left.nil? || node.right.nil?
|
68
|
-
path = []
|
69
|
-
count = 0
|
70
|
-
ancestor = node
|
71
|
-
loop do
|
72
|
-
path.unshift ancestor.key
|
73
|
-
count += 1 if ancestor.color == :BLACK
|
74
|
-
break if (ancestor = ancestor.parent).nil?
|
75
|
-
end
|
76
|
-
paths[path] = count
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
# puts "paths from root (#{paths.size}):"
|
81
|
-
# paths.each do |path, count|
|
82
|
-
# p path
|
83
|
-
# end
|
84
|
-
|
85
|
-
puts "black-node counts: #{paths.values.uniq}"
|
86
|
-
|
87
|
-
|
88
|
-
def delete_keys_of_interest(rbt, deleted)
|
89
|
-
# puts "root: #{rbt.root.key}"
|
90
|
-
# puts "size: #{rbt.size}"
|
91
|
-
|
92
|
-
paths = {}
|
93
|
-
rbt.pre_order do |node; path, count, ancestor|
|
94
|
-
if node.left.nil? || node.right.nil?
|
95
|
-
path = []
|
96
|
-
count = 0
|
97
|
-
ancestor = node
|
98
|
-
loop do
|
99
|
-
path.unshift ancestor.key
|
100
|
-
count += 1 if ancestor.color == :BLACK
|
101
|
-
break if (ancestor = ancestor.parent).nil?
|
102
|
-
end
|
103
|
-
paths[path] = count
|
104
|
-
end
|
105
|
-
end
|
106
|
-
|
107
|
-
# puts "paths from root (#{paths.size}):"
|
108
|
-
# paths.each do |path, count|
|
109
|
-
# p path
|
110
|
-
# end
|
111
|
-
|
112
|
-
# puts "black-node counts: #{paths.values.uniq}"
|
113
|
-
|
114
|
-
raise "Unbalanced tree after deleting: #{deleted}" if paths.values.uniq.size > 1
|
115
|
-
|
116
|
-
koi = rbt.each.select do |node|
|
117
|
-
node.color == :BLACK && node.left.nil? && node.right.nil?
|
118
|
-
end.map(&:key)
|
119
|
-
# puts "keys of interest: #{koi}"
|
120
|
-
|
121
|
-
v = koi.size > 0 ? koi.shuffle.first : rbt.root&.key
|
122
|
-
|
123
|
-
return if v.nil?
|
124
|
-
|
125
|
-
deleted << v
|
126
|
-
# rbt = rbt.delete_red_black(v)
|
127
|
-
rbt.delete(v)
|
128
|
-
|
129
|
-
delete_keys_of_interest(rbt, deleted)
|
130
|
-
end
|
131
|
-
|
132
|
-
# deleted = []
|
133
|
-
|
134
|
-
# Benchmark.bm do |benchmark|
|
135
|
-
# # benchmark.report("koi:") do
|
136
|
-
# # delete_keys_of_interest(rbt_copy, deleted)
|
137
|
-
# # end
|
138
|
-
# # rbt_copy = rbt.dup
|
139
|
-
# benchmark.report("delete:") do
|
140
|
-
# # values.each { |v| rbt_copy = rbt_copy.delete_red_black(v) }
|
141
|
-
# values.each { |v| rbt.delete(v) }
|
142
|
-
# end
|
143
|
-
# end
|
144
|
-
|
145
|
-
# # p "deleted: #{deleted}"
|
146
|
-
# p rbt.inspect
|
147
|
-
|
148
|
-
print "Value to delete? "
|
149
|
-
n = gets.to_i
|
150
|
-
|
151
|
-
toggle = 0
|
152
|
-
while n >= 0
|
153
|
-
# rbt_copy = rbt.delete_red_black(n)
|
154
|
-
rbt.delete(n)
|
155
|
-
|
156
|
-
name = toggle == 0 ? 'dot2' : 'dot'
|
157
|
-
File.open(name + '.txt', 'w') do |file|
|
158
|
-
file.write "graph \"\"\n{\n label=\"Red-Black Tree - #{n}\"\n"
|
159
|
-
# file.write " labelfontsize=8.0\n"
|
160
|
-
|
161
|
-
i = 0
|
162
|
-
rbt.each do |node|
|
163
|
-
file.write(" #{node.key} [style=filled,color=#{node.color.to_s.downcase},fontcolor=white];\n")
|
164
|
-
file.write(" #{node.key} -- %s;\n" % [node.left ? "#{node.left.key}" : 'NULL' + (i += 1).to_s])
|
165
|
-
file.write(" #{node.key} -- %s;\n" % [node.right ? "#{node.right.key}" : 'NULL' + (i += 1).to_s])
|
166
|
-
end
|
167
|
-
i.times do |n|
|
168
|
-
file.write(" NULL#{n + 1} [fontsize=6,shape=box,width=0.2,height=0.2,style=filled,color=gray,label=\"NULL\"];\n")
|
169
|
-
end
|
170
|
-
file.write("}\n")
|
171
|
-
end
|
172
|
-
|
173
|
-
system 'dot -Tpng -o' + name + '.png ' + name + '.txt'
|
174
|
-
system 'open ' + name + '.png'
|
175
|
-
|
176
|
-
print "Value to delete? "
|
177
|
-
n = gets.to_i
|
178
|
-
toggle ^= 1
|
179
|
-
end
|
180
|
-
|
181
|
-
# values.delete(n)
|
182
|
-
# values.each do |v|
|
183
|
-
# puts "deleting #{v}"
|
184
|
-
# rbt = rbt.delete_red_black(v)
|
185
|
-
# end
|
186
|
-
|
187
|
-
# puts "empty rbt: #{rbt.inspect}"
|
188
|
-
|
189
|
-
|
190
|
-
# name = 'dot2'
|
191
|
-
# File.open(name + '.txt', 'w') do |file|
|
192
|
-
# file.write "graph \"\"\n{\n label=\"Red-Black Tree Copy\"\n"
|
193
|
-
# # file.write " labelfontsize=8.0\n"
|
194
|
-
|
195
|
-
# i = 0
|
196
|
-
# rbt_copy.each do |node|
|
197
|
-
# file.write(" #{node.key} [style=filled,color=#{node.color.to_s.downcase},fontcolor=white];\n")
|
198
|
-
# file.write(" #{node.key} -- %s;\n" % [node.left ? "#{node.left.key}" : 'NULL' + (i += 1).to_s])
|
199
|
-
# file.write(" #{node.key} -- %s;\n" % [node.right ? "#{node.right.key}" : 'NULL' + (i += 1).to_s])
|
200
|
-
# end
|
201
|
-
# i.times do |n|
|
202
|
-
# file.write(" NULL#{n + 1} [fontsize=6,shape=box,width=0.2,height=0.2,style=filled,color=gray,label=\"NULL\"];\n")
|
203
|
-
# end
|
204
|
-
# file.write("}\n")
|
205
|
-
# end
|
206
|
-
|
207
|
-
# system 'dot -Tpng -o' + name + '.png ' + name + '.txt'
|
208
|
-
# system 'open ' + name + '.png'
|