資料結構入門學習系列 3(線性表的順序儲存)

2021-08-09 13:19:39 字數 1426 閱讀 6795

空間複雜度:演算法寫成程式後,執行時占用的電腦記憶體空間。s(n)=o(f(n))

這個比較好理解,比如一維陣列a[n]占用空間複雜度是:s(n)=o(n),

二維陣列a[n][m]占用空間複雜度是:s(n)=o(n*m)

線性結構中的線性表:存在唯一的第乙個元素和最後乙個元素。除了這兩個特殊資料之外,中間元素都有乙個直接前驅和乙個直接後繼。

乙個簡單的抽象模型:

adt listadt list

其中線性結構根據儲存方式不同有以下幾種:

1.順序儲存(陣列),通過抽象語言簡單定義一下:

#include#define ok 1

#define error -1

#define max_size 100

typedef int status

typedef int elemtype

typedef struct sqlistsqlist;

對於該線性結構初始化;

/初始化

status init_sqlist(sqlist *l)

else

}

之後進行在i的位置插入乙個元素e的操作:

//在第i個位置插入元素e

status insert_sqlist(sqlist *l, int i, elemtype e)

if(l->length > max_size)

for(j=l->length-1;j>=i-1;j--)

l->length++;

}

該線性表的插入運算需要將i之後的元素都往後移一位,然後在i的位置插入。

時間複雜度:一般情況下,插入某個點的概率為p=1/(n+1),需要做的操作次數為:q=n-i+1.由此可以計算i從0到n的插入可能操作次數為i從0到n的p*q的和。預算後是n/2,也就是o(n)。

下面來看刪除的操作,刪除分兩種方法,一種是刪除掉i位置的元素,一種是刪除元素值為e的元素。

刪除掉i位置的元素:

//刪除固定位置i的乙個元素

status delete_sqlist(sqlist *l, int i)

根據之前插入函式的演算法,改程式的時間複雜度也是o(n)。

刪除元素值為e的元素:

//刪除元素e

status locate_delete_sqlist(sqlist *l, elemtype e)

if(i>=l->length)

return error;

}

刪除的時候需要先查詢,再講找到的位置的元素之後往前一次平移一位。由之前的計算:比較查詢的時間複雜度為:(n+1)/2,平移的時間複雜度是:(n-1)/2。所以最終複雜度為o(n)。

資料結構 線性表3

每天要學習的太多,今天花大量時間敲完靜態鍊錶的 發現後面還有迴圈鍊錶,雙向鍊錶,這樣學習效率太低。所以後面不打算把偽碼重新實現一遍,只記錄學習的要點等。通過物理的線性結構實現邏輯的鏈式儲存,下標由0開始,及s 0 為第乙個資料。typedef struct component,staticlinkl...

資料結構3 線性表

設計演算法,將兩個安置遞增有序的單鏈表合併成乙個安置遞增有序的單鏈表。void listmerge linklist la,linklist lb,linklist lc else if la lc next la if lb lc next lb 設l為一帶有頭結點的迴圈單鏈表,鍊錶中儲存一組無序...

資料結構系列 線性表(二)

總結 由於順序儲存最大的缺點就是增刪慢,在增刪操作後需要移動大量元素,比較耗費時間。所以鏈式儲存解決了這個問題。物理儲存單元上非連續的 非順序的儲存結構。鏈式結構中,除了儲存資料元素外,還需要儲存後繼的儲存位址。儲存資料元素資訊的域叫作 資料域 儲存後繼位置的域叫作 指標域 指標域中儲存的資訊叫作 ...