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.
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.2
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-18 00:00:00.000000000 Z
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/iterate_dot_graphs.rb
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
@@ -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'