以下代碼返回給定數字n的所有素數因子。以下算法的執行時間是多少?
算法背後方法:
迭代數(即> = 2),直到N/I來獲得的素因子。
內部循環簡單地用當前的素數除以它,如果同樣的質數出現一次更會繼續將減少數量的大小。
if語句會添加最後一個& n> 2的最高素數,因爲到那時n已經減少到那個值。
static List<Integer> getAllPrimes(int n){
List<Integer> factors = new ArrayList<Integer>();
for(int i = 2 ; i <= n/i ; ++i){
while(n % i == 0){
factors.add(i); //LINE 1
n/=i;
}
}
if(n > 2){factors.add(n);}
return factors;
}
如何確定此算法的運行時間?由於每當內部循環迭代時,如果它是質數,它會根據索引i減小大小,並帶有一些常數值,如n/2,n/3 ....等等。
這實際上是具有最差的情況下的複雜性爲'O(SQRT(n))的一個數的因式分解標準算法'和最壞的情況是任何質數爲'N'。你可以閱讀這篇文章**(http://www.geeksforgeeks.org/print-all-prime-factors-of-a-given-number/)。 –
您能否請證明在最壞情況下如何使用數學或簡單測試用例來執行sqrt(n)次。我無法弄清楚 –
那麼在最壞的情況下,'n'在內部while循環中不會減少。因此''n'在'for'循環的整個執行過程中保持與初始值相同。如果'n'與初始值相同,則'For'循環需要'O(sqrt(n))'時間。最後在'if(n> 2)'語句中,'n'將被添加到列表中。這種方式在最壞的情況下需要'O(sqrt(n))'。最差情況輸入是質數(以11爲例,並查找for循環運行多少時間)。 –