DSA 0.0.3 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1cf45aaf41acd85971600055fd5dfac1825e539b
4
- data.tar.gz: 8ab7c55725ae11725a9e9ef7bff86c6d9416a1a0
3
+ metadata.gz: cd9d302cc8e21bcb88c9a087cafa81fb2835b371
4
+ data.tar.gz: d44c6c4347afeab407ffed1fb7fe1dd36a1a18f2
5
5
  SHA512:
6
- metadata.gz: 1085cb96b51a4b9dd4f168454cb9218bfa8cc473c2050a8cf662cfecc6feabd002876da7a6005bc28db323bd6a8f9f9a338dff5e6930cd20b4044b11a51051d1
7
- data.tar.gz: bd64fc623b6c397346f355cc8b6e7cf289e7bc3e4e69138313c985cfb17830f7b2d466eec48df623f5cd217ac07ad771b611412803e6509523c952e954465845
6
+ metadata.gz: baffedd679af3f07429c79665a58f664bad3ef1f1dcb3ca739b518808c6f60e7319f3b7f536fd36c81fb8b78e7ecc8a7de858a8603866b54f8724a2ee221e53f
7
+ data.tar.gz: 9784aa8e128162b51b4cf84dea3738aedcfdc22bec40724c4106aa0f28f15a9218e34a06333745a29b1a07433a85dc836618ab5c2f9b282f2e8376183f319530
data/.gitignore CHANGED
@@ -1,19 +1,19 @@
1
- *.gem
2
- *.rbc
3
- .bundle
4
- .config
5
- .yardoc
6
- Gemfile.lock
7
- InstalledFiles
8
- _yardoc
9
- coverage
10
- doc/
11
- lib/bundler/man
12
- pkg
13
- rdoc
14
- spec/reports
15
- test/tmp
16
- test/version_tmp
17
- tmp
18
- *.idea
19
-
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ *.idea
19
+
@@ -1,24 +1,24 @@
1
- # coding: utf-8
2
- lib = File.expand_path('../lib', __FILE__)
3
- $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require 'DSA/version'
5
-
6
- Gem::Specification.new do |spec|
7
- spec.name = "DSA"
8
- spec.version = DSA::VERSION
9
- spec.authors = ["lusaisai"]
10
- spec.email = ["lusaisai@163.com"]
11
- spec.summary = %q{Data Structures and Algorithms in Ruby}
12
- spec.description = %q{List, BinarySearchTree(RedBlackTree), PriorityQueue, (Array/List)Stack and Queue}
13
- spec.homepage = "https://github.com/lusaisai/DSA"
14
- spec.license = "MIT"
15
-
16
- spec.files = `git ls-files -z`.split("\x0")
17
- spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
- spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
- spec.require_paths = ["lib"]
20
-
21
- spec.add_development_dependency "bundler", "~> 1.5"
22
- spec.add_development_dependency "rake"
23
- end
24
-
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'DSA/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "DSA"
8
+ spec.version = DSA::VERSION
9
+ spec.authors = ["lusaisai"]
10
+ spec.email = ["lusaisai@163.com"]
11
+ spec.summary = %q{Data Structures and Algorithms in Ruby}
12
+ spec.description = %q{List, BinarySearchTree(RedBlackTree), SkipList, PriorityQueue, (Array/List)Stack and Queue}
13
+ spec.homepage = "https://github.com/lusaisai/DSA"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.5"
22
+ spec.add_development_dependency "rake"
23
+ end
24
+
data/Gemfile CHANGED
@@ -1,5 +1,5 @@
1
- source 'https://rubygems.org'
2
-
3
- # Specify your gem's dependencies in DSA.gemspec
4
- gemspec
5
-
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in DSA.gemspec
4
+ gemspec
5
+
@@ -1,23 +1,23 @@
1
- Copyright (c) 2014 lusaisai
2
-
3
- MIT License
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining
6
- a copy of this software and associated documentation files (the
7
- "Software"), to deal in the Software without restriction, including
8
- without limitation the rights to use, copy, modify, merge, publish,
9
- distribute, sublicense, and/or sell copies of the Software, and to
10
- permit persons to whom the Software is furnished to do so, subject to
11
- the following conditions:
12
-
13
- The above copyright notice and this permission notice shall be
14
- included in all copies or substantial portions of the Software.
15
-
16
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
- OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23
-
1
+ Copyright (c) 2014 lusaisai
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23
+
data/README.md CHANGED
@@ -5,28 +5,28 @@ Ruby gem for basic Data Structures and Algorithms
5
5
  ## Installation
6
6
 
7
7
  Add this line to your application's Gemfile:
8
- ```bash
8
+ ```
9
9
  gem 'DSA'
10
10
  ```
11
11
  And then execute:
12
- ```bash
12
+ ```
13
13
  $ bundle
14
14
  ```
15
15
  Or install it yourself as:
16
- ```bash
16
+ ```
17
17
  $ gem install DSA
18
18
  ```
19
19
  ## Usage
20
20
 
21
21
  To include the package,
22
- ```ruby
22
+ ```
23
23
  require 'DSA'
24
24
  ```
25
25
 
26
26
  ### List
27
27
  A doubly linked list data structure. Use when there are lots of insertions/deletions in the middle,
28
28
  otherwise, built-in array is better.
29
- ```ruby
29
+ ```
30
30
  l = DSA::List.new
31
31
  l.push 'some value'
32
32
  l.pop
@@ -38,13 +38,13 @@ otherwise, built-in array is better.
38
38
  l.length
39
39
  ```
40
40
  General access/removal/insertion using index is supported, these operations require linear time, so use carefully.
41
- ```ruby
41
+ ```
42
42
  l[2]
43
43
  l.insert_at 10, 'some value'
44
44
  l.remove_at 2
45
45
  ```
46
46
  To do lots of insertions/deletions, use the iterator, StopIteration is raised when reaching to head or tail
47
- ```ruby
47
+ ```
48
48
  li = l.begin_iterator # the iterator starts from the head
49
49
  puts li.next
50
50
  li.insert 'some value'
@@ -61,19 +61,19 @@ the performance might not be the best, use only when a full traversal is inevita
61
61
  An ordered map, works like a hash, but preserves an order and provides range search, implemented as a RedBlack tree.
62
62
 
63
63
  The following three are aliases in creating a new object,
64
- ```ruby
64
+ ```
65
65
  rb = DSA::BinarySearchTree.new
66
66
  rb = DSA::OrderedMap.new
67
67
  rb = DSA::RedBlackTree.new
68
68
  ```
69
69
  Method are very like a hash,
70
- ```ruby
70
+ ```
71
71
  rb[key] = value
72
72
  rb[key]
73
73
  rb.delete key
74
74
  ```
75
75
  And special methods related to orders, those methods yield key/value pairs to block, if no block, enumerator is returned.
76
- ```ruby
76
+ ```
77
77
  rb.each # in-order traversal
78
78
  rb.gt(key) # key/value pairs for keys greater than key
79
79
  rb.ge(key)
@@ -81,7 +81,7 @@ And special methods related to orders, those methods yield key/value pairs to bl
81
81
  rb.le(key)
82
82
  ```
83
83
  A help method tried to print a tree, not quite pretty, but may helps test
84
- ```ruby
84
+ ```
85
85
  rb.bfs_print
86
86
  ```
87
87
  Enumerable is included, all those method such as 'each' are all available, since other methods are based on each,
@@ -90,7 +90,7 @@ the performance might not be the best, use only when a full traversal is inevita
90
90
  ### SkipList
91
91
  An ordered map, storing key/value pairs, duplicate keys are allowed, value can be omitted, preserves an order and provides range search, implemented as a skip list.
