ds 0.0.4 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (75) hide show
  1. checksums.yaml +7 -0
  2. data/.rubocop.yml +11 -0
  3. data/.rubocop_todo.yml +452 -0
  4. data/.travis.yml +12 -0
  5. data/Gemfile +1 -1
  6. data/README.rdoc +185 -214
  7. data/Rakefile +8 -3
  8. data/ds.gemspec +16 -13
  9. data/lib/ds.rb +20 -30
  10. data/lib/ds/{matrixes → arrays}/array_2d.rb +9 -10
  11. data/lib/ds/arrays/expandable_array.rb +34 -0
  12. data/lib/ds/arrays/heap_store.rb +32 -0
  13. data/lib/ds/arrays/tri_matrix.rb +33 -0
  14. data/lib/ds/lists/list.rb +310 -186
  15. data/lib/ds/lists/list_element.rb +14 -11
  16. data/lib/ds/pair.rb +4 -4
  17. data/lib/ds/queues/priority_queue.rb +33 -20
  18. data/lib/ds/queues/simple_queue.rb +55 -0
  19. data/lib/ds/sets/indexed_set.rb +37 -0
  20. data/lib/ds/stacks/stack.rb +25 -17
  21. data/lib/ds/trees/binary_heap.rb +71 -66
  22. data/lib/ds/trees/binary_tree.rb +40 -44
  23. data/lib/ds/trees/red_black_tree.rb +123 -0
  24. data/lib/ds/trees/red_black_tree/node.rb +21 -0
  25. data/lib/ds/trees/tree.rb +50 -48
  26. data/lib/ds/trees/tree_walker.rb +73 -144
  27. data/lib/ds/trees/trie.rb +67 -37
  28. data/lib/ds/trees/trie/node.rb +48 -0
  29. data/lib/ds/version.rb +2 -1
  30. data/test/help.rb +3 -6
  31. data/test/performance/binary_heap_performance_test.rb +20 -0
  32. data/test/performance/list_performance_test.rb +36 -0
  33. data/test/performance/priority_queue_performance.rb +32 -0
  34. data/test/performance/rbt_performance_test.rb +17 -0
  35. data/test/performance/simple_queue_performance_test.rb +37 -0
  36. data/test/performance/stack_test.rb +45 -0
  37. data/test/test_array2d.rb +29 -31
  38. data/test/test_binary_heap.rb +29 -23
  39. data/test/test_binary_tree.rb +30 -20
  40. data/test/test_expandable_array.rb +6 -10
  41. data/test/test_heap_store.rb +34 -0
  42. data/test/test_indexed_set.rb +26 -0
  43. data/test/test_list.rb +226 -109
  44. data/test/test_list_element.rb +34 -16
  45. data/test/test_pair.rb +5 -8
  46. data/test/test_priority_queue.rb +43 -64
  47. data/test/test_queue.rb +12 -61
  48. data/test/test_red_black_tree.rb +46 -0
  49. data/test/test_stack.rb +35 -39
  50. data/test/test_tree.rb +42 -29
  51. data/test/test_tree_walker.rb +27 -52
  52. data/test/test_tri_matrix.rb +6 -11
  53. data/test/test_trie.rb +59 -17
  54. metadata +80 -35
  55. data/lib/ds/ext/array_x.rb +0 -35
  56. data/lib/ds/graphs/digraph.rb +0 -20
  57. data/lib/ds/graphs/edge.rb +0 -15
  58. data/lib/ds/graphs/graph.rb +0 -111
  59. data/lib/ds/graphs/graph_as_matrix.rb +0 -113
  60. data/lib/ds/graphs/graph_as_tri_matrix.rb +0 -24
  61. data/lib/ds/lists/cyclic_list.rb +0 -21
  62. data/lib/ds/lists/ring.rb +0 -42
  63. data/lib/ds/matrixes/expandable_array.rb +0 -37
  64. data/lib/ds/matrixes/tri_matrix.rb +0 -30
  65. data/lib/ds/queues/queue.rb +0 -53
  66. data/lib/ds/sets/ordered_set.rb +0 -32
  67. data/lib/ds/trees/binary_search_tree.rb +0 -34
  68. data/lib/ds/trees/complete_binary_tree.rb +0 -60
  69. data/test/test_array_x.rb +0 -51
  70. data/test/test_binary_search_tree.rb +0 -39
  71. data/test/test_complete_binary_tree.rb +0 -58
  72. data/test/test_digraph.rb +0 -134
  73. data/test/test_graph.rb +0 -80
  74. data/test/test_ordered_set.rb +0 -28
  75. 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.4
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: 2013-06-16 00:00:00.000000000 Z
13
- dependencies: []
14
- description: Data structures (lists,stacks, trees, heaps, graphs..) in pure Ruby.
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/ext/array_x.rb
28
- - lib/ds/graphs/digraph.rb
29
- - lib/ds/graphs/edge.rb
30
- - lib/ds/graphs/graph.rb
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/queue.rb
43
- - lib/ds/sets/ordered_set.rb
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/complete_binary_tree.rb
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/test_graph.rb
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/test_ring.rb
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: 1.8.25
134
+ rubygems_version: 2.4.5.1
96
135
  signing_key:
97
- specification_version: 3
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
@@ -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
@@ -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
@@ -1,15 +0,0 @@
1
- module DS
2
- class Edge
3
-
4
- attr_accessor :from, :to, :weight
5
-
6
- #Create new edge.
7
- def initialize(from,to,weight=1)
8
- @from = from
9
- @to = to
10
- @weight = weight
11
- end
12
-
13
- end
14
- end
15
-
@@ -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