免责声明:我知道这个问题的最明显答案是HashSet<string>
。它速度之快,无序且其值是唯一的。
但是我只是想知道,因为HashSet<T>
是一个可变的类,所以它具有Add
,Remove
等。因此,我不确定使这些操作成为可能的底层数据结构是否会在读取操作时牺牲某些性能-特别是,我关注Contains
。
基本上,我想知道存在哪些可以为类型为Contains
的对象提供string
方法的绝对最快的数据结构。 .NET框架本身之内或之外。
我对各种答案都感兴趣,无论它们的局限性如何。例如,我可以想象某些结构可能会限制为一定长度的字符串,或者可能会根据问题域(例如,可能的输入值的范围)等进行优化。如果存在,我想听听一下。
最后一件事:我不将其限制为只读数据结构。显然,任何读写数据结构都可以嵌入到只读包装器中。我什至提到“只读”一词的唯一原因是,我对数据结构没有任何要求以允许添加,删除等。但是,如果它具有这些功能,我将不会抱怨。
更新:
Moron's answer是我要寻找的东西的一个很好的例子。出于以下原因,Trie *绝对似乎很有可能:HashSet<T>.Contains
取决于某些GetHashCode
的IEqualityComparer<string>
函数,as far as I can tell在.NET中默认为O(n)**。 。换句话说,必须检查字符串中的每个字符以使HashSet<string>.Contains
返回true
或false
。对于Trie
,只有返回值true
需要O(n)来确定;返回值false
可能会更快返回。
这当然是假设的。到目前为止,我还没有在.NET中编写或遇到过可以在HashSet<string>
击败Contains
的Trie实现(尽管我写的实现对于字母'a'到'z'非常接近)。我只是说,似乎有可能。
*顺便说一下,该链接还使我想到了另一个有趣的/类似的可能性:DAWG。
**此处“ n”是指字符串的长度。
最佳答案
Tries非常适合做Contains
,特别是对于有限字母的字符串。给定字符串s,包含在trie上的时间复杂度为O(| s |)(| s | = s的长度),这是最佳的。