我需要做一个"查找功能"对于一个项目。我必须搜索所有相同的字符串(当然只有一个由运营商编写)以及它们以最快的方式存在于一个巨大的文件中。 我想到了一个与哈希表连接的树,但我不知道它是否正确。
如何使用字符串(我通常使用数字)?
应该使用哪种最佳数据结构(复杂性)?
答案 0 :(得分:1)
假设最坏的情况:
/usr/share/dict/words
用它的~100,000个单词(这里)连接起来,直到我们有一个Tebibyte给出大约1.1 mio。重复并混淆。算法的选择取决于
如果您只有少数(数字故意保持模糊)输入和/或没有太多可用内存,您可以直接搜索它(Boyer-Moor(-Horspool),Rabin-Karp,Apostolico-Giancarlo,Knuth-莫里斯-普拉特)。
你有很多输入和一些可用的内存你可以首先索引文件(显然是O(n))并在O(1)中使用哈希表或O(log n)搜索二进制搜索树(有几种可能的优化,但让它保持简单)。
不需要太多内存。无论你做什么,散列表或树,你需要保持位置,因为你有超过四个Gibibytes你需要一个64位计数器。 8个字节乘以1.1 mio的表大小:仅8个Mebibytes。加上单词本身的空间(少于一个Mebibyte和我的/usr/share/dict/words
)或散列表的索引(稍微少一些,因为你不需要那么短的单词列表的大整数)。
您需要一些开销来保存和管理大文件中单个单词的索引。二进制搜索树快速且快速构建,尽管它具有相当大的内存开销。如果您不需要搜索索引:只需将它们放入一个简单的数组中。
tl; dr:索引文件,这是对单词和他们的位置的一个hastable。如果你需要同时将这些地方(可能需要64位整数!)放在一个简单的数组中,但如果需要搜索这些索引,则使用(二进制)搜索树。我假设你知道如何建立一个完美的哈希。