btree 0.0.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 64a14900f4f059a6341312729643c101a88d19ea
4
+ data.tar.gz: da8ab66ed5bdf738658f2ef7ecb1421c9d58d1dc
5
+ SHA512:
6
+ metadata.gz: 0a1929ec3cb16b36af5ef5cbc1546bf59652f4aeddf6765b9ff70c7ea502c77827e29fb41ce7b556d7bb93c3cf6f293b46ce1ae06dcd79551cfe4b8e5d74924c
7
+ data.tar.gz: 26fc63048a49802026ba22661f025fc904d295ff0198c277dfd410650bbf539efb2477203e778d13e3328af2ed0247d6aeee1083d39bfaa5d88d545e5eb4d7f3
data/Gemfile ADDED
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+ source "https://rubygems.org"
3
+ #repo_name "seifertd/Ruby-BTree"
4
+ git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
5
+
6
+ # gem "rails"
7
+
8
+ # Added at 2017-11-09 08:39:45 -0800 by doug:
9
+ gem "rake", "~> 12.2", :group => [:development, :test]
10
+
11
+ # Added at 2017-11-09 08:40:02 -0800 by doug:
12
+ gem "bones", "~> 3.8", :group => [:development, :test]
13
+
14
+ # Added at 2017-11-09 08:40:12 -0800 by doug:
15
+ gem "shoulda", "~> 3.5", :group => [:development, :test]
@@ -0,0 +1,41 @@
1
+ GEM
2
+ remote: https://rubygems.org/
3
+ specs:
4
+ activesupport (5.1.4)
5
+ concurrent-ruby (~> 1.0, >= 1.0.2)
6
+ i18n (~> 0.7)
7
+ minitest (~> 5.1)
8
+ tzinfo (~> 1.1)
9
+ bones (3.8.4)
10
+ little-plugger (~> 1.1)
11
+ loquacious (~> 1.9)
12
+ rake (~> 12.0)
13
+ rdoc (~> 5.0)
14
+ concurrent-ruby (1.0.5)
15
+ i18n (0.9.1)
16
+ concurrent-ruby (~> 1.0)
17
+ little-plugger (1.1.4)
18
+ loquacious (1.9.1)
19
+ minitest (5.10.3)
20
+ rake (12.2.1)
21
+ rdoc (5.1.0)
22
+ shoulda (3.5.0)
23
+ shoulda-context (~> 1.0, >= 1.0.1)
24
+ shoulda-matchers (>= 1.4.1, < 3.0)
25
+ shoulda-context (1.2.2)
26
+ shoulda-matchers (2.8.0)
27
+ activesupport (>= 3.0.0)
28
+ thread_safe (0.3.6)
29
+ tzinfo (1.2.4)
30
+ thread_safe (~> 0.1)
31
+
32
+ PLATFORMS
33
+ ruby
34
+
35
+ DEPENDENCIES
36
+ bones (~> 3.8)
37
+ rake (~> 12.2)
38
+ shoulda (~> 3.5)
39
+
40
+ BUNDLED WITH
41
+ 1.15.3
data/README.md CHANGED
@@ -1,5 +1,5 @@
1
- Ruby-BTree
2
- ==========
1
+ btree
2
+ =====
3
3
 
4
4
  Pure ruby implementation of a btree as described in Introduction to Algorithms by
5
5
  Cormen, Leiserson, Rivest and Stein, Chapter 18.
data/Rakefile CHANGED
@@ -12,7 +12,8 @@ Bones {
12
12
  name 'btree'
13
13
  authors 'Douglas A. Seifert'
14
14
  email 'doug@dseifert.net'
15
- url 'http://www.dseifert.net/btree'
15
+ url 'https://github.com/seifertd/Ruby-BTree'
16
16
  readme_file 'README.md'
17
+ exclude ['.bnsignore', '.gitignore', '.ruby-gemset', '.ruby-version', '.travis.yml', 'vendor', '.git']
17
18
  }
18
19
 
@@ -1,18 +1,16 @@
1
1
  class Btree::Node
2
- attr_accessor :leaf
3
2
  def initialize(degree)
4
3
  @degree = degree
5
4
  @keys = []
6
5
  @children = []
7
- @leaf = true
8
6
  end
9
7
 
10
8
  def dump(level = 0)
11
9
  @keys.each_with_index do |key, idx|
10
+ puts "LEVEL: #{level} => #{key.first}: full? #{full?} leaf? #{leaf?} children: #{values.inspect}"
12
11
  if @children[idx]
13
12
  @children[idx].dump(level + 1)
14
13
  end
15
- puts "#{level}: #{key.first}: full? #{full?} leaf? #{leaf?}"
16
14
  end
