有序陣列合併的並行演算法(有一定限制)

2021-08-26 16:16:49 字數 2083 閱讀 4739

如果a=(a1,a2,...,am)和b=(b1,b2,...,bn)是兩個有序的公升序陣列,合併陣列a和b就行形成乙個新的公升序陣列包含a和b的有所有元素,假設a=(2,4,11,12,14,35,95,99),b=(6,7,9,25,26,31,42,85,87,102,105).

如果合併a和b的陣列,序列演算法會遍歷兩個陣列,然後將陣列元素存到陣列c中,開始時設定兩個指標,分別指向陣列a和b的每乙個元素,接下來每個移動a或者b的乙個指標。如此遍歷時間複雜度為o(m+n)。其偽**如下

序列演算法:

輸入a和b

輸出c1. set a[m+1] = +inf,b[n+1] = +inf.

2. set i = 1, j = 1 , k = 1

3. while k <= m+n do

4. if a[i] < b[j] do

c[k] = a[i] and i = i+1

else

c[k] = b[j] and j = j + 1;

endif

5. k = k + 1;

6. end while

7. end

下面分析其並行演算法(注意本演算法有乙個侷限性,只適用於最終合併的c中沒有重複元素的情況)

定義: rank(x:a)指數組a中不大於x的元素個數, rank(6:a)=2, rank(25:a)=5.

rank(b:a)為陣列(r1,r2,..., rn),其中ri=rank(b[i]:a)

對於上面給出的a和b陣列,可以得到如下。

rank(b:a)=(2,2,2,5,5,5,6,6,6,8,8)

rank(b:b)=(1,2,3,4,5,6,7,8,9,10,11)

rank(a:b)=(0,0,3,3,3,6,9,9)

rank(a:a)=(1,2,3,4,5,6,7,8)

進一步分析rank(x:a u b)是指aub中不大於x的元素數量,因此rank(x:aub=rank(x:a)+rank(x:b),進一步:

rank(a:aub)= rank(a:a)+rank(a:b) = (0,0,3,3,3,6,9,9) +(1,2,3,4,5,6,7,8)

= (1,2,6,7,8,12,16,17)

rank(b:aub)= (3,4,5,9,10,11,13,14,15,18,19)

從rank(a:aub)中我們可以知道a中每個元素中c中的位置,即c[1] = 2, c[2] = 4, c[6] = 11, c[17] = 99. 對b中元素可以rank(b:aub)確定其中c中的位置

上面介紹了基本的演算法思想,下面來分析該演算法,並將其並行化。

下面給出該演算法的偽**

1. for i = and j = do in parallel

2. find rank (ai:a) and find rank(bj:b)

3. findrank (ai:b) and find rank(bj:a)

4. end parallel

5. denote rank(a:b)and rank(b:a).

6. ra = rank(a:a)+rank(a:b)

7. rb = rank(b:a)+rank(b:b)

8. for i = 1 to m do in parallel

9. c[rai] = a[i]

10. end parallel

11. for i = 1 to n do in parallel

12. c[rbi] = b[i]

13. end parallel

14. end

時間複雜度分析:

由於a和b是有序的,我們可以使用二分搜尋法利用乙個處理器在o(log(m))的時間內完成求rank(x:a),相似地rank(x:b)的複雜度為o(log(n)).

因此1~4步使用m+n個處理器可以在o(log(n))(假定n >= m)的時間內完成, 其餘步驟都可以在o(1)的時間內完成,因此該演算法的時間複雜度為o(log(n)), 需要使用的處理器個數為m+n.

本演算法中最重要的部分是求rank(a:aub)和rank(b:aub),假設使用m+n個處理器,可以在o(log(n))完成。下面給出該演算法的偽**

演算法 兩個有序陣列合併成乙個有序陣列

兩個有序陣列的合併函式 public static int mergelist int a,int b else 後面連個while迴圈是用來保證兩個陣列比較完之後剩下的乙個陣列裡的元素能順利傳入 while i result k a i while j result k b j return re...

兩個有序陣列合併成乙個大的有序陣列

package com.test public class use7 int b int result mergelist a,b for int i result public static int mergelist int a,int b else 後面連個while迴圈是用來保證兩個陣列比較...

Python實現兩個有序陣列合併為乙個有序陣列

def merge a,b 合併2個有序陣列,預設a,b都是從小到大的有序陣列 1.臨時變數 i,j 0,0 分別標記2個陣列的起始位置 na,nb len a len b 分別標記2個陣列的長度 temp 臨時存放空間 2.只要2個陣列不為空 比較大小a i a j 依次填入temp while ...