92
92
 
93
- ```ruby
93
+ ```
94
94
  sl = DSA::SkipList.new
95
95
  sl.add key, value
96
96
  sl.add key # value will be nil
@@ -99,7 +99,7 @@ An ordered map, storing key/value pairs, duplicate keys are allowed, value can b
99
99
  ```
100
100
 
101
101
  And special methods related to orders, those methods yield key/value pairs to block, if no block, enumerator is returned.
102
- ```ruby
102
+ ```
103
103
  sl.find key
104
104
  sl.each # in-order traversal
105
105
  sl.gt(key) # key/value pairs for keys greater than key
@@ -108,7 +108,7 @@ And special methods related to orders, those methods yield key/value pairs to bl
108
108
  sl.le(key)
109
109
  ```
110
110
  A help method prints the skip list
111
- ```ruby
111
+ ```
112
112
  sl.print_me
113
113
  sl.print_me width # width, the length of evert key/value pair, default to 10
114
114
  ```
@@ -118,7 +118,7 @@ the performance might not be the best, use only when a full traversal is inevita
118
118
 
119
119
  ### PriorityQueue
120
120
  An array based heap, priority is a number, the smaller it is, higher priority it has
121
- ```ruby
121
+ ```
122
122
  pq = DSA::PriorityQueue.new
123
123
  pq.add 10, 'some job'
124
124
  pq.length
@@ -128,7 +128,7 @@ An array based heap, priority is a number, the smaller it is, higher priority it
128
128
 
129
129
  ### Stack and Queue
130
130
  Implemented based on array or list.
131
- ```ruby
131
+ ```
132
132
  s = DSA::ArrayStack.new
133
133
  s = DSA::ListStack.new
134
134
  s.push 'some value'
@@ -136,7 +136,8 @@ Implemented based on array or list.
136
136
  s.empty?
137
137
  s.top
138
138
  s.length
139
-
139
+ ```
140
+ ```
140
141
  q = DSA::ArrayQueue.new
141
142
  q = DSA::ListQueue.new
142
143
  q.enqueue 'some value'
@@ -148,9 +149,17 @@ Implemented based on array or list.
148
149
  ### Algorithm
149
150
  The following functions are for demonstrations, specially sort, using built-in Array#bsearch and Array#sort instead,
150
151
  they have a better performance.
151
- ```ruby
152
+ ```
152
153
  DSA::Algorithm::factorial(5)
154
+ DSA::Algorithm::fibonacci(10) # There are different implementations with different performance, defaults to fibonacci_logarithm(10)
155
+ DSA::Algorithm::fibonacci_exponential(10)
156
+ DSA::Algorithm::fibonacci_linear(10)
157
+ DSA::Algorithm::fibonacci_logarithm(10)
158
+ DSA::Algorithm::fibonacci_constant(10)
159
+ DSA::Algorithm::fibonacci_bad(10)
153
160
  DSA::Algorithm::binary_search((1..9).to_a, 2, 0, 8)
154
161
  DSA::Algorithm::insertion_sort!(array)
155
162
  DSA::Algorithm::quick_sort!(array, 0, array.length-1)
163
+ DSA::Algorithm::radix_sort(array) # array should be integers
164
+ DSA::Algorithm::sqrt(number)
156
165
  ```
data/Rakefile CHANGED
@@ -1,2 +1,2 @@
1
- require "bundler/gem_tasks"
2
-
1
+ require "bundler/gem_tasks"
2
+
data/lib/DSA.rb CHANGED
@@ -1,11 +1,11 @@
1
- require_relative 'DSA/version'
2
- require_relative 'DSA/algorithm'
3
- require_relative 'DSA/stack_and_queue'
4
- require_relative 'DSA/list'
5
- require_relative 'DSA/priority_queue'
6
- require_relative 'DSA/binary_search_tree'
7
- require_relative 'DSA/skip_list'
8
-
9
- module DSA
10
- # Your code goes here...
11
- end
1
+ require_relative 'DSA/version'
2
+ require_relative 'DSA/algorithm'
3
+ require_relative 'DSA/stack_and_queue'
4
+ require_relative 'DSA/list'
5
+ require_relative 'DSA/priority_queue'
6
+ require_relative 'DSA/binary_search_tree'
7
+ require_relative 'DSA/skip_list'
8
+
9
+ module DSA
10
+ # Your code goes here...
11
+ end
@@ -11,6 +11,102 @@ module DSA
11
11
  end
