I rozwinęły czysto funkcjonalnego kolejki w Lisp (schemat) w następujący sposób:Czy ta prosta, funkcjonalna kolejka jest ważna?
;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?)
opóźniających przeciw-podobna do wad, ale zawiesza oceny ogona przez owijanie go w zamknięciu. delay-append podobnie (delay-append s t) dodaje t do s przez rekurencyjne zawieszenie ogona.
W konsekwencji każda kolejka zawija jedną warstwę zamknięcia, co sprawia, że O (1), każdy widok po prostu pobiera wartość powodującą, że jest O (1), a każda kolejka usuwa i ocenia jedno zamknięcie, co powoduje, że O (1).
Nie widziałem tego gdzie indziej; na przykład w czysto funkcjonalnych strukturach danych Okasaki najprostszą kolejką jest kolejka bankierska, która jest znacznie bardziej skomplikowana niż ta, i ma tylko zamortyzowaną O (1), podgląd i usunięcie kolejki. Co sprawia, że podejrzewam, że w moim rozumowaniu jest błąd.
Czy ta struktura danych brzmi? Czy gdzieś tam jest odniesienie?
Edycja: opóźnienie-minusy to niewłaściwa rzecz do zastosowania w opóźnieniu-dopisz tutaj; Próbuję użyć funkcji podobnej do makra (dzięki Will Ness).
Próbowałem go skorygować za pomocą
(define (delay-append s t)
(if (null? s)
t
(cons (delay-car s) (lambda() (delay-append (delay-cdr s) t)))))
ale to nie działa z API.
Może powinieneś wymyślić twierdzenia, testów i przykładów, by sprawdzić, co zrobiłeś.Szczególnie nie jest jasne, jakie "opóźnienie" to zapewnia i jakie "opóźnienia-minusy" faktycznie istnieją - biorąc pod uwagę, że Schemat ma * ścisłą * ocenę. –
Twoja edycja zepsuła to. było już OK. –
Dzięki Will, zrobił to; Próbowałem skompensować niepoprawne opóźnienia (próbowałem użyć funkcji jak makro) - kolejka jest O (N), jak napisano. –