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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Des Autors scheint zu sein, stützend, seine Logik auf der Annahme, dass Vergleich ist die einzige operation, die für Sie verfügbar sind. Mit einem Hash-basierten Datenstruktur Art wird, um dieses durch die Verringerung der Wahrscheinlichkeit des Müssens zu tun, Vergleiche in den meisten Fällen zu dem Punkt, wo man im Grunde tun dies in konstanter Zeit.
Jedoch, wenn die zahlen wurden von hand gepflückt, immer produzieren hash-Kollisionen, würden Sie am Ende effektiv Ihre hash in eine Liste, die machen Ihr Algorithmus in O(n2). Wie der Autor weist darauf hin, einfach die Sortierung der Werte in einer Liste zunächst bietet die besten garantiert Algorithmus, obwohl in den meisten Fällen wird ein hash-set vorzuziehen wäre.
In vielen besonderen Fällen kann eine array-oder hash-Tabelle genügt. Im "Allgemeinen Fall" ist es nicht, da die hash-Tabelle ist der Zugriff nicht immer Konstante Zeit.
Zur Gewährleistung konstanter Zeit zugreifen, müssen Sie in der Lage sein, zu garantieren, dass die Anzahl der Schlüssel, können möglicherweise am Ende in jeder Klasse ist begrenzt durch einige Konstante. Für Charaktere, das ist ziemlich einfach, aber wenn die set-Elemente waren, sagen -, Doppel-oder Zeichenfolgen, wäre es nicht (außer im rein akademischen Sinne, dass es, z.B., eine endliche Anzahl von double-Werten).
Hash-Tabellen lookups sind, amortisiert konstanter Zeit, d.h., im Allgemeinen, die insgesamt Kosten von der Suche bis n zufälligen Schlüsseln ist O(n). Im schlimmsten Fall, Sie kann linear sein. Deshalb, während Sie im Allgemeinen reduzieren könnte die, um von Modus-Berechnung auf O(n), im schlimmsten Fall würde es erhöhen die Reihenfolge der Modus-Berechnung auf O(n^2).