depq 0.3 → 0.4
Sign up to get free protection for your applications and to get access to all the features.
- 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
|