演算法的時間複雜度分析有兩種方式。
一種方式是計算演算法具體的執行時間,最終根據這個時間的長短評價演算法的優劣。這種估計方法比較簡單易
於操作,但是這種方法有乙個缺點:估計時間會隨著計算機的不同而產生變化(不同計算機的配置、同乙個
計算機所處環境不同都會影響)。
另一種方式是只記錄演算法的關鍵操作。
例如這個程式:
--------------------------------------------
for (int a = 0; a < num1; a++)
}--------------------------------------------
其**段中出現了迴圈語句的巢狀。應該使用乘法法則,所以o(t(n))=o(num1*num2)。
迴圈語句的迴圈條件會對我們計算演算法時間複雜度產生一定的迷惑作用。很多初學者認為迴圈次數越少的
演算法在時間開銷方面越小。從原理上說這是對的但不要忘記,大o表示法只是演算法在時間開銷方面的數量
級,若數量級相同,即使兩個演算法執行關鍵操作的步數實際上並不相同,那麼也把它們看做是時間複雜度
相等的兩個演算法。
舉例下面的程式:
--------------------------------------------
for (int a = 0; a < num1/2; a++)
}---------------------------------------------
這段**與前面的例子在結構上一模一樣,唯一不同之處在於兩重迴圈的次數減少為原來的一半。用公式
計算這段**的時間複雜度可知o(t(n))=o(num1*num2/4),顯然num1*num2與num1*num2/4具有相同的數量級
兩者均為n的平方,所以這段**與上面的**具有相同的時間複雜度。
例:---------------------------------------------
node* find(const type& x, node* ptr)
else
if (x < ptr->data)
return find(x, ptr->leftchild);
else
if (x > ptr->data)
return find(x, ptr->rightchild);
else
return ptr;
}--------------------------------------------
上述**定義了函式find。但在實現部分函式又呼叫了find自身。
像這種自身定義自身的情況就叫做遞迴。
函式find的作用是在指標ptr指向的鍊錶中尋找變數x,並返回指向x所在結點的指標。這裡鍊錶中的數是有
序存放的,現假定它為從小到大的順序。find的執行過程是:首先令x與鍊錶中間的數值進行比較,若相等
,返回結點指標;若小於,則在中間結點左側的鍊錶中尋找變數x,尋找方式與上面相同;若大於,則在中
間結點的右側鍊錶中尋找變數x,尋找方式與上面相同。如此遞迴下去直到演算法結束為止。(折半查詢法)
這是一種常用的查詢法。
若鍊錶的長度為n,則平均查詢的時間為log以2為底n的對數,所以演算法的時間複雜度為o(log@2n)。
通常程式的時間複雜度有(按照從小到大的順序排列):c, log@2n, n, nlog@2n, n^2, n^3, 2^n,
3^n, n!。(@表示以2為底,n^2表示n的2次方)
若c表示常數,即演算法的執行時間是固定不變的,不隨程式中其他變數狀態的改變而發生變化。但要注意,
語句a=1;與語句a=(a+b)*c+(d+e)*f+g/h;的時間複雜度同為c。不可認為後面的賦值語句較長就認為它有更
高的時間複雜度。
演算法時間複雜度空間複雜度
演算法 是解決某一類問題的通法,即一系列清晰無歧義的計算指令。每個演算法只能解決具有特定特徵的一類問題,但乙個問題可由多個演算法解決。乙個演算法應該有以下五個方面的特性 比較演算法的優劣我們從兩個維度去進行考量 時間 空間 時間複雜度,空間複雜度 找出基本語句 演算法中執行次數最多的那條語句就是基本...
演算法 時間複雜度 空間複雜度
1 if i 1 2 a 1 result 3 4 result n 2 result 1000 1000 3 array.push a array.pop 4 map.set 1,1 map.get 1,1 在計算複雜度的時候,o 1 一般會被忽略。1 for let i 0 i n i 2 wh...
演算法的時間複雜度 空間複雜度
時間複雜度和空間複雜度是度量演算法效率的常用指標 事後統計,不常用 事前統計影響因素 演算法策略 問題規模 程式語言 質量 機器執行指令的速度 撇開軟硬體的影響,演算法執行工作量的大小只依賴於問題的規模 通常用整數n表示 乙個演算法是由控制結構 順序,分支,迴圈三種 和原操作 指固有資料型別的操作 ...