空間複雜度:演算法寫成程式後,執行時占用的電腦記憶體空間。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為一帶有頭結點的迴圈單鏈表,鍊錶中儲存一組無序...
資料結構系列 線性表(二)
總結 由於順序儲存最大的缺點就是增刪慢,在增刪操作後需要移動大量元素,比較耗費時間。所以鏈式儲存解決了這個問題。物理儲存單元上非連續的 非順序的儲存結構。鏈式結構中,除了儲存資料元素外,還需要儲存後繼的儲存位址。儲存資料元素資訊的域叫作 資料域 儲存後繼位置的域叫作 指標域 指標域中儲存的資訊叫作 ...