metaclass: (Default)
[personal profile] metaclass
А вот как правильно сделать такую иммутабельную функциональную структуру данных:

есть словарь(map) из строк в качестве ключей и некоей структуры в качестве значений. Причем эта структура содержит внутри себя список. Для простоты можно считать что структура и есть просто список.
И задача - заполнить оный словарь имея список пар "строка-ключ, значение для списка". Ключи в списке пар повторяются. Короче, что-то вроде "select key,list(value) from KeyValuePairs group by key".

Наверно, можно предварительно отсортировать список по ключам, затем просто пройтись по списку, объединяя списки пар с одинаковыми ключами в пару "ключ, список значений" и полученное затем засунуть в словарь.

Date: 2010-09-09 03:02 pm (UTC)
From: [identity profile] x-a-e-p.livejournal.com
вставки делать надо(то есть после начального заполнения структуры изменяться она не будет)? если нет, то собственно, отсортированный по ключу массив (ключ, значение) и есть такая структура.

Date: 2010-09-09 05:15 pm (UTC)
From: [identity profile] http://users.livejournal.com/_slw/
push @{$Dict{$key}}, $value;

Date: 2010-09-09 08:50 pm (UTC)
From: [identity profile] permea-kra.livejournal.com
foldl M.empty (M.unionWith (++)) . map ( uncarry M.singleton )

Date: 2010-09-09 08:54 pm (UTC)
From: [identity profile] http://users.livejournal.com/_slw/
у меня лаконичней

Date: 2010-09-09 08:55 pm (UTC)
From: [identity profile] permea-kra.livejournal.com
У вас нечитаемый asii-арт.

Date: 2010-09-09 08:57 pm (UTC)
From: [identity profile] http://users.livejournal.com/_slw/
не более вашего

Date: 2010-09-09 08:56 pm (UTC)
From: [identity profile] permea-kra.livejournal.com
И половина мысли, насколько я вижу

Date: 2010-09-09 08:59 pm (UTC)
From: [identity profile] http://users.livejournal.com/_slw/
ровно та половина, на которую хватило ТЗ

Date: 2010-09-10 04:12 am (UTC)
From: [identity profile] gds.livejournal.com
кстати да, вот тут перл лучше хаскеля. Гораздо более интуитивно-понятное решение.

Date: 2010-09-09 06:12 pm (UTC)
From: (Anonymous)
Кажется, в простейшем случае вам подходит Data.Map.insertWith (++).

Date: 2010-09-09 06:21 pm (UTC)
From: [identity profile] metaclass.livejournal.com
Ага, ближе всего к этому.

Date: 2010-09-09 07:01 pm (UTC)
From: [identity profile] gds.livejournal.com
правильно -- в зависимости от того, что делают с ключами потом, для доступа по ним. В среднем случае -- какое-нибудь avl tree (есть доказанно-корректная реализация, если чо), значения которого хранят эти самые list(value) (либо список, либо finger trees).
А вот как такое строить -- есть разные идеи. Если очень хочется эффективности, можно сделать слияние деревьев, где для слияния значений будет использоваться какая-нибудь из эффективных форм склеивания содержимого (для списков -- зависит от списков и семантики языка, для finger trees -- всё однозначно).

Date: 2010-09-09 08:53 pm (UTC)
From: [identity profile] permea-kra.livejournal.com
>>есть словарь(map) из строк в качестве ключей
http://hackage.haskell.org/package/list-tries-0.2

>>И задача - заполнить оный словарь имея список пар "строка-ключ, значение для списка"
http://hackage.haskell.org/packages/archive/fingertree/0.0.1.0/doc/html/Data-FingerTree.html В вариации секуэнса (см статью из заголовка)



Profile

metaclass: (Default)
metaclass

April 2017

S M T W T F S
      1
2345678
9101112 131415
16171819202122
23242526272829
30      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Aug. 26th, 2025 01:50 pm
Powered by Dreamwidth Studios