Массив Джуди для управляемых языков - PullRequest
11 голосов
/ 15 февраля 2009

массив Джуди - это быстрая структура данных, которая может представлять разреженный массив или набор значений. Есть ли его реализация для управляемых языков, таких как C #? Спасибо

Ответы [ 3 ]

16 голосов
/ 16 февраля 2009

Стоит отметить, что их часто называют деревьями Джуди или Триами Джуди, если вы ищете их в Google.

Я также искал реализацию .Net, но ничего не нашел. Также стоит отметить, что:

Реализация в значительной степени рассчитана на эффективное использование кэша, поскольку такие особенности реализации могут сильно зависеть от размера определенных конструкций, используемых в подструктурах. В этом отношении управляемая реализация .Net может несколько отличаться.

Есть некоторые существенные препятствия, которые я могу видеть (и, возможно, есть и другие, которые я пропустил при кратком сканировании)

  • API имеет некоторые довольно анти-OO-аспекты (например, нулевой указатель рассматривается как пустое дерево), поэтому он упрощен, переместите указатель состояния в LHS и заставьте преобразование методов экземпляра функции в C ++ не работать.
  • Реализация подструктур, на которые я смотрел, интенсивно использовала указатели. Я не вижу, чтобы они эффективно переводились в ссылки на управляемых языках.
  • Реализация является воплощением множества очень сложных идей, которые противоречат простоте общедоступного API.
  • База кода составляет около 20 тыс. Строк (большая часть сложная), это не кажется мне простым портом.

Вы можете взять библиотеку и обернуть код C в C ++ / CLI (возможно, просто внутренне удерживая указатель, который является страницей приложения, и все вызовы c указывают на него). Это обеспечило бы упрощенную реализацию, но связанные библиотеки для нативной реализации могут быть проблематичными (как и распределение памяти). Вам также, вероятно, понадобится преобразовать строки .Net в обычный старый байт * при переходе (или просто работать с байтами напрямую)

12 голосов
/ 18 февраля 2009

Джуди не совсем подходит для управляемых языков. Я не думаю, что вы сможете использовать что-то вроде SWIG и сделать первый слой автоматически.

Я написал PyJudy, и мне пришлось внести некоторые нетривиальные изменения API, чтобы они хорошо вписывались в Python. Например, я написал в документации:

Массивы JudyL отображают машинные слова в машинные слова. На практике слова хранить беззнаковые целые или указатели. PyJudy поддерживает все четыре отображения как отдельные классы.

  • pyjudy.JudyLIntInt - карта без знака целочисленные ключи к целому без знака Значения
  • pyjudy.JudyLIntObj - карта без знака целочисленные ключи к значениям объекта Python
  • pyjudy.JudyLObjInt - карта Python ключи объекта к целому без знака Значения
  • pyjudy.JudyLObjObj - карта Python ключи объекта к значениям объекта Python

Я не просматривал код в течение нескольких лет, поэтому мои воспоминания о нем довольно туманные. Это была моя первая библиотека расширений Python, и я помню, что я собрал некую систему шаблонов для генерации кода. В настоящее время я бы использовал что-то вроде genshi.

Я не могу указать на альтернативы Джуди - это одна из причин, почему я ищу Stackoverflow.

Редактировать: Мне сказали, что мои временные числа в документации отличаются от того, что предлагает документация Джуди, потому что Джуди разработана для 64-битных строк кэша, а мой PowerBook был только 32-битным.

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

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

2 голосов
/ 15 февраля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...