Rekursives Sortieren in Perl

8

Ich habe einen Hash, der Schlüssel enthält, die Datenbank-Indexen entsprechen, aber die Datenbank kann mehrdimensionale Datensätze haben, so dass der Schlüssel ein einzelner Index oder eine Liste von Indizes sein kann.

Ich muss einen Weg finden, diese Datensätze zu sortieren, damit ich sie in einer logischen Reihenfolge ausdrucken kann.

Beispiel:

%Vor%

Ich möchte, dass es zuerst nach dem tiefsten Index sortiert wird. Wenn der Wert ganz links identisch ist, möchte ich zum nächsten Wert gehen und diese vergleichen. Wenn diese identisch sind, möchte ich mit dem nächsten fortfahren ... und so weiter ... bis alle Möglichkeiten ausgeschöpft sind.

Dies wird höchstwahrscheinlich eine gewisse Rekursion beinhalten, aber ich kann nicht herausfinden, wie Rekursion mit diesen fancy $a und $b Variablen funktioniert.

Was kann ich in some_function eingeben, um die folgende Ausgabe zu erhalten?

%Vor%     
tjwrona1992 09.05.2016, 21:10
quelle

4 Antworten

13

Das Folgende ist die schnellste Lösung (bei weitem!):

%Vor%

Wenn Sie etwas einfacheres wollen, und immer noch ziemlich schnell, können Sie eine "natürliche Art" verwenden.

Benchmarks:

%Vor%

Benchmark-Code:

%Vor%     
ikegami 09.05.2016, 21:38
quelle
4

Ich dachte, das Modul Sort::Naturally würde Ihnen hier helfen, scheint aber nicht >

Ich muss einen Fehler in meinem Test gehabt haben. Das funktioniert gut

%Vor%

Ich empfehle entweder diese oder die Sort::Key::Naturally Lösung, da sie am klarsten sind

Es ist eine schlechte Praxis, die Geschwindigkeit der Ausführung zu verfolgen, besonders auf Kosten der Lesbarkeit, bevor es Beweise dafür gibt, dass eine gegebene Lösung zu langsam ist. Selbst dann ist es töricht, Teile deines Codes zufällig zu optimieren, in der Hoffnung, einen Unterschied zu machen, und deine Lösung sollte durch einen Profiler laufen, um herauszufinden, wo es am fruchtbarsten wäre, Verbesserungen vorzunehmen.


Es ist keine Rekursion erforderlich. Dieses Programm zeigt eine Sortierunterroutine by_elements , die einfach jedes Element in der Liste vergleicht, bis es entweder eine Nichtübereinstimmung oder das Ende einer der Listen findet

Im ersten Fall ist das Ergebnis nur der Vergleich der beiden unterschiedlichen Elemente, und im letzteren Fall ist es ein Vergleich der Anzahl der Elemente in den beiden Listen

%Vor%

Ausgabe

%Vor%     
Borodin 09.05.2016 21:49
quelle
3

Verwenden Sie natsort von Sort::Key::Natural :

%Vor%

Ausgaben:

%Vor%     
Miller 09.05.2016 21:49
quelle
2

Keine Rekursion nötig, nur eine Schleife, aus der Sie ausbrechen können.

%Vor%

Aber wenn Ihr Herz auf eine rekursive Lösung eingestellt ist, gibt es

%Vor%     
mob 09.05.2016 21:48
quelle

Tags und Links