【问题标题】:Patricia Trie for fast retrieval of IPv4 address and satellite dataPatricia Trie 用于快速检索 IPv4 地址和卫星数据
【发布时间】:2012-09-24 10:58:57
【问题描述】:

我正在用 C++ 编写一个程序,该程序需要快速查找和存储 IP 地址(所有 IPv4)。每个 IP 地址都有一个与之关联的数据。如果它已经存在于 trie 中,我打算将 trie 中的 IP 地址数据与新地址数据合并。如果它不存在,我打算将它作为新条目添加到 trie 中。不需要删除 IP 地址。

为了实现这一点,我需要设计一个 Patricia Trie。但是,我无法想象除此之外的设计。我似乎很天真,但我想到的唯一想法是将 IP 地址更改为二进制形式,然后使用 trie。然而,我对 HOW 究竟如何实现这一点一无所知。

如果您能帮我解决这个问题,我将非常感谢您。 请注意,我确实找到了类似的问题 here 。这个问题或更具体的答案超出了我的理解,因为 CPAN 网站中的代码对我来说不够清楚。

另外注意,我的数据是以下格式

10.10.100.1:“汤姆”、“杰克”、“史密斯”

192.168.12.12:“琼斯”,“莉兹”

12.124.2.1:“吉米”,“乔治”

10.10.100.1:“迈克”、“哈利”、“詹妮弗”

【问题讨论】:

  • 多少? (如果几百万:使用哈希表)
  • 我添加了一个示例,如果有帮助的话。

标签: data-structures ip-address trie patricia-trie radix-tree


【解决方案1】:

Patricia 尝试解决为给定 IP 地址寻找最佳覆盖前缀的问题(例如,路由器使用它们来快速确定 192.168.0.0/16 是 192.168.14.63 的最佳选择)。如果您只是想精确匹配 IP 地址,哈希表是更好的选择。

【讨论】:

    【解决方案2】:

    我认为您指的是RadixTree。我在 Java 中有一个 RadixTrie 的实现,如果你想用它作为起点,它会执行值映射的实际键。它使用PatriciaTrie 作为其支持结构。

    使用以下字符串的示例。

    1. 10.10.101.2
    2. 10.10.100.1
    3. 10.10.110.3

    Trie 示例(未压缩)

    └── 1
        └── 0
            └── .
                └── 1
                    └── 0
                        └── .
                            └── 1
                                ├── 0
                                │   ├── 1
                                │   │   └── .
                                │   │       └── (2) 10.10.101.2
                                │   └── 0
                                │       └── .
                                │           └── (1) 10.10.100.1
                                └── 1
                                    └── 0
                                        └── .
                                            └── (3) 10.10.110.3
    

    Patricia Trie(压缩)

    └── [black] 10.10.1
        ├── [black] 0
        │   ├── [white] (0.1) 00.1
        │   └── [white] (1.2) 01.2
        └── [white] (10.3) 10.10.110.3
    

    【讨论】:

    • 我无法理解您对 PATRICIA 尝试的解释。我读过的参考资料(Knuth、Sedgewick 和this)似乎都暗示“Patricia 创建一棵二叉树,每个字符串存储一个节点”,但在我看来,您的 PATRICIA 似乎每个 字符串存储...
    • @Seb 我假设它们指的是 Patricia Trie 的压缩版本(如我上面的第二个示例所示)。话虽如此,Patricia Trie 的定义似乎有点过分。我写的版本和这里的解释一起:youtu.be/jXAHLqQthKw?t=244
    • 毫无疑问,我已经阅读了 Knuth 和 Sedgewick 关于这个主题的书籍,并且我完全理解他们的解释。我还有一份“PATRICIA - 检索字母数字编码信息的实用算法”的副本,这是历史上说 PATRICIA 的权威定义,由 D. R. Morrison 撰写并提交给 ACM 杂志。您的图表使用五个节点来存储三个字符串;根据莫里森的说法,“推论表明,随着图书馆的发展,每一个新的末端都会带入图书馆正是一个新的分支”......重点是我的。
    • 如果您想知道 PATRICIA 树的样子,请联系much more like a cyclic graph。您的图表看起来像某种其他类型的 radix trie。
    • @Seb 我认为您在争论实施。它可以使用二叉基数树、DAG 或许多其他方式来实现。如果你在普林斯顿看塞德威克本人的幻灯片,他的图表看起来就像我上面的例子。 algs4.cs.princeton.edu/lectures/52Tries.pdf 第 51 页他还提到帕特里夏树“也称为:暴击位树,基数树。”
    猜你喜欢
    • 2014-03-30
    • 2016-09-18
    • 2018-09-21
    • 1970-01-01
    • 1970-01-01
    • 2012-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多