我遇到了一个可能需要使用更不寻常的数据结构的问题,但我不确定。
基本上,我想将URI主机名存储在容器中,并且能够查询容器以判断容器中是否存在主机名。但是,如果容器包含某个主机名的更高级别的域,我希望查询返回true
,如果我查找较低级别的域。换句话说,如果容器包含example.com
,我希望能够查找www.example.com
,并返回true
。或者,如果容器包含foo.example.com
,我希望能够查找bar.foo.example.com
,它将返回true。
我已经考虑过这个问题了,似乎没有任何直接的方法可以做到这一点。显而易见的解决方案是使用常规关联容器,如哈希表或树(C ++中的std::unordered_set
或std::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 Tries以相反的方式工作。
那么,定期关联容器是最好的方式吗?或者其他一些建议是什么?
答案 0 :(得分:1)
一个简单的解决方案,将节点顺序反转(即将www.example.com
变为com.example.www
)并将其填入您的Patrica Trie。然后你可以遍历特里直到你一次找到你的比赛