массив Judy - это быстрая структура данных, которая может представлять собой разреженный массив или набор значений. Есть ли его реализация для управляемых языков, таких как С#? Благодаря
Массив Judy для управляемых языков
Ответ 1
Стоит отметить, что их часто называют Judy Trees или Judy Tries, если вы ищете для них.
Я также искал реализацию .Net, но ничего не нашел. Также стоит отметить, что:
Реализация в значительной степени предназначена для эффективного использования кеша, поскольку такие особенности реализации могут сильно зависеть от размера определенных конструкций, используемых в подструктурах. В этом отношении реализация, управляемая .NET. Может быть несколько иной.
Есть некоторые существенные препятствия, которые я могу видеть (и, вероятно, больше того, что мое короткое прохождение пропустило)
- API имеет некоторые анти-OO-аспекты (например, нулевой указатель рассматривается как пустое дерево), поэтому он упрощен, перемещает указатель состояния на LHS и делает методы экземпляров методов экземпляров на С++ не будет работать.
- Реализация подструктур, на которые я смотрел, сильно использовала указатели. Я не вижу, чтобы они эффективно переводились на ссылки на управляемые языки.
- Реализация - это перегонка множества очень сложных идей, которые противоречат простоте публичного api.
- Кодовая база составляет около 20 тыс. строк (большая часть из них сложная), это не делает меня легким портом.
Вы можете взять библиотеку и обернуть код C в С++/CLI (возможно, просто удерживая внутри себя указатель, который является c api trie и имеющий все вызовы c, указывает на это). Это обеспечило бы упрощенную реализацию, но связанные библиотеки для собственной реализации могут быть проблематичными (как и распределение памяти). Вероятно, вам также придется иметь дело с преобразованием строк .Net в обычный старый байт * при переходе (или просто работать с байтами напрямую)
Ответ 2
Джуди действительно плохо подходит для управляемых языков. Я не думаю, что вы сможете использовать что-то вроде SWIG и сделать первый слой автоматически.
Я написал PyJudy, и мне пришлось сделать некоторые нетривиальные изменения API, чтобы они хорошо вписывались в Python. Например, я написал в документации:
Макеты JudyL сопоставляют машинные слова с машинные слова. На практике слова хранить целые числа без знака или указатели. PyJudy поддерживает все четыре отображения в виде различные классы.
- pyjudy.JudyLIntInt - карта без знака целые ключи для целых чисел без знака значения
- pyjudy.JudyLIntObj - карта без знака целочисленные ключи к значениям объектов Python
- pyjudy.JudyLObjInt - карта Python Объектные ключи для целых чисел без знака значения
- pyjudy.JudyLObjObj - карта Python объектные ключи к значениям объектов Python
Я не смотрел код в течение нескольких лет, поэтому мои воспоминания об этом довольно туманны. Это была моя первая библиотека расширений Python, и я помню, что я взломал систему шаблонов для генерации кода. В настоящее время я бы использовал что-то вроде genshi.
Я не могу указать на альтернативы Джуди - это одна из причин, почему я ищу Stackoverflow.
Изменить: мне сказали, что мои временные номера в документации отключены от документации Judy, потому что Judy разработана для 64-разрядных строк кеша, а мой PowerBook - всего 32 бита.
Некоторые другие ссылки:
- Патрисия пытается (http://www.csse.monash.edu.au/~lloyd/tildeAlgDS/Tree/PATRICIA/)
- Двойной массив пытается (http://linux.thai.net/~thep/datrie/datrie.html)
- HAT-trie (http://members.optusnet.com.au/~askitisn/index.html)
Последние имеют номера сравнения для различных высокопроизводительных реализаций trie.
Ответ 3
Это оказалось более сложным, чем я думал. PyJudy может стоить того, чтобы выглядеть, как было бы Tie:: Judy. Там что-то на Softpedia и что-то Ruby-ish. Проблема в том, что ни одна из них не является специфичной для .NET.