1 迴圈鍊錶應用例項: 約瑟夫環問題:編號為1,2,...,n的的n個人按照順時針方向圍坐在一張圓桌周圍,每個人持有乙個密碼(正整數),一開始任選乙個正整數作為報數上限值m,從第乙個人開始按照順時針方向自1開始報數,報到m時停止報數,報m的那個人出列,將他的密碼作為新的m值,從他順時針方向的下乙個人開始重新從1報數,數到m的人又出列:如此下去,直到圓桌周圍的人全部出列為止。
迴圈鍊錶:單鏈表的尾結點指向頭結點(定義:迴圈鍊錶最後乙個節點的指標域由指向null改為指向頭結點或第乙個結點,就得到了單鏈形勢的迴圈鍊錶,並稱為迴圈單鏈表,在迴圈單鏈表中,表中的所有結點被鏈在乙個環上); l指向頭結點,一般會設乙個rail尾指標指向單鏈表中的最後乙個元素;
2 乙個例子 有兩個帶頭結點的迴圈鍊錶la和lb,編寫乙個演算法,將兩個帶頭結點的迴圈單鏈表合併成乙個,其頭指標為la 解決辦法如下所示:
實現**如下:
#include #include#includeusing namespace std;
//adt
typedef struct nodenode;
typedef struct node* linklist;
int main(){}
/*** 帶頭結點的迴圈單鏈表la和lb合併為乙個迴圈單鏈表,其頭指標為la**/
linklist merge_1(linklist la, linklist lb)
演算法的時間複雜度分析:
在兩個while中一次遍歷,時間複雜度是o(n),所以採用帶尾指標的迴圈鍊錶,時間複雜度可以減低至o(1)
3 迴圈鍊錶的特點:
(1)從表中任一結點出發都能訪問到表中的所有結點;
(2)迴圈鍊錶是對稱的,為了判斷起始位置,一般要設定頭結點,頭結點的設定也可將空表和非空表的邏輯狀態及運算統一起來;
(3)迴圈鍊錶的運算和線性鍊錶基本一致,有時可簡化某些運算
4 課後練習(約瑟夫環的實現)
資料結構與演算法學習筆記3
最好情況時間複雜度 最壞情況時間複雜度 平均情況時間複雜度 均攤時間複雜度 例 在乙個無序的陣列 array 中,查詢變數 x 出現的位置。如果沒有找到,就返回 1 n表示陣列array的長度 intfind int array,int n,int x return pos 時間複雜度 o n nn...
《大話資料結構》資料結構與演算法學習筆記3
演算法複雜度 設問題的輸入規模為n,判斷乙個演算法的效率時,函式中的常數和其他次要項通常可以忽略,而應該更加關注主項 最高端項 的階數。就是和數學分析裡判斷兩個函式高低階的思路一樣。如果規範一下說法,就是演算法時間複雜度 演算法時間複雜度 定義 在進行演算法分析時,語句總的執行次數t n 是關於問題...
資料結構與演算法學習
我想重新學習一下資料結構與演算法,打好基礎。to measure is to know.我們用演算法複雜度t n 來表示演算法的效率,效能。t n 的取值 所有問題規模為n的問題例項中,將他們的計算成本進行總體的比較,取出最壞情況下的值。有幾點需要catch,1.演算法執行的時間,會根據程式語言,作...