簡體   English   中英

k路合並中合並與項目數之間的關系是什么

[英]What is the relation between merges and number of items in a in k-way merge

問題是:在一次 k 路合並中,我們將執行多少次合並操作。 例如:2路合並:2節點1合並; 3節點2合並; 4 個節點 3 個合並。 所以我們得到 M(n)=n-1。

當 k 是任意的時,M(n) 是什么?

2-way merge 在合並大小相等的塊時效率最高,因此基於 2-way 合並的最有效的k -way 合並是先將塊 1 與塊 2 合並,將塊 3 與塊 4 合並,以此類推,然后合並前兩個結果塊,依此類推。 這基本上是歸並排序的工作原理,並導致 O( kn log k ) 時間,假設k個塊中的每一個包含n 個項目。 但只有當所有塊都恰好有n 個項目並且k是 2 的冪時,它才是完全有效的,所以......

您可以使用包含每個塊的第一項(即總共k項)的堆,而不是執行k個單獨的合並通道:

  1. 從堆中讀取最低項(O(log k ) 時間)
  2. 把它寫出來
  3. 從堆中刪除它
  4. 如果該項目來自的塊尚未耗盡,則將其下一個項目放入堆中(再次O(log k )一次)。
  5. 重復直到堆為空。

如果總共有kn個項目,這總是需要 O( kn log k ) 時間,無論它們如何在塊之間分布,也不管k是否是 2 的冪。你的堆需要包含(item, block_index)對這樣您就可以識別每個項目來自哪個塊。

好的,按照說明回答原始問題:

要使用一系列 2 路合並來合並k個塊,總是需要恰好k - 1 次合並,因為無論您在任何時間點選擇合並哪對塊,合並它們都會將塊的總數減少 1。

正如我在原始答案中所說,您選擇合並的哪對塊確實會影響整體時間復雜度——最好合並大小相似的塊——但它不會影響 2 路合並操作的數量

是的,堆的方式可能更有效。 但是原始問題的答案是什么? 我發現可能沒有答案,因為它可能不是一個完整的 k 路樹,所以 4 路可能會回歸到 3 路、2 路。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM