【问题标题】:DNS look up, hash tablesDNS查找,哈希表
【发布时间】:2016-04-03 19:34:23
【问题描述】:

下图是我们数据结构课程的最后作业。

问题是编写一个DNS查找程序,使用注册的域名服务器将域映射到它们的IP地址。

我有一些想法,但我想知道这些是否是实施该程序的正确方法。

我想我可以使用哈希表来注册域名服务器。那么registerDNSdeleteDNS 方法将是恒定时间

对于注册 URL,再次使用哈希表。但这里困扰我的是他们提供了一个vector<string> &dnsChain,它提供了有关如何访问保存 URL 的 DNS 的信息。

现在registerURLdeleteURL 也是恒定时间。但是我们在哈希表的每个单元格中都存储了一个向量,我认为这会增加空间复杂度。(如果你有一百万个 URL,每个单元格中有一个 dnsChain 和百万个元素呢?)

对于access 方法,我认为我们应该在DNS 哈希表中查找,以确保该URL 的dnsChain 中的每个DNS 都已注册。如果您在 dnsChain 中有 N 个域名服务器,则访问 O(N)。这可以接受吗?

还有一种合并两个 DNS 的合并方法。我的想法是在 DNS 哈希表的每个单元格中使用一个向量。如果我们将 DNS2 合并到 DNS1,那么我们可以将 DNS2 推到 DNS1 的向量中,这意味着 DNS1 也包含 DNS2。

可以降低空间复杂度吗?我们是否必须在 URL 哈希表的每个单元格中存储 dnsChain

我们是否必须遍历dnsChain中的每个DNS才能访问一个URL?(如果10^6个DNS访问一个URL,会不会很慢?)

或者在这种情况下我可以使用任何其他辅助数据结构或技术(trie、可扩展哈希、BST)吗?

【问题讨论】:

  • 如果不是那么开放和广泛,这可能是一个很好的 Programmers.SE 问题。

标签: c++ data-structures hash


【解决方案1】:

由于这是作业,我只会给出一些非常高级的建议。

考虑到许多 dnsChain 都有重复的 URL,我建议将 dnsChain 存储在树中,如果链有很多重复且很长,这可能会节省大量空间。需要注意的一件事是,树必须包含添加/删除次数的计数,并且只有在计数达到 0 时才应删除。

布隆过滤器是一种可用于加速访问功能的简洁数据结构。这是概率性的,但只会偶尔给出误报,但绝不会出现误报。这些也用于工业中以加速缓存。更多信息可以在here找到。

【讨论】:

  • dnsChains 实际上有 IP 地址,但我想我明白了。如果每个 URL 都使用相同的 dnsChain 访问,那么一个树节点就足够了,而不是存储相同的 dnsChain 百万次,对吧?
  • 是的,但您可能需要注意删除/添加树节点的方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-03
  • 1970-01-01
  • 1970-01-01
  • 2010-11-26
  • 2012-07-02
  • 1970-01-01
  • 2011-11-11
相关资源
最近更新 更多