Вторичен ред в Heap::Simple

Как да дефинирам вторично подреждане към интерфейса Heap::Simple в Perl?


person syker    schedule 30.06.2010    source източник


Отговори (2)


Документацията посочва, че конструкторът взема препратка към код, за да дефинира реда, така че вие можете да посочите всеки метод на сортиране, който желаете:

my $heap = Heap::Simple->new(order => \&sort_method);

Всеки път, когато два ключа трябва да бъдат сравнени, дадената препратка към код ще бъде извикана като: $less = $code_reference->($key1, $key2);

Това трябва да върне истинска стойност, ако $key1 е по-малък от $key2 и невярна стойност в противен случай. $code_reference трябва да предполага общо отношение на реда, така че трябва да е транзитивно.

Предполагам, че под „вторично подреждане“ имате предвид, че се използва второ сравнение, ако първото показва, че стойностите са еднакви. Да кажем, че първото сравнение е на стойности, намерени чрез метода „method1“, а второто сравнение е на стойности от „method2“. Така че, ако по метод1 стойностите са различни, върнете този резултат и в противен случай се върнете към метод2:

sub sort_method
{
    my ($val1, $val2) = @_;

    my $result = ($val1->method1 <=> $val2->method1)
                          ||
                 ($val1->method2 <=> $val2->method2);

    return 1 if $result == -1;
}

Ако method1 и method2 връщат низове вместо числови стойности, просто използвайте оператора cmp вместо <=>. Можете да използвате всичко, което искате, стига операторът да върне правилните стойности. Повечето функции за сортиране като използване на стойностите -1, 0 и 1, за да покажат дали value1 е по-малко, равно или по-голямо от value2, но този модул обича 1 да означава val1 ‹ val2, така че след събиране на -1, 0, 1 резултат, тогава се връща 1, ако резултатът е -1 (където стойност1 е по-малка от стойност2).

person Ether    schedule 30.06.2010
comment
Трябва ли да дефинирам атрибута elements, когато конструирам Heap? Знам със сигурност, че всеки от моите елементи е масив с определен размер (и всъщност методът за сортиране разглежда две от стойностите в този масив). Например: my $heap = Heap::Simple-›new(order =› \&sort_method, elements =› Array); - person syker; 30.06.2010
comment
Поправих повредената връзка към документацията. - person Zaid; 30.06.2010
comment
Имам известен проблем, опитвайки се да напиша функцията за сравнение въз основа на елементите на масива. Може ли някой да ме насочи към ресурси по подобна тема? - person syker; 30.06.2010
comment
Защо не можете да използвате $b и $a вместо съответно $val2 и $val1? - person syker; 30.06.2010
comment
@syker: $a и $b се третират като глобални променливи в Perl, така че е най-добре да ги избягвате извън coderefs, предадени на функцията sort. - person Ether; 30.06.2010

Първо, вие пишете функция, която взема два от обектите, които искате да поставите в купчината, и връща вярна стойност, ако първият е по-малък от втория, и невярно в противен случай.

След това предоставете това като coderef на Heap::Simple.

Примерът от Heap::Simple docs е както следва:

use Heap::Simple;

sub more { return $_[0] > $_[1] }

my $heap = Heap::Simple->new(order => \&more);
$heap->insert(8, 3, 14, -1, 3);
print $heap->extract_top, " " for 1..$heap->count;
print "\n";
# Will print: 14 8 3 3 -1
person Anon.    schedule 30.06.2010