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

Ip Patricia Trie中查找最长前缀搜索的算法/步骤,ip,lookup,patricia-trie,Ip,Lookup,Patricia Trie,我正在实现Patricia尝试查找IP前缀,我可以得到 用于完成键匹配的代码,但在存在前缀搜索时遇到问题 是作为其他键前缀的键,如: 1.2.3.0 1.2.0.0 在上述情况下,有人能帮我了解前缀搜索的算法吗 我是否认为这些是分开长度(即,24和16)的键?< P>如果使用这个TIE将IP号码存储为固定长度的元素,那么肯定不是正确的方法。这里的要点是PT对于存储可变长度的数据特别有用。 如果您将部分IP号码存储为可变长度的前缀,那么PT是一个不错的选择。 在这种情况下,是的,您的钥匙应具

我正在实现Patricia尝试查找IP前缀,我可以得到 用于完成键匹配的代码,但在存在前缀搜索时遇到问题 是作为其他键前缀的键,如:

1.2.3.0
1.2.0.0
在上述情况下,有人能帮我了解前缀搜索的算法吗
我是否认为这些是分开长度(即,24和16)的键?

< P>如果使用这个TIE将IP号码存储为固定长度的元素,那么肯定不是正确的方法。这里的要点是PT对于存储可变长度的数据特别有用。

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

您所要做的就是在遍历trie时存储“公共部分”。
这是对实现的一个小的补充。只要确保在执行trie时,将公共部分存储在递归函数的参数中的某个位置。
为了更好地理解Patricia trie,我建议阅读,这是一个很好的知识来源

编辑:在PT中存储C字符串时存在一个问题。这个trie设计用于存储二进制数据,但您只对获取整个字节感兴趣。 确保仅当前缀的大小(以位为单位)是8的倍数时,才存储前缀的公共部分。 举一个错误的例子:您的树中有一个键:0xC0 0xA5,并且您正在查找0xC0 0xA6。
当公共部分为“0xC0 0xA”时,遍历将停止,但您只对“0xC0”感兴趣。所以请确保存储公共字节,而不是位。

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


在LLVM的测试代码中有一个相当可读的C实现: