在 Skiena 的“算法设计手册”一书中,据说计算集合的模式(最常见的元素)有一个 Ω( n log n ) 下限(这让我很困惑),但也有(我猜是正确的)不存在用于计算模式的更快的最坏情况算法。我只是对 Ω( n log n )的下限感到困惑。
在Google 图书上查看该书的页面
但是在某些情况下,这肯定可以在线性时间(最好的情况)内计算出来,例如通过下面的 Java 代码(找到字符串中最常见的字符),“技巧”是使用哈希表计算出现次数。这似乎很明显。
那么,我对这个问题的理解缺少什么?
编辑:(谜团已解决)正如 StriplingWarrior 指出的那样,如果仅使用比较,即没有内存索引,则下限成立,另请参见:http ://en.wikipedia.org/wiki/Element_distinctness_problem
// Linear time
char computeMode(String input) {
// initialize currentMode to first char
char[] chars = input.toCharArray();
char currentMode = chars[0];
int currentModeCount = 0;
HashMap<Character, Integer> counts = new HashMap<Character, Integer>();
for(char character : chars) {
int count = putget(counts, character); // occurences so far
// test whether character should be the new currentMode
if(count > currentModeCount) {
currentMode = character;
currentModeCount = count; // also save the count
}
}
return currentMode;
}
// Constant time
int putget(HashMap<Character, Integer> map, char character) {
if(!map.containsKey(character)) {
// if character not seen before, initialize to zero
map.put(character, 0);
}
// increment
int newValue = map.get(character) + 1;
map.put(character, newValue);
return newValue;
}