Я разработал чисто функциональную очередь в Лиспе (схема) следующим образом:Является ли эта простая чисто функциональная очередь действительной?
;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?)
задержки минусы похожи на минусы, но она приостанавливает оценку хвоста, окружив его закрытие. delay-append аналогично (delay-append s t) добавляет t к s рекурсивными подвесками хвоста.
Следовательно, каждая обводка обертывает один слой затвора, делая его O (1), каждый заглядывает, просто извлекает значение, создавая его O (1), и каждый dequeue извлекает и оценивает одно замыкание, делающее его O (1).
Я не видел этого в другом месте; например, в чистых функциональных структурах данных Окасаки простейшая очередь представляет собой очередность банкира, которая значительно сложнее, чем эта, и только амортизировала O (1) enqueue, peek и dequeue. Что вызывает у меня подозрение, что в моих рассуждениях есть ошибка.
Это структура данных звук? Есть ли здесь ссылка?
Редактировать: Задержки-минусы - это неправильная вещь для использования в delay-append here; Я пытаюсь использовать функцию как макрос (спасибо Will Ness).
Я попытался исправить это с помощью
(define (delay-append s t)
(if (null? s)
t
(cons (delay-car s) (lambda() (delay-append (delay-cdr s) t)))))
, но это не работает с API.
Может быть, вы должны прийти с утверждениями, тестами и примерами, чтобы проверить, что вы сделали.Особенно неясно, какая именно «задержка» это обеспечивает и что «задержка-минус» действительно делает - учитывая, что Scheme делает * строгую оценку. –
ваше редактирование сломало его. до этого было хорошо. –
Спасибо, это так; Я пытался компенсировать неправильные задержки-задержки (я пытался использовать функцию как макрос) - enqueue - O (N), как написано. –