演算法的時間複雜度比較,計算多項式的直接法和秦九韶法

2022-03-29 13:37:16 字數 1408 閱讀 6734

1.直接法:

1

double polynomial_1(int n, double a, doublex)2

每次迴圈迭代,pow函式內部都會執行i次乘法,然後一次加法,所以整體的演算法複雜度為o = 1/2 * n ^ 2 + 3/2n,儘管pow函式的實現方法是利用遞迴優化後的,但是演算法複雜度還是達到了o(nlogn)

2.秦九韶法:

1

double polynomial_2(int n, double a, doublex)2

它不斷提取公因式x來減少乘法的運算次數,演算法複雜度為o(n);

下面介紹乙個測試執行時間的函式

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

5clock_t start, stop;

6double duration; //

記錄被測函式執行的時間,以秒為單位

7#define maxn 10 //

多項式最大項數,最大項數加1

8#define maxk 1e4 //

被測函式最大重複呼叫次數910

intmain()

11

根據maxk設定不同的值,讓被測函式重複迴圈執行相應的次數,實驗結果如下

由實驗結果可以看出,秦九韶演算法幾乎都比普通演算法快乙個數量級

偽多項式複雜度

上篇的標記演算法中,談到這個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 確定規模,根據迴圈條件,確定規模為...