Разница в асимптотическом времени двух вариантов сглаживания - PullRequest
2 голосов
/ 15 августа 2011

Я прохожу документ Scala by Example и у меня возникают проблемы с упражнением 9.4.2. Вот текст:

Упражнение 9.4.2 Рассмотрим проблему написания функции flatten, которая принимает список списков элементов в качестве аргументов. Результатом flatten должно быть объединение всех списков элементов в один список. Вот реализация этого метода в терминах :\.

def flatten[A](xs: List[List[A]]): List[A] =
  (xs :\ (Nil: List[A])) {(x, xs) => x ::: xs}

Подумайте о замене тела сплющенного на

((Nil: List[A]) /: xs) ((xs, x) => xs ::: x)

Какая разница в асимптотической сложности между двумя версиями flatten?

Фактически flatten предопределен вместе с набором других пользовательских функций в объекте. Вызван список в стандартной библиотеке Scala. Доступ к нему можно получить из пользовательской программы, вызвав List.flatten. Обратите внимание, что flatten не является методом класса List - он не имеет смысла, поскольку он применяется только к спискам списков, а не ко всем спискам в целом.

Я не вижу, как асимптотическое время этих двух вариантов функции различается. Я уверен, что это потому, что мне не хватает чего-то фундаментального в значении сгибания влево и сгиба вправо.

Вот pdf документа, который я описываю: http://www.scala -lang.org / доку / файлы / ScalaByExample.pdf

Обычно я нахожу это отличным введением в Scala.

1 Ответ

4 голосов
/ 15 августа 2011

Посмотрите на реализацию конкатенации ::: (стр.68) (остальной ответ - в маске с тегами спойлера, при наведении курсора мыши!)

(продолжениевопрос: это единственный параметр, который следует принимать во внимание, думая об эффективности этой функции? Разве у foldLeft нет преимущества, а не асимптотическая сложность, которой у foldRight нет?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...