segment_tree 0.0.2 → 0.0.3
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.
- data/lib/segment_tree/version.rb +1 -1
- data/lib/segment_tree.rb +30 -7
- metadata +7 -17
data/lib/segment_tree/version.rb
CHANGED
data/lib/segment_tree.rb
CHANGED
@@ -1,23 +1,45 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
# == Synopsys
|
2
|
+
# Segment tree is a tree data structure for storing intervals, or segments.
|
3
|
+
# It allows querying which of the stored segments contain a given point.
|
4
|
+
# It is, in principle, a static structure; that is, its content cannot be modified once the structure is built.
|
5
|
+
#
|
6
|
+
# == Example
|
7
|
+
# data = [
|
8
|
+
# [IPAddr.new('87.224.241.0/24').to_range, {:city => "YEKT"}],
|
9
|
+
# [IPAddr.new('195.58.18.0/24').to_range, {:city => "MSK"}]
|
10
|
+
# # and so on
|
11
|
+
# ]
|
12
|
+
# ip_tree = SegmentTree.new(data)
|
13
|
+
#
|
14
|
+
# client_ip = IPAddr.new("87.224.241.66")
|
15
|
+
# ip_tree.find_first(client_ip).value # => {:city=>"YEKT"}
|
3
16
|
class SegmentTree
|
4
17
|
# An abstract tree node
|
5
18
|
class Node #:nodoc:all:
|
6
|
-
|
7
|
-
|
19
|
+
attr_reader :begin, :end
|
20
|
+
|
21
|
+
def initialize(*)
|
22
|
+
@begin, @end = @range.begin, @range.end
|
23
|
+
end
|
24
|
+
protected :initialize
|
25
|
+
|
26
|
+
def include?(x)
|
27
|
+
@range.include?(x)
|
28
|
+
end
|
8
29
|
end
|
9
30
|
|
10
31
|
# An elementary intervals or nodes container
|
11
32
|
class Container < Node #:nodoc:all:
|
12
33
|
extend Forwardable
|
13
34
|
|
14
|
-
attr_reader :left, :right
|
35
|
+
#attr_reader :left, :right
|
15
36
|
|
16
37
|
# Node constructor, accepts both +Node+ and +Segment+
|
17
38
|
def initialize(left, right)
|
18
39
|
@left, @right = left, right
|
19
|
-
|
20
40
|
@range = left.begin..(right || left).end
|
41
|
+
|
42
|
+
super
|
21
43
|
end
|
22
44
|
|
23
45
|
# Find all intervals containing point +x+ within node's children. Returns array
|
@@ -48,6 +70,7 @@ class SegmentTree
|
|
48
70
|
raise ArgumentError, 'Range expected, %s given' % range.class.name unless range.is_a?(Range)
|
49
71
|
|
50
72
|
@range, @value = range, value
|
73
|
+
super
|
51
74
|
end
|
52
75
|
|
53
76
|
def find(x)
|
@@ -55,7 +78,7 @@ class SegmentTree
|
|
55
78
|
end
|
56
79
|
|
57
80
|
def find_first(x)
|
58
|
-
include?(x) ? self : nil
|
81
|
+
@range.include?(x) ? self : nil
|
59
82
|
end
|
60
83
|
end
|
61
84
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: segment_tree
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-08-
|
12
|
+
date: 2012-08-04 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
16
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirement: &82956300 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,15 +21,10 @@ dependencies:
|
|
21
21
|
version: '1.0'
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements:
|
25
|
-
none: false
|
26
|
-
requirements:
|
27
|
-
- - ! '>='
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
version: '1.0'
|
24
|
+
version_requirements: *82956300
|
30
25
|
- !ruby/object:Gem::Dependency
|
31
26
|
name: rspec
|
32
|
-
requirement: !ruby/object:Gem::Requirement
|
27
|
+
requirement: &82956050 !ruby/object:Gem::Requirement
|
33
28
|
none: false
|
34
29
|
requirements:
|
35
30
|
- - ! '>='
|
@@ -37,12 +32,7 @@ dependencies:
|
|
37
32
|
version: '2.11'
|
38
33
|
type: :development
|
39
34
|
prerelease: false
|
40
|
-
version_requirements:
|
41
|
-
none: false
|
42
|
-
requirements:
|
43
|
-
- - ! '>='
|
44
|
-
- !ruby/object:Gem::Version
|
45
|
-
version: '2.11'
|
35
|
+
version_requirements: *82956050
|
46
36
|
description: Tree data structure for storing segments. It allows querying which of
|
47
37
|
the stored segments contain a given point.
|
48
38
|
email: amikhailov83@gmail.com
|
@@ -76,7 +66,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
76
66
|
version: '0'
|
77
67
|
requirements: []
|
78
68
|
rubyforge_project:
|
79
|
-
rubygems_version: 1.8.
|
69
|
+
rubygems_version: 1.8.17
|
80
70
|
signing_key:
|
81
71
|
specification_version: 3
|
82
72
|
summary: Tree data structure for storing segments. It allows querying which of the
|