Ersetzt ein Listenelement ein Anti-Pattern?

8

Ich habe ein Modul, das auf Wegen arbeitet, die als Listen dargestellt werden. Die meisten Funktionen machen eine typische rekursive Listenverarbeitung, aber jetzt brauche ich eine, die manchmal einen Pfad mutiert. Also habe ich diese replace Funktion geschrieben:

%Vor%

was so funktioniert:

%Vor%

Wenn ich das Bedürfnis habe, ein eingebautes Modul zu erweitern, merke ich schließlich, dass ich etwas Eigenartiges oder Ineffizientes mache. Ersetzt ein Listenelement eines dieser Dinge? Gibt es einen einfacheren (ebenso effizienten) Weg, dies zu tun?

    
Daniel 12.07.2012, 15:34
quelle

3 Antworten

4

Wenn O(N) complexity für Ihre Anwendung akzeptabel ist, ist Ihr Code perfekt. Für eine bessere Komplexität möchten Sie die Notwendigkeit einer linearen Suche umgehen, indem Sie beispielsweise den Elementen eine Reihenfolge zuweisen und binäre Suchbäume verwenden.

Ein ähnliches Problem, das keine Suche beinhaltet, ist das Ersetzen eines Listenelements durch einen bekannten Index:

%Vor%

Für dieses Problem existieren bessere persistente Datenstrukturen als die Standardliste. Suche nach rein funktionalen Random-Access-Listen in der Literatur.

Seltsamerweise definiert keine ML-Familiensprache (OCaml, F #, SML) replace oder replaceAt in der Standardlistenbibliothek. Dies soll Benutzer dazu anregen, ihren Code neu zu gestalten, um die Komplexität dieser Operationen zu vermeiden.

    
t0yv0 14.07.2012, 21:29
quelle
4

Sie können es mit List.fold schreiben:

%Vor%

Es ist etwas einfacher und mit ähnlicher Leistung (eine einzelne Schleife über die Elemente der Liste).

    
MiMo 12.07.2012 15:55
quelle
2
%Vor%

AKTUALISIEREN

%Vor%     
BLUEPIXY 12.07.2012 23:47
quelle

Tags und Links