2-Wege gehen effizientesten sind, wenn sie gleich große Blöcke verschmelzenden, so dass der effizienteste k -Wege merge bezogen auf 2-Weg ist, verschmilzt Block zuerst zu fusionieren 1 mit dem Block 2, Block 3 mit dem Block 4, usw. fusionieren Sie dann die ersten beiden resultierenden Blöcke und so weiter. Dies ist im Grunde wie mergesort arbeitet, und die Ergebnisse in O (log knk) Zeit, wobei jedes der k Blöcke enthält n Elemente annimmt. Aber es ist nur vollkommen effizient, wenn alle Bausteine genau n Elemente und k ist eine Potenz von 2, also ...
Statt Durchführung k separater merge gibt, können Sie einen einzigen Durchgang verwenden, die verwendet einen Haufen auf das erste Element jedes Blocks (dh k Elemente insgesamt) enthält:
- Lesen sie den niedrigsten Punkt aus dem Heap (O (log k ) time)
- Schreib es out
- es aus dem
- Haufen entfernen Wenn der Block, dass das Element aus ist kam noch nicht erschöpft, legen Sie das nächste Stück von ihm in den Heap (wieder O (log k) Zeit).
- Wiederholen, bis der Heap leer ist.
Wenn es insgesamt kn Artikel sind, das dauert immer O (kn log k) Zeit unabhängig davon, wie sie unter den Blöcken verteilt sind, und zwar unabhängig davon, ob k ist eine Macht von 2. Ihr Heap muss (item, block_index)
Paare enthalten, so dass Sie identifizieren können, aus welchem Block jedes Element stammt.
Fair genug, ich habe die ursprüngliche Frage nicht beantwortet. Die Antwort auf diese Frage ist "M (k) = k - 1 immer", wie ich in meiner 2. Antwort erkläre. Dies gilt unabhängig davon, was k ist. –