Ich habe eine rein funktionelle Warteschlange in Lisp (Schema) wie folgt entwickelt:Ist diese simple rein funktionale Warteschlange gültig?
;Internal functions
(define (delay-cons x s)
(cons x (lambda() s)))
(define (delay-car s)
(car s))
(define (delay-cdr s)
((cdr s)))
(define (delay-append s t)
(if (null? s)
t
(delay-cons (delay-car s) (delay-append (delay-cdr s) t))))
;API
(define (enqueue x q) (delay-append q (delay-cons x empty)))
(define dequeue delay-cdr)
(define peek delay-car)
(define empty '())
(define empty? null?)
verzögerungs Nachteile cons ähnlich ist, aber es unterbricht die Auswertung des Schwanzes, indem es in einer Schließ Einwickeln. Delay-append ähnlich (delay-append s t) hängt t an s durch rekursive Suspensionen des Tails an.
Folglich umschließt jede Enqueue eine Schicht des Verschlusses, so dass sie O (1) ergibt, jeder Peek erhält einfach einen Wert, der O (1) ergibt, und jede Ausqueuerei ruft einen Verschluss ab und bewertet ihn, der ihn zu O (1) macht.
Ich habe das anderswo nicht gesehen; Zum Beispiel ist in Okasakis rein funktionalen Datenstrukturen die einfachste Warteschlange eine Bankwarteschlange, die wesentlich komplizierter ist als diese und nur O (1) Enqueue, Peek und Dequeue amortisiert hat. Was mich verdächtig macht, dass meine Argumentation falsch ist.
Klingt diese Datenstruktur? Gibt es irgendwo eine Referenz?
Bearbeiten: Verzögerung-Nachteile ist die falsche Sache in Verzögerung-Append hier zu verwenden; Ich versuche eine Funktion wie ein Makro zu benutzen (Danke Will Ness).
Ich habe versucht, es zu korrigieren
(define (delay-append s t)
(if (null? s)
t
(cons (delay-car s) (lambda() (delay-append (delay-cdr s) t)))))
verwenden, aber dies mit der API funktioniert nicht.
Vielleicht sollten Sie kommen mit Behauptungen, Tests und Beispielen zu überprüfen, was Sie getan haben.Insbesondere ist nicht klar, welche Art von "Verzögerung" dies bietet und was "Verzögerung-Nachteile" tatsächlich bewirkt - angesichts der Tatsache, dass das Programm * eine strikte * Bewertung vornimmt. –
Ihre Bearbeitung hat es kaputt gemacht. Es war OK vorher. –
Danke Will, tat es; Ich habe versucht, Verzögerungen zu kompensieren - Nachteile falsch (Ich habe versucht, eine Funktion wie ein Makro zu verwenden) - Enqueue ist O (N) wie geschrieben. –