資料結構與演算法學習系列(3) 迴圈鍊錶

2021-08-21 14:15:45 字數 1184 閱讀 1605

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.演算法執行的時間,會根據程式語言,作...