2009-05-26 5 views
6

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

1.2.3.0 
1.2.0.0 

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

ответ

3

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

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

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

EDIT: Существует одна проблема при хранении строк C в PT. Этот trie предназначен для хранения двоичных данных, но вас интересует только получение всех байтов. Убедитесь, что вы храните общую часть префикса только в том случае, если его размер в битах кратен 8. Неправильный пример: у вас есть ключ в вашем дереве: 0xC0 0xA5, и вы смотрите на 0xC0 0xA6. Ваш обход остановится, когда общая часть «0xC0 0xA», но вы заинтересованы в том, чтобы принимать только «0xC0». Поэтому не забудьте сохранить общие байты, а не биты.

Смежные вопросы