【问题标题】:What is an efficient data structure to read/write IPv6 address ranges into for quick lookup times?什么是读取/写入 IPv6 地址范围以加快查找时间的有效数据结构?
【发布时间】:2017-08-07 19:09:19
【问题描述】:

我正在尝试考虑一种有效的数据结构,可用于将 IPv6 地址范围存储到其中。查找时间应该很快。也就是说,给定一个 IPv6 地址,我应该能够快速确定它来自哪个时间间隔。就我而言,地址范围不会重叠。

一种有效的方法是创建一个简单的二叉搜索树,每个非叶节点只是“重定向查找流量”。然而,这种方法的问题是 BST 的大小会非常大,可能大约为 2^128 个节点,我可能无法读取/写入文件。

那么,我可以使用什么数据结构进行快速 IPv6 地址查找,该数据结构也具有文件大小的下限???

顺便说一句,我正在使用 Java。

【问题讨论】:

  • 可以使用第三方库吗? Guava 的 RangeSet 很适合这个。
  • 如果范围不重叠,您可以使用哈希表。
  • 不是我的专业领域,但是...... Postgres 数据库内置了原生data types for network addresses,提供functions for working with such addresses,我猜可以执行范围搜索。
  • 我们可以只对区间进行排序并进行二分查找吗?

标签: java algorithm networking optimization data-structures


【解决方案1】:

有一个非常好的数据结构,称为区间树。 它基于普通的二叉搜索树。 但是,它不是存储密钥,而是存储间隔。并支持查值。它可以返回找到密钥的节点。因为一个节点包含它的边界,所以很容易实现你的用例。

看看https://en.wikipedia.org/wiki/Interval_tree

【讨论】:

  • 谢谢。知道最多需要多少节点的理论上限是多少?
  • 不知道上限。然而,我已经看到维基百科文章中有示例 java 代码。您始终可以复制/粘贴代码并简单地编写一个测试来确定界限。或者做一些谷歌搜索。
【解决方案2】:

如果您不必定义有关 IPv6 的间隔,那么您可以使用 trie 数据结构,我相信。

一些关于尝试实现的文档。

【讨论】:

    猜你喜欢
    • 2019-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-17
    • 1970-01-01
    • 2021-12-24
    • 2011-04-27
    相关资源
    最近更新 更多