Вопрос Что нового в чисто функциональных структурах данных со времен Окасаки? и эпический ответ jbapple, упомянутый с использованием списков различий в функциональном программировании (в отличие от логического программирования), что меня недавно интересовало. Это привело меня к поиску реализации списка различий для Haskell. У меня есть два вопроса (простите / исправьте меня, если я должен задать им два разных вопроса в StackExchange).
Простой вопрос заключается в том, знает ли кто-либо об академическом рассмотрении списков различий в функциональном программировании и / или реализациях, помимо списка в библиотеке Haskell? Ответ jbapple не дал цитаты для списков различий (списки различий в логическом программировании существуют в знаниях и в нескольких источниках, которые у меня есть Around Here Somewhere (TM)). До того, как найти реализацию на Haskell, я не знал, что идея перешла от логики к функциональному программированию. Конечно, списки различий в Haskell являются чем-то вроде естественного использования функций более высокого порядка и работают совершенно иначе, чем в логическом программировании, но интерфейс, безусловно, схож.
Более интересная (и не очень понятная) вещь, о которой я хотел спросить, заключается в том, является ли заявленная асимптотическая верхняя граница для вышеупомянутой библиотеки разностных списков на языке Haskell верной / правдоподобной. Моя путаница может быть из-за того, что я упускаю что-то из очевидного в логике сложности, но заявленные границы имеют смысл для меня, только если замена на большую структуру данных (или формирование замыкания, или поиск переменной, или что-то ) всегда занимает постоянное время. Или «подвох» заключается просто в том, что нет ограничений по времени выполнения для «головы» и «хвоста» именно потому, что этим операциям, возможно, придется пахать через произвольную кучу отложенных вычислений / замен?
Ответы:
Я думаю, что это более или менее правильно. ЭБ только действительно быстрые операции сборки, хотя, так что вспашка , где мΘ ( м ) м - количество операций, используемых для построения DL.
fromList
head
tail
[a] -> [a]
toList
источник
Да, границы зависят от предположения, что состав функции занимает постоянное время. В основном, если у вас есть список присоединения:
Очевидно, что конкатенация является постоянным временем, и этоO ( n ) чтобы превратить это в список против. Если вы подумаете об обычном представлении замыканий, вы увидите, что это в основном то же представление указателя, что и обычное представление типов данных. (В качестве альтернативы вы можете просмотреть этот тип как нефункционализированный список различий.)
источник