因此,如果我必须在哈希表或前缀树之间进行选择,那么有哪些区分因素会导致我选择一个而不是另一个。从我自己的幼稚角度来看,似乎使用trie会有一些额外的开销,因为它没有存储为数组,但是就运行时间而言(假设最长的键是最长的英文单词),它实际上可以是O (1)(相对于上限)。也许最长的英语单词是50个字符?
一旦获得索引,哈希表将立即查找。但是,散列密钥以获取索引似乎很容易采取近50个步骤。
有人可以为此提供更丰富的见解吗?谢谢!
因此,如果我必须在哈希表或前缀树之间进行选择,那么有哪些区分因素会导致我选择一个而不是另一个。从我自己的幼稚角度来看,似乎使用trie会有一些额外的开销,因为它没有存储为数组,但是就运行时间而言(假设最长的键是最长的英文单词),它实际上可以是O (1)(相对于上限)。也许最长的英语单词是50个字符?
一旦获得索引,哈希表将立即查找。但是,散列密钥以获取索引似乎很容易采取近50个步骤。
有人可以为此提供更丰富的见解吗?谢谢!
Answers:
尝试的优势:
基础:
新操作:
链接结构的优点:
哈希表的优点:
这完全取决于您要解决的问题。如果您需要做的只是插入和查找,请使用哈希表。如果您需要解决更复杂的问题,例如与前缀相关的查询,那么trie可能是更好的解决方案。
每个人都知道哈希表及其用途,但查询时间并不完全恒定,它取决于哈希表的大小,哈希函数的计算复杂度。
在大多数甚至很小的延迟/可扩展性(例如:高频交易)都需要解决的工业场景中,创建巨大的哈希表以进行有效查找并不是一个很好的解决方案。您还必须考虑要针对其在内存中占用的空间进行优化的数据结构,以减少缓存丢失。
消息中间件是一个很好的例子,其中trie更适合要求。您有一百万个消息订阅者和发布者,这些消息属于各种类别(以JMS术语表示-主题或交易所),在这种情况下,如果您要基于主题(实际上是字符串)过滤出消息,则绝对不希望创建哈希表有百万个主题的百万个订阅。更好的方法是将主题存储在trie中,因此,基于主题匹配进行过滤时,其复杂性与主题/订阅/发布者的数量无关(仅取决于字符串的长度)。我喜欢它,因为您可以利用这种数据结构来优化空间需求,从而降低缓存丢失率。
在特里树上的插入和查找与输入字符串O(s)的长度成线性关系。
哈希将为您提供O(1)用于查找和插入,但首先您必须根据输入字符串再次计算哈希,该字符串也是O(s)。
结论是,两种情况下的渐近时间复杂度都是线性的。
从数据的角度来看,该Trie有更多开销,但是您可以选择一个压缩的Trie,这将使您或多或少地再次与哈希表建立联系。
要打破领带,请问自己一个问题:我是否只需要查找完整的单词?还是我需要返回所有匹配前缀的单词?(如在预想输入法中一样)。对于第一种情况,请进行哈希处理。它是更简单,更简洁的代码。易于测试和维护。对于前缀或后缀很重要的更复杂的用例,请尝试一下。
而且,如果您只是为了好玩而做,则实施Trie将使周日的下午变得很有用。
一些(通常是嵌入式,实时)应用程序要求处理时间与数据无关。在那种情况下,哈希表可以保证已知的执行时间,而字典则根据数据而变化。
00110010
可能是输入字节,但您要包括00111010
仅删除一位的匹配项。