12
12
 
13
13
 
14
+ def self.fibonacci(n)
15
+ self.fibonacci_logarithm(n)
16
+ end
17
+
18
+ # we could implement fibonacci using recursion which looks simple, unfortunately, the running time of this algorithm
19
+ # itself is a fibonacci sequence, which grows fast, kind of exponential
20
+ def self.fibonacci_exponential(n)
21
+ if !n.is_a? Integer or n < 0
22
+ raise ArgumentError
23
+ end
24
+
25
+ if n == 0
26
+ 0
27
+ elsif n == 1
28
+ 1
29
+ elsif n >= 2
30
+ fibonacci_exponential(n-1) + fibonacci_exponential(n-2)
31
+ end
32
+ end
33
+
34
+
35
+ # fibonacci numbers
36
+ def self.fibonacci_linear(n)
37
+ if !n.is_a? Integer or n < 0
38
+ raise ArgumentError
39
+ end
40
+
41
+ if n == 0
42
+ 0
43
+ elsif n == 1
44
+ 1
45
+ elsif n >= 2
46
+ a = 0
47
+ b = 1
48
+ 2.upto(n) {
49
+ b, a = a + b, b
50
+ }
51
+ b
52
+ end
53
+ end
54
+
55
+ # fibonacci sequences can be calculated in matrix multiplying
56
+ # [[f(n+1), f(n)], [f(n), f(n-1)]] equals [[1,1], [1,0]] to the nth
57
+ # matrix multiplying can be achieved in logarithm time if we use divide and conquer
58
+ def self.fibonacci_logarithm(n)
59
+ if !n.is_a? Integer or n < 0
60
+ raise ArgumentError
61
+ end
62
+
63
+ if n == 0
64
+ 0
65
+ elsif n == 1
66
+ 1
67
+ elsif n >= 2
68
+ result = self.fibonacci_matrix_nth(n)
69
+ result[0][1]
70
+ end
71
+ end
72
+
73
+ def self.fibonacci_matrix_nth(n)
74
+ first = [[1,1], [1,0]]
75
+ if n == 1
76
+ first
77
+ elsif n % 2 == 0
78
+ half = self.fibonacci_matrix_nth(n/2)
79
+ square_matrix_multiply(half, half)
80
+ else
81
+ square_matrix_multiply(first, self.fibonacci_matrix_nth(n-1))
82
+ end
83
+ end
84
+
85
+ def self.square_matrix_multiply(a, b, size=2)
86
+ result = []
87
+ n = size - 1
88
+ 0.upto(n) do |i|
89
+ result[i] = []
90
+ 0.upto(n) do |j|
91
+ result[i][j] = 0
92
+ 0.upto(n) do |k|
93
+ result[i][j] += a[i][k] * b[k][j]
94
+ end
95
+ end
96
+ end
97
+ result
98
+ end
99
+
100
+
101
+ # It is kind of cheating, but mathematicians are unbelievable,
102
+ # they figured out a function to calculate the fibonacci sequence directly.
103
+ # There's limitation on the 64-bit float numbers, so only use it to calculate small numbers.
104
+ def self.fibonacci_constant(n)
105
+ phi = 1.618034
106
+ ((phi ** n - (1-phi) ** n) / Math.sqrt(5)).round
107
+ end
108
+
109
+
14
110
  # Binary search in sorted array
