在SO带到了某些语言的工具来哈希字符串给他们一个表中的快速查找另一个问题。的这两个例子是字典<>在.NET和在Python {}存储结构。其他语言当然支持这样的机制。 C ++有地图,LISP具有等效,因为这样做其他大多数现代语言。

这是在问题的答案是对字符串的哈希算法可以不断timem一个SO成员谁在节目声称,任何东西都可以在固定时间内被散列25年的经验进行争辩。我个人的观点是,这是不正确的,除非特定应用程序放在字符串长度的边界。这意味着,一些常数K将决定字符串的最大长度。

我所熟悉的,它使用一个散列函数用于其操作的拉宾-卡普算法,但是该算法没有规定特定的哈希函数来使用,并且所述一个作者建议是O(m),其中m是长度散列字符串。

我看到一些其他网页像这样的(的http:// WWW。 cse.yorku.ca/~oz/hash.html ),该显示一些散列算法,但似乎他们每个迭代串的整个长度的在其值到达。

从我关于这个问题的相对有限的阅读,似乎对于字符串类型最相关数组正在使用与引擎盖下某种形式的树操作的散列函数实际创建。这可能是一个AVL树或红色/黑色树指向在键/值对的值元素的位置。

即使在这种树结构中,如果我们要保持theta的顺序上(日志(N)),其中n是在树中的元素的数量,我们需要有一个常数时间散列算法。否则,我们不得不遍历字符串的加罚。尽管THETA(M)将通过THETA(的log(n))含有许多字符串指标黯然失色,我们不能忽视它,如果我们在我们搜索对文本将是非常大的这样一个领域。

据我所知,后缀树/阵列和阿霍Corasick可以带来搜索降到THETA(M),用于在存储器中的更大的费用,但什么我特别是询问是否一个常数时间散列法存在的任意字符串长度作为由其他SO部件权利。

感谢。

有帮助吗?

解决方案

在一般情况下,我相信任何一个完整的字符串哈希必须使用字符串的每一个字符,因此,需要成长为O(n)的n个字符。不过我认为实际的字符串哈希你可以使用近似的哈希值,可以很容易为O(1)。

考虑到始终使用最小的字符串的散列(N,20)字符来计算标准散列。显然,这种成长,如O(1)字符串大小。它会可靠地工作?这取决于你的域...

其他提示

一个散列函数不必(且不能),用于每一个串返回一个唯一的值。

您可以使用前10个字符来初始化一个随机数发生器,然后用它来从字符串拔出100个随机字符,和散列这一点。这将是恒定的时间。

您也可以直接返回恒定值1.严格来说,这仍然是一个哈希函数,虽然不是一个非常有用的。

可以不容易实现的一般恒定的时间散列字符串算法,而不用担心散列冲突的严重病例。

有关它是固定的时间,你将无法在字符串中使用每一个字符。举一个简单的例子,假设我们采取的第一个6个字符。然后是一个人并试图哈希的URL的数组。该具有功能将看到的“http:/”。为每一个字符串

类似的场景可用于其他字符的选择方案进行。你可以挑选伪随机基于前一个字符的值中的字符,但你仍然可以运行壮观失败的风险,如果由于某种原因,字符串有“错误”的模式,许多结了相同的哈希值。

虽然我不能想象为无限长的字符串的固定时间的散列函数,实在没有必要为它。

后面使用散列函数的想法是生成散列值的分布,使得它的不可能的许多字符串会碰撞 - 对于所考虑的域。该键将允许直接访问的数据存储。这些两个组合导致的恒定的时间查找 - 平均

如果发生过这种碰撞,则查找算法倒在一个更灵活的查找子策略。

当然,这是可行的,只要你确保所有的字符串“实习”,你把它们传递给需要的东西散列之前。实习是插入串入一个字符串表,使得具有相同值的所有实习字符串实际上是同一对象的过程。然后,可以将(固定长度)指针简单地散列为实习字符串,代替散列字符串本身。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top