Wie kann ich in Haskell effizient umkehren?

8

Beachten Sie, dass die triviale Lösung

ist %Vor%

ist wegen der quadratischen Zunahme der Komplexität nicht sehr effizient. Wenn ich versucht habe, die übliche falzl zu falten (blind), aber mein Versuch

%Vor%

hat nicht wie erwartet funktioniert.

    
shuhalo 22.10.2011, 21:57
quelle

5 Antworten

19

Versuchen Sie Folgendes:

%Vor%

Obwohl es normalerweise besser ist, es mit foldl ':

%Vor%     
fuz 22.10.2011 22:08
quelle
8

Betrachten Sie Folgendes:

%Vor%

Lass es uns einfach in Stücke schneiden:

%Vor%

Jetzt haben wir diese Reihe von Funktionen, lassen Sie uns sie zusammenstellen:

%Vor%

((.), id) es ist Endo monoid, also

%Vor%

Für die linke Falte brauchen wir nur Dual monoid.

%Vor%

(<>) = (:) und seed = []

%Vor%

Oder einfach:

%Vor%     
klapaucius 23.10.2011 12:20
quelle
2

Grundsätzlich müssen Sie 1: 2: 3: [] in (3:). (2:). (1 :) umwandeln und auf [] anwenden. Also:

%Vor%

Die Bedeutung des akkumulierten g ist hier, dass es auf sein Argument einwirkt, indem es den umgekehrten partiellen Schwanz von xs an ihn anfügt.

Für das Beispiel 1: 2: 3: [] wird im letzten Schritt x 3 und g wird (2:). (1:).

    
comco 02.09.2015 16:38
quelle
0
%Vor%     
ivan_a 10.12.2012 04:06
quelle
-2

alte Frage, ich weiß, aber gibt es etwas nicht optimal bei diesem Ansatz, es scheint, als wäre foldr aufgrund der faulen Bewertung schneller und der Code ist ziemlich knapp:

%Vor%

ist (++) deutlich langsamer als (:), was einige logische Wendungen erfordert, wie in FUZxxls Antwort

gezeigt     
low_ghost 19.12.2015 21:28
quelle

Tags und Links