15
111
  def self.binary_search(data, target, low, high)
16
112
  return false if low > high
@@ -64,5 +160,39 @@ module DSA
64
160
  quick_sort!(data, left, high)
65
161
  end
66
162
 
163
+ # radix sort, in base 10
164
+ def self.radix_sort(data)
165
+ goto_next_digit = true
166
+ position = 0
167
+ while goto_next_digit
168
+ goto_next_digit = false
169
+ buckets = []
170
+ 10.times { buckets << [] }
171
+ data.each do |number|
172
+ digit = get_digit(number, position)
173
+ goto_next_digit = true if digit > 0 # if all digits are zero, loop will end
174
+ buckets[digit] << number
175
+ end
176
+ data = buckets.flatten!
177
+ position += 1
178
+ end
179
+ data
180
+ end
181
+
182
+ def self.sqrt(n)
183
+ err = 1e-10
184
+ r = Float(n)
185
+ while (r - n/r).abs >= err
186
+ r = ( r + n/r ) / 2
187
+ end
188
+ r
189
+ end
190
+
191
+
192
+ private
193
+ def self.get_digit(number, position)
194
+ number % (10 ** (position+1)) / (10 ** position)
195
+ end
196
+
67
197
  end
68
198
  end
@@ -1,3 +1,3 @@
1
- module DSA
2
- VERSION = "0.0.3"
3
- end
1
+ module DSA
2
+ VERSION = '1.0.0'
3
+ end
@@ -17,11 +17,41 @@ class MyTest < Test::Unit::TestCase
17
17
  # Do nothing
18
18
  end
19
19
 
20
+ def test_sqrt
21
+ puts 'square root of 2 is ', DSA::Algorithm::sqrt(2)
22
+ puts 'square root of 25 is ', DSA::Algorithm::sqrt(25)
23
+ puts 'square root of 123456.789 is ', DSA::Algorithm::sqrt(123456.789)
24
+ end
25
+
26
+ def test_radix_sort
27
+ assert_equal( 2, DSA::Algorithm::get_digit(123, 1), 'get digit failed' )
28
+ assert_equal( 0, DSA::Algorithm::get_digit(123, 5), 'get digit failed' )
29
+ original = [123,6,7890,88,32,254,345677,238,1,125,29,226]
30
+ expected = [1, 6, 29, 32, 88, 123, 125, 226, 238, 254, 7890, 345677]
31
+ assert_equal expected, DSA::Algorithm::radix_sort(original), 'sort failed'
32
+ end
33
+
20
34
  def test_function
21
35
  assert_equal 120, DSA::Algorithm::factorial(5), 'factorial function is wrong'
22
36
  assert DSA::Algorithm::binary_search((1..9).to_a, 2, 0, 8), 'binary search failed'
37
+ assert_equal 55, DSA::Algorithm::fibonacci(10), 'fibonacci failed'
23
38
  end
24
39
 
40
+ def test_fibonacci
41
+ assert_equal 55, DSA::Algorithm::fibonacci_exponential(10), 'fibonacci_exponential failed'
42
+ assert_equal 55, DSA::Algorithm::fibonacci_linear(10), 'fibonacci_linear failed'
43
+ assert_equal 55, DSA::Algorithm::fibonacci_logarithm(10), 'fibonacci_logarithm failed'
44
+ assert_equal 55, DSA::Algorithm::fibonacci_constant(10), 'fibonacci_constant failed'
45
+ Benchmark.bm(20) do |x|
46
+ # x.report('fibonacci exponential') { DSA::Algorithm::fibonacci_exponential(35) }
47
+ x.report('fibonacci linear') { DSA::Algorithm::fibonacci_linear(99999) }
48
+ x.report('fibonacci logarithm') { DSA::Algorithm::fibonacci_logarithm(99999) }
49
+ x.report('fibonacci constant') { DSA::Algorithm::fibonacci_constant(1000) }
50
+ # x.report('fibonacci constant') { DSA::Algorithm::fibonacci_constant(100000) }
51
+ end
52
+ end
53
+
54
+
25
55
  def test_performance
