Suche nach einer FP-Ranking-Implementierung, die Bindungen behandelt (d. h. gleiche Werte)

8

Ausgehend von einer sortierten Abfolge von Werten ist es mein Ziel, jedem Wert einen Rang zuzuordnen, wobei gleiche Ränge für gleiche Werte (aka ties) verwendet werden:

Eingabe: Vector(1, 1, 3, 3, 3, 5, 6)

Ausgabe: Vector((0,1), (0,1), (1,3), (1,3), (1,3), (2,5), (3,6))

Einige Typen geben Aliase für die Lesbarkeit an:

%Vor%

Eine imperative Implementierung mit einer veränderbaren rank -Variable könnte folgendermaßen aussehen:

%Vor%

Um meine FP-Fähigkeiten zu verbessern, habe ich versucht, eine funktionale Implementierung zu finden:

%Vor%

Es ist weniger lesbar und - was noch wichtiger ist - es fehlt der letzte Wert (wegen der Verwendung von sliding(2) bei einer ungeraden Anzahl von Werten).

Wie könnte dies behoben und verbessert werden?

    
netzwerg 02.11.2016, 05:30
quelle

6 Antworten

11

Das funktioniert gut für mich:

%Vor%

Das gleiche in Java 8 mit Javaslang:

%Vor%

Die Ausgabe beider Varianten ist

%Vor%

*) Offenlegung: Ich bin der Schöpfer von Javaslang

    
Daniel Dietrich 02.11.2016, 08:31
quelle
5

Das ist schön und prägnant, aber es geht davon aus, dass Ihre Value s nicht negativ werden. (Tatsächlich nimmt es nur an, dass sie niemals mit -1 beginnen können.)

%Vor%

Bearbeiten

Änderung, die keine Annahmen macht, wie von @Kolmar vorgeschlagen.

%Vor%     
jwvh 02.11.2016 06:34
quelle
1

Hier ist ein Ansatz mit Rekursion, Mustererkennung und Wachen.

Der interessante Teil ist, wo Kopf und Kopf des Schwanzes ( h bzw. ht ) von der Liste dekonstruiert werden und ein if prüft, ob sie gleich sind. Die Logik für jeden Fall passt den Rang an und fährt mit dem verbleibenden Teil der Liste fort.

%Vor%

Ausgabe:

%Vor%     
Brian 02.11.2016 05:54
quelle
1

Dies ist eine Modifikation der Lösung von @jwvh, die keine Annahmen über die Werte macht:

%Vor%

Beachten Sie, dass es ausgegeben würde, wenn vs leer ist, also müssten Sie vs.headOption getOrElse 0 verwenden oder prüfen, ob die Eingabe vorher leer ist: if (vs.isEmpty) Vector.empty else ...

    
Kolmar 02.11.2016 07:49
quelle
0
%Vor%     
Sarvesh Kumar Singh 02.11.2016 06:00
quelle
0
%Vor%

Die Idee ist, mit groupBy nach identischen Elementen zu suchen, deren Vorkommen zu finden und sie dann zu sortieren und dann flatMap. Zeit Komplexität würde ich sagen, ist O (nlogn), groupBy ist O (n), sortieren ist O (nlogn), fl

    
zhang rui 02.11.2016 07:31
quelle

Tags und Links