dskiplist 0.0.2 → 1.0.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 89e285ab3fac883f1ad22f5959e1a85672c9412f
4
- data.tar.gz: 8ed03b7fda7c621f0f806840958eeaa85e03759f
3
+ metadata.gz: d4ae3f9e4947138a5eff42cf7e5ba9d3880efdae
4
+ data.tar.gz: 11d5d9ef6b19298fa1a65cf89837ecf0d0197f02
5
5
  SHA512:
6
- metadata.gz: f3f1318ad48db40ee5aff1cde484508a3e8707f0d99a5433088b13a822cfa81010c9ed3ba24c856aa61db1c988104141edcb18bacec79c019b1f29caccbcac24
7
- data.tar.gz: 7a218abfea5cc99740a54ba22b15f16ab8b2c8a42200433f8107b6ee2bd4649b4a8daf9fe32edfbf3c44ca7ea341933a46946c418f0e42727e8e3c9a0cbf0510
6
+ metadata.gz: 28887ea80ed34d66a994d0cc6f055c399d8a14ba87b63be7885432d24d6a166b67bc6732eb5a7df46981b1d1370849dac15db03879314b9b88141681b0fe9519
7
+ data.tar.gz: 4002864d186702f36c99ab3679ef76d09c29aa425918c1bd5d2e971b0ea97a3686bdfbdad21e9cf383b1e77fc3d19fe8a612b04238f96376674d97c66b068c07
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # DSkipList
2
2
 
3
- Warning: This software is alpha.
3
+ Warning: This software is alpha. If you find a bug, please file the issue on github
4
4
 
5
5
  This is a ruby skiplist much faster than the ruby skiplist gem here https://github.com/metanest/ruby-skiplist
6
6
  Benchmarks below
@@ -27,6 +27,7 @@ require 'dskiplist'
27
27
 
28
28
  list = DSkipList.new
29
29
 
30
+ #strings and symbols are also valid keys, just keep it consistent
30
31
  list[1] = 'dog'
31
32
  list[2] = 'cat'
32
33
 
data/dskiplist.gemspec CHANGED
@@ -19,4 +19,5 @@ Gem::Specification.new do |spec|
19
19
  spec.add_development_dependency "rspec"
20
20
  spec.add_development_dependency "bundler", "~> 1.5"
21
21
  spec.add_development_dependency "rake"
22
+ spec.add_development_dependency "pry"
22
23
  end
Binary file
@@ -1,3 +1,3 @@
1
1
  module Dskiplist
2
- VERSION = "0.0.2"
2
+ VERSION = "1.0.0"
3
3
  end
data/lib/dskiplist.rb CHANGED
@@ -51,25 +51,28 @@ class DSkipList
51
51
  initialize(@max_level)
52
52
  return self
53
53
  end
54
-
54
+
55
+ #returns previous node if exact key match is not found
55
56
  def find_node(search_key)
56
57
  x = @header
57
58
  @level.downto(0) do |i|
59
+ #puts "on level #{i}"
58
60
  while x.forward[i] and x.forward[i].key < search_key
61
+ #puts "walked node #{x.key} on level #{i}"
59
62
  x = x.forward[i]
60
63
  end
61
64
  end
62
- x = x.forward[0]
63
- if x and x.key == search_key
64
- return x
65
- else
66
- return nil
67
- end
65
+ x = x.forward[0] if x.forward[0].key == search_key
66
+ return x
68
67
  end
69
68
 
70
69
  def [] key
71
70
  node = self.find_node(key)
72
- return node.value if node
71
+ if node and node.key == key
72
+ return node.value
73
+ else
74
+ return nil
75
+ end
73
76
  end
74
77
 
75
78
  def random_level
@@ -147,29 +150,25 @@ class DSkipList
147
150
  def walk(from, to, limit, level, output)
148
151
  if from
149
152
  x = find_node(from)
150
- raise 'start node not found' if !x
153
+ x = x.forward[level] if x.forward[level]
151
154
  else
152
155
  x = @header.forward[level]
153
156
  end
154
- if to
155
- to_node = find_node(to)
156
- raise 'stop node not found' if !to_node
157
- end
158
- #if no block is given, assume we are trying to count
157
+ #if no block is given, assume we are trying to count and avoid the expensive yield below
159
158
  if !block_given?
160
159
  count = 0
161
160
  while x
161
+ break if to && x.key >= to
162
162
  count += 1
163
- break if to_node == x
164
163
  x = x.forward[level]
165
164
  end
166
165
  return count
167
- elsif to_node or limit
166
+ elsif to or limit
168
167
  count = 0
169
- while x
168
+ while !x.nil?
170
169
  yield(x, output)
171
170
  count += 1
172
- break if to_node and x == to_node
171
+ break if to and x.key >= to
173
172
  break if limit and count == limit
174
173
  x = x.forward[level]
175
174
  end
@@ -1,5 +1,6 @@
1
1
  require 'rspec'
2
- require 'dskiplist'
2
+ require './lib/dskiplist.rb'
3
+ require 'pry'
3
4
  #Checks for stray links in the upper levels. There may be a more exhaustive way to check integrity.
4
5
  def check_integrity(list)
5
6
  complete = list.to_a
@@ -12,6 +13,7 @@ def check_integrity(list)
12
13
  end
13
14
 
14
15
  describe "The skiplist" do
16
+ puts "test suite launching"
15
17
  before :each do
16
18
  @list = DSkipList.new
17
19
  100.times {|n| @list[n] = n}
@@ -21,6 +23,7 @@ describe "The skiplist" do
21
23
  end
22
24
 
23
25
  it "should lookup value correctly" do
26
+ puts "30 returned #{@list[30]}"
24
27
  expect(@list[30]).to eq(30)
25
28
  end
26
29
 
@@ -31,14 +34,14 @@ describe "The skiplist" do
31
34
 
32
35
  it "should count correctly" do
33
36
  expect(@list.count).to eq(100)
34
- expect(@list.count(50,99)).to eq(50)
35
- expect(@list.count(1,1)).to eq(1)
37
+ expect(@list.count(50,99)).to eq(48)
38
+ expect(@list.count(1,1)).to eq(0)
36
39
  end
37
40
 
38
41
  it "should convert to array" do
39
42
  entire = @list.to_a
40
43
  expect(entire.count).to eq(100)
41
- subset = @list.to_a(26,50)
44
+ subset = @list.to_a(25,50)
42
45
  expect(subset.count).to eq(25)
43
46
  26.upto(50) do |n|
44
47
  expect(subset.include? n).to eq(true)
@@ -47,9 +50,9 @@ describe "The skiplist" do
47
50
 
48
51
  it "should convert to hash" do
49
52
  expect(@list.to_h.count).to eq(100)
50
- expect(@list.to_h(51,75).count).to eq(25)
53
+ expect(@list.to_h(50,75).count).to eq(25)
51
54
  subset = @list.to_h(25,50)
52
- 25.upto(50) do |n|
55
+ 26.upto(50) do |n|
53
56
  expect(subset[n]).to eq(n)
54
57
  end
55
58
  end
@@ -62,5 +65,7 @@ describe "The skiplist" do
62
65
  it "should delete multiple elements properly" do
63
66
  (25..75).each {|n| @list.delete n}
64
67
  (25..75).each {|n| expect(@list[n]).to eq(nil)}
68
+ #check sizes of each level to make sure we aren't chopping off the tail when we delete. Seems fine
69
+ #@list.level.downto(0) {|l| puts "level #{l} contains #{@list.count(nil, nil, l)}"}
65
70
  end
66
71
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dskiplist
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Forrest Allison
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-02-12 00:00:00.000000000 Z
11
+ date: 2014-02-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: pry
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
55
69
  description:
56
70
  email:
57
71
  - light24bulbs@gmail.com
@@ -59,7 +73,6 @@ executables: []
59
73
  extensions: []
60
74
  extra_rdoc_files: []
61
75
  files:
62
- - ".dskiplist.gemspec.swo"
63
76
  - ".git-new/HEAD"
64
77
  - ".git-new/config"
65
78
  - ".git-new/description"
@@ -82,7 +95,6 @@ files:
82
95
  - ".git-new/objects/ae/ee3428c017916e5cc0e57d387224f33ed0b990"
83
96
  - ".git-new/objects/d8/7d4be66f458acd52878902bbf1391732ad21e1"
84
97
  - ".gitignore"
85
- - ".skiplist-test.rb.swo"
86
98
  - Gemfile
87
99
  - LICENSE.txt
88
100
  - README.md
Binary file
Binary file