En el libro "El Algoritmo Manual de diseño" por Skiena, el cálculo de la modo (elemento más frecuente) de un conjunto, se dice que tiene una Ω (n registro n) cota inferior (esto me intriga) , pero también (correctamente supongo) que no existe un algoritmo de peor caso más rápido para calcular el modo. Solo me deja perplejo que el límite inferior sea Ω (n log n).¿Computando el modo (elemento más frecuente) de un conjunto en tiempo lineal?
Véase la página del libro en Google Books
Pero sin duda esto podría en algunos casos ser calculado en tiempo lineal (mejor de los casos), por ejemplo, por código Java como a continuación (encuentra el carácter más frecuente en una cadena), el "truco" es contar las ocurrencias usando una tabla hash. Esto parece obvio.
Entonces, ¿qué es lo que me falta en mi comprensión del problema?
EDIT: (Misterio resuelto) Como StriplingWarrior señala, el límite inferior se mantiene si sólo se utilizan comparaciones, es decir, sin la indexación de la memoria, ver también: 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;
}
Parece que nada se menciona en la lista de erratas: http://www.cs.sunysb.edu/~skiena/algorist/book/errata –
No se puede leer la página. Un mensaje extravagante, aparentemente danés. –
Cambia google.dk a google.com, y funcionará. – StriplingWarrior