Ist einsetzen Zeit, die Komplexität der sortierten-Liste der Implementierung der priority queue O(n)?
Vom wikipedia:
Sortierte Liste Implementierung: Wie ein
Kasse im Supermarkt, aber
wo wichtige Leute zu bekommen "cut" in
vor weniger wichtigen Leuten. (O(n)
einsetzen Zeit, O(1) get-next time,
O(n*log(n)) zu bauen)
Ich denke, wenn die Suche die Einfügeposition mit binäre Suche Algorithmus,der die Einfügung Zeit Komplexität O(log(n)).Hier behandle ich die Ankunft um von jobs als einen Faktor Priorität.
Also bin ich falsch oder wikipedia falsch ist?
Update:
Nach der strengen definition der Liste von TAOCP:
Einer linearen Liste ist eine Sequenz von n >=0
Knoten XEins, X[2], ... , X[n], deren
wesentliche strukturelle properities
beziehen Sie nur die relativen Positionen
zwischen den Elementen, wie Sie in einem
line.
Ich nehme an, die Liste wikipedia verweisen ist nicht verkettete Liste,und es könnte sein, array.
Dank.
- Könntest du poste den link zu dem Wikipedia-Artikel, den du zitiert hast?
- Ah, ich habe die Arbeit für Sie. Es ist die priority-queue-Artikel: en.wikipedia.org/wiki/Priority_queue
Du musst angemeldet sein, um einen Kommentar abzugeben.
wenn der es ist verbunden mit Liste unterstützt Sie nicht tun können, binäre Suche, also;
finden Sie die Einfügemarke ist O(n),
eigentlich einfügen O(1) wie ändern Sie einfach die benachbarten Knoten,
insgesamt O(n).
wenn Ihr array gesichert, die Sie tun können eine binäre Suche also;
finden Sie die Einfügemarke ist in O(log(n)),
aber das einfügen in ein array ist O(n) müssen Sie möglicherweise verschieben Sie alle Elemente des Arrays,
insgesamt O(n)
dies ist, warum Sie eigentlich haben Baum/heap gesichert, so dass alle Operationen in O(log(n))
Es scheint, dass in Ihrem Zitat, Wikipedia bezieht sich auf eine priority-queue unterstützt durch eine sortierte Liste, sondern als ein heap. Zum einfügen eines Elements in eine sortierte Liste benötigt O(n) Zeit (vorausgesetzt, dass wir die Aufrechterhaltung Ihrer sortedness).
1 -> 2 -> 3 -> 4
und versuchen Sie element5
in Sie es von hand. Beachten Sie, dass Sie nicht über random-access - (es gibt keinelist[3]
gibt es nurlist->next
)Binäre Suche ist in der Tat
O(log n)
aber binäre Suche funktioniert auf arrays - es funktioniert in dieser Zeit, denn Sie können auf ein element in O(1).Jedoch in der Literatur, wenn Sie sehen, der Begriff-Liste, die Sie denken sollten verketteten Listen.
In einer Liste, daher Sie nicht haben O(1) Zugriffszeit, sondern Sie brauchen, um die Suche für die position "von hand" - also einfügen eines Elements nehmen würde O(n).
1
in der Liste0->2->3->4
versus in der Reihe0 2 3 4
).Schlimmsten Fall einsetzen der Zeit in eine sortierte Liste O(n). Im schlimmsten Fall ist das einfügen die oberste Position in der Liste. Zu tun, dass Sie Schritt für Schritt durch alle Elemente, und fügen Sie anschließend am Ende. Der Grund, warum Sie nicht bekommen, es zu tun eine binäre Suche ist, dass nur das element, das Sie zugreifen können, in der Liste ist der Nachfolger von Ihre aktuelle element, D. H. ohne random-access.
Wikipedia korrekt ist. Wie andere hier schon gesagt haben, Listen sind nicht random-access, daher müssen Sie zu jedem Knoten zwischen A und B, bevor man zu B, und Das macht binäre Suche nutzlos, da das Durchlaufen der Liste ist O(n), so dass Sie am Ende tut mehr Arbeit, als wenn Sie gerade iteriert über die Liste einmal. Sie könnten cache-der Anfang, Mitte und Ende-Knoten, die in einem separaten Puffer-und überprüfen Sie diese zuerst. Das wäre aber nur die gleiche Wirkung wie die Verwendung mehrerer Listen. Die skip-Liste Datenstruktur nimmt diese Idee einen Schritt weiter.
So verwenden Sie einen random-access-heap statt, oder vielleicht eine skip-Liste: http://en.wikipedia.org/wiki/Skip_list je nach Ihren Bedürfnissen.