ds 0.0.4 → 0.0.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 +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
|