关于常数哪个更有效是非常依赖的。一方面,trieO(N)
为插入所有元素提供了严格的时间复杂度,而哈希表在最坏的情况下可能会衰减到二次时间。
另一方面,在缓存方面尝试效率不是很高——每次查找都需要O(|S|)
随机访问内存请求,这可能会导致性能显着下降。
这两种方法都是有效的,我认为在选择其中一种时应该考虑多种因素,例如最大延迟(如果是实时系统)、吞吐量和开发时间。
如果平均案例性能很重要,我建议生成一堆文件并运行统计分析哪种方法更好。Wilcoxon签名检验是实际使用的最先进的假设检验。
关于嵌入式系统:这两种方法仍然有效,但在这里:trie 中的每个“节点”(或一堆节点)都将在磁盘上而不是在 RAM 上。请注意,这意味着对于 trie O(|S|)随机访问磁盘查找每个条目,这可能会很慢。
对于散列解决方案,您有 10MB,假设他们可以将其中的 5MB 用于磁盘指针的散列表。我们还假设你可以在这 5MB 上存储 500 个不同的磁盘地址(这里悲观分析),这意味着在每次哈希查找后你还有 5MB 可以加载一个桶,如果你有 500 个桶,加载因子为 0.5,这意味着您可以存储 500 * 5MB * 0.5 ~= 1.25GB > 1GB 的数据,因此使用散列表解决方案,因此使用散列 - 每次查找只需要O(1)
随机磁盘查找即可找到包含相关字符串的存储桶。
请注意,如果仍然不够,我们可以重新散列指针表,非常类似于在虚拟内存机制中的分页表中所做的。
由此我们可以得出结论,对于嵌入式系统,散列解决方案在大多数情况下更好(请注意,在最坏的情况下它可能仍会遭受高延迟,这里没有灵丹妙药)。
PS,基数树通常比 trie 更快,更紧凑,但与哈希表相比,它具有 trie 的相同副作用(当然,虽然不那么重要)。