关于 SO 的另一个问题提出了一些语言的工具来散列字符串,以便在表中快速查找。这方面的两个示例是 .NET 中的字典<> 和 Python 中的 {} 存储结构。其他语言当然支持这种机制。C++ 有它的映射,LISP 有一个等价物,就像大多数其他现代语言一样。
在对字符串的哈希算法可以在恒定时间内进行的问题的答案中提出了争议,一位拥有 25 年编程经验的 SO 成员声称任何东西都可以在恒定时间内进行哈希处理。我个人的观点是,这不是真的,除非您的特定应用程序在字符串长度上设置了边界。这意味着某个常数 K 将决定字符串的最大长度。
我熟悉 Rabin-Karp 算法,它使用散列函数进行操作,但该算法并没有规定要使用特定的散列函数,作者建议的是 O(m),其中 m 是哈希字符串。
我看到其他一些页面,例如这个(http://www.cse.yorku.ca/~oz/hash.html)显示一些哈希算法,但似乎每个页面都在字符串的整个长度上进行迭代达到它的价值。
从我对该主题的相对有限的阅读来看,似乎大多数字符串类型的关联数组实际上是使用散列函数创建的,该函数在引擎盖下使用某种树进行操作。这可能是指向键/值对中值元素位置的 AVL 树或红/黑树。
即使使用这种树结构,如果我们要保持在 theta(log(n)) 的顺序上,其中 n 是树中元素的数量,我们需要有一个恒定时间的哈希算法。否则,我们有迭代字符串的附加惩罚。即使对于包含许多字符串的索引,theta(m) 会被 theta(log(n)) 黯然失色,但如果我们处于这样一个域中,我们搜索的文本将非常大,我们也不能忽略它。
我知道后缀树/数组和 Aho-Corasick 可以将搜索降低到 theta(m) 以获得更大的内存开销,但我要特别问的是,对于任意长度的字符串是否存在恒定时间哈希方法由其他 SO 成员声明。
谢谢。