資料結構與演算法之間存在著本質聯絡。
演算法的定義及特性:
演算法是為了解決某類為而規定的乙個有限長的操作序列。
乙個演算法必須滿足一下五個重要特性。
演算法的時間複雜度:一般情況下,演算法中基本語句重複執行的次數是問題規模n的某個函式f(n),演算法的時間量度記作t(n)=o(f(n)) 它表示雖問題規模n的增大,演算法執行時間的增長率和f(n)的增長率相同,稱作演算法的漸進複雜度,簡稱時間複雜度。
在計算演算法時間複雜度時,可以忽略所有低次冪項和最高次冪的洗漱,這樣可以簡化演算法分析,也體現出了增長率的含義。
非遞迴演算法的時間複雜度:
1.常量階示例
for(int i = 0; i < 10000; i++)
如上例,如果演算法的執行時間不對問題規模n的增加而增長,演算法中語句頻度就是某個常數,即使這個常數再大,演算法的時間複雜度都是o(1)。
2.線性階示例、
for(int i = 0; i < n; i++)
迴圈體內兩條基本語句的頻度均為f(n) = n,所以演算法的時間複雜度為t(n) = o(n),稱為線性階。
3.平方階示例
for(int k = 0; k < n; k++)
x++;
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
y++;
對迴圈語句秩序考慮迴圈體中的執行語句,以上程式段中頻度最大(一條語句的重複執行次數稱作語句頻度)是y++;,其頻度為f(n)=n^2,所以該演算法的時間複雜度為t(n)=o(n^2),稱為平方階。
4.對數階示例
for(int i = 1; i <= n; i *= 2)
該演算法的時間複雜度為t(n)=o(log2n),稱為對數階。
常見的演算法時間複雜度按數量級排序依次為:常量階o(1)、對數階o(log2n)、線性階o(n)、線性對數階o(nlog2n)、平方階o(n^2)、立方階o(n^3)、……、k次方階o(n^k)、指數階o(2^n)等。
演算法的空間複雜度:
與時間複雜度相似,用漸近空間複雜度作為演算法所需儲存空間的量度,簡稱空間複雜度。
for(int i = 0; i < n/2; i++)
上述示例**中僅需借助乙個變數t,與問題規模n大小無關,所以其空間複雜度為o(1).
for(int i = 0; i < n; i++)
b[i] = a[n-i-1];
for(int i = 0; i < n; i++);
a[i] = b[i];
上述示例**中需要另外借助乙個大小為n的輔助陣列b,所以其空間複雜度為o(n)。
最後,對於乙個演算法,其時間複雜度和空間複雜度往往是相互影響的,當追求乙個較好的時間複雜度時,可能會導致占用較多的儲存空間,即可能空間複雜度的效能便車,反之亦然。不過,通常情況下,鑑於運算空間較為充足,我們都已演算法的時間複雜度作為演算法優劣的衡量標準。
資料結構 演算法和演算法分析
一 演算法的基本概念 1.什麼是演算法 演算法 演算法是對特定問題的求解步驟,是指令的有限序列。演算法的特徵 1 演算法有0或多個輸入 2 演算法至少有乙個輸出 3 演算法的每一條指令都可以執行 4 演算法的每一條指令都有確切的定義,沒有二義。5 演算法必須總能在執行有限步以後終止。2.演算法的描述...
資料結構和演算法分析
1.1本書討論的內容 1.2數學知識的複習 1.3遞迴簡論 了解程式在適當輸入和巨大 輸入時的差別,明白優化代 碼採取適當資料結構的重要 指數 對數 級數 模運 算 歸納法反證法證明 指在函式的定義中使用 函式自身的方法,還較常 用於描述以自相似方法 重複事物的過程。也可 以理解為自我複製的過程。在...
資料結構演算法1 演算法和演算法分析
最近面試ios實習生。幾次都是敗在資料結構演算法上面了。決定重新撿起大學的課本,複習一下資料結構演算法相關知識。1 反轉乙個鍊錶。迴圈演算法。1 list reverse list l 13 return tmp 14 2 反轉乙個鍊錶。遞迴演算法。1 list resverse list l 8 ...