Общая реализация Trie Haskell

Мне нужна была общая реализация Trie на Haskell, но я не смог ее найти.

Мне были реализованы мои собственные функции (здесь только ключи, мне не нужны данные по Trie), но я хочу найти хорошая реализация Trie в Haskell для будущего использования (я новичок в haskeller).

Я нашел Data.Trie, но ключи ByteString.

Является ли Data.Trie правильным вариантом? (и то я не знаю, как его использовать)

Спасибо!!! :D


person josejuan    schedule 18.04.2013    source источник
comment
Невозможно написать триал, работающий с произвольными типами ключей. Какие ключи вы хотите использовать? Обратите внимание, что Data.IntMap и Data.IntSet — это попытки с ключами Int.   -  person C. A. McCann    schedule 18.04.2013
comment
К.А. McCann, Trie нужен только тип, поддерживающий оператор равенства над упорядоченными исходными данными. При этом вы можете построить Trie. Что имеет значение, если вы не знаете базовый тип? Разве моя реализация не Trie? Благодарю вас! (Но предположим, что тип ключа — [a])   -  person josejuan    schedule 18.04.2013
comment
Правильно, вам нужно, чтобы ключи представляли собой какую-то последовательность или что-то, что вы можете превратить в последовательность. Например, Data.IntMap обрабатывает Int как последовательность битов. Возможность сортировать или индексировать непосредственно каждый фрагмент — это хорошо, но достаточно списка вещей, которые вы можете сравнить на равенство. В любом случае, есть пакет list-tries, но он всегда казался мне немного запутанным.   -  person C. A. McCann    schedule 18.04.2013
comment
Хорошо (извините, иногда я не понимаю :( ). Спасибо!!!   -  person josejuan    schedule 18.04.2013
comment
Ух ты! Я доволен, моя собственная реализация Trie следует стратегии пакета list-tries (я шел правильным путем) :D :D :D Спасибо (можете написать ответ на голосование как решенный?) :)   -  person josejuan    schedule 18.04.2013
comment
@C.A.McCann Нет ничего изначально проблематичного в определении попыток для почти произвольных типов ключей. См., например, этот документ: citeseerx.ist.psu.edu/ viewdoc/summary?doi=10.1.1.1.6342 Насколько мне известно, эта идея используется в пакете Conal MemoTrie, но для конкретной цели запоминания.   -  person kosmikus    schedule 18.04.2013
comment
@kosmikus: Конечно, но акцент на ближнем. Вам не нужно многого, но полностью полиморфного дерева без ограничения класса не произойдет.   -  person C. A. McCann    schedule 18.04.2013


Ответы (3)


Перенесено из комментария по просьбе...

Единственная очень общая реализация trie, о которой я знаю, это пакет list-tries . Мне всегда казалось, что это немного перегружено, но «слишком сложный» для одного человека является «полнофункциональным» для другого, поэтому, если это соответствует вашим целям, дерзайте. Кроме того, пакет активно поддерживается, и это хорошо.

Да, и, поскольку в пакете нигде это явно не указано, я мог видеть: версия «Patricia trie» — это trie, который сжимает последовательности узлов с одной ветвью в один узел, хранящий префикс общего ключа. Таким образом, для ключей «aabb» и «aabc» вы получите узел с «aab», а затем ответвления «b» и «c». Стандартное дерево всегда разветвляется по одному элементу за раз.

person C. A. McCann    schedule 18.04.2013

Ознакомьтесь с пакетом MemoTrie на Hackage и на GitHub. Справочную информацию о простой и красивой теории, лежащей в основе, см. на странице мемоизации вики Haskell, включая две статьи Ральфа Хинце, одну мной и некоторыми сообщениями в блогах.

Другой пакет trie/memoization — functor-combo, также на Hackage и на GitHub. Этот пакет воплощает в себе реализацию идей, описанных в разделе Элегантное запоминание с использованием типов высшего порядка< /em> и другие записи блога.

Некоторые другие связанные пакеты:

person Conal    schedule 18.04.2013
comment
Спасибо, Конал, но я не могу сопоставить ваш ответ с моим вопросом (я уверен, что виноват). Интуитивно я не могу понять, как я могу проверять (внутри) мемоизированную структуру, с другой стороны, используя trie, я могу проверять эту структуру для получения новой информации (запоминание выполняется как черный ящик). Я часто читаю ваш пост, но он слишком сложен (как по волшебству) для меня :D :D В любом случае спасибо!!!! - person josejuan; 18.04.2013
comment
@josejuan: запомненная структура является деревом. Мемоизация представляет собой композицию из двух фаз: memo = untrie . trie. Первая фаза (trie) преобразует функцию в дерево, а вторая фаза преобразует это дерево обратно в функцию. Если все, что вам нужно, это запоминание, вы можете обращаться с memo как с черным ящиком. Если вы хотите больше проверить и преобразовать сами данные, просто заступитесь после trie и перед untrie. Эти древовидные структуры всегда находятся в Functor, Applicative, Foldable, Traversable и Monad, поэтому сразу же доступно множество функций для работы с ними. - person Conal; 19.04.2013

http://hackage.haskell.org/package/TrieMap — часть моей работы в день. Мне не совсем понятно, что вы подразумеваете под «общим», но TrieMap поддерживает более или менее произвольные (даже рекурсивные!) алгебраические типы данных, например бинарные деревья, как тройные ключи.

person Louis Wasserman    schedule 18.04.2013
comment
Очень интересно, спасибо! list-tries является прямым для использования, и в качестве универсального trie можно использовать любую другую структуру (например, дерево может быть пройдено/последовательно, тогда вы можете использовать его с list-tries, другой, вы можете преобразовать IntTrie в list-trie [Бит]), но ваша реализация делает это явно! (Видел вашу посылку, но не понял), обязательно воспользуюсь в будущем! :D Спасибо! - person josejuan; 19.04.2013