我正在阅读有关尝试的内容,而这篇topcoder文章(https://www.topcoder.com/community/data-science/data-science-tutorials/using-tries/)说:
尝试可以在O(L)时间内插入和查找字符串(其中L表示单个单词的长度)。这比set快得多,但它比哈希表快一点。
我一直都知道集合和哈希表在查找内容时非常快,并且它们有不断的查找时间。这不是真的吗?为什么它会更快"比一套?而且它似乎也暗示哈希表的查找时间也不同于设置。我一直认为集合和散列表的实现方式几乎相同,只是存储了一些对象。
答案 0 :(得分:3)
引用的文章没有将trie与抽象" set"进行比较。数据结构;它将trie与C ++标准库std::set
进行比较,后者是一个搜索树,通常是一个红黑树,它允许您按排序顺序迭代内容。 (C ++也有std::unordered_set
,它基于哈希表,但文章可能是在标准库的一部分之前编写的。)
只有当哈希值可以在O(1)中计算时,哈希表才是(平均)O(1),因为必须在任何查找完成之前计算密钥的哈希值。对于字符串键,大多数哈希函数需要查看键中的每个字符,因此它们在字符串的长度上是O(L)。 (这个相当明显的事实是出于某些原因经常在讨论哈希表计算复杂性时跳过。)由于trie和hashtable最终必须验证提供的密钥是否等于容器中的候选密钥,因此存在O(L )两种情况下的因素。
然而,尝试仍然有优势。例如,它们可以按字典顺序迭代,如std::set
,但通常更快,而哈希表只能以某种非确定性顺序迭代。因此,如果您需要进行前缀搜索,则哈希表不是合适的数据结构。