17
15
  (@children[@keys.size..-1] || []).each do |c|
18
16
  c.dump(level+1)
@@ -41,24 +39,51 @@ class Btree::Node
41
39
  end
42
40
 
43
41
  def leaf?
44
- @leaf
42
+ @children.length == 0
45
43
  end
46
44
 
47
45
  def size
48
46
  @keys.size
49
47
  end
50
48
 
49
+ def values_of(range)
50
+
51
+ result = Array.new
52
+
53
+ i = 1
54
+ while i <= size && range.end >= @keys[i-1].first
55
+ if range.cover? @keys[i-1].first
56
+ result << @keys[i-1].last
57
+ child = @children[i-1].values_of(range) unless leaf?
58
+ result += child if child
59
+ end
60
+ i += 1
61
+ end
62
+
63
+ result
64
+
65
+ end
66
+
67
+
51
68
  def value_of(key)
69
+
70
+ return values_of(key) if key.kind_of? Range
71
+
52
72
  i = 1
53
73
  while i <= size && key > @keys[i-1].first
54
74
  i += 1
55
75
  end
56
76
 
77
+ #puts "Getting value of key #{key}, i = #{i}, keys = #{@keys.inspect}, leaf? #{leaf?}, numchildren: #{@children.size}"
78
+
57
79
  if i <= size && key == @keys[i-1].first
80
+ #puts "Found key: #{key.inspect}"
58
81
  return @keys[i-1].last
59
82
  elsif leaf?
83
+ #puts "We are a leaf, no more children, so val is nil"
60
84
  return nil
61
85
  else
86
+ #puts "Looking into child #{i}"
62
87
  return @children[i-1].value_of(key)
63
88
  end
64
89
  end
@@ -94,7 +119,6 @@ class Btree::Node
94
119
  splitee = @children[child_idx]
95
120
  y = Btree::Node.new(@degree)
96
121
  z = Btree::Node.new(@degree)
97
- z.leaf = splitee.leaf
98
122
  (@degree-1).times do |j|
99
123
  z._keys[j] = splitee._keys[j+@degree]
100
124
  y._keys[j] = splitee._keys[j]
@@ -6,7 +6,6 @@ class Btree::Tree
6
6
  def initialize(degree = 2)
7
7
  @degree = degree
8
8
  @root = Btree::Node.new(@degree)
9
- @root.leaf = true
10
9
  @size = 0
11
10
  end
12
11
 
@@ -15,7 +14,6 @@ class Btree::Tree
15
14
  node = @root
16
15
  if node.full?
17
16
  @root = Btree::Node.new(@degree)
18
- @root.leaf = false
19
17
  @root.add_child(node)
20
18
  @root.split(@root.children.size - 1)
21
19
  #puts "After split, root = #{@root.inspect}"
@@ -0,0 +1,7 @@
1
+ require "./lib/btree"
2
+
3
+ t = Btree.create(2)
4
+ 45.times {|n| t.insert n, n*n}
5
+ puts "tree size = #{t.size}"
6
+ puts "Value of 0: #{t.value_of(0).inspect}"
7
+ t.dump
@@ -1,8 +1,8 @@
1
- require 'test/unit'
1
+ require 'minitest/autorun'
2
2
  require 'btree'
3
3
  require 'shoulda'
4
4
 
5
- class TestBtree < Test::Unit::TestCase
5
+ class TestBtree < MiniTest::Test
6
6
  def test_insert_notfull
7
7
  t = Btree.create(5)
8
8
  t.insert(5, "5")
@@ -26,6 +26,17 @@ class TestBtree < Test::Unit::TestCase
26
26
  end
27
27
  end
28
28
 
29
+ def test_insert_a_lot
30
+ t = Btree.create(2)
31
+ 45.times do |i|
32
+ t.insert i, i*i
33
+ end
34
+ assert_equal 45, t.size
35
+ 45.times do |i|
36
+ assert_equal i*i, t.value_of(i)
37
+ end
38
+ end
39
+
29
40
  def test_value_of
30
41
  t = Btree.create(5)
31
42
  t.insert(1, "foo")
@@ -38,6 +49,7 @@ class TestBtree < Test::Unit::TestCase
38
49
  assert_equal "foo", t.value_of(1)
39
50
  assert_nil t.value_of(11)
40
51
  assert_equal 4, t.size
52
+ assert_equal ["findme", "bar"], t.value_of(3..6)
41
53
  end
42
54
 
43
55
  def test_fill_root
@@ -1 +1 @@
1
- 0.0.0
1
+ 1.0.0
metadata CHANGED
@@ -1,96 +1,73 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: btree
3
- version: !ruby/object:Gem::Version
4
- hash: 31
5
- prerelease: false
6
- segments:
7
- - 0
8
- - 0
9
- - 0
10
- version: 0.0.0
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
11
5
  platform: ruby
