depq 0.3 → 0.4
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/README +38 -22
- data/{depq.rb → lib/depq.rb} +591 -474
- data/{test-depq.rb → test/test-depq.rb} +70 -25
- metadata +5 -5
@@ -24,54 +24,63 @@
|
|
24
24
|
# IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
|
25
25
|
# OF SUCH DAMAGE.
|
26
26
|
|
27
|
-
require '
|
27
|
+
require 'depq'
|
28
28
|
require 'test/unit'
|
29
29
|
|
30
30
|
class Depq
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
}
|
46
|
-
end
|
31
|
+
def mm_validation(&upper)
|
32
|
+
0.upto(self.size-1) {|i|
|
33
|
+
_, x = get_entry(i)
|
34
|
+
j = i*2+1
|
35
|
+
k = i*2+2
|
36
|
+
if j < self.size && !upper.call(i, j)
|
37
|
+
_, y = get_entry(j)
|
38
|
+
raise "wrong binary heap: pri[#{i}]=#{x.inspect} > #{y.inspect}=pri[#{j}]"
|
39
|
+
end
|
40
|
+
if k < self.size && !upper.call(i, k)
|
41
|
+
_, z = get_entry(k)
|
42
|
+
raise "wrong binary heap: pri[#{i}]=#{x.inspect} > #{z.inspect}=pri[#{k}]"
|
43
|
+
end
|
44
|
+
}
|
47
45
|
end
|
48
46
|
|
49
|
-
def
|
50
|
-
|
47
|
+
def min_validation
|
48
|
+
mm_validation &method(:min_upper?)
|
49
|
+
end
|
50
|
+
MinMode[:validation] = :min_validation
|
51
|
+
|
52
|
+
def max_validation
|
53
|
+
mm_validation &method(:max_upper?)
|
54
|
+
end
|
55
|
+
MaxMode[:validation] = :max_validation
|
56
|
+
|
57
|
+
def itv_validation
|
58
|
+
range=0...self.size
|
51
59
|
range.each {|j|
|
52
60
|
imin = parent_minside(j)
|
53
61
|
imax = parent_maxside(j)
|
54
62
|
jmin = minside(j)
|
55
|
-
if minside?(j) && range.include?(imin) && pcmp(
|
63
|
+
if minside?(j) && range.include?(imin) && pcmp(imin, j) > 0
|
56
64
|
raise "ary[#{imin}].priority > ary[#{j}].priority "
|
57
65
|
end
|
58
|
-
if maxside?(j) && range.include?(imax) && pcmp(
|
66
|
+
if maxside?(j) && range.include?(imax) && pcmp(imax, j) < 0
|
59
67
|
raise "ary[#{imax}].priority < ary[#{j}].priority "
|
60
68
|
end
|
61
|
-
if range.include?(imin) && pcmp(
|
69
|
+
if range.include?(imin) && pcmp(imin, j) == 0 && scmp(imin, j) > 0
|
62
70
|
raise "ary[#{imin}].subpriority < ary[#{j}].subpriority "
|
63
71
|
end
|
64
|
-
if range.include?(imax) && pcmp(
|
72
|
+
if range.include?(imax) && pcmp(imax, j) == 0 && scmp(imax, j) > 0
|
65
73
|
raise "ary[#{imax}].subpriority < ary[#{j}].subpriority "
|
66
74
|
end
|
67
|
-
if maxside?(j) && range.include?(jmin) && pcmp(
|
75
|
+
if maxside?(j) && range.include?(jmin) && pcmp(jmin, j) == 0 && scmp(jmin, j) > 0
|
68
76
|
raise "ary[#{jmin}].subpriority < ary[#{j}].subpriority "
|
69
77
|
end
|
70
78
|
}
|
71
79
|
end
|
80
|
+
IntervalMode[:validation] = :itv_validation
|
72
81
|
|
73
82
|
def validation
|
74
|
-
@mode
|
83
|
+
send(Mode[@mode][:validation]) if @mode
|
75
84
|
if @ary.length % ARY_SLICE_SIZE != 0
|
76
85
|
raise "wrong length"
|
77
86
|
end
|
@@ -945,6 +954,42 @@ class TestDepq < Test::Unit::TestCase
|
|
945
954
|
assert_equal(nil, q.delete_unspecified_locator)
|
946
955
|
end
|
947
956
|
|
957
|
+
def test_replace_min
|
958
|
+
q = Depq.new
|
959
|
+
q.insert 1
|
960
|
+
q.insert 2
|
961
|
+
q.insert 0
|
962
|
+
assert_equal(0, q.min)
|
963
|
+
loc = q.find_min_locator
|
964
|
+
assert_equal(2, loc.subpriority)
|
965
|
+
assert_equal(3, q.totalcount)
|
966
|
+
assert_equal(loc, q.replace_min(10))
|
967
|
+
assert_equal(4, q.totalcount)
|
968
|
+
assert_equal(1, q.delete_min)
|
969
|
+
assert_equal(2, q.delete_min)
|
970
|
+
assert_equal(3, q.find_min_locator.subpriority)
|
971
|
+
assert_equal(10, q.delete_min)
|
972
|
+
assert_equal(nil, q.delete_min)
|
973
|
+
end
|
974
|
+
|
975
|
+
def test_replace_max
|
976
|
+
q = Depq.new
|
977
|
+
q.insert 3
|
978
|
+
q.insert 4
|
979
|
+
q.insert 2
|
980
|
+
assert_equal(4, q.max)
|
981
|
+
loc = q.find_max_locator
|
982
|
+
assert_equal(1, loc.subpriority)
|
983
|
+
assert_equal(3, q.totalcount)
|
984
|
+
assert_equal(loc, q.replace_max(1))
|
985
|
+
assert_equal(4, q.totalcount)
|
986
|
+
assert_equal(3, q.delete_max)
|
987
|
+
assert_equal(2, q.delete_max)
|
988
|
+
assert_equal(3, q.find_min_locator.subpriority)
|
989
|
+
assert_equal(1, q.delete_max)
|
990
|
+
assert_equal(nil, q.delete_max)
|
991
|
+
end
|
992
|
+
|
948
993
|
def test_each
|
949
994
|
q = Depq.new
|
950
995
|
a = [1,2,0]
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: depq
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: "0.
|
4
|
+
version: "0.4"
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tanaka Akira
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-11-29 00:00:00 +09:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -28,7 +28,7 @@ extra_rdoc_files: []
|
|
28
28
|
|
29
29
|
files:
|
30
30
|
- README
|
31
|
-
- depq.rb
|
31
|
+
- lib/depq.rb
|
32
32
|
has_rdoc: true
|
33
33
|
homepage: http://depq.rubyforge.org/
|
34
34
|
licenses: []
|
@@ -37,7 +37,7 @@ post_install_message:
|
|
37
37
|
rdoc_options: []
|
38
38
|
|
39
39
|
require_paths:
|
40
|
-
-
|
40
|
+
- lib
|
41
41
|
required_ruby_version: !ruby/object:Gem::Requirement
|
42
42
|
requirements:
|
43
43
|
- - ">="
|
@@ -58,4 +58,4 @@ signing_key:
|
|
58
58
|
specification_version: 3
|
59
59
|
summary: Stable Double-Ended Priority Queue.
|
60
60
|
test_files:
|
61
|
-
- test-depq.rb
|
61
|
+
- test/test-depq.rb
|