Что такое DList?

Я пытался поискать в гугле, но получил только истории о второстепенных знаменитостях. Учитывая отсутствие документации, что такое ДСписок?


person oxbow_lakes    schedule 28.07.2010    source источник
comment
Я нажал на этот вопрос только для того, чтобы пошутить о знаменитостях. Но это уже было в вопросе... +1   -  person Will Dean    schedule 28.07.2010


Ответы (4)


Это список различий в духе "Список различий как функции".

scala> val (l1, l2, l3) = (List(1, 2, 3), List(4, 5, 6), List(7, 8, 9))
l1: List[Int] = List(1, 2, 3)
l2: List[Int] = List(4, 5, 6)
l3: List[Int] = List(7, 8, 9)

Эффективное добавление:

scala> l1 ::: l2 ::: l3
res8: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9)

Неэффективное добавление. Это создает промежуточный список (l1 ++ l2), затем ((l1 ++ l2) ++ l3)

scala> l1 ++ l2 ++ l3  // inefficient
res9: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9)

DList хранит добавления, и ему нужно создать только один полный список, эффективно вызывающий:

scala> List(l1, l2, l3) reduceRight ( _ ::: _) 
res10: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9)
person retronym    schedule 28.07.2010
comment
Разве добавление обычных списков Scala с ::: не линейно по длине префиксов? Или есть какой-то дополнительный код, который использует их неизменность, чтобы добиться большего? - person Kris Nuttycombe; 28.07.2010
comment
При DList общая операция по-прежнему равна O(n * m), где n — количество фрагментов, а m — размер фрагмента. С ++ операция O(n * n * m) - person retronym; 28.07.2010

Списки различий представляют собой спископодобную структуру данных, поддерживающую операции добавления O(1).

Добавление и другие операции, которые изменяют список, представлены через функциональную композицию функций модификации, а не путем прямого копирования списка.

Пример из библиотеки dlist Haskell:

-- Lists as functions
newtype DList a = DL { unDL :: [a] -> [a] }

-- The empty list
empty       = DL id

-- The append case: composition, a la Hughes
append xs ys = DL (unDL xs . unDL ys)

-- Converting to a regular list, linear time.
toList      = ($[]) . unDL

Этот метод восходит как минимум к Hughes 84, Новое представление списков и его применение к функции «обратно», Р. Джон Хьюз, 1984 г., где он предлагает представлять списки как функции и добавлять их как композицию функций, что позволяет, например, реверс для работы в линейном времени. Из бумаги:


введите здесь описание изображения

введите здесь описание изображения


person Don Stewart    schedule 11.06.2011
comment
Хорошо бы добавить a -> DList a пример: singleton = \a -> DL ((:) a) - person palik; 21.11.2019

Это тип данных в неканоническом пакете scalaz, полезный для типизированных списков с константами. временной доступ на обоих концах. (Хитрость заключается в том, чтобы погуглить «scala» И «dlist».)

person Kilian Foth    schedule 28.07.2010
comment
Я предположил, что это не относится к Scala - person oxbow_lakes; 28.07.2010
comment
Было обнаружено, что DList переполняет стек и был удален из Scalaz: code.google. .com/p/scalaz/issues/detail?id=19 - person Will Sargent; 06.04.2012
comment
@WillSargent DList был снова добавлен в Scalaz в 2011 году github.com/scalaz/scalaz/commit/ - person Mauricio Scheffer; 06.09.2013

На странице проекта scalaz:

DList, тип данных для представления элементов одного и того же типа с постоянными операциями добавления/добавления времени.

person michael.kebe    schedule 28.07.2010