Массив 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 бита.

Некоторые другие ссылки:

Последние имеют номера сравнения для различных высокопроизводительных реализаций trie.

Ответ 3

Это оказалось более сложным, чем я думал. PyJudy может стоить того, чтобы выглядеть, как было бы Tie:: Judy. Там что-то на Softpedia и что-то Ruby-ish. Проблема в том, что ни одна из них не является специфичной для .NET.