depq 0.4 → 0.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. data/README +1 -0
  2. data/lib/depq.rb +71 -39
  3. data/test/test-depq.rb +12 -6
  4. metadata +29 -33
data/README CHANGED
@@ -21,6 +21,7 @@ depq is double-ended stable priority queue with priority update operation implem
21
21
  * ((<reference manual|URL:http://depq.rubyforge.org/rdoc/classes/Depq.html>))
22
22
  * ((<home page on rubyforge|URL:http://depq.rubyforge.org/>))
23
23
  * ((<project info on rubyforge|URL:http://rubyforge.org/projects/depq/>))
24
+ * ((<depq on gemcutter|URL:http://gemcutter.org/gems/depq>))
24
25
  * ((<source repository on github|URL:http://github.com/akr/depq>))
25
26
  * ((<raa entry|URL:http://raa.ruby-lang.org/project/depq/>))
26
27
 
@@ -1,10 +1,10 @@
1
1
  # depq.rb - Double-Ended Priority Queue.
2
2
  #
3
- # Copyright (C) 2009 Tanaka Akira <akr@fsij.org>
4
- #
3
+ # Copyright (C) 2009-2011 Tanaka Akira <akr@fsij.org>
4
+ #
5
5
  # Redistribution and use in source and binary forms, with or without
6
6
  # modification, are permitted provided that the following conditions are met:
7
- #
7
+ #
8
8
  # 1. Redistributions of source code must retain the above copyright notice, this
9
9
  # list of conditions and the following disclaimer.
10
10
  # 2. Redistributions in binary form must reproduce the above copyright notice,
@@ -12,7 +12,7 @@
12
12
  # and/or other materials provided with the distribution.
13
13
  # 3. The name of the author may not be used to endorse or promote products
14
14
  # derived from this software without specific prior written permission.
15
- #
15
+ #
16
16
  # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
17
17
  # WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18
18
  # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
@@ -34,7 +34,7 @@
34
34
  # * priority - you can get a value with minimum priority
35
35
  # * double-ended - you can get a value with maximum priority too
36
36
  # * stable - you will get the value inserted first with minimum/maximum priority
37
- # * priority update - usable for Dijkstra's shortest path algorithm and various graph algorithms
37
+ # * priority change - you can change the priority of a inserted value. (usable for Dijkstra's shortest path algorithm and various graph algorithms)
38
38
  # * implicit heap - compact heap representation using array. most operations are O(log n) at worst
39
39
  # * iterator operations: nlargest, nsmallest and merge
40
40
  #
@@ -420,9 +420,9 @@ class Depq
420
420
  # class Cmp
421
421
  # def call(a,b) a.casecmp(b) end
422
422
  # end
423
- # q = Depq.new(Cmp.new)
424
- # q.insert "Foo"
425
- # q.insert "bar"
423
+ # q = Depq.new(Cmp.new)
424
+ # q.insert "Foo"
425
+ # q.insert "bar"
426
426
  # p q.delete_min #=> "bar"
427
427
  # p q.delete_min #=> "Foo"
428
428
  #
@@ -785,12 +785,12 @@ class Depq
785
785
  #
786
786
  # This method doesn't delete the element from the queue.
787
787
  #
788
- # q = Depq.new
789
- # p q.find_min_locator #=> nil
790
- # q.insert 3
791
- # q.insert 1
792
- # q.insert 2
793
- # p q.find_min_locator #=> #<Depq::Locator: 1>
788
+ # q = Depq.new
789
+ # p q.find_min_locator #=> nil
790
+ # q.insert 3
791
+ # q.insert 1
792
+ # q.insert 2
793
+ # p q.find_min_locator #=> #<Depq::Locator: 1>
794
794
  # p q.find_min_locator #=> #<Depq::Locator: 1>
795
795
  # p q.delete_min #=> 1
796
796
  # p q.find_min_locator #=> #<Depq::Locator: 2>
@@ -827,12 +827,12 @@ class Depq
827
827
  #
828
828
  # This method doesn't delete the element from the queue.
829
829
  #
830
- # q = Depq.new
831
- # p q.find_min #=> nil
832
- # q.insert 3
833
- # q.insert 1
834
- # q.insert 2
835
- # p q.find_min #=> 1
830
+ # q = Depq.new
831
+ # p q.find_min #=> nil
832
+ # q.insert 3
833
+ # q.insert 1
834
+ # q.insert 2
835
+ # p q.find_min #=> 1
836
836
  # p q.find_min #=> 1
837
837
  # p q.delete_min #=> 1
838
838
  # p q.find_min #=> 2
@@ -952,12 +952,16 @@ class Depq
952
952
  #
953
953
  def delete_locator(loc)
954
954
  check_locator(loc)
955
- if @heapsize <= loc.send(:index)
956
- _, priority, subpriority = delete_entry(loc.send(:index))
957
- loc.send(:index).upto(self.size-1) {|i|
958
- loc2, _ = get_entry(i)
959
- loc2.send(:index=, i)
960
- }
955
+ index = loc.send(:index)
956
+ if @heapsize <= index
957
+ _, priority, subpriority = get_entry(index)
958
+ last = self.size - 1
959
+ if index != last
960
+ loc2, priority2, subpriority2 = get_entry(last)
961
+ set_entry(index, loc2, priority2, subpriority2)
962
+ loc2.send(:index=, index)
963
+ end
964
+ delete_entry(last)
961
965
  loc.send(:internal_deleted, priority, subpriority)
962
966
  loc
963
967
  else
@@ -1173,7 +1177,7 @@ class Depq
1173
1177
  # q.insert 4
1174
1178
  # q.insert 3
1175
1179
  # p q.min #=> 2
1176
- # q.replace_min(5)
1180
+ # q.replace_min(5)
1177
1181
  # p q.delete_min #=> 3
1178
1182
  # p q.delete_min #=> 4
1179
1183
  # p q.delete_min #=> 5
@@ -1275,34 +1279,48 @@ class Depq
1275
1279
  nil
1276
1280
  end
1277
1281
 
1282
+ # :call-seq:
1283
+ # Depq.nlargest(n, iter)
1284
+ # Depq.nlargest(n, iter) {|e| order }
1285
+ #
1278
1286
  # returns the largest n elements in iter as an array.
1279
1287
  #
1280
1288
  # The result array is ordered from the minimum element.
1281
1289
  #
1282
1290
  # p Depq.nlargest(3, [5, 2, 3, 1, 4, 6, 7]) #=> [5, 6, 7]
1283
1291
  #
1292
+ # If the block is given, the elements are compared by
1293
+ # the corresponding block values.
1294
+ #
1295
+ # p Depq.nlargest(3, [5, 2, 3, 1, 4, 6, 7]) {|e| -e } #=> [3, 2, 1]
1296
+ #
1284
1297
  def Depq.nlargest(n, iter)
1285
1298
  limit = (n * Math.log(1+n)).ceil
1286
1299
  limit = 1024 if limit < 1024
1287
1300
  q = Depq.new
1288
1301
  threshold = nil
1289
- iter.each {|v|
1302
+ iter.each {|e|
1303
+ if block_given?
1304
+ v = yield e
1305
+ else
1306
+ v = e
1307
+ end
1290
1308
  if q.size < n
1291
1309
  if q.size == 0
1292
1310
  threshold = v
1293
1311
  else
1294
1312
  threshold = v if (v <=> threshold) < 0
1295
1313
  end
1296
- q.insert v
1314
+ q.insert e, v
1297
1315
  else
1298
1316
  if (v <=> threshold) > 0
1299
- q.insert v
1317
+ q.insert e, v
1300
1318
  if limit < q.size
1301
1319
  tmp = []
1302
- n.times { tmp << q.delete_max }
1320
+ n.times { tmp << q.delete_max_locator }
1303
1321
  q.clear
1304
- q.insert_all tmp
1305
- threshold = tmp.last
1322
+ tmp.each {|loc| q.insert_locator loc }
1323
+ threshold = tmp.last.priority
1306
1324
  end
1307
1325
  end
1308
1326
  end
@@ -1314,34 +1332,48 @@ class Depq
1314
1332
  a
1315
1333
  end
1316
1334
 
1335
+ # :call-seq:
1336
+ # Depq.nsmallest(n, iter)
1337
+ # Depq.nsmallest(n, iter) {|e| order }
1338
+ #
1317
1339
  # returns the smallest n elements in iter as an array.
1318
1340
  #
1319
1341
  # The result array is ordered from the minimum element.
1320
1342
  #
1321
1343
  # p Depq.nsmallest(5, [5, 2, 3, 1, 4, 6, 7]) #=> [1, 2, 3, 4, 5]
1322
1344
  #
1345
+ # If the block is given, the elements are compared by
1346
+ # the corresnponding block values.
1347
+ #
1348
+ # p Depq.nsmallest(5, [5, 2, 3, 1, 4, 6, 7]) {|e| -e } #=> [7, 6, 5, 4, 3]
1349
+ #
1323
1350
  def Depq.nsmallest(n, iter)
1324
1351
  limit = (n * Math.log(1+n)).ceil
1325
1352
  limit = 1024 if limit < 1024
1326
1353
  q = Depq.new
1327
1354
  threshold = nil
1328
- iter.each {|v|
1355
+ iter.each {|e|
1356
+ if block_given?
1357
+ v = yield e
1358
+ else
1359
+ v = e
1360
+ end
1329
1361
  if q.size < n
1330
1362
  if q.size == 0
1331
1363
  threshold = v
1332
1364
  else
1333
1365
  threshold = v if (v <=> threshold) > 0
1334
1366
  end
1335
- q.insert v
1367
+ q.insert e, v
1336
1368
  else
1337
1369
  if (v <=> threshold) < 0
1338
- q.insert v
1370
+ q.insert e, v
1339
1371
  if limit < q.size
1340
1372
  tmp = []
1341
- n.times { tmp << q.delete_min }
1373
+ n.times { tmp << q.delete_min_locator }
1342
1374
  q.clear
1343
- q.insert_all tmp
1344
- threshold = tmp.last
1375
+ tmp.each {|loc| q.insert_locator loc }
1376
+ threshold = tmp.last.priority
1345
1377
  end
1346
1378
  end
1347
1379
  end
@@ -1,10 +1,10 @@
1
1
  # test-depq.rb - test for depq.rb
2
2
  #
3
3
  # Copyright (C) 2009 Tanaka Akira <akr@fsij.org>
4
- #
4
+ #
5
5
  # Redistribution and use in source and binary forms, with or without
6
6
  # modification, are permitted provided that the following conditions are met:
7
- #
7
+ #
8
8
  # 1. Redistributions of source code must retain the above copyright notice, this
9
9
  # list of conditions and the following disclaimer.
10
10
  # 2. Redistributions in binary form must reproduce the above copyright notice,
@@ -12,7 +12,7 @@
12
12
  # and/or other materials provided with the distribution.
13
13
  # 3. The name of the author may not be used to endorse or promote products
14
14
  # derived from this software without specific prior written permission.
15
- #
15
+ #
16
16
  # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
17
17
  # WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18
18
  # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
@@ -92,7 +92,7 @@ class Depq
92
92
  if loc.send(:index) != i
93
93
  raise "index mismatch"
94
94
  end
95
- unless self.equal? loc.depq
95
+ unless self.equal? loc.depq
96
96
  raise "depq mismatch"
97
97
  end
98
98
  i += 1
@@ -401,13 +401,13 @@ class TestDepq < Test::Unit::TestCase
401
401
  q.insert "bar"
402
402
  assert_equal("Foo", q.delete_min)
403
403
  assert_equal("bar", q.delete_min)
404
-
404
+
405
405
  q = Depq.new(:casecmp)
406
406
  q.insert "Foo"
407
407
  q.insert "bar"
408
408
  assert_equal("bar", q.delete_min)
409
409
  assert_equal("Foo", q.delete_min)
410
-
410
+
411
411
  q = Depq.new(lambda {|a,b| a.casecmp(b) })
412
412
  q.insert "Foo"
413
413
  q.insert "bar"
@@ -1030,6 +1030,9 @@ class TestDepq < Test::Unit::TestCase
1030
1030
  a = Depq.nlargest(3, [5, 1, 3, 2, 4, 6, 7])
1031
1031
  assert_equal([5, 6, 7], a)
1032
1032
 
1033
+ a = Depq.nlargest(3, [5, 1, 3, 2, 4, 6, 7]) {|e| -e }
1034
+ assert_equal([3, 2, 1], a)
1035
+
1033
1036
  assert_equal([1,2], Depq.nlargest(3, [1,2]))
1034
1037
 
1035
1038
  a = []
@@ -1042,6 +1045,9 @@ class TestDepq < Test::Unit::TestCase
1042
1045
  a = Depq.nsmallest(5, [5, 2, 3, 1, 4, 6, 7])
1043
1046
  assert_equal([1, 2, 3, 4, 5], a)
1044
1047
 
1048
+ a = Depq.nsmallest(5, [5, 2, 3, 1, 4, 6, 7]) {|e| -e }
1049
+ assert_equal([7, 6, 5, 4, 3], a)
1050
+
1045
1051
  assert_equal([1,2], Depq.nsmallest(3, [1,2]))
1046
1052
 
1047
1053
  a = []
metadata CHANGED
@@ -1,61 +1,57 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: depq
3
- version: !ruby/object:Gem::Version
4
- version: "0.4"
3
+ version: !ruby/object:Gem::Version
4
+ version: '0.5'
5
+ prerelease:
5
6
  platform: ruby
6
- authors:
7
+ authors:
7
8
  - Tanaka Akira
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
-
12
- date: 2009-11-29 00:00:00 +09:00
13
- default_executable:
12
+ date: 2011-10-27 00:00:00.000000000 Z
14
13
  dependencies: []
14
+ description: ! 'depq is a Double-Ended Priority Queue library.
15
+
16
+ It is a data structure which can insert elements and delete elements with minimum
17
+ and maximum priority.
15
18
 
16
- description: |
17
- depq is a Double-Ended Priority Queue library.
18
- It is a data structure which can insert elements and delete elements with minimum and maximum priority.
19
19
  If there are elements which has same priority, the element inserted first is chosen.
20
+
20
21
  The priority can be changed after the element is inserted.
21
22
 
23
+ '
22
24
  email: akr@fsij.org
23
25
  executables: []
24
-
25
26
  extensions: []
26
-
27
27
  extra_rdoc_files: []
28
-
29
- files:
28
+ files:
30
29
  - README
31
30
  - lib/depq.rb
32
- has_rdoc: true
31
+ - test/test-depq.rb
33
32
  homepage: http://depq.rubyforge.org/
34
33
  licenses: []
35
-
36
34
  post_install_message:
37
35
  rdoc_options: []
38
-
39
- require_paths:
36
+ require_paths:
40
37
  - lib
41
- required_ruby_version: !ruby/object:Gem::Requirement
42
- requirements:
43
- - - ">="
44
- - !ruby/object:Gem::Version
45
- version: "0"
46
- version:
47
- required_rubygems_version: !ruby/object:Gem::Requirement
48
- requirements:
49
- - - ">="
50
- - !ruby/object:Gem::Version
51
- version: "0"
52
- version:
38
+ required_ruby_version: !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ required_rubygems_version: !ruby/object:Gem::Requirement
45
+ none: false
46
+ requirements:
47
+ - - ! '>='
48
+ - !ruby/object:Gem::Version
49
+ version: '0'
53
50
  requirements: []
54
-
55
51
  rubyforge_project: depq
56
- rubygems_version: 1.3.4
52
+ rubygems_version: 1.8.11
57
53
  signing_key:
58
54
  specification_version: 3
59
55
  summary: Stable Double-Ended Priority Queue.
60
- test_files:
56
+ test_files:
61
57
  - test/test-depq.rb