1. 程式人生 > >【資料結構】線性結構:儲存&運算&時間複雜度

【資料結構】線性結構:儲存&運算&時間複雜度

版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/shamingai/article/details/48914005

邏輯結構:表內元素的關係,共有集合、線性結構(線性表、棧、佇列、陣列)、樹形結構(樹、二叉樹、森林)、圖結構(圖)四種;

儲存結構:是資料在計算機中的實現,也叫物理結構,常用的是順序儲存和鏈式儲存。

順序儲存指的是所有儲存結點放在一個連續的儲存區中;

鏈式儲存指的是儲存結點不一定存放在一個連續的儲存區,結點間的邏輯關係靠結點中的指標來確定。

線性表的順序儲存,我們稱之為順序表。

順序表的所有資料都儲存在一個連續的儲存區,當執行插入、刪除等操作的時候,一個結點有變化就會影響後面的所有結點。

計算演算法的時間複雜度,一個重要的指標是資料元素的比較和移動的次數。

順序表的讀表元素和求表長演算法,只執行一次就能出結果,時間複雜度為O(1)。

順序表的定位演算法:1、遍歷表中資料,查詢所求值;2、找到則返回結點需要的最小值;3、找不到則返回0。

要遍歷表,時間複雜度與表長有關,時間複雜度為O(n)。

順序表的插入演算法:1、確定插入結點位置(定位);2、將該結點及後面所有位置的結點後移;3、將插入結點放入空出來的位置;4、表長增加。

最好的情況下是插入到表尾,沒有資料移動,最壞的情況下是插入到表頭,所有均資料移動。平均下來(0+n)/2,插入演算法的時間複雜度是O(n)。

順序表的刪除演算法:1、確定原被刪除結點位置;2、將其後的結點左移,覆蓋被刪除結點;2、表長減少。

情況插入步驟相同,其時間複雜度為O(n)。

線性表也可以使用鏈式儲存,根據指標的指向,線性表的鏈式儲存劃分成單鏈表、迴圈連結串列、雙向迴圈連結串列三類。

單鏈表指標方向是唯一的,直接前驅指向該結點,該結點再指向直接後繼;

迴圈連結串列就是單鏈表的最後一個結點的指標指向第一個結點,形成環結構;

雙向迴圈連結串列在迴圈連結串列的基礎上,每個結點再新增一個指標,這類指標均用於指向直接前驅(每個結點含兩個指標)。

單鏈表任何相鄰的結點都通過一個指標(相當於火車的車鉤)相連,因此要想獲取後一個結點必須遍歷前面所有的結點。

單鏈表的初始化演算法:1、建立頭結點;2、指標域為NULL;3、用一個LinkList型別變數指向新建立的結點。

單鏈表的求表長演算法:1、帶計數器的工作指標p,指向頭結點;2、工作指標移動一個結點,計算器加1;3、p=p→next時計算器的值。

單鏈表的讀表元素演算法:1、遍歷該元素前面所有結點,2、讀操作。時間複雜度為O(n)。

單鏈表的定位演算法:1、從頭至尾訪問結點;2、返回序號。時間複雜度為O(n)。

單鏈表的插入運算:1、找到前一個結點(定位);2、生成目標結點;3、目標結點連結後繼結點;4、目標結點連結前驅結點。時間複雜度為O(n)。

單鏈表的刪除運算:1、找到待刪結點的直接前驅(定位);2、刪除待刪結點;3、待刪結點的直接前驅指向直接後繼。時間複雜度為O(n)

單鏈表的建表過程:1、建含頭結點的空表(初始化);2、建立新結點,將新結點連結頭結點;3、復建立新結點,將新結點連結到表尾……

實現單鏈表建表過程有三種方法:

方法一(插入演算法):新增結點插入到表尾,新增插入都會遍歷表。

整個建表過程的計算量為[n(n-1)]/2,時間複雜度是O(2^2);

方法二(尾插):設定指標指向尾結點,新增結點插入到尾結點即可,形成連結串列資料順序與輸入順序相反。

整個建表過程,時間與元素個數成正比,時間複雜度是O(n);

方法三(前插):新增結點插入到表頭,每次插入到第一個資料結點之前,形成連結串列資料順序與輸入資料順序相同。其時間複雜度也是O(n)。

順序表與單鏈表時間複雜度的比較:

按位置查詢,順序表執行一次操作即可O(1),單鏈表要遍歷到該位置才能找到,O(n);

定位演算法,均需要遍歷全表才能返回最小的序號,時間複雜度均為O(n)。

插入演算法,順序表,先定位O(1),新增結點後的右移,時間複雜度為O(n);單鏈表,先定位O(n),其他結點不移動,時間複雜度也為O(n)。

刪除演算法與插入演算法相同。