选择适当的数据结构(哈希表与后缀树)来索引大量相似字符串

Bob*_*Bob 5 string hash prefix-tree

我有一大堆字符串,顺序约为 10^12 左右,我需要选择一个适当的数据结构,以便提供一个字符串,我可以以 O(log(n)) 之类的形式检索和关联的整数值或 O(m) 时间,其中“n”是字符串列表的长度,“m”是每个字符串的长度。

\n\n

我们可以预期,我们的字符串集(每个字符串的长度为“m”)并通过某个大小为“q”的字母表进行编码,几乎涵盖了该长度的所有可能的字符串。例如,假设我们有 10^12 个长度为 m = 39 的唯一二进制字符串。这意味着我们已经覆盖了该长度的所有可能二进制字符串集合的约 54%。

\n\n

因此,我担心为字符串找到合适的哈希函数来避免冲突。有没有一个好的我可以用的?索引我的 n 个字符串集需要多长时间?

\n\n

或者我应该使用后缀树?我们知道 Ukkonen\xe2\x80\x99s 算法允许线性时间构造,我的猜测是,考虑到大量相似的字符串,这会节省空间?

\n

小智 1

...

嗨鲍勃,

长话短说:经典的 HASH+BTREE 方法非常强大且超快。

无论 1000 万个还是 100 亿个字符串要存储在上述结构中,都没有关系 - 您总是有一个非常低的 MAX 搜索阈值。

好吧,你需要 10^12 = 1,000,000,000,000 - 但这是 1 万亿,这让我感到惊讶 - 即使我的重字符串语料库也在 10 亿范围内。

只需检查我在 C 中的实现: http: //www.sanmayce.com/#Section13Level

因此,我担心为字符串找到合适的哈希函数来避免冲突。有没有一个好的我可以用的?

C 语言中最快的哈希表查找函数如下:

http://www.sanmayce.com/Fastest_Hash/index.html#KT_torture3

它比强大的 CRC32 8slice 变体(Castagnoli 和 Koopman 的)快 300-500%,同时具有类似的碰撞。