1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
#!/usr/bin/perl -w use strict; use warnings; use List::Util qw (max); my %hash = ( 1 => defined, 4 => defined, 8 => defined, 10 => defined, ); print "max: " . max(keys %hash) . "\n"; my %kopie = %hash; delete $kopie{max(keys %hash)}; print "zweitmax: " . max(keys %kopie) . "\n";
my $max = (sort {$b <=> $a} keys %hash)[1];
2011-12-01T05:33:18 biancaUnd ob man nun in einem um einen Eintrag verringerten Hash sortiert oder über den ganzen und dann einfach von sort das Ergebnis [1] verwendet kann ein so großer Unterschied eigentlich nicht sein.
Vielleicht möchtest du das als Übungsaufgabe mal benchmarken.
2011-12-01T13:38:34 pqüber die elemente laufen und sich was merken ist O(n).
2011-12-01T15:32:03 pqich verstehe die frage nicht.
List::Util::max läuft über die liste und merkt sich was. daher hat es O(n).
2011-12-01T15:58:25 pqList::Util::max merkt sich das grösste element und liefert es als ergebnis. eine funktion, die das zweitgrösste element zurückliefert, gibt es in List::Util nicht. eine solche funktion müsste sich beide, das grösste und das zweitgrösste element merken.
2011-12-01T16:15:43 biancaEinmal für das Größte und einmal für das Zweigrößte. Und ob man das mit einem um 1 verringerten Hash tut oder ob man stattdessen sort [1] nimmt bleibt doch annähernd gleich, oder nicht?
2011-12-01T13:38:34 pqder unterschied ist glasklar.
über die elemente laufen und sich was merken ist O(n logn).
sortieren ist O(n * log n) (mergesort).
2011-12-01T22:03:14 tonewheel2011-12-01T13:38:34 pqüber die elemente laufen und sich was merken ist O(n logn).
2011-12-01T13:38:34 pqüber die elemente laufen und sich was merken ist O(n).
Quotealso ab einer bestimmten Groesse muesste das Sortieren laenger dauern, als das zweimalige Durchlaufen.
2011-12-01T23:38:20 pqda hast du mich falsch zitiert.
print "zweitmax: " . (sort{$a<=>$b} keys %hash)[-2] . "\n";
print "zweitmax: " . (reverse sort{$a<=>$b} keys %hash)[2] . "\n";
reverse sort{$a<=>$b} @list
sort{ $b <=> $a } @list