演算法導論6 5 8習題解答 最小堆K路合併

2021-06-01 11:24:52 字數 1742 閱讀 2740

演算法思想

:1. 從k個鍊錶中取出每個鍊錶的第乙個元素,組成乙個大小為k的陣列arr,然後將陣列arr轉換為最小堆,那麼arr[0]就為最小元素了

2. 取出arr[0],將其放到新的鍊錶中,然後將arr[0]元素在原煉表中的下乙個元素補到arr[0]處,即arr[0].next,如果arr[0].next為空,即它所在的鍊錶的元素已經取完了,那麼將堆的最後乙個元素補到arr[0]處,堆的大小自動減一,迴圈n-k次即可。

為了方便貼上,把.h和.cpp都弄在一起,首先是兩個類list和node,然後就是兩個關於最小堆操作的函式,**有點長,但是一點都不難,因為你肯定看過最大堆的操作,那麼最小堆就大同小異了:

#include

using

namespace

std;

class

node

;class

list;//

修正i的位置,在此處已經假設i的子節點都是堆

void

min_heapify(node* &a,

inti,

intlength);

//建立陣列的堆

void

build_min_heap(node* &a,

intlength);

intmain()

node* arr =

newnode[k];

arr[

0] = *(list_one->first);

arr[

1] = *(list_two->first);

arr[

2] = *(list_three->first);

arr[

3] = *(list_four->first);

arr[

4] = *(list_five->first);

//先對這k個排序

build_min_heap(arr, k);

list* list =

newlist();

//每次取arr[0]的下乙個node,如果node為空的話, //

則把堆末尾的元素補到arr[0],由於有--k,所以堆的大小減一

while

(k > 0)

node* begin = list->first;

while

(begin != null)

return0;

}void

min_heapify(node* &a,

inti,

intlength)

if(right <= length -

1&& a[right] < a[smallest])

if(smallest != temp)

else

break;}

}void

build_min_heap(node* &a,

intlength)

node::node()

node::node(

intd)

node::

operator

node()

const

bool

node::

operator

<(

const

node& temp)

list::list()

void

list::insert(

intd)

prev->next = node;}}

演算法導論 習題 6 5 8

題 請給出乙個時間為o nlgk 用來將k個已排序鍊錶合併為乙個排序鍊錶的演算法。此處n為所有輸入鍊錶中元素的總數。k個已排序鍊錶,假設每乙個鍊錶的第乙個元素為root i i 1,2,3.k 那麼可以為這k個元素root i 構造乙個最小堆heap min,其時間複雜度為o lgk 此時堆頂元素假...

演算法導論習題解答 2 3 7

2.3 7 請給出乙個執行為 nlgn 的演算法 偽碼 使之能在給定乙個由n 個整數構成的集合s 和另乙個整數x 時,判斷出s 中是否存在有兩個其和等於x 的元素。解 解題思路 先對集合s進行歸併排序,然後新建乙個陣列s1,使得s1 i x s i 再將兩個陣列並起來。如果在並的過程中發現有兩個元素...

演算法導論6 5 7習題解答

clrs 6.5 7 heap delete a,i 操作將結點i中的項從堆a中刪去。對含n個元素的最大堆,請給出時間為o lgn 的heap delete的實現。演算法思想 對即將被刪的i處的元素設定為堆中末尾的元素,同時堆的大小減1.此題同時附帶6.2 5的解答 如下 1 include 2 u...