From: Mason Kelsey Date: 2009-09-21T13:38:00+09:00 Subject: Re: Multi-Dimensional Arrays in Priority Queues --002354471014ce429904740f0b07 Content-Type: text/plain; charset=ISO-8859-1 By the way, your last comment about making a class to handle these objects. I have a class and will be putting the method I'm building to push and pop these contents into an ordered queue. But the concept of objects is still a big mystery to me. I'm working on deeping my knowledge of that but it will take some time until it sinks in. If you have the a method like I described, where does the _require "pqueue"_ statement get included? Inside of the Class to end code or above it? No Sam On Mon, Sep 21, 2009 at 12:02 AM, Josh Cheek wrote: > 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< > http://www.math.kobe-u.ac.jp/%7Ekodama/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] 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| p x} > > __END__ > output that I got: > size:6 > each_pop: [[2], [123456780], [123456708]] > [[4], [123456780], [123456708]] > [[12], [123456780], [123456708]] > [[23], [123456780], [123456708]] > [[33], [123456780], [123456708]] > [[54], [123456780], [123456708]] > > You were passing a two dimensional array, so x[0] returns an array, ie [2] > to get it to an integer, you need to go in one more time so x[0][0] would > return 2, which is comparable to other integers. > > You should consider making a class to handle these objects. > --002354471014ce429904740f0b07--