Size: a a a

2021 March 04

VD

Velvet Darkness in Haskell
Мне в голову один раз приходило сделать на int map или типа того.
источник

VD

Velvet Darkness in Haskell
Заодно можно будет не аллоцировать всю память заранее даже.
источник

JS

Jerzy Syrowiecki in Haskell
на расстоянии вытянутой руки, кажется, только IntMap
источник

JS

Jerzy Syrowiecki in Haskell
ещё в природе есть https://en.wikipedia.org/wiki/Finger_tree
источник

JS

Jerzy Syrowiecki in Haskell
Seq построен на finger tree, но обещает только логарифмические чтение и запись
источник

VD

Velvet Darkness in Haskell
Смотрю на intmap и получается insert за min(n, W), где n - кол-во элементов в мапе, W - кол-во бит в int. Т.к. у меня предполагается 2^15 элементов максимум, то получается будет по W.
источник

VD

Velvet Darkness in Haskell
А была бы полиморфная BitMap, то можно было было бы и Word16 заюзать для ключа и иметь W в два раза меньше.
источник

VD

Velvet Darkness in Haskell
Вообще нормально, запишу себе в черную книжицу intmap на случай, если попа опять сгорит от Array.(!): invalid index.
источник

VD

Velvet Darkness in Haskell
А Data.Array здравомыслящие люди получается вообще не используют или есть какие-то случаи, когда предпочтительнее чем vector?
источник

MK

Maxim Koltsov in Haskell
не используют
источник

JS

Jerzy Syrowiecki in Haskell
Velvet Darkness
Смотрю на intmap и получается insert за min(n, W), где n - кол-во элементов в мапе, W - кол-во бит в int. Т.к. у меня предполагается 2^15 элементов максимум, то получается будет по W.
min (2^15) 64 = 64
O(64) = O(1)
источник

VD

Velvet Darkness in Haskell
По всей строгости определения O таки да, но O(16) все равно лучше O(64).
источник

JS

Jerzy Syrowiecki in Haskell
Velvet Darkness
А была бы полиморфная BitMap, то можно было было бы и Word16 заюзать для ключа и иметь W в два раза меньше.
возможно, имеет значение только ширина машинного слова, и делать ключ меньше машинного слова нет смысла
источник

JS

Jerzy Syrowiecki in Haskell
но это неточно
источник

VD

Velvet Darkness in Haskell
Ну почему ж. Если Word16 вместо Int, то в два раза больше ключей в одну и ту же память влезет.
источник

VD

Velvet Darkness in Haskell
Если там еще ключи как-нибудь линейным массивом хранить, то в кеш больше влезет и будет быстрее искаться
источник

VD

Velvet Darkness in Haskell
Но я не настоящий байтоёб, так что да, "это неточно".
источник

JS

Jerzy Syrowiecki in Haskell
можно попробовать форкнуть IntMap, заменить там type Key = Word16 и побенчмаркать
источник

JS

Jerzy Syrowiecki in Haskell
Velvet Darkness
Если там еще ключи как-нибудь линейным массивом хранить, то в кеш больше влезет и будет быстрее искаться
там вроде ключи не хранятся вообще, по индексам битовые маски рассчитываются
источник

JS

Jerzy Syrowiecki in Haskell
а, да, хранится общий префикс ключа
источник