26
56
  puts
27
57
 
@@ -50,11 +80,8 @@ class MyTest < Test::Unit::TestCase
50
80
  end
51
81
 
52
82
  def test_sort_performance
53
-
54
-
55
-
56
83
  puts 'sort on already sorted'
57
- puts
84
+ puts '=' * 50
58
85
  value = 10**5
59
86
  sorted_a = (0..value).to_a
60
87
  sorted_b = sorted_a.map {|e| e}
@@ -69,8 +96,9 @@ class MyTest < Test::Unit::TestCase
69
96
  assert_equal sorted_a, sorted_b, ''
70
97
  assert_equal sorted_a, sorted_c, ''
71
98
 
72
-
99
+ puts
73
100
  puts 'sort on not sorted'
101
+ puts '=' * 50
74
102
  value = 10**4
75
103
  not_sorted_a = value.times.map { Random.rand(value) }
76
104
  not_sorted_b = not_sorted_a.map { |e| e }
@@ -83,12 +111,16 @@ class MyTest < Test::Unit::TestCase
83
111
  assert_equal not_sorted_a, not_sorted_b, ''
84
112
  assert_equal not_sorted_a, not_sorted_c, ''
85
113
 
86
- puts 'sort on not sorted'
114
+ puts
115
+ puts 'sort on a million not sorted'
116
+ puts '=' * 50
87
117
  value = 10**6
88
118
  not_sorted_b = value.times.map { Random.rand(value) }
89
119
  not_sorted_c = value.times.map { Random.rand(value) }
120
+ not_sorted_d = value.times.map { Random.rand(value) }
90
121
  Benchmark.bm(20) do |x|
91
122
  x.report('quick sort') { DSA::Algorithm::quick_sort! not_sorted_c, 0, not_sorted_c.length-1 }
123
+ x.report('radix sort') { DSA::Algorithm::radix_sort not_sorted_d }
92
124
  x.report('built in sort') { not_sorted_b.sort! }
93
125
  end
94
126
 
metadata CHANGED
@@ -1,44 +1,44 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: DSA
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - lusaisai
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-03-22 00:00:00.000000000 Z
11
+ date: 2015-03-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ~>
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
19
  version: '1.5'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ~>
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.5'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '>='
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - '>='
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
- description: List, BinarySearchTree(RedBlackTree), PriorityQueue, (Array/List)Stack
41
+ description: List, BinarySearchTree(RedBlackTree), SkipList, PriorityQueue, (Array/List)Stack
42
42
  and Queue
43
43
  email:
44
44
  - lusaisai@163.com
@@ -46,7 +46,7 @@ executables: []
46
46
  extensions: []
47
47
  extra_rdoc_files: []
48
48
  files:
49
- - .gitignore
49
+ - ".gitignore"
50
50
  - DSA.gemspec
51
51
  - Gemfile
52
52
  - LICENSE.txt
@@ -76,17 +76,17 @@ require_paths:
76
76
  - lib
77
77
  required_ruby_version: !ruby/object:Gem::Requirement
78
78
  requirements:
79
- - - '>='
79
+ - - ">="
80
80
  - !ruby/object:Gem::Version
81
81
  version: '0'
82
82
  required_rubygems_version: !ruby/object:Gem::Requirement
83
83
  requirements:
84
- - - '>='
84
+ - - ">="
85
85
  - !ruby/object:Gem::Version
86
86
  version: '0'
87
87
  requirements: []
88
88
  rubyforge_project:
89
- rubygems_version: 2.0.14
89
+ rubygems_version: 2.2.2
90
90
  signing_key:
91
91
  specification_version: 4
92
92
  summary: Data Structures and Algorithms in Ruby