在Patricia Trie中找到最长前缀搜索的算法/步骤

时间:2009-05-26 18:07:36

标签: ip lookup patricia-trie

我正在实施Patricia尝试IP前缀查找,我可以得到 代码工作完全密钥匹配,但遇到前缀搜索问题,当有 键是其他键的前缀,如:

1.2.3.0
1.2.0.0

在上述情况下,任何人都可以帮助我使用前缀搜索算法 我应该将它们视为单独长度的键(即/ 24和16)吗?

3 个答案:

答案 0 :(得分:4)

看看Net-Patricia。这是Patricia trie用于查找IP地址的实现。接口是perl,但底层代码在C中。这是一个链接,但许多CPAN归档应该有它:

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

答案 1 :(得分:3)

如果您使用此trie将IP号码存储为固定长度的元素,那么它绝对不是正确的方法。这里的要点是PT对于存储可变长度数据特别有用。

如果您存储部分IP号码,作为可变长度的前缀,那么PT是一个不错的选择。
在这种情况下,您的密钥应该具有不同的长度。
假设您在二进制0xC0 0xA8中存储前缀“192.168”,则将其添加为第一个键。
然后,当搜索类似192.168.1.1的IP时,您可以获得您的trie包含192.168的信息,这是您查找的前缀。

您所要做的就是在遍历特里时存储“公共部分”。
这是this实施的一个小小的补充。只需确保在向下移动trie时,将公共部分存储在递归函数的参数中。
为了更好地理解Patricia trie,我建议阅读Robert Sedgewick's Algorithms book这是一个很好的知识来源。

编辑:在PT中存储C字符串时存在一个问题。此trie旨在存储二进制数据,但您只对获取整个字节感兴趣。 只有当位大小为8的倍数时,才能确保存储前缀的公共部分。 对于一个错误的例子:你的树中有密钥:0xC0 0xA5,你正在寻找0xC0 0xA6。 当公共部分“0xC0 0xA”时,您的遍历将停止,但您只对“0xC0”感兴趣。因此,请确保存储公共字节,而不是位。

答案 2 :(得分:0)