下图是我们数据结构课程的最终作业。
问题是编写DNS查找程序,使用注册的域名服务器将域映射到其IP地址。
我有一些想法,但我想知道这些是否是实施该计划的正确方法。
我以为我可以使用哈希表来注册域名服务器。然后,registerDNS
和deleteDNS
方法常量时间。
为了注册URL,再次使用哈希表。但是困扰我的是他们提供了一个vector<string> &dnsChain
,它提供了有关如何转到包含URL的DNS的信息。
现在registerURL
和deleteURL
常量时间。但是我们在哈希表的每个单元格中存储了一个向量,我相信这会增加空间复杂度。(如果你有一个百万个URL,每个单元格中有一个dnsChain
百万个元素怎么办? ?)
对于access
方法,我认为我们应该在DNS哈希表中查找以确保该URL的dnsChain
中的每个DNS都已注册。如果您在dnsChain
中有N个域名服务器,则会访问 O(N)。这可以接受吗?
此外,还有一种合并两个DNS的合并方法。我的想法是在DNS哈希表的每个单元格中使用向量。如果我们将DNS2合并到DNS1,那么我们可以将DNS2推送到DNS1的向量,这意味着DNS1也包含DNS2。
愿空间复杂度降低吗?我们是否必须在URL哈希表的每个单元格中存储dnsChain
?
我们是否必须遍历dnsChain
中的每个DNS才能访问网址?(如果使用10 ^ 6 DNS来访问网址,那么它会不会很慢?)
或者在这种情况下我可以使用其他任何辅助数据结构或技术(trie,extendible hashing,BST)吗?
答案 0 :(得分:1)
由于这是家庭作业,我只会给出一些非常高级别的建议。
考虑到许多dnsChains有重复的URL,我建议将dnsChains存储在树中,如果链条有很多重复并且很长,那么这可能会节省大量的空间。需要注意的一点是,树木必须包含添加/删除的次数,并且只有在计数达到0时才应删除。
这里可以用来加速访问功能的整洁数据结构是布隆过滤器。这是概率性的,但偶尔会给出误报,但绝不会出现假阴性。这些也用于工业中以加速缓存。可以找到更多信息here。