Komplexität beim Finden der größten Zahlen in einem Array der Größe

7

Was folgt, ist mein Algorithmus, um dies in einer Zeit zu tun, von der ich glaube, dass sie ist, und mein Beweis dafür. Mein Professor ist anderer Meinung, dass es in läuft und denkt stattdessen, dass es in läuft . Alle Kommentare bezüglich des Beweises selbst oder des Stils (dh meine Ideen mögen klar sein, die Präsentation jedoch nicht).O(n)O(n)Ω(n2)

Die ursprüngliche Frage:

Gegeben Zahlen, finden Sie die größte unter ihnen in der Zeit . Sie dürfen nichts anderes über annehmen .nmno(nlogn)m

Meine Antwort:

  1. Sortieren Sie die ersten Elemente des Arrays. Dies dauert , da dies vollständig von und nicht von abhängt .mO(1)mn
  2. Speichern Sie sie in einer verknüpften Liste (unter Beibehaltung der sortierten Reihenfolge). Dies dauert aus dem gleichen Grund wie oben auch .O(1)
  3. Testen Sie für jedes andere Element im Array, ob es größer als das kleinste Element der verknüpften Liste ist. Dies dauert Zeit, da Vergleiche durchgeführt werden müssen.O(n)n
  4. Wenn die Anzahl tatsächlich größer ist, löschen Sie das erste Element der verknüpften Liste (das niedrigste) und fügen Sie die neue Nummer an der Stelle ein, an der die Liste in sortierter Reihenfolge gehalten werden soll. Dies dauert da es durch eine Konstante ( ) oben begrenzt ist, da die Liste nicht wächst.O(1)m
  5. Daher ist die Gesamtkomplexität für den Algorithmus .O(n)

Mir ist bewusst, dass die Verwendung eines rot-schwarzen Baums im Gegensatz zu einer verknüpften Liste in konstanter Hinsicht effizienter ist (da die konstante Obergrenze im Gegensatz zu und das Problem, einen Zeiger zu behalten Das unterste Element des Baumes (um die Vergleiche zu erleichtern) ist hervorragend machbar, es ist mir damals einfach nicht in den Sinn gekommen.O(mlog2(m))m

Was fehlt mein Beweis? Gibt es eine Standardmethode für die Darstellung (auch wenn sie falsch ist)?

Soandos
quelle
1
"besser als " - das ist rau. Ich nehme an, du meinst ? Ein weiteres Problem der Frage ist, dass nicht klar ist, ob behoben ist. O(nlogn)Θ(nlogn)m
Raphael
@ Raphael, ich sende dir was ich habe. Keine Ahnung, was er meinte. Angenommen, es ist wirklich Ob fest ist oder nicht , habe ich keine Ahnung. Als ich die Komplexität berechnete, nahm ich an, dass dies der Fall war, aber es gab keine Grundlage für diese Annahme. O(nlog2(n))m
Soandos
1
@soandos: Dann fragst du deinen Professor; Von Ihnen und uns kann nicht erwartet werden, dass sie mit einer halben Frage arbeiten. Übrigens hat der tatsächliche Wortlaut, den Sie zitieren, ein anderes Problem: Jeder Algorithmus ist wenn Sie Ihre Eingabegröße auf 10 Milliarden festlegen. O(1)
Raphael
1
@soandos: Ich habe dein Update in das "Zitat" aufgenommen. Die Antworten von Louis und Joe sprechen Ihr Problem ausreichend an (imho). Und unverzeihlich löst die Übung natürlich.
Raphael
1
@soandos Wenn Sie eine Lösung für die Übung wollten (danke unverzeihlich), dann hätten Sie einfach von Anfang an danach fragen sollen. Stattdessen haben Sie etwas gefragt wie: "Ist mein Algorithmus und wie kann ich meinen Beweis verbessern?" O(n)
Joe

Antworten:

17

Hier ist ein -Algorithmus, der das Problem löst.O(n)

  1. Verwenden Sie den -Auswahlalgorithmus im ungünstigsten Fall , um die Statistik ter Ordnung zu bestimmen . Sei diese Zahl, die kleinste der größten Zahlen, die wir zu bestimmen versuchen.O(n) nm+1km

  2. Partitionieren Sie nun das Array mit der QuickSort- Partitionsfunktion um den Pivot . Dieser Schritt benötigt auch .kO(n)

  3. Geben Sie die größten Zahlen aus: Diese werden durch und alle Zahlen im oberen Subarray angegeben, die durch die Partition in Schritt 2 generiert wurden.mk

Massimo Cafaro
quelle
1
Nett. Je nachdem, welchen Algorithmus Sie in 1., 2. wählen, ist dies möglicherweise bereits geschehen.
Raphael
5

Ihr Algorithmus dauert Θ(n+mn)Zeit. Ich vermute, dass Ihr Professor nach etwas sucht, das brauchtO(n+nlogm) Zeit, die möglich sein sollte, vielleicht mit einem Haufen ...

Die Ursache für Ihre Meinungsverschiedenheit mit dem Professor ist, dass er oder sie nicht zu denken scheint mist eine Konstante, trotz des Wortlauts der Frage. Wenn nicht, dannΘ(m) ist viel schlimmer als Θ(logm).

Louis
quelle
Der rot-schwarze Baum braucht diese Zeit nicht?
Soandos
4
Diese Antwort sagt dem OP nicht, wo er in seiner Argumentation falsch liegt. Können Sie das klarstellen?
Juho
Siehe Update zu Frage
Soandos
1

Korrektheit In
Ihrer Präsentation fehlt die Schleife, um die Korrektheit festzustellen: Sie behalten die größte beimElemente, die bisher in einer verknüpften Liste angetroffen wurden. Somit haben Sie am Ende Ihres Algorithmus alle Elemente getestet und haben somit das größtemElemente im Array. Ihr Algorithmus ist immer noch korrekt, aber die Angabe des Zwecks der verknüpften Liste am Anfang der Beschreibung macht die Richtigkeit deutlicher.

Laufzeit
log10(10 billion)=10, (mit Basis 2 sind es ungefähr ~ 33), was viel kleiner als 10 Millionen ist. In dem angegebenen Beispielm ist um ein Vielfaches größer als lognund deshalb glaube ich nicht, dass Sie das sicher annehmen können m ist konstant.

Sie sollten einen Algorithmus bereitstellen, der ist o(nlogn) so lange wie m=o(n). Durch Ersetzen Ihrer verknüpften Liste und linearen Suche durch einen ausgeglichenen binären Suchbaum oder einen Min-Heap wird diese Laufzeit erreicht:O(mlogm+nlogm)=O(nlogm)=o(nlogn). (unter der Annahmem=o(n), sonst ist deine Laufzeit Θ(nlogn))

Falls Sie mit der Notation und der dahinter stehenden Intuition nicht vertraut sind o(nlogn) ist <O(nlogn)Einzelheiten zur Notation finden Sie in der entsprechenden Frage auf cs.SE.

Joe
quelle
Siehe Update zu Frage
Soandos
Ihre Antwort scheint der Antwort auf die Frage am nächsten zu kommen, aber ich denke, Sie können einfach mit sagen m=n/2 Der OP-Algorithmus bewirkt, dass Θ(n2).