Performance Foreach循环中的嵌套If语句是否增加了计算复杂性,而不仅仅是线性增加?

Performance Foreach循环中的嵌套If语句是否增加了计算复杂性,而不仅仅是线性增加?,performance,nested,time-complexity,big-o,nested-loops,Performance,Nested,Time Complexity,Big O,Nested Loops,我已经开始对我的解决方案运行静态代码分析,并注意到我的团队有一个部分的“代码复杂性”评级超出了图表 我查看了一下,发现嵌套if语句的15层,外部有一个foreach循环,内部有两个嵌套层 我熟悉big O表示法和字典查找的复杂性,与double for(foreach)循环相比,它会导致效率的多项式增加,而不是线性增加 然而,这是否意味着if语句正在导致任何实际的进一步复杂性 或者问题真的只是另一个foreach中的foreach,而if语句只是一个线性增加,就像一堆带有fall-through

我已经开始对我的解决方案运行静态代码分析,并注意到我的团队有一个部分的“代码复杂性”评级超出了图表

我查看了一下,发现嵌套if语句的15层,外部有一个foreach循环,内部有两个嵌套层

我熟悉big O表示法和字典查找的复杂性,与double for(foreach)循环相比,它会导致效率的多项式增加,而不是线性增加

然而,这是否意味着if语句正在导致任何实际的进一步复杂性

或者问题真的只是另一个foreach中的foreach,而if语句只是一个线性增加,就像一堆带有fall-through的case语句一样

IE:只是可读性/可维护性问题多于实际效率问题


我意识到这是一个迹象,表明可能有更好的算法来处理这里正在做的事情,但我正在寻找一个数学上的理解,从foreach语句中的if语句(如果有)中了解效率低下的原因。

您可能在看圈复杂度。由于if语句的数量,您的代码可以使用大量的路径。想象一棵树的根向下延伸,每个if语句都是根的分裂,它们在不同的方向上分支

将有许多单独的根路径

圈复杂度是一种软件度量,用于表示程序的复杂度。它是通过程序源代码的线性独立路径数量的定量度量

减少圈复杂度的一种方法是尽可能消除唯一路径的数量

嵌套的IF语句可能会增加时间复杂性

首先,嵌套for循环将导致O(N^2)的时间复杂性。这实际上取决于if语句的性质。如果If语句是O(1),比如检查变量是否等于int,那么它对运行时几乎没有影响

for(Object1: Array1){
    for(Object2: Array2){
        if(Object1.number == 20){
            if(Object2.number = 10){
                ...
            }
        }
    }
}
O(N^2) Time Complexity
但是,如果这些if语句在集合上迭代以查找匹配项,则会为每个集合迭代增加额外的O(N)复杂性层

for(Object1: Array1){
    for(Object2: Array2){
        if(Array3.contains(Object1)){
            if(Array4.contains(Object2)){
                ...
            }
        }
    }
}
O(N^4) or more Time Complexity
了解每个if语句的时间复杂度是很重要的。甚至可能每个if语句都比O(N)差,这会对程序的性能产生负面影响