Массив Джуди для управляемых языков
-
23-08-2019 - |
Вопрос
Массив Джуди — это быстрая структура данных, которая может представлять собой разреженный массив или набор значений.Существует ли его реализация для управляемых языков, таких как C#?Спасибо
Решение
Стоит отметить, что их часто называют «Judy Trees» или «Judy Tries», если вы ищете их в Google.
Я также искал реализацию .Net, но ничего не нашел.Также стоит отметить, что:
Реализация в значительной степени ориентирована на эффективное использование кэша, поскольку особенности такой реализации могут сильно зависеть от размера определенных конструкций, используемых в подструктурах.В этом отношении управляемая реализация .Net может несколько отличаться.
Я вижу на этом пути некоторые существенные препятствия (и, вероятно, есть еще несколько, которые я пропустил при кратком сканировании).
- В API есть некоторые довольно анти-OO-аспекты (например, нулевой указатель рассматривается как пустое дерево), поэтому в упрощенном виде перемещение указателя состояния в LHS и преобразование методов экземпляра функций в C++ не будет работать.
- Реализация подструктур, которые я рассмотрел, интенсивно использовала указатели.Я не вижу, чтобы они эффективно переводились в ссылки на управляемых языках.
- Реализация представляет собой квинтэссенцию множества очень сложных идей, которые противоречат простоте общедоступного API.
- База кода составляет около 20 тыс. строк (большинство из них сложны), и мне не кажется, что это простой порт.
Вы можете взять библиотеку и обернуть код C в C++/CLI (вероятно, просто удерживая внутри указатель, который является API-интерфейсом, и все вызовы c указывают на него).Это обеспечит упрощенную реализацию, но связанные библиотеки для собственной реализации могут быть проблематичными (как и распределение памяти).Вам также, вероятно, придется иметь дело с преобразованием строк .Net в простой старый байт * при переходе (или просто работать с байтами напрямую).
Другие советы
Джуди действительно не очень хорошо сочетается с управляемыми языками.Я не думаю, что вы сможете использовать что-то вроде SWIG и автоматически выполнить первый слой.
Я написал PyJudy, и в итоге мне пришлось внести некоторые нетривиальные изменения в API, чтобы он хорошо вписывался в Python.Например, я написал в документации:
Judyl Charrys Map Machine слова для машинных слов.На практике слова хранят без знака целых числа или указатели.Pyjudy поддерживает все четыре сопоставления в качестве отдельных классов.
- pyjudy.judylintint - карта без знака INTEGER KEYS для беспигенных целочисленных значений
- pyjudy.judylintobj - карта без знака целочисленных ключей к значениям объекта Python
- pyjudy.judylobjint - Map Python Object Keys для не знаменитых целочисленных значений
- pyjudy.judylobjobj - карта ключи объекта Python к значениям объекта Python
Я не просматривал код уже несколько лет, поэтому мои воспоминания о нем довольно смутны.Это была моя первая библиотека расширений Python, и я помню, что создал своего рода систему шаблонов для генерации кода.Сейчас я бы использовал что-то вроде генши.
Я не могу указать альтернативы Джуди — это одна из причин, по которой я ищу Stackoverflow.
Редактировать:Мне сказали, что мои значения времени в документации не соответствуют тем, что предлагает документация Джуди, потому что Джуди разработана для 64-битных строк кэша, а мой PowerBook был только 32-битным.
Некоторые другие ссылки:
- Патрисия старается(http://www.csse.monash.edu.au/~lloyd/tildeAlgDS/Tree/PATRICIA/ )
- Двойной массив пытается (http://linux.thai.net/~thep/datrie/datrie.html)
- ШЛЯПА-три (http://members.optusnet.com.au/~askitisn/index.html)
Последний содержит сравнительные цифры для различных высокопроизводительных реализаций дерева.
Это оказывается сложнее, чем я думал. ПиДжуди возможно, стоит посмотреть, как и Галстук::Джуди.Есть что-то на Софтпедия, и что-то Рубиновый.Проблема в том, что ни один из них не относится конкретно к .NET.