Size: a a a

2021 February 08

к

кана in Haskell Start
с мапой нет

можно взять [(k, v)] и тогда можно будет, но поиск за n
источник

AK

Alexey Kholodkov in Haskell Start
кана
с мапой нет

можно взять [(k, v)] и тогда можно будет, но поиск за n
А почему с ней нельзя? У меня же не fromList, а fromAscList. Может есть подобные ленивые структуры с логарифмическим поиском?
источник

к

кана in Haskell Start
Alexey Kholodkov
А почему с ней нельзя? У меня же не fromList, а fromAscList. Может есть подобные ленивые структуры с логарифмическим поиском?
мапа это дерево, длина пути до ноды все равно будет зависеть от размера дерева, получается чтобы вычислить путь до любой ноды, нужно знать как минимум количество элементов, что равносильно чтению всего файла
источник

к

кана in Haskell Start
раз ключи упорядоченны, то можно взять [(k, v)], искать бинарным поиском (что все равно будет за O(n), ведь это список, но меньше сравнений), но весь файл читать не придется при этом
источник

AK

Alexey Kholodkov in Haskell Start
кана
мапа это дерево, длина пути до ноды все равно будет зависеть от размера дерева, получается чтобы вычислить путь до любой ноды, нужно знать как минимум количество элементов, что равносильно чтению всего файла
То есть в реализации из Data.Map ноды хранятся не по отдельности, а в одном масиве?
источник

к

кана in Haskell Start
нет, ноды хранятся в дереве. Там буквально дерево

data Map k a
 = Bin k a (Map k a) (Map k a)
 | Tip


когда делаем лукап,
- если Tip, то элемента нет
- если Bin k a _ _, и k - нужный ключ, то a
- если Bin k _ l r, и k > нужного ключа, то ищем в l
- иначе ищем в r


lookup :: Ord k => k -> Map k a -> Maybe a
lookup = go
 where
   go !_ Tip = Nothing
   go k (Bin _ kx x l r) = case compare k kx of
     LT -> go k l
     GT -> go k r
     EQ -> Just x
источник

к

кана in Haskell Start
пока мы не знаем количество элементов мапы, мы не знаем, какая у дерева будет глубина, значит не сможем и найти путь
источник

к

кана in Haskell Start
поэтому мапы и сеты в такой реализации не могут быть бесконечными например
источник

к

кана in Haskell Start
точнее могут, если напрямую дерево строить бесконечное, но не могут быть получены из бесконечного списка
источник

к

кана in Haskell Start
какие-то альтернативы разумные для бесконечных мапов я не нашел, я все еще думаю, что в таких кейсах лучше всего использовать просто [(k, v)]
источник

AK

Alexey Kholodkov in Haskell Start
кана
пока мы не знаем количество элементов мапы, мы не знаем, какая у дерева будет глубина, значит не сможем и найти путь
Все равно не понимаю. Зачем мне путь в полном дереве? Почему не прочитать только кусок добавляя каждую ноду из списка к пустому дереву? Тогда полным оно будет только тогда (и если) потребуется последний элемент.
источник

к

кана in Haskell Start
Alexey Kholodkov
Все равно не понимаю. Зачем мне путь в полном дереве? Почему не прочитать только кусок добавляя каждую ноду из списка к пустому дереву? Тогда полным оно будет только тогда (и если) потребуется последний элемент.
1
---
 2
/
1
---
 2
/ \
1   3
---
   3
  / \
 2   4
/
1
источник

к

кана in Haskell Start
с разным числом элементов путь до 1 меняется
источник

к

кана in Haskell Start
пока неизвестна глубина дерева, путь тоже неизвестен
источник

к

кана in Haskell Start
нужно или заранее знать хотя бы число элементов (этого хватит, если заранее известно, что список пар точно отсортирован), или не балансировать дерево
источник

к

кана in Haskell Start
если не балансировать, то это просто обычный список пар и выйдет

1
\
 2
  \
   3
    \
     4

или

     4
    /
   3
  /
 2
/
1
источник

ВЩ

Взщз Щщщхш in Haskell Start
Кстати, строение мапы можно напечатать
источник

AK

Alexey Kholodkov in Haskell Start
кана
нужно или заранее знать хотя бы число элементов (этого хватит, если заранее известно, что список пар точно отсортирован), или не балансировать дерево
Балансировка же при каждом добавлении производится. Вот только тут уже нужна мутабельность
источник

к

кана in Haskell Start
Alexey Kholodkov
Балансировка же при каждом добавлении производится. Вот только тут уже нужна мутабельность
1. зачем мутабельность, эти мапы успешно балансируются без всякой мутабельности
2. а построение мапы из списка это не добавление?
источник

AK

Alexey Kholodkov in Haskell Start
кана
1. зачем мутабельность, эти мапы успешно балансируются без всякой мутабельности
2. а построение мапы из списка это не добавление?
1. Чтобы поменять ссылки в нодах. 2. Не знаю как в хаскеле
источник