Während eines Interviews für eine Java-Entwicklerposition wurde ich wie folgt gefragt:
Schreiben Sie eine Funktion, die zwei Parameter akzeptiert:
- eine Zeichenfolge, die ein Textdokument darstellt, und
- eine Ganzzahl, die die Anzahl der zurückzugebenden Elemente angibt.
Implementieren Sie die Funktion so, dass eine Liste der nach Worthäufigkeit geordneten Zeichenfolgen zurückgegeben wird, wobei das am häufigsten vorkommende Wort zuerst angezeigt wird. Ihre Lösung sollte in -Zeit ausgeführt werden, wobei n die Anzahl der Zeichen im Dokument ist.
Folgendes habe ich beantwortet (im Pseudocode), es ist nicht , sondern O ( n log n ) Zeit wegen der Sortierung. Ich kann nicht herausfinden, wie es O ( n ) Zeit geht.
wordFrequencyMap = new HashMap<String, Integer>();
words = inputString.split(' ');
for (String word : words) {
count = wordFrequencyMap.get(word);
count = (count == null) ? 1 : ++count;
wordFrequencyMap.put(word, count);
}
return wordFrequencyMap.sortByValue.keys
Weiß jemand Bescheid oder kann mir jemand Hinweise geben?
algorithms
sorting
strings
data-mining
user2712937
quelle
quelle
Hashtable
ist es für die Zwecke dieser Site irrelevant , ob es sich um Legacy-Java handelt oder nicht.Antworten:
Ich schlage eine Variation der Verteilungszählung vor:
maxWordCound
. -maxWordCount
. Eintragstyp sind Listen von Zeichenfolgen. - , da die Anzahl nicht höher sein kann.Sie können den Versuch wahrscheinlich in der ersten Phase durch andere Datenstrukturen ersetzen.
quelle
Die Erfassung der Anzahl der Vorkommen ist O (n), der Trick besteht also darin, nur die Anzahl der Top-k-Vorkommen zu finden.
Ein Heap ist eine übliche Methode, um die Top-k-Werte zu aggregieren, obwohl auch andere Methoden verwendet werden können (siehe https://en.wikipedia.org/wiki/Partial_sorting ).
Angenommen, k ist der zweite Parameter oben und es ist eine Konstante in der Problemstellung (es scheint zu sein):
Da die Heap-Größe eine Konstante ist, sind die Heap-Operationen O (1), also ist Schritt 3 O (n).
Der Haufen könnte auch dynamisch gepflegt werden, während der Versuch erstellt wird.
quelle
Was folgt, ist falsch ; Ich lasse es vorerst zur Veranschaulichung hier.
Erstellen Sie einen Suffixbaum des Textes, z. B. mit dem Ukkonen-Algorithmus .
Wenn die Konstruktion dies noch nicht tut, addieren Sie die Anzahl der erreichbaren Blätter zu jedem (inneren) Knoten.
Durchquere den Baum von der Wurzel und schneide alle Zweige am ersten (weißen) Platz ab.
Durchlaufen Sie den Baum und sortieren Sie die Liste der untergeordneten Elemente jedes Knotens nach ihrer Blattzahl.
Der Ertrag des Baumes (Blätter von links nach rechts) ist jetzt eine Liste aller Wörter, sortiert nach Häufigkeit.
Zur Laufzeit:
Genauere Grenzen können erhalten werden, indem die Laufzeit mit der Anzahl verschiedener Wörter parametrisiert wird. Wenn es wenige gibt, ist der Baum nach 2 klein.
quelle
HashMap
quelle
Hashtable-basierte Lösung
Die Annahme ist, dass der Hashing-Algorithmus in Bezug auf die Anzahl der Zeichen zeitlich linear ist.
Radix sortbasierte Lösung
Die obersten paar längsten Wörter auf Englisch sind lächerlich lang , aber dann könnte man die Wortlänge auf eine vernünftige Zahl (wie 30 oder kleiner) begrenzen und Wörter abschneiden, die die damit verbundene Fehlerquote akzeptieren.
quelle