data_structures_rmolinari 0.4.3 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +19 -0
- data/README.md +119 -33
- data/Rakefile +6 -4
- data/ext/c_disjoint_union/disjoint_union.c +75 -129
- data/ext/c_disjoint_union/extconf.rb +7 -2
- data/ext/c_segment_tree_template/extconf.rb +17 -0
- data/ext/c_segment_tree_template/segment_tree_template.c +363 -0
- data/ext/shared.c +32 -0
- data/lib/data_structures_rmolinari/algorithms.rb +5 -5
- data/lib/data_structures_rmolinari/c_segment_tree_template_impl.rb +15 -0
- data/lib/data_structures_rmolinari/disjoint_union.rb +2 -0
- data/lib/data_structures_rmolinari/segment_tree.rb +126 -0
- data/lib/data_structures_rmolinari/segment_tree_template.rb +11 -8
- data/lib/data_structures_rmolinari.rb +5 -62
- metadata +8 -2
@@ -10,73 +10,16 @@ end
|
|
10
10
|
|
11
11
|
# These define classes inside module DataStructuresRMolinari
|
12
12
|
require_relative 'data_structures_rmolinari/algorithms'
|
13
|
+
|
13
14
|
require_relative 'data_structures_rmolinari/disjoint_union'
|
14
15
|
require_relative 'data_structures_rmolinari/c_disjoint_union' # version as a C extension
|
15
|
-
|
16
|
+
|
17
|
+
require_relative 'data_structures_rmolinari/segment_tree'
|
18
|
+
|
16
19
|
require_relative 'data_structures_rmolinari/heap'
|
17
20
|
require_relative 'data_structures_rmolinari/max_priority_search_tree'
|
18
21
|
require_relative 'data_structures_rmolinari/min_priority_search_tree'
|
19
22
|
|
20
23
|
module DataStructuresRMolinari
|
21
|
-
|
22
|
-
# Concrete instances of Segment Tree
|
23
|
-
#
|
24
|
-
# @todo consider moving these into generic_segment_tree.rb and renaming that file
|
25
|
-
|
26
|
-
# A segment tree that for an array A(0...n) answers questions of the form "what is the maximum value in the subinterval A(i..j)?"
|
27
|
-
# in O(log n) time.
|
28
|
-
class MaxValSegmentTree
|
29
|
-
extend Forwardable
|
30
|
-
|
31
|
-
# Tell the tree that the value at idx has changed
|
32
|
-
def_delegator :@structure, :update_at
|
33
|
-
|
34
|
-
# @param data an object that contains values at integer indices based at 0, via +data[i]+.
|
35
|
-
# - This will usually be an Array, but it could also be a hash or a proc.
|
36
|
-
def initialize(data)
|
37
|
-
@structure = SegmentTreeTemplate.new(
|
38
|
-
combine: ->(a, b) { [a, b].max },
|
39
|
-
single_cell_array_val: ->(i) { data[i] },
|
40
|
-
size: data.size,
|
41
|
-
identity: -Shared::INFINITY
|
42
|
-
)
|
43
|
-
end
|
44
|
-
|
45
|
-
# The maximum value in A(i..j).
|
46
|
-
#
|
47
|
-
# The arguments must be integers in 0...(A.size)
|
48
|
-
# @return the largest value in A(i..j) or -Infinity if i > j.
|
49
|
-
def max_on(i, j)
|
50
|
-
@structure.query_on(i, j)
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
# A segment tree that for an array A(0...n) answers questions of the form "what is the index of the maximal value in the
|
55
|
-
# subinterval A(i..j)?" in O(log n) time.
|
56
|
-
class IndexOfMaxValSegmentTree
|
57
|
-
extend Forwardable
|
58
|
-
|
59
|
-
# Tell the tree that the value at idx has changed
|
60
|
-
def_delegator :@structure, :update_at
|
61
|
-
|
62
|
-
# @param (see MaxValSegmentTree#initialize)
|
63
|
-
def initialize(data)
|
64
|
-
@structure = SegmentTreeTemplate.new(
|
65
|
-
combine: ->(p1, p2) { p1[1] >= p2[1] ? p1 : p2 },
|
66
|
-
single_cell_array_val: ->(i) { [i, data[i]] },
|
67
|
-
size: data.size,
|
68
|
-
identity: nil
|
69
|
-
)
|
70
|
-
end
|
71
|
-
|
72
|
-
# The index of the maximum value in A(i..j)
|
73
|
-
#
|
74
|
-
# The arguments must be integers in 0...(A.size)
|
75
|
-
# @return (Integer, nil) the index of the largest value in A(i..j) or +nil+ if i > j.
|
76
|
-
# - If there is more than one entry with that value, return one the indices. There is no guarantee as to which one.
|
77
|
-
# - Return +nil+ if i > j
|
78
|
-
def index_of_max_val_on(i, j)
|
79
|
-
@structure.query_on(i, j)&.first # discard the value part of the pair, which is a bookkeeping
|
80
|
-
end
|
81
|
-
end
|
24
|
+
# Add things here if needed
|
82
25
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: data_structures_rmolinari
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rory Molinari
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-02-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: must_be
|
@@ -79,6 +79,7 @@ email: rorymolinari@gmail.com
|
|
79
79
|
executables: []
|
80
80
|
extensions:
|
81
81
|
- ext/c_disjoint_union/extconf.rb
|
82
|
+
- ext/c_segment_tree_template/extconf.rb
|
82
83
|
extra_rdoc_files: []
|
83
84
|
files:
|
84
85
|
- CHANGELOG.md
|
@@ -86,12 +87,17 @@ files:
|
|
86
87
|
- Rakefile
|
87
88
|
- ext/c_disjoint_union/disjoint_union.c
|
88
89
|
- ext/c_disjoint_union/extconf.rb
|
90
|
+
- ext/c_segment_tree_template/extconf.rb
|
91
|
+
- ext/c_segment_tree_template/segment_tree_template.c
|
92
|
+
- ext/shared.c
|
89
93
|
- lib/data_structures_rmolinari.rb
|
90
94
|
- lib/data_structures_rmolinari/algorithms.rb
|
95
|
+
- lib/data_structures_rmolinari/c_segment_tree_template_impl.rb
|
91
96
|
- lib/data_structures_rmolinari/disjoint_union.rb
|
92
97
|
- lib/data_structures_rmolinari/heap.rb
|
93
98
|
- lib/data_structures_rmolinari/max_priority_search_tree.rb
|
94
99
|
- lib/data_structures_rmolinari/min_priority_search_tree.rb
|
100
|
+
- lib/data_structures_rmolinari/segment_tree.rb
|
95
101
|
- lib/data_structures_rmolinari/segment_tree_template.rb
|
96
102
|
- lib/data_structures_rmolinari/shared.rb
|
97
103
|
homepage: https://github.com/rmolinari/data_structures
|