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

标签 java algorithm time-complexity

下面的代码返回给定数字 n 的所有质因数。

Approach behind the algorithm:

遍历数字(即 >=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... 等)减小大小。

最佳答案

在分析这样的算法时,弄清楚您是在寻找最佳情况、平均情况还是最坏情况分析通常很有帮助,因为每种情况下的答案可能不同。

让我们从最坏情况分析开始。要使该算法尽可能长时间地运行,必须发生什么?好吧,如果我们从不划分任何质因数,那么外层循环将运行尽可能多的次数。具体来说,它将运行 Θ(√n) 次。只有当所讨论的数字是质数时才会发生这种情况,因此我们可以说最坏的情况发生在质数输入上,其中运行时间为 Θ(√n)。

最好的情况呢?好吧,当 i 对于 n 太大或 n 对于 i 太小时,这个算法将终止。降低 n 比增加 i 快得多,因为 n 呈几何下降,而 i 呈算术增长。一个理想的情况是输入尽可能快地下降,如果您提供的输入只有很小的因子(这些称为平滑数),就会发生这种情况。在理想情况下,您将获得 2 的完美幂,在这种情况下,算法会反复将 n 减半,直到它降至 1。这是对数行为的标志,因此在最佳情况下,运行时间为 Θ(log n).

关于java - 以下算法的执行时间是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44737962/

相关文章:

algorithm - 生成 nCk 个从 0 到 n-1 的数字组合

c++ - 为什么在树中插入顺序元素比在树中插入随机元素需要更多时间?

python - 判断一个字符串是否是回文

java - 带有两个 JSON 对象的 POST 请求

java - 在 Android studio 中使用 Clipdrawable 时提高动画速度?

java - hibernate中的@GenerateValue(strategy = IDENTITY)在部署时不会生成relation(table)

c++ - 解密加密的字符串

java - 错误否则没有

python - while循环的迭代次数随着步长的增加

algorithm - 为什么 O(n log n) 大于 O(n)?