Berechnung des Modus (häufigste element) eines Satzes in der linearen Zeit?

In dem Buch "the Algorithm Design Manual" von Skiena, Berechnung der Modus (häufigste element) eines Satzes, so wird gesagt, eine Ω - (n log n) untere Schranke (das verwirrt mich), aber auch (korrekt denke ich), dass kein schneller worst-case-Algorithmus existiert, der für die Berechnung des Modus. Ich bin nur verwirrt durch die untere Schranke als Ω(n log n).

Finden Sie auf der Seite des Buches auf Google Bücher

Aber sicherlich könnte dies in einigen Fällen berechnet werden, in linearer Zeit (best case), z.B. durch Java-code wie unten (findet die häufigste Zeichen in einem string), der "trick" sein, um zu zählen Ereignisse mit Hilfe einer hashtable. Dies scheint offensichtlich.

So, was bin ich in meinem Verständnis für das problem?

EDIT: (Rätsel gelöst) Als StriplingWarrior Punkte out die untere Schranke gilt, wenn nur Vergleiche werden verwendet, also keine Indizierung von Speicher, siehe auch: 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;
}
  • Nichts scheint zu erwähnt werden, dass in der errata-Liste: cs.sunysb.edu/~skiena/algorist/Buch/errata
  • Die Seite nicht Lesen kann. Einige ausgefallene Nachricht, anscheinend Dänisch.
  • Ändern Sie die google.dk zu google.com und es wird funktionieren.
  • fixe den link zu gehen google.com 🙂
  • (Feste der link wieder)
  • Never mind hash-maps, Sie sind störend, weil der Dubiose Komplexität Forderungen. Betrachten Sie das problem zu finden, das häufigste element in einer Sequenz, die nur aus "0"en und "1"en. Offensichtlich, dass die lineare Zeit, nur zählen die Dinge, die (ebenso können Sie Sortieren in linearer Zeit, einfachsten möglichen Fall einer bucket-sort). Als StriplingWarrior sagt, es ist der Vergleich, der version, der das problem hat, dass diese Schranke, nur als Vergleich Art hat eine Big_Omega(n log n) untere Schranke. Vermutlich, wenn das Buch definiert seine Begriffe zu früh, es schränkt die Diskussion irgendwie.
  • ... sonst wäre es ja nicht sagen "sortiert den Satz in O(n log n) Zeit", weil natürlich mit fester Breite ganze zahlen der Größe k bits sortiert werden können in O(k*n) Zeit, zum Beispiel mit einem binäre radix-sort. Also, wenn er spricht über "Nummern", es bedeutet nicht, dass int oder andere Feste Größe numerischen Typ.

Schreibe einen Kommentar