Алгоритм / шаги по поиску длинного префикса поиска в Патрисии Три - PullRequest
6 голосов
/ 26 мая 2009

Я реализую попытки Патрисии для поиска префикса IP, я могу получить код работает для полного соответствия ключей, но сталкивается с проблемами при поиске префикса, когда есть ключи, которые являются префиксами других ключей, например:

1.2.3.0
1.2.0.0

Может кто-нибудь помочь мне с алгоритмом поиска префикса в приведенном выше случае Должен ли я рассматривать их как ключи отдельной длины (т. Е., / 24 и 16)?

Ответы [ 3 ]

4 голосов
/ 18 декабря 2009

Взгляните на Net-Patricia. Это реализация программы Patricia для поиска IP-адресов. Интерфейс Perl, но основной код находится на C. Вот ссылка, но она должна быть у многих архивов CPAN:

http://cpansearch.perl.org/src/PHILIPP/Net-Patricia-1.15_07/libpatricia/patricia.c

3 голосов
/ 05 ноября 2009

Если вы используете этот набор для хранения IP-адресов в качестве элементов фиксированной длины, то это определенно не правильный путь. Дело в том, что PT особенно полезен для хранения данных переменной длины.

Если вы храните части IP-номеров в качестве префиксов переменной длины, то PT - хороший выбор.
В этом случае ваши ключи должны быть разной длины.
Допустим, вы храните префикс «192.168» в двоичном формате 0xC0 0xA8, вы добавляете его в качестве первого ключа.
Затем при поиске IP-адреса, например 192.168.1.1, вы можете получить информацию о том, что ваш файл содержит 192.168, что является префиксом того, что вы ищете.

Все, что вам нужно сделать, это сохранить «общую часть» при обходе дерева.
Это небольшое дополнение к реализации this . Просто убедитесь, что при переходе вниз по дереву вы сохраняете общую часть где-то в параметрах рекурсивной функции.
Для хорошего понимания Patricia trie я бы предложил прочитать книгу Алгоритмов Роберта Седжвика , которая является отличным источником знаний.

РЕДАКТИРОВАТЬ : Существует одна проблема при хранении C-строк в PT. Этот три предназначен для хранения двоичных данных, но вы заинтересованы только в получении целых байтов. Убедитесь, что вы храните общую часть префикса, только если его размер в битах кратен 8. Для неправильного примера: у вас есть ключ в вашем дереве: 0xC0 0xA5, и вы ищете 0xC0 0xA6. Ваш обход прекратится, когда общая часть "0xC0 0xA", но вы заинтересованы в принятии только "0xC0". Поэтому убедитесь, что храните общие байты, а не биты.

0 голосов
/ 23 ноября 2014

В тестовом коде для LLVM есть довольно читаемая реализация C: https://llvm.org/svn/llvm-project/test-suite/trunk/MultiSource/Benchmarks/MiBench/network-patricia/

...