12
- authors:
6
+ authors:
13
7
  - Douglas A. Seifert
14
8
  autorequire:
15
9
  bindir: bin
16
10
  cert_chain: []
17
-
18
- date: 2010-12-20 00:00:00 -08:00
19
- default_executable:
20
- dependencies:
21
- - !ruby/object:Gem::Dependency
11
+ date: 2017-11-09 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
22
14
  name: bones
23
- prerelease: false
24
- requirement: &id001 !ruby/object:Gem::Requirement
25
- none: false
26
- requirements:
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
27
17
  - - ">="
28
- - !ruby/object:Gem::Version
29
- hash: 27
30
- segments:
31
- - 3
32
- - 5
33
- - 4
34
- version: 3.5.4
18
+ - !ruby/object:Gem::Version
19
+ version: 3.8.4
35
20
  type: :development
36
- version_requirements: *id001
37
- description: |-
38
- Pure ruby implementation of a btree as described in Introduction to Algorithms by
39
- Cormen, Leiserson, Rivest and Stein, Chapter 18.
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 3.8.4
27
+ description: "Pure ruby implementation of a btree as described in Introduction to
28
+ Algorithms by \nCormen, Leiserson, Rivest and Stein, Chapter 18."
40
29
  email: doug@dseifert.net
41
30
  executables: []
42
-
43
31
  extensions: []
44
-
45
- extra_rdoc_files:
32
+ extra_rdoc_files:
46
33
  - History.txt
47
- - lib/btree/.node.rb.swp
48
- - version.txt
49
- files:
50
- - .bnsignore
34
+ files:
35
+ - Gemfile
36
+ - Gemfile.lock
51
37
  - History.txt
52
38
  - README.md
53
39
  - Rakefile
54
40
  - lib/btree.rb
55
- - lib/btree/.node.rb.swp
56
41
  - lib/btree/node.rb
57
42
  - lib/btree/tree.rb
43
+ - lib/insert_alot.rb
58
44
  - test/test_btree.rb
59
45
  - version.txt
60
- has_rdoc: true
61
- homepage: http://www.dseifert.net/btree
46
+ homepage: https://github.com/seifertd/Ruby-BTree
62
47
  licenses: []
63
-
48
+ metadata: {}
64
49
  post_install_message:
65
- rdoc_options:
66
- - --main
50
+ rdoc_options:
51
+ - "--main"
67
52
  - README.md
68
- require_paths:
53
+ require_paths:
69
54
  - lib
70
- required_ruby_version: !ruby/object:Gem::Requirement
71
- none: false
72
- requirements:
55
+ required_ruby_version: !ruby/object:Gem::Requirement
56
+ requirements:
73
57
  - - ">="
74
- - !ruby/object:Gem::Version
75
- hash: 3
76
- segments:
77
- - 0
78
- version: "0"
79
- required_rubygems_version: !ruby/object:Gem::Requirement
80
- none: false
81
- requirements:
58
+ - !ruby/object:Gem::Version
59
+ version: '0'
60
+ required_rubygems_version: !ruby/object:Gem::Requirement
61
+ requirements:
82
62
  - - ">="
83
- - !ruby/object:Gem::Version
84
- hash: 3
85
- segments:
86
- - 0
87
- version: "0"
63
+ - !ruby/object:Gem::Version
64
+ version: '0'
88
65
  requirements: []
89
-
90
66
  rubyforge_project: btree
91
- rubygems_version: 1.3.7
67
+ rubygems_version: 2.6.12
92
68
  signing_key:
93
- specification_version: 3
94
- summary: Pure ruby implementation of a btree as described in Introduction to Algorithms by Cormen, Leiserson, Rivest and Stein, Chapter 18.
95
- test_files:
69
+ specification_version: 4
70
+ summary: Pure ruby implementation of a btree as described in Introduction to Algorithms
71
+ by Cormen, Leiserson, Rivest and Stein, Chapter 18.
72
+ test_files:
96
73
  - test/test_btree.rb
data/.bnsignore DELETED
@@ -1,18 +0,0 @@
1
- # The list of files that should be ignored by Mr Bones.
2
- # Lines that start with '#' are comments.
3
- #
4
- # A .gitignore file can be used instead by setting it as the ignore
5
- # file in your Rakefile:
6
- #
7
- # Bones {
8
- # ignore_file '.gitignore'
9
- # }
10
- #
11
- # For a project with a C extension, the following would be a good set of
12
- # exclude patterns (uncomment them if you want to use them):
13
- # *.[oa]
14
- # *~
15
- announcement.txt
16
- coverage
17
- doc
18
- pkg
Binary file