Как да дефинирам вторично подреждане към интерфейса Heap::Simple в Perl?
Вторичен ред в Heap::Simple
Отговори (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).
$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