From: Josh Cheek Date: 2009-09-21T13:02:09+09:00 Subject: Re: Multi-Dimensional Arrays in Priority Queues --000e0cd598da8ff48004740e8bf8 Content-Type: text/plain; charset=ISO-8859-1 On Sun, Sep 20, 2009 at 10:23 PM, Mason Kelsey wrote: > Tried it but it didn't work. Made the following change: > > require "pqueue" > pq=PQueue.new(proc{|x,y| x[0] pq.push([[12], [123456780], [123456708]]) > pq.push([[23], [123456780], [123456708]]) > pq.push([[4], [123456780], [123456708]]) > pq.push([[33], [123456780], [123456708]]) > pq.push([[02], [123456780], [123456708]]) > pq.push([[54], [123456780], [123456708]]) > print "size:"+pq.size.to_s+"\n" > print "each_pop: " > pq.each_pop{|x| print x.to_s+" "} > print "\n" > I got the messages: > >ruby simple_pqueue.rb > simple_pqueue.rb:3: undefined local variable or method `x' for main:Object > (NameError) > from ./pqueue.rb:24:in `[]' > from ./pqueue.rb:24:in `upheap' > from ./pqueue.rb:65:in `push' > from simple_pqueue.rb:5 > >Exit code: 1 > > The "from" error messages appear to be coming from the code inside of the > pqueue class methods. > > Doesn't like the brackets. I tried several variations of this and also got > a message that said the < is an invalid method. Very strange. Sorry but > I'm totally confused here. > > There must be a way to do this. > > No Sam > > On Sun, Sep 20, 2009 at 10:31 PM, Mario Camou > wrote: > > > Hi, > > In the line: > > > > pq.push([2], [123456780], [123456708]) > > > > you're not passing in a multi-dimensional array, you're passing 3 > > parameters > > each of which is an array. Try with: > > > > pq.push([[2], [123456780], [123456708]]) > > > > (notice the double [ at the beginning and the double ] at the end). > > > > you will also have to change your PQueue creation to something like this: > > > > pq=PQueue.new(proc{|x,y| x[0] > > > Haven't tested this in irb but it (or something very much like it) should > > work. > > > > -Mario. > > > > -- > > I want to change the world but they won't give me the source code. > > > > > > On Mon, Sep 21, 2009 at 04:25, Mason Kelsey > wrote: > > > > > In my program I need to construct a priority queue that sorts > ascending. > > > The basic idea can be expressed in the following simple code that uses > a > > > Priority Queue concept. See: > > > http://www.math.kobe-u.ac.jp/~kodama/tips-ruby-pqueue.html > > > > > > 1 require "pqueue" > > > 2 > > > 3 pq=PQueue.new(proc{|x,y| x > > 4 pq.push(2) > > > 5 pq.push(3) > > > 6 pq.push(4) > > > 7 pq.push(3) > > > 8 pq.push(2) > > > 9 pq.push(4) > > > 10 print "size:"+pq.size.to_s+"\n" > > > 11 print "each_pop: " > > > 12 pq.each_pop{|x| print x.to_s+" "} > > > 13 print "\n" > > > > > > This is clean and simple to understand. But I need to be able to put > > into > > > the queue several components per push to make an entire record object. > I > > > need to have three components: an integer heuristic value, followed by > > two > > > 9 > > > digit configuration patterns, such as > > > pq.push([2], [123456780], [123456708]) But this gives me an argument > > error > > > message: > > > pqueue.rb:4:in `push': wrong number of arguments (3 for 1) > > > (ArgumentError) from pqueue.rb:4 > > > > > > or pq.push(2_123456780_123456708) ignores the underscore separators and > > > runs > > > the 3 parts together as one long number. > > > > > > Still learning Ruby and none of the books address multiple dimensional > > > arrays very well. Is the Priority Queue not able to handle > > > multi-dimensional arrays? Can this code be modified to allow > > > multi-elements > > > in each push and still sort on the first element? > > > > > > If I cannot use pqueue, is there another required library of methods > that > > > will work with three elements in each array entry? > > > > > > Thanks in advance to those of you who can help. And thanks to all who > > help > > > out on this forum. Very good forum. > > > > > > No Sam > > > > > > require "pqueue" pq=PQueue.new proc{|x,y| x[0][0]