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.
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