引例:
對於給定陣列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)描寫演算法不可以浪費空間為前提。
資料結構在實際開發過程中的應用
寫了這麼些年的 對資料結構和演算法分析也只停留在皮毛階段,實在是慚愧,把自己最近一段時間在專案中資料結構的具體應用總結一下。結構具體應用 結構體用來表示某些純資料結構會很好 指標的指標 做動態陣列用效果不錯,但是在初始化時也需要動態確定指標的容量 一維陣列 用來儲存一些配置資訊列表不錯 二維陣列 做...
資料結構在實際開發過程中的應用
寫了這麼些年的 對資料結構和演算法分析也只停留在皮毛階段,實在是慚愧,把自己最近一段時間在專案中資料結構的具體應用總結一下。結構具體應用 結構體用來表示某些純資料結構會很好 指標的指標 做動態陣列用效果不錯,但是在初始化時也需要動態確定指標的容量 一維陣列 用來儲存一些配置資訊列表不錯 二維陣列 做...
資料結構中演算法的複雜度問題
演算法的複雜度分為時間複雜度和空間複雜度 其實,時間複雜度實際上就是乙個函式,這個函式呢,它計算的是乙個演算法執行基本操作的次數。這裡,要明確,為什麼不直接用時間來衡量乙個演算法的優劣,其原因在於乙個演算法在乙個平台上執行時,可能會受到其他因素的影響,比如相同的兩個機器在執行乙個和多個程序時,其響應...