對高效率素數求解演算法進行時間複雜度分析

2021-08-16 01:49:00 字數 892 閱讀 5708

最近在複習資料結構的內容,特別是如何計算乙個演算法的時間複雜度。

在解習題的過程中找到乙份高效率的素數求解演算法,在這裡分析一下演算法的時間複雜度。

演算法引自:

void getprimes(int n) // 對於輸入的整數n,將所有小於n的素數列印到螢幕上}}

for(int i=2;i!=n;++i) // 第四個迴圈

else}}

delete temp;

}

開始對演算法的時間複雜度進行分析,主要與迴圈語句有關。

對於第乙個迴圈語句,時間複雜度顯而易見為o(n)。

第二個迴圈與第三個迴圈是巢狀的,所以需要分析第三個迴圈內部的語句會計算的次數。

第二個迴圈會使得i從2到(n/2-1)迴圈(n/2-1)次,而內部的迴圈次數k則為(k=n/i)

所以內部的語句運算次數為(n/2 + n/3 + n/4 + ... + n/(n/2-1))=n(1/2+1/3+1/4+...+1/(n/2-1))

(1/2+1/3+1/4+...+1/(n/2-1))為經典的調和數列和,有乙個近似的求和公式,計算之後為(ln(n)+c)

所以第二個和第三個迴圈內的語句的時間複雜度為o(n*ln(n))

第四個迴圈的時間複雜度顯而易見為o(n)。

所以對比之後整個演算法的時間複雜度為o(n*ln(n))。

相比於最簡單的求素數演算法,例如下面這個時間複雜度為o(n^2)的演算法來說,時間複雜度為o(n*ln(n))的演算法的效率是非常高的。

void getprimes(int n) // 對於輸入的整數n,將所有小於n的素數列印到螢幕上

} if (j >= (i + 1) / 2)

else

}}}

經典題目高效率求素數(質數)

我們學習了python的迴圈語句和if分支結構後,就可以做很多是事情了 比如經典的求素數問題。定義 乙個大於1的自然數,只能被1和它自身整除的數。根據定義要想判定乙個大於1的數是不是素數,要整除從2開始到它自身截止在內的所有數根據能不能被整除來判斷。比如求100以內的素數只根據定義我們可以寫成 計數...

判斷數字最高效率的演算法

這是以前csdn上乙個經典的帖子,我當年剛學 net的時候學習的,不知道有沒有朋友有不同意見 q 怎樣判斷是數字?例如 12345 是數字,12345t 不是數字 12345年 不是數字 非常感謝各位,我以前也曾試過用正則式 和 異常法來做 但用的正則式中的另乙個方法,可沒這麼簡單哦 呵榀,這個不錯...

ASP的高效率的分頁演算法

寫程式也這麼長的時間了,對於程式分頁演算法也有所接觸。飄易一般習慣使用的有兩種分頁演算法,一是傳統的ado分頁,二是select top分頁演算法。對於小型資料表,比如一兩萬的資料量的表,我傾向使用ado演算法,對於大型的資料表,則必須採用後者的演算法了。先來說說傳統的ado分頁演算法。這種演算法,...