資料結構初學過程中對演算法效率度量的理解

2021-07-11 13:37:00 字數 2152 閱讀 3017

引例:

對於給定陣列a[8]=;

如何將陣列前三個元素移到陣列後面使得:

a[8]=?

1、第一種方法(耗費記憶體):

定義乙個新的空白陣列b,將a[3]往後的元素依次放入b[0]至b[4],接著將a[0]至a[2]放入b[5]至b[7].最後用**a[i] = b[i];將元素移入a中即可。

(第1步)

(第2步)

**如下:

int i,j;

int b[20];

for(i=3,j=0; i

<8; i++,j++)

b[j] = a[i];

for(i=0; j

<8; i++,j++)

b[j] = a[i];

for(i=0; i

<8; i++)

a[i] = b[i];

此種方法,雖然時間複雜度變小了,但是空間複雜度較大。由於分配了乙個至少與陣列a相等的陣列b的儲存空間,在陣列a長度不是8,而是幾千幾萬時,記憶體的耗費就顯得更為突出。

2、簡化思考:

對於a[8]=;如何將10(第乙個元素a[0])移到陣列最後(最後乙個元素a[7])?

分析:將a[0]內容移到a[7]位置,只需將a[7]內容換成a[0]即可:

即a[7] = a[0];

但是,這樣a[7]的原有的資料會丟失,所以應該用以下**實現:

將a[0]的資料先暫時儲存在另一變數t所屬空間內,然後用for迴圈將a[i]整體(乙個乙個按順序)前移乙個位置,最後將a[0]存入a[7]即可。

3、舉一反三:

對於要轉移的前三個元素,只需要將以上步驟執行三次即可。

for(i=0; i

<3; i++)

此演算法,由於旨在陣列a自身記憶體及t的記憶體上做操作,空間複雜度小,但是時間複雜度相對較高,並非最好的演算法。

4、如何做到空間複雜度與時間複雜度都比較小:

既要在a自身空間內進行操作,又要迴圈巢狀少一點,函式呼叫便顯得尤為重要:

將a[i]前後調換:

此演算法是將置換使用了三次,既沒有過分浪費記憶體,又沒有過分浪費時間,時間複雜度和空間複雜度相對來說都較小。但是**量稍大,可通過函式呼叫來解決(如下)。

void move_element(int a,int s,int e)

}int main(void)

; move_element(a,0,7);

move_element(a,0,4);

move_element(a,5,7);//函式傳送的是陣列首元素位址和陣列區間(而非長度)

for(i=0; i<8; i++)

printf("%-5d",a[i]);

return

0;}

到此為止,這個簡單的程式算是基本寫完了。

5、總結:

(1)所有資料集合的移動演算法都可以通過浪費空間來解決,但是都不是理想的演算法。

(2)描寫演算法不可以浪費空間為前提。

資料結構在實際開發過程中的應用

寫了這麼些年的 對資料結構和演算法分析也只停留在皮毛階段,實在是慚愧,把自己最近一段時間在專案中資料結構的具體應用總結一下。結構具體應用 結構體用來表示某些純資料結構會很好 指標的指標 做動態陣列用效果不錯,但是在初始化時也需要動態確定指標的容量 一維陣列 用來儲存一些配置資訊列表不錯 二維陣列 做...

資料結構在實際開發過程中的應用

寫了這麼些年的 對資料結構和演算法分析也只停留在皮毛階段,實在是慚愧,把自己最近一段時間在專案中資料結構的具體應用總結一下。結構具體應用 結構體用來表示某些純資料結構會很好 指標的指標 做動態陣列用效果不錯,但是在初始化時也需要動態確定指標的容量 一維陣列 用來儲存一些配置資訊列表不錯 二維陣列 做...

資料結構中演算法的複雜度問題

演算法的複雜度分為時間複雜度和空間複雜度 其實,時間複雜度實際上就是乙個函式,這個函式呢,它計算的是乙個演算法執行基本操作的次數。這裡,要明確,為什麼不直接用時間來衡量乙個演算法的優劣,其原因在於乙個演算法在乙個平台上執行時,可能會受到其他因素的影響,比如相同的兩個機器在執行乙個和多個程序時,其響應...