演算法是為了解決某類問題而規定的乙個有限長的操作序列,簡而言之,演算法就是解決問題的方法和步驟。程式使用某種程式語言對演算法的具體實現。程式 = 資料結構 + 演算法, 資料結構通過演算法實現操作,演算法根據資料結構設計程式。
乙個演算法必須有五個重要特性:有窮性,確定性,可行性,輸入,輸出。
評價演算法優劣的基本標準:正確性,可讀性,健壯性,高效性。
乙個演算法首先要具備正確性,然後是健壯性,可讀性。在幾個方面都滿足的情況下主要考慮的是演算法的效率。演算法的效率主要考慮時間效率,空間效率。
1.時間效率:演算法所耗費的時間。
2.空間效率:指的是演算法執行的過程中所耗費的儲存空間。
3.時間效率和空間效率是相互矛盾的。
考慮演算法效率在目前情況下主要考慮的是時間效率。
演算法執行時間 = 乙個簡單操作所需的時間 * 簡單操作次數,由於每條語句執行一次所需要的時間是由機器本身軟硬體環境決定的,與演算法無關。所以我們可以假設執行每條語句 所需的時間均為單位時間。此時對演算法效率的研究就可以轉化為對所有語句執行次數的研究。
例:for(int i = 1; i <=n; i++) // n + 1 次
for(int j = 1; j <= n; j++) // n * (n + 1) 次
總執行次數為 :f(n) = 2 * n * n + 2 * n + 1;
t(n) = n * n;
當 n 趨向於無窮大時,t(n) / f(n) = 2;則稱 f(n) 是 t(n) 的同數量級函式 。記作 t(n) = o(f(n)) , o(f(n))稱為演算法的漸進時間複雜度(o是數量級符號),簡稱時間複雜度。
時間複雜度的定義:
一般情況下,演算法中基本語句重複執行的次數是問題規模 n 的某個函式 f(n) ,演算法的時間量度記作: t(n) = o(f(n));
它表示隨問題規模 n 的增大,演算法執行時間的增長率和 f(n) 的增長率相同,稱作演算法的漸進時間複雜度,簡稱時間複雜度。
例:分析時間複雜度
i = 1;
while(i <= n)
i = i * 2;
解題思路:
顯然 i = i * 2;是基本語句;
當迴圈 1 次:i = 1 * 2 = 2;
當迴圈 2 次:i = 2 * 2 = 2^2;
當迴圈 3 次:i = 2^2 * 2 = 2^3 ;
當迴圈 x 次:i = 2 * 2 * 2 * 2 * 2 * 2… = 2^x;
設基本語句執行的次數為x,由迴圈條件得
i <= n.
所以,2^x <= n;
所以,x <= log(2) n;
所以,2^f(n) <= n, 即 f(n) <= log(2) n, 取最大值,f(n) = log(2) n;
所以該程式的時間複雜度 t(n) = o(log(2) n);
綜上:
分析時間複雜度的三個步驟
1.找到基本語句;
2.執行次數表示為關於 n 的函式;
3. 找出函式的數量級用「o」表示;
補充:
1.有的情況演算法中基本操作的重複執行次數還和問題的輸入資料集有關。例如查詢陣列中的等於常數 e 的元素,基本操作的次數會和陣列中每一元素的位置有關。這種情況下,總是考慮最壞的情況。
時間複雜度運算規則:
加法規則:t(n) = t1(n) + t2(n) = o(f1(n)) + o(f2(n)) = o( max ( f1(n), f2(n) ) );
乘法規則:t(n) = t1(n) * t2(n) = o(f1(n)) * o(f2(n)) = o( f1(n) * f2(n) );
文章借鑑:《資料結構》(c語言版)(第二版)人民郵電出版社;青島大學–王卓老師
資料結構和演算法基礎知識
準備系統完整的複習資料結構和演算法,開始的東西很基礎 簡單,但也寫一下,以後要回顧直接看這一篇省事。程式 資料結構 演算法 資料結構 相互之間存在一種或多種特定關係的資料元素的集合。資料物件 具有相同性質的資料元素的幾何,是資料的乙個子集。資料的邏輯結構 集合 元素除同屬一集合無其他關係。線性結構 ...
演算法與資料結構基礎知識
計算機要工作,首先要有資料,資料就是計算機加工和處理的物件 簡單的分類一下,資料分為數值資料和非數值資料 數值資料主要應用於工程和科學計算 而非數值資料,比如聲音,影象等在計算機中是以二進位制形式存放在物理介質上。每個二進位制位為乙個bit,8個二進位制位為乙個byte 位元組 要談資料結構,就必須...
資料結構基礎知識
時間複雜度和空間複雜度 同一問題可用不同演算法解決,而乙個演算法的質量優劣將影響到演算法乃至程式的效率。演算法分析的目的在於選擇合適演算法和改進演算法。乙個演算法的評價主要從時間複雜度和空間複雜度來考慮。1 時間複雜度 1 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測...