設順序錶用陣列a表示,表中元素儲存在陣列下標1~m+n的範圍內,前m個元素遞增有序,後n個元素遞增有序,設計乙個演算法,使得整個順序表有序。
(1)給出演算法的基本設計思想。
(2)根據設計思想,採用c或c++語言描述演算法,關鍵之處給出注釋。
(3)說明你所設計演算法的時間複雜度和空間複雜度。
(1)演算法基本設計思想:
將陣列a中的m+n個元素(假設元素為int型)看成兩個順序表,表l和表r。將陣列當前狀態看做起始狀態,即此時表l由a中前m個元素構成,表r由a中後n個元素構成。要使a中m+n個元素整體有序只需將表r中的元素逐個插入表l中的合適位置即可。插入過程:取表
r中的第乙個元素a[m+1]存入輔助變數temp中,讓temp逐個與a[m],a[m-1],…,a[1]進行比較,當temp(2)演算法描述
void insert(int a,int m,int n)
}
(3)演算法時間和空間複雜度
①本題的規模由m和n共同決定。取最內側迴圈中a[j+1]=a[j];這一句作為基本操作,其執行次數在最壞的情況下為:f(m,n)=(m+m+n-1)n/2=mn+n2/2–n/22
②演算法額外空間中只有乙個變數temp,因此空間複雜度為o(1)。
已知遞增有序的單鏈表a,b(a,b中元素個數分別為m,n且a,b都帶有頭結點)分別儲存了乙個集合,請設計演算法以求出兩個集合a和b的差集a-b(即僅由在a中出現而不在b中出現的元素所構成的集合)。將差集儲存在單鏈表a中,並保持元素的遞增有序性。
(1)給出演算法的基本設計思想。
(2)根據設計思想,採用c或c++語言描述演算法,關鍵之處給出注釋。
(3)說明你所設計演算法的時間複雜度。
(1)演算法基本設計思想:
只需從a中刪去a與b中共有的元素即可。由於兩個鍊錶中元素是遞增有序的所以可以這麼做:設定兩個指標p, q開始時分別指向a和b的開始結點。迴圈進行以下判斷和操作,如果p所指結點的值小於q所指結點值,則p後移一位;如果q所指結點的值小於p所指結點的值,則q後移一位;如果兩者所指結點的值相同,則刪除p所指結點。最後p與q任一指標為null的時候演算法結束。
(2)演算法描述:
void difference(lnode *&a, lnode *b)
else
if (p->data > q->data)
q = q->next;
else
}}
(3)演算法時間複雜度分析:
由演算法描述可知,演算法規模由m和n共同確定。演算法中有乙個單層迴圈,迴圈內的所有操作都是常數級的,因此可以用迴圈執行的次數作為基本操作執行的次數。可見迴圈執行的次數即為p, q兩指標沿著各自鍊錶移動的次數,考慮最壞的情況,即p, q都走完了自己所在的鍊錶,迴圈執行m+n次。即時間複雜度為o(m+n)。
資料結構學習筆記(六)鍊錶演算法題
假期結束,看點題目。設順序錶用陣列a表示,表中元素儲存在陣列下標1 m n的範圍內,前m個元素遞增有序,後n個元素遞增有序,設計乙個演算法,使得整個順序表有序。1 給出演算法的基本設計思想。2 根據設計思想,採用c或c 語言描述演算法,關鍵之處給出注釋。3 說明你所設計演算法的時間複雜度和空間複雜度...
資料結構學習筆記(七)鍊錶演算法題 續
有乙個遞增非空單鏈表,設計乙個演算法刪除值域重複的結點。比如。解法一 定義指標p指向起始結點。將p所指當前結點值域和其直接後繼結點值域比較。如果當前結點值域等於後繼結點值域,刪除後繼結點 否則p指向後繼結點,重複以上過程,直到p的後繼結點為空。本題 如下 void delsl1 lnode l el...
資料結構學習筆記 鍊錶
表示式的計算 表示式的計算涉及到棧的操作 對於表示式 a b c d e f 演算法 用到兩個棧,分別是符號棧和運算元棧。輸入表示式時,為了表示表示式輸入完畢,在表示式的最後加上 號,也就是說輸入的表示式為 a b c d e f 首先設定各個符號的優先順序,和 的優先順序為0,也就是最低的 和 的...