1.直接法:
1每次迴圈迭代,pow函式內部都會執行i次乘法,然後一次加法,所以整體的演算法複雜度為o = 1/2 * n ^ 2 + 3/2n,儘管pow函式的實現方法是利用遞迴優化後的,但是演算法複雜度還是達到了o(nlogn)double polynomial_1(int n, double a, doublex)2
2.秦九韶法:
1它不斷提取公因式x來減少乘法的運算次數,演算法複雜度為o(n);double polynomial_2(int n, double a, doublex)2
下面介紹乙個測試執行時間的函式
clock()函式可以捕捉從程式開始執行到clock()被呼叫時所打下的點數,在要測試的函式前後各放置乙個clock()函式,利用兩個clock()函式即可計算出執行乙個函式所打下的點數,clk_tck(或者是clocks_per_sec)是乙個常量,表示乙個機器時鐘每秒鐘所打下的點數,簡單計算後即可得到測試函式的執行時間,但是因為乙個函式的執行時間是在是太短了,短到時鐘還來不及打下下乙個點函式就執行結束了,所以我們讓被測函式重複迴圈多次執行,即可得到特定次數下的執行時間,被測函式的執行時間的比較就可以實現了。
1下面是主函式,設定了多項式的各項係數void run(double(*f)(int, double*, double), double a, int
case_n)
2
1 #include 2 #include 3 #include 4根據maxk設定不同的值,讓被測函式重複迴圈執行相應的次數,實驗結果如下5clock_t start, stop;
6double duration; //
記錄被測函式執行的時間,以秒為單位
7#define maxn 10 //
多項式最大項數,最大項數加1
8#define maxk 1e4 //
被測函式最大重複呼叫次數910
intmain()
11
由實驗結果可以看出,秦九韶演算法幾乎都比普通演算法快乙個數量級
偽多項式複雜度
上篇的標記演算法中,談到這個o k 的演算法是乙個指數級複雜度的演算法,其實對那道題目本身來說,k是固定的,既然不是輸入,那也無所謂複雜度,之所以有o k 這種說法,是把k當做一種輸入了,這是看待輸入的角度問題,倒不用深究。考慮乙個更簡化的演算法 python 設輸入n是正整數 def f n i ...
演算法 演算法時間複雜度比較
演算法的執行時間通常與下列函式成比例 1 大部分程式的大部分指令之執行一次,或者最多幾次。如果乙個程式的所有指令都具有這樣的性質,我們說這個程式的執行時間是常數。logn 如果乙個程式的執行時間是對數級的,則隨著n的增大程式會漸漸慢下來,如果乙個程式將乙個大的問題分解成一系列更小的問題,每一步都將問...
演算法時間複雜度計算
本部落格主要講解下演算法時間複雜度的基本計算過程。演算法時間複雜度是指演算法中基本操作的執行次數。記為t n o f n t n 為增長比最快項的係數。計算步驟 舉例說明 例1 void funfirst int n step1 基本操作是 j i 2 step2 確定規模,根據迴圈條件,確定規模為...