搜索文件中字符串的最快方法

时间:2016-11-19 17:10:36

标签: c string tree time-complexity hashtable

我需要做一个"查找功能"对于一个项目。我必须搜索所有相同的字符串(当然只有一个由运营商编写)以及它们以最快的方式存在于一个巨大的文件中。 我想到了一个与哈希表连接的树,但我不知道它是否正确。

  1. 如何使用字符串(我通常使用数字)?

  2. 应该使用哪种最佳数据结构(复杂性)?

1 个答案:

答案 0 :(得分:1)

假设最坏的情况:

  • huge(1 Tebibyte)文件
  • 高度多变且高度重复的内容。让/usr/share/dict/words用它的~100,000个单词(这里)连接起来,直到我们有一个Tebibyte给出大约1.1 mio。重复并混淆。
  • 非重复(或接近非重复)短(即1-20字节,平均10)输入。

算法的选择取决于

  • 输入数量(输入/秒)
  • 可用内存

如果您只有少数(数字故意保持模糊)输入和/或没有太多可用内存,您可以直接搜索它(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位整数!)放在一个简单的数组中,但如果需要搜索这些索引,则使用(二进制)搜索树。我假设你知道如何建立一个完美的哈希。