代码之家  ›  专栏  ›  技术社区  ›  obizues

foreach循环中嵌套的if语句是否不仅仅是线性增加了计算复杂性?

  •  -1
  • obizues  · 技术社区  · 7 年前

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

    我查了一下发现 15个层次 嵌套的if语句,外部有foreach循环,内部有2个嵌套级别。

    我熟悉大O符号和字典查找的复杂性,相比之下,双for(foreach)循环会变成多项式,从而提高效率,而不是线性增长。

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

    或者问题真的只是另一个foreach中的foreach,而if语句只是一个线性增长,就像一堆case语句的fall through?

    即:仅仅是一个可读性/可维护性问题,而不是一个实际的效率问题?

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

    1 回复  |  直到 7 年前
        1
  •  1
  •   Jae Yang    7 年前

    你可能会看到圈复杂度。由于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)更糟,这会对程序的性能产生负面影响。