ds 0.0.4 → 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.rubocop.yml +11 -0
- data/.rubocop_todo.yml +452 -0
- data/.travis.yml +12 -0
- data/Gemfile +1 -1
- data/README.rdoc +185 -214
- data/Rakefile +8 -3
- data/ds.gemspec +16 -13
- data/lib/ds.rb +20 -30
- data/lib/ds/{matrixes → arrays}/array_2d.rb +9 -10
- data/lib/ds/arrays/expandable_array.rb +34 -0
- data/lib/ds/arrays/heap_store.rb +32 -0
- data/lib/ds/arrays/tri_matrix.rb +33 -0
- data/lib/ds/lists/list.rb +310 -186
- data/lib/ds/lists/list_element.rb +14 -11
- data/lib/ds/pair.rb +4 -4
- data/lib/ds/queues/priority_queue.rb +33 -20
- data/lib/ds/queues/simple_queue.rb +55 -0
- data/lib/ds/sets/indexed_set.rb +37 -0
- data/lib/ds/stacks/stack.rb +25 -17
- data/lib/ds/trees/binary_heap.rb +71 -66
- data/lib/ds/trees/binary_tree.rb +40 -44
- data/lib/ds/trees/red_black_tree.rb +123 -0
- data/lib/ds/trees/red_black_tree/node.rb +21 -0
- data/lib/ds/trees/tree.rb +50 -48
- data/lib/ds/trees/tree_walker.rb +73 -144
- data/lib/ds/trees/trie.rb +67 -37
- data/lib/ds/trees/trie/node.rb +48 -0
- data/lib/ds/version.rb +2 -1
- data/test/help.rb +3 -6
- data/test/performance/binary_heap_performance_test.rb +20 -0
- data/test/performance/list_performance_test.rb +36 -0
- data/test/performance/priority_queue_performance.rb +32 -0
- data/test/performance/rbt_performance_test.rb +17 -0
- data/test/performance/simple_queue_performance_test.rb +37 -0
- data/test/performance/stack_test.rb +45 -0
- data/test/test_array2d.rb +29 -31
- data/test/test_binary_heap.rb +29 -23
- data/test/test_binary_tree.rb +30 -20
- data/test/test_expandable_array.rb +6 -10
- data/test/test_heap_store.rb +34 -0
- data/test/test_indexed_set.rb +26 -0
- data/test/test_list.rb +226 -109
- data/test/test_list_element.rb +34 -16
- data/test/test_pair.rb +5 -8
- data/test/test_priority_queue.rb +43 -64
- data/test/test_queue.rb +12 -61
- data/test/test_red_black_tree.rb +46 -0
- data/test/test_stack.rb +35 -39
- data/test/test_tree.rb +42 -29
- data/test/test_tree_walker.rb +27 -52
- data/test/test_tri_matrix.rb +6 -11
- data/test/test_trie.rb +59 -17
- metadata +80 -35
- data/lib/ds/ext/array_x.rb +0 -35
- data/lib/ds/graphs/digraph.rb +0 -20
- data/lib/ds/graphs/edge.rb +0 -15
- data/lib/ds/graphs/graph.rb +0 -111
- data/lib/ds/graphs/graph_as_matrix.rb +0 -113
- data/lib/ds/graphs/graph_as_tri_matrix.rb +0 -24
- data/lib/ds/lists/cyclic_list.rb +0 -21
- data/lib/ds/lists/ring.rb +0 -42
- data/lib/ds/matrixes/expandable_array.rb +0 -37
- data/lib/ds/matrixes/tri_matrix.rb +0 -30
- data/lib/ds/queues/queue.rb +0 -53
- data/lib/ds/sets/ordered_set.rb +0 -32
- data/lib/ds/trees/binary_search_tree.rb +0 -34
- data/lib/ds/trees/complete_binary_tree.rb +0 -60
- data/test/test_array_x.rb +0 -51
- data/test/test_binary_search_tree.rb +0 -39
- data/test/test_complete_binary_tree.rb +0 -58
- data/test/test_digraph.rb +0 -134
- data/test/test_graph.rb +0 -80
- data/test/test_ordered_set.rb +0 -28
- data/test/test_ring.rb +0 -28
metadata
CHANGED
@@ -1,72 +1,112 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ds
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.0.6
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- knife
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
13
|
-
dependencies:
|
14
|
-
|
11
|
+
date: 2016-05-30 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: minitest
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
description: Data structures (lists, stacks, trees, heaps, graphs..) in pure Ruby.
|
15
56
|
email:
|
16
57
|
- satre@o2.pl
|
17
58
|
executables: []
|
18
59
|
extensions: []
|
19
60
|
extra_rdoc_files: []
|
20
61
|
files:
|
21
|
-
- .gitignore
|
62
|
+
- ".gitignore"
|
63
|
+
- ".rubocop.yml"
|
64
|
+
- ".rubocop_todo.yml"
|
65
|
+
- ".travis.yml"
|
22
66
|
- Gemfile
|
23
67
|
- README.rdoc
|
24
68
|
- Rakefile
|
25
69
|
- ds.gemspec
|
26
70
|
- lib/ds.rb
|
27
|
-
- lib/ds/
|
28
|
-
- lib/ds/
|
29
|
-
- lib/ds/
|
30
|
-
- lib/ds/
|
31
|
-
- lib/ds/graphs/graph_as_matrix.rb
|
32
|
-
- lib/ds/graphs/graph_as_tri_matrix.rb
|
33
|
-
- lib/ds/lists/cyclic_list.rb
|
71
|
+
- lib/ds/arrays/array_2d.rb
|
72
|
+
- lib/ds/arrays/expandable_array.rb
|
73
|
+
- lib/ds/arrays/heap_store.rb
|
74
|
+
- lib/ds/arrays/tri_matrix.rb
|
34
75
|
- lib/ds/lists/list.rb
|
35
76
|
- lib/ds/lists/list_element.rb
|
36
|
-
- lib/ds/lists/ring.rb
|
37
|
-
- lib/ds/matrixes/array_2d.rb
|
38
|
-
- lib/ds/matrixes/expandable_array.rb
|
39
|
-
- lib/ds/matrixes/tri_matrix.rb
|
40
77
|
- lib/ds/pair.rb
|
41
78
|
- lib/ds/queues/priority_queue.rb
|
42
|
-
- lib/ds/queues/
|
43
|
-
- lib/ds/sets/
|
79
|
+
- lib/ds/queues/simple_queue.rb
|
80
|
+
- lib/ds/sets/indexed_set.rb
|
44
81
|
- lib/ds/stacks/stack.rb
|
45
82
|
- lib/ds/trees/binary_heap.rb
|
46
|
-
- lib/ds/trees/binary_search_tree.rb
|
47
83
|
- lib/ds/trees/binary_tree.rb
|
48
|
-
- lib/ds/trees/
|
84
|
+
- lib/ds/trees/red_black_tree.rb
|
85
|
+
- lib/ds/trees/red_black_tree/node.rb
|
49
86
|
- lib/ds/trees/tree.rb
|
50
87
|
- lib/ds/trees/tree_walker.rb
|
51
88
|
- lib/ds/trees/trie.rb
|
89
|
+
- lib/ds/trees/trie/node.rb
|
52
90
|
- lib/ds/version.rb
|
53
91
|
- test/help.rb
|
92
|
+
- test/performance/binary_heap_performance_test.rb
|
93
|
+
- test/performance/list_performance_test.rb
|
94
|
+
- test/performance/priority_queue_performance.rb
|
95
|
+
- test/performance/rbt_performance_test.rb
|
96
|
+
- test/performance/simple_queue_performance_test.rb
|
97
|
+
- test/performance/stack_test.rb
|
54
98
|
- test/test_array2d.rb
|
55
|
-
- test/test_array_x.rb
|
56
99
|
- test/test_binary_heap.rb
|
57
|
-
- test/test_binary_search_tree.rb
|
58
100
|
- test/test_binary_tree.rb
|
59
|
-
- test/test_complete_binary_tree.rb
|
60
|
-
- test/test_digraph.rb
|
61
101
|
- test/test_expandable_array.rb
|
62
|
-
- test/
|
102
|
+
- test/test_heap_store.rb
|
103
|
+
- test/test_indexed_set.rb
|
63
104
|
- test/test_list.rb
|
64
105
|
- test/test_list_element.rb
|
65
|
-
- test/test_ordered_set.rb
|
66
106
|
- test/test_pair.rb
|
67
107
|
- test/test_priority_queue.rb
|
68
108
|
- test/test_queue.rb
|
69
|
-
- test/
|
109
|
+
- test/test_red_black_tree.rb
|
70
110
|
- test/test_stack.rb
|
71
111
|
- test/test_tree.rb
|
72
112
|
- test/test_tree_walker.rb
|
@@ -74,26 +114,31 @@ files:
|
|
74
114
|
- test/test_trie.rb
|
75
115
|
homepage: ''
|
76
116
|
licenses: []
|
117
|
+
metadata: {}
|
77
118
|
post_install_message:
|
78
119
|
rdoc_options: []
|
79
120
|
require_paths:
|
80
121
|
- lib
|
81
122
|
required_ruby_version: !ruby/object:Gem::Requirement
|
82
|
-
none: false
|
83
123
|
requirements:
|
84
|
-
- -
|
124
|
+
- - ">="
|
85
125
|
- !ruby/object:Gem::Version
|
86
126
|
version: '0'
|
87
127
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
88
|
-
none: false
|
89
128
|
requirements:
|
90
|
-
- -
|
129
|
+
- - ">="
|
91
130
|
- !ruby/object:Gem::Version
|
92
131
|
version: '0'
|
93
132
|
requirements: []
|
94
133
|
rubyforge_project: ds
|
95
|
-
rubygems_version:
|
134
|
+
rubygems_version: 2.4.5.1
|
96
135
|
signing_key:
|
97
|
-
specification_version:
|
136
|
+
specification_version: 4
|
98
137
|
summary: Some common data structures.
|
99
|
-
test_files:
|
138
|
+
test_files:
|
139
|
+
- test/performance/binary_heap_performance_test.rb
|
140
|
+
- test/performance/list_performance_test.rb
|
141
|
+
- test/performance/priority_queue_performance.rb
|
142
|
+
- test/performance/rbt_performance_test.rb
|
143
|
+
- test/performance/simple_queue_performance_test.rb
|
144
|
+
- test/performance/stack_test.rb
|
data/lib/ds/ext/array_x.rb
DELETED
@@ -1,35 +0,0 @@
|
|
1
|
-
module DS
|
2
|
-
module ArrayX
|
3
|
-
|
4
|
-
#Checks if array is already sorted.
|
5
|
-
def sorted?(order=:any)
|
6
|
-
return true if size < 2
|
7
|
-
|
8
|
-
if size == 2
|
9
|
-
return false if self[0] > self[1] and order == :asc
|
10
|
-
return false if self[0] < self[1] and order == :desc
|
11
|
-
else
|
12
|
-
case order
|
13
|
-
when :asc
|
14
|
-
(size-2).times{ |i| return false if self[i] > self[i+1] }
|
15
|
-
when :desc
|
16
|
-
(size-2).times{ |i| return false if self[i] < self[i+1] }
|
17
|
-
else
|
18
|
-
return (self[0] < self[1])? sorted?(:asc) : sorted?(:desc)
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
true
|
23
|
-
end
|
24
|
-
|
25
|
-
#Checks if array has duplicates.
|
26
|
-
def duplications?
|
27
|
-
size != uniq.size
|
28
|
-
end
|
29
|
-
|
30
|
-
#Returns array tail.
|
31
|
-
def tail
|
32
|
-
self[1..-1]
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
data/lib/ds/graphs/digraph.rb
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
module DS
|
2
|
-
class Digraph < Graph
|
3
|
-
|
4
|
-
def self.create(args)
|
5
|
-
new(args,:matrix)
|
6
|
-
end
|
7
|
-
|
8
|
-
|
9
|
-
#Returns number of incoming edges to given vertex.
|
10
|
-
def in_degree x
|
11
|
-
@g.degree x, :in
|
12
|
-
end
|
13
|
-
|
14
|
-
#Returns number of outcoming edges to given vertex.
|
15
|
-
def out_degree x
|
16
|
-
@g.degree x, :out
|
17
|
-
end
|
18
|
-
|
19
|
-
end
|
20
|
-
end
|
data/lib/ds/graphs/edge.rb
DELETED
data/lib/ds/graphs/graph.rb
DELETED
@@ -1,111 +0,0 @@
|
|
1
|
-
module DS
|
2
|
-
class Graph
|
3
|
-
|
4
|
-
Infinity = 1 << 64
|
5
|
-
|
6
|
-
#Create new graph from array of edges. Second parameter determines
|
7
|
-
#graph internal implementation: :list (Adjency List), :tri_matrix (Triangular
|
8
|
-
#Matrix), :matrix (Matrix).
|
9
|
-
def initialize(edges,store = :matrix)
|
10
|
-
case store
|
11
|
-
when :matrix
|
12
|
-
@g = GraphAsMatrix.new(edges)
|
13
|
-
when :tri_matrix
|
14
|
-
@g = GraphAsTriMatrix.new(edges)
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
#Create new graph from array of edges. Internally graph will be represented
|
19
|
-
#by Triangular Matrix.
|
20
|
-
def self.create(edges)
|
21
|
-
new(edges,:tri_matrix)
|
22
|
-
end
|
23
|
-
|
24
|
-
#Adds new edge to graph.
|
25
|
-
def add(x,y,weight=1)
|
26
|
-
e = Edge.new(x,y,weight)
|
27
|
-
add_edges([e])
|
28
|
-
end
|
29
|
-
|
30
|
-
#Adds new edges to graph.
|
31
|
-
def add_edges(edges)
|
32
|
-
@g.add_edges(edges)
|
33
|
-
end
|
34
|
-
|
35
|
-
|
36
|
-
#Removes conection between vertex x and y.
|
37
|
-
def remove(x,y)
|
38
|
-
@g.remove(x,y)
|
39
|
-
end
|
40
|
-
|
41
|
-
#Returns all neighbors for given vertex.
|
42
|
-
def neighbors v
|
43
|
-
@g.neighbors v
|
44
|
-
end
|
45
|
-
|
46
|
-
#Returns vertex degree.
|
47
|
-
def degree x
|
48
|
-
@g.degree x
|
49
|
-
end
|
50
|
-
|
51
|
-
#Checks if two elements are connected.
|
52
|
-
def edge? x,y
|
53
|
-
@g.edge? x,y
|
54
|
-
end
|
55
|
-
|
56
|
-
#Returns Edge(x,y) if exist.
|
57
|
-
def get_edge x, y
|
58
|
-
@g.get_edge x,y
|
59
|
-
end
|
60
|
-
|
61
|
-
def vertex_size
|
62
|
-
@g.vertex_size
|
63
|
-
end
|
64
|
-
|
65
|
-
def each_vertex &block
|
66
|
-
@g.each_vertex &block
|
67
|
-
end
|
68
|
-
|
69
|
-
def each_edge &block
|
70
|
-
@g.each_edge &block
|
71
|
-
end
|
72
|
-
|
73
|
-
|
74
|
-
def bfs s
|
75
|
-
colors = {}
|
76
|
-
parents = {}
|
77
|
-
res = []
|
78
|
-
d = {}
|
79
|
-
q = Queue.new
|
80
|
-
|
81
|
-
@g.each_vertex do |v|
|
82
|
-
colors[v] = :white
|
83
|
-
parents[v] = nil
|
84
|
-
d[v] = Infinity
|
85
|
-
end
|
86
|
-
|
87
|
-
colors[s] = :white
|
88
|
-
parents[s] = nil
|
89
|
-
d[s] = 0
|
90
|
-
|
91
|
-
q.enqueue s
|
92
|
-
|
93
|
-
while !q.empty?
|
94
|
-
u = q.dequeue
|
95
|
-
@g.neighbors(u).each do |v|
|
96
|
-
if colors[v] === :white
|
97
|
-
colors[v] = :grey
|
98
|
-
d[v] = d[u] + 1
|
99
|
-
parents[v] = u
|
100
|
-
q.enqueue v
|
101
|
-
end
|
102
|
-
end
|
103
|
-
colors[u] = :black
|
104
|
-
res << u
|
105
|
-
end
|
106
|
-
res
|
107
|
-
end
|
108
|
-
|
109
|
-
|
110
|
-
end
|
111
|
-
end
|
@@ -1,113 +0,0 @@
|
|
1
|
-
module DS
|
2
|
-
class GraphAsMatrix
|
3
|
-
|
4
|
-
def initialize(edges)
|
5
|
-
@store = Array2D.new
|
6
|
-
@max = 0
|
7
|
-
|
8
|
-
@map = OrderedSet.new #maps objects to matrix indexes.
|
9
|
-
|
10
|
-
add_edges(edges)
|
11
|
-
end
|
12
|
-
|
13
|
-
#Adds new edges to graph.
|
14
|
-
def add_edges(edges)
|
15
|
-
for e in edges
|
16
|
-
x = @map.push e.from
|
17
|
-
y = @map.push e.to
|
18
|
-
|
19
|
-
@store[x,y] = e.weight
|
20
|
-
|
21
|
-
@max = [@max, x, y].max
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
#Returns all neighbors for given vertex.
|
26
|
-
def neighbors(v)
|
27
|
-
n = []
|
28
|
-
vertexes = @map.to_a
|
29
|
-
v = @map.index(v)
|
30
|
-
|
31
|
-
0.upto @max do |i|
|
32
|
-
n << vertexes[i] if @store[v,i] > 0
|
33
|
-
end
|
34
|
-
n
|
35
|
-
end
|
36
|
-
|
37
|
-
#Removes conection between vertex x and y.
|
38
|
-
def remove(x,y)
|
39
|
-
v1 = @map.index(x)
|
40
|
-
v2 = @map.index(y)
|
41
|
-
|
42
|
-
vertexes = @map.to_a
|
43
|
-
|
44
|
-
@store[v1,v2] = 0
|
45
|
-
if (degree vertexes[@max]) == 0
|
46
|
-
@max -= 1
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
#Returns Edge(x,y) if exist.
|
51
|
-
def get_edge x,y
|
52
|
-
s = @map.index x
|
53
|
-
t = @map.index y
|
54
|
-
if @store[s,t] > 0
|
55
|
-
Edge.new(x, y, @store[s,t])
|
56
|
-
else
|
57
|
-
nil
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
#Checks if two elements are connected.
|
62
|
-
def edge? x,y
|
63
|
-
v1 = @map.index(x)
|
64
|
-
v2 = @map.index(y)
|
65
|
-
@store[v1,v2] > 0
|
66
|
-
end
|
67
|
-
|
68
|
-
#Returns vertex counter.
|
69
|
-
def vertex_size
|
70
|
-
@map.size
|
71
|
-
end
|
72
|
-
|
73
|
-
|
74
|
-
#Returns vertex degree. Second parameter determines direction - :in incoming
|
75
|
-
#edges, :out - outcoming edges, :all - incoming and outcoming edges.
|
76
|
-
def degree(x,direction=:all)
|
77
|
-
x = @map.index(x)
|
78
|
-
sum_in = 0
|
79
|
-
sum_out = 0
|
80
|
-
0.upto @max do |i|
|
81
|
-
sum_in += 1 if @store[i,x] and @store[i,x] > 0
|
82
|
-
sum_out += 1 if @store[x,i] and @store[x,i] > 0
|
83
|
-
end
|
84
|
-
|
85
|
-
case direction
|
86
|
-
when :all
|
87
|
-
sum_in+sum_out
|
88
|
-
when :in
|
89
|
-
sum_in
|
90
|
-
when :out
|
91
|
-
sum_out
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
|
96
|
-
#Vertex iterator
|
97
|
-
def each_vertex
|
98
|
-
vertexes = @map.to_a
|
99
|
-
(0..@max).each {|v| yield vertexes[v]}
|
100
|
-
end
|
101
|
-
|
102
|
-
#Edge iterator
|
103
|
-
def each_edge
|
104
|
-
vertexes = @map.to_a
|
105
|
-
for v0 in 0..@max
|
106
|
-
for v1 in 0..v0-1
|
107
|
-
yield Edge.new(vertexes[v0],vertexes[v1],@store[v0,v1]) if @store[v0,v1] > 0
|
108
|
-
end
|
109
|
-
end
|
110
|
-
end
|
111
|
-
|
112
|
-
end
|
113
|
-
end
|