用于容纳URI主机名的容器



我遇到了一个问题,可能需要使用更不寻常的数据结构,但我不确定。

从本质上讲,我希望将URI主机名存储在容器中,并能够查询容器来判断容器中是否存在主机名。但是,如果容器包含某个主机名的较高级别域,则如果查找较低级别域,我希望查询返回true。换句话说,如果容器包含example.com,我希望能够查找www.example.com,它将返回true。或者,如果容器包含foo.example.com,我希望能够查找bar.foo.example.com,并且它将返回true。

我已经考虑过这个问题,但似乎没有任何简单的方法来解决这个问题。显而易见的解决方案是只使用一个常规的关联容器,比如哈希表或树(C++中的std::unordered_setstd::set)。查找后,我必须遍历域名的每个段,并不断查询容器,看看它是否包含每个段。因此,如果我需要查找www.example.com,我必须执行三个查询:一个用于com,一个用于example.com,一个为www.example.com。一旦我得到一个阳性,我就会返回true,否则如果容器中没有这些,则返回false。

这个解决方案很好,可能也是我最终会采用的解决方案。但这似乎不对,因为我必须根据主机名的长度进行N个查询。由于主机名通常没有那么多段,所以我并不担心性能。但我担心我应该在这里做一些更聪明的事情,尤其是因为这似乎是其他人已经考虑过的问题。

我考虑使用一种更奇特的数据结构,比如Patrica Trie或其他类型的前缀感知容器。我确实有一个很好的库来实现这个结构,所以使用它不是问题。但是,经过思考,我认为Patricia Trie不会有帮助。尝试是为键是前缀,值是全长字符串的情况而设计的。在我的情况下,通常比容器中的任何值都长。换句话说,我的密钥可能是www.example.com,如果容器有example.com,我希望它能够找到example.com。但是,Patricia尝试了相反的工作方式。

那么,使用常规关联容器是最好的方法吗?或者还有什么其他建议?

一个简单的解决方案,颠倒节点顺序(即将www.example.com转换为com.example.www),并将其填充到Patrica Trie中。然后你可以遍历trie,直到你一次找到你的匹配

最新更新