Eingabe:
Eine Menge von Arrays (von Zahlen).
Die Elemente in jedem Array sind in sortierter Reihenfolge, aber der Satz von Arrays ist nicht unbedingt sortiert. Die Arrays haben nicht unbedingt die gleiche Größe. Die Gesamtzahl der Elemente beträgt .A i n
Ausgabe: Das -kleinste Element aller Elemente in der Eingabe.
Was ist der effizienteste Algorithmus für dieses Problem?
Ist es beispielsweise möglich, eine Laufzeit von ?
Antworten:
Sie können dies in Zeit und zusätzlichem Speicherplatz wie folgt tun :O ( l )O(l+k log l) O(l)
Wenn Sie den binären Heap durch einen Fibonacci-Heap ersetzen, werden Sie wahrscheinlich auf die amortisierte -Zeit reduziert , aber in der Praxis ist er langsamer als der binäre Heap, es sei denn, ist RIESIG.lO(l+k) l
Ich vermute, dass die Fibonacci-Heap-Bindung optimal ist, weil Sie intuitiv mindestens Elemente untersuchen müssen, um das -kleinste zu finden, und Sie müssen mindestens ein Element von jedem der Arrays, da Sie nicht wissen, wie sie sortiert sind, was sofort eine Untergrenze von ergibt .k l Ω ( max ( k , l ) ) = Ω ( k + l )k k l Ω(max(k,l))=Ω(k+l)
quelle
Hier ist ein randomisierter -Algorithmus. Es kann wahrscheinlich mit demselben Trick derandomisiert werden, mit dem die übliche Schnellauswahl derandomisiert wird.O(ℓlog2n)
Wir emulieren den klassischen Schnellauswahlalgorithmus. In jeder Phase wählen Sie einen Drehpunkt aus und berechnen mithilfe der binären Suche in jeder Liste, wie viele Elemente sich darunter in . Dann entfernen Sie Elemente auf der falschen Seite und wiederholen. Der Prozess endet erwartungsgemäß nach Iterationen.O(ℓlogn) logn
quelle
Dies scheint durch das Papier Allgemeine Auswahl und Rangfolge (vorläufige Version) von Frederickson und Johnson in STOC '80 gelöst zu werden.
Sie geben die oberen und unteren Grenzen von: was sich für die meisten Arraygrößenverteilungen als herausstellt .Θ(ℓ+∑ℓi=1log|Ai|) ℓlogn
Der eigentliche Algorithmus zum Erreichen der Obergrenze ist offenbar in einem früheren Artikel angegeben: Optimale Algorithmen zum Erzeugen von Quantilinformationen in X + Y und Matrizen mit sortierten Spalten , Proc. 13. Jahreskonferenz über Informationswissenschaft und -systeme, Johns Hopkins University (1979) 47-52.
quelle
Eine -way-Zusammenführung benötigt Zeit (verwenden Sie eine effiziente Methode, um eine Prioritätswarteschlange der Kopfelemente in jeder Liste darzustellen), und wählen Sie dann das te Element in konstanter Zeit aus. Ich denke, das wird in Knuths "Sortieren und Suchen" zum Sortieren besprochen. Das kleinste (oder größte erfordert eindeutig , für ein unsortiertes Array ist es IIRC.Θ ( n log l ) k Θ ( l ) O ( n )ℓ Θ(nlogℓ) k Θ(ℓ) O(n)
Bitte beschreiben Sie Ihren Algorithmus.
quelle