以下算法的执行时间是多少?

时间:2017-06-24 15:25:59

标签: java algorithm time-complexity

以下代码返回给定数字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 ......等。

1 个答案:

答案 0 :(得分:3)

在分析这样的算法时,通常有助于澄清您是在寻找最佳案例,平均案例还是最差案例分析,因为答案可能在每种情况下都有所不同。

让我们从最坏情况分析开始。要让这个算法尽可能长时间运行会发生什么?好吧,如果我们永远不会分出任何素数因子,那么外部循环将尽可能多地运行。具体来说,它将运行Θ(√n)次。只有当有问题的数字是素数时才会发生这种情况,因此我们可以说最坏的情况发生在素数输入上,其中运行时间是Θ(√n)。

最好的情况怎么样?好吧,当我对n太大或n对于i来说太小时,这个算法将终止。降低n比增加i要快得多,因为当算术增加时,n几何下降。一个理想的情况是输入尽可能快地下降,如果你提供的输入只有微小的小因子(这些被称为平滑数),就会发生这种情况。在理想情况下,你将获得2的完美幂,并且在这种情况下,算法重复地将n减半,直到它降至1.这是对数行为的标志,因此在最好的情况下运行时是Θ(log n)中。