【例1】求解一般集合的並集問題
【問題描述】已知兩個集合 a 和 b ,現要求乙個新的集合 a=a u b ,例如,設
a=(7,5,3,11)
b=(2,6,3)
合併後,a=(7,5,3,11,2,6)
【問題分析】可以利用兩個線性表 la 和 lb 分別表示集合 a 和 b (即線性表中的資料元素為集合中的成員),這樣只需要擴大線性表 la ,將存在於 lb 中而不存在於 la 中資料元素插入到 la 中去。只要從 lb 中依次取得每個資料元素,並依值在 la 中進行查訪,若不存在,則插入之。
(上述操作過程可用演算法描述。具體實現時既可採用順序形式,也可採用鍊錶形式)
【演算法步驟】1.分別獲取 la 的表長 m 和 lb 的表長 n
2.從 lb 中第1個資料元素開始,迴圈 n 次執行以下操作:
【演算法描述】
void
mergelist
(list &la,list lb)
}
【演算法分析】上述演算法的時間複雜度取決於抽象資料型別list定義中基本操作的執行時間,假設 la 和 lb 的表長分別 m 和 n ,迴圈執行 n 次,則:
當採用順序儲存
結構時, 在每次迴圈中,getelem 和 listinsert 這兩個操作的執行時間和表長無關,locateelem 的執行時間和表長 m 成正比,因此,此演算法的時間複雜度為o(m×n)
。
當採用鏈式儲存
結構時,在每次迴圈中,getelem 的執行時間和表長 n 成正比,而 listinsert 和 locateelem 這兩個操作的執行時間和表長 m 成正比,因此,若假設 m 大於 n ,此演算法的時間複雜度也為o(m×n)
。
解釋:1,2,3,4,5… : 遞增排列
9,8,7,6,5… : 遞減排列
1,2,3,3,4,5,8 ,8,… : 非遞減排列
9,8,7,7,6,5,5,2,1,… : 非遞增排列
【例2】求解有序集合的並集問題
【問題描述】有序集合是指集合中的元素有序排列。
已知兩個有序集合 a 和 b ,資料元素按值非遞減有序排列,現要求乙個新的集合 c = a u b ,使集合 c 中的資料元素仍按值非遞減有序排列。例如,設
a=(3,5,8,11)
b=(2,6,8,9,11,15,20)
則,c=(2,3,5,6,8,9,11,11,15,20)
【問題分析】與【例1】一樣,利用兩個線性表 la 和 lb 分別表示集合 a 和 b,不同的是,此例中的 la 和 lb 有序,這樣便沒有必要從 lb 中依次取得每個資料元素,到 la 中進行查訪。
如果 la 和 lb 兩個表長分別記為 m 和 n,則合併後表長應為 m+n 。 先設 lc 為空表,然後將 la 或 lb 中的元素逐個插入到 lc 中即可。可設兩個指標 pa 和 pb 分別指向 la 和 lb 中的某個元素,若設 pa 當前所指的元素為 a ,pb 當前所指的元素為 b ,則當前應插入到 lc 中的元素 c 為
顯然,指標 pa 和 pb 的初值分別指向兩個有序表的第乙個元素,在所指元素插入 lc 之後,在 la 或 lb 中順序後移。
【演算法步驟】
【演算法描述】
void
mergelist_sq
(sqlist la,sqlist lb,sqlist &lc)
while
(pa*pc++
=*pa++
;//lb已到達表尾,依次將la的剩餘元素插入到lc的最後
while
(pb*pc++
=*pb++
;//la已到達表尾,依次將lb的剩餘元素插入到lc的最後
【演算法分析】若對於上演算法中第乙個迴圈語句的迴圈體做如下修改:分出元素比較的第三種情況,當 *pa==*pb 時,只將兩者中之一插入 lc ,則該演算法完成的操作和【例1】相同,但時間複雜度卻不同。【例2】演算法中,由於 la 和 lb 中元素依值非遞減,則對 lb 中的每個元素,不需要在 la 中從表頭到表尾進行全程搜尋。如果兩個表長分別記為 m 和 n ,則【例2】演算法中的迴圈最多執行的總次數為 m+n。
所以演算法的時間複雜度為o(m+n)
。
此演算法在歸併時,需要開闢新的輔助空間,所以空間複雜度
也為o(m+n)
,空間複雜度較高。利用鍊錶來實現上述歸併時,不需要開闢新的儲存空間,可以時空間複雜度達到最低。
借鑑:《資料結構》 嚴蔚敏
線性表的合併(有序)
define crt secure no warnings 1 include stdio.h include windows.h define maxsize 20 typedef struct a int hblist a b,a c,a d while blow b last clow c l...
合併有序鏈式線性表
leetcode的easy題之21merge two sorted lists要求合併兩個已經排好序的鏈式線性表。其實就是簡單的鍊錶操作。但是由於自己各種操作不熟悉,這道題捯飭了一天。首先就是這個控制台輸入兩組數,分別建立兩個線性表這裡卡了很久。另乙個點就是把鍊錶接起來,這裡操作也不是很熟悉。以下就...
有序線性表的有序合併
對於這個問題其實想法很簡單,已經已知線性表是有序的,那麼我們只需要比較值的大小放入另外乙個陣列中或者直接輸出 要考慮的是兩個輸入序列的邊界問題。這個問題在 中注釋,也是常用的迴圈兩個線性表的方法。已知線性表 la 和 lb 中的資料元素按值非遞減有序排列,現要求將 la 和 lb 歸併為乙個新的線性...