java - 如何降低这部分代码的复杂性?

标签 java algorithm time-complexity

此代码打印数组“pts”(一次 4 个元素)中存在的元素组合,使得特定数字组合永远不会出现超过一次。例如。如果 1 2 3 4 已经被打印出来,那么它的任何排列都不应该被打印出来。

for (int i = 0; i < pts.length; i++) {
    for (int j = i+1; j < pts.length; j++) {
        for (int k = j+1; k < pts.length; k++) {    
            for (int l = k+1; l < pts.length; l++) {
                System.out.println(""+pts[i]+" "+pts[j]+" "+pts[k]+" "+pts[l]);
            }
        }
    }
}

如果有人可以建议其他方法或可以告诉我如何降低此代码的复杂性。我会很感激

最佳答案

您对此无能为力。输出为 O(n^4)。复杂性在于问题陈述,而不在于此循环的实现。您应该研究为什么要枚举所有集合 (i,j,k,l) 且 i < j < k < l 的原因。

您可以避免在每个循环中引用 pts.length。根据您在循环中所做的事情,编译器不会明显看出 pts 长度没有改变。以下代码只有 1 个对 pts.length 的引用,并且仍然返回所有 i < j < k < l < pts.length 的集合。

for (int l = 0; l < pts.length; l++) {
    for (int k = 0; k < l; k++) {    
        for (int j = 0; j < k; j++) {
            for (int i = 0; i < j; i++) {
                System.out.println(""+i+" "+j+" "+k+" "+l);
            }
        }
    }
}

注意,它改变了生成集的顺序,不知道是否重要。无论如何,这是一个真正的小改进。

关于java - 如何降低这部分代码的复杂性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26325071/

相关文章:

rust - Rust借阅检查器是否在本地或全局分析程序?

java - Spring文件上传内部服务器错误

java - Sun Solaris 服务器证书中的证书链验证程序错误被 ChainVerifier 拒绝

c# - 如何找出一些给定素数最接近 10000 的可能组合?

algorithm - 检查一个数字是否可以写成一些斐波那契数的乘积

algorithm - 以下函数 O(n³) 的时间复杂度如何?

Java map 与后端数据库。哪个更适合速度和关系的多线程?

java - 如何在 Spring Boot 中运行 Autowiring 线程

java - gwt-可视化依赖不起作用?

algorithm - 真随机数发生器