【发布时间】:2010-12-24 03:14:30
【问题描述】:
另一个关于 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 成员声称的长度。
谢谢。
【问题讨论】:
标签: string associative-array string-algorithm