Konzentration auf die Anforderung in der Frage der Annahme der Eingabe als ein Strom von ganzen Zahlen wäre eine Lösung eine modifizierte Einfügesortierung ...
Erstellen Sie eine Liste (sie ein Name countlist
) von Listen, zunächst leer. Jedes Mal, wenn Sie einen neuen Wert akzeptieren, durchlaufen Sie die einzelnen Listen in countlist
und suchen nach dem Wert. Wenn Sie den Wert in countlist[i]
finden, entfernen Sie den Wert aus der aktuellen Liste und fügen Sie ihn in countlist[i+1]
ein. Fügen Sie ggf. eine neue Liste zu countlist
hinzu. Wenn Sie den Wert nie finden, fügen Sie den Wert in countlist[1]
ein.
Der Zweck der Iteration absteigend statt aufsteigend ist, dass Sie einen Zeiger auf, wo der Wert in countlist[i]
eingefügt wird, wenn Sie es in countlist[i-1]
finden können. Wenn Sie für die Werte, die die gleiche Anzahl haben, keine Untersortierung benötigen, können Sie diesen Zeiger überspringen und aufsteigend iterieren.
Ich glaube, dass dieser Algorithmus insgesamt O (n) ist. Das Verarbeiten jedes neuen Werts ist O (n) und Ergebnisse werden sortiert, wie Sie gehen. Zu jedem Zeitpunkt können Sie die richtige Reihenfolge (bis jetzt) drucken, indem Sie durch countlist
iterieren und jede Liste drucken.
Beispiellauf mit dem Beispiel in der Frage ...
input: 7, 4, 2, 4, 9, 6, 5, 6, 2, 0, 2, 1
After accepting 7:
countlist[1] = 7
After accepting 4:
countlist[1] = 4, 7
After accepting 2:
countlist[1] = 2, 4, 7
After accepting 4:
countlist[1] = 2, 7
countlist[2] = 4
After accepting 9:
countlist[1] = 2, 7, 9
countlist[2] = 4
After accepting 6:
countlist[1] = 2, 6, 7, 9
countlist[2] = 4
After accepting 5:
countlist[1] = 2, 5, 6, 7, 9
countlist[2] = 4
After accepting 6:
countlist[1] = 2, 5, 7, 9
countlist[2] = 4, 6
After accepting 2:
countlist[1] = 5, 7, 9
countlist[2] = 2, 4, 6
After accepting 0:
countlist[1] = 0, 5, 7, 9
countlist[2] = 2, 4, 6
After accepting 2:
countlist[1] = 0, 5, 7, 9
countlist[2] = 4, 6
countlist[3] = 2
After accepting 1:
countlist[1] = 0, 1, 5, 7, 9
countlist[2] = 4, 6
countlist[3] = 2
welche Programmiersprache? – RomanPerekhrest
Nehmen wir an, dass es Java ist, aber das ist mehr, um einen effektiven Algorithmus zu finden, als Programmiersprache und Bibliotheken zu verwenden, da am Ende Programmiersprachen intelligente Algorithmen verwenden. – whiteErru
die offensichtliche Wahl wäre eine sortierte Karte, wie Sie bereits erwähnt haben, aber es könnte sich auch lohnen, mit einem vollwertigen RDBMS zu arbeiten und die Macht der Datenbankindizierung zu nutzen, abhängig von der Größe Ihrer Daten, die auch für eine Streaming-Liste von Werten und Sie müssen sich nicht um Speicherprobleme in Speicherkarten usw. sorgen. – xander