本質複雜度(Essential complexity)是指由於一問題的本質不適合簡單的求解方式,所有可行的求解方式都很複雜的情形。本質複雜度和偶然複雜度不同,後者的複雜度和問題本質無關,和選用求解的工具或方法有關。

本質複雜度至少在1980年代中期已被使用,圖靈獎得主佛瑞德·布魯克斯當時已開始使用本質複雜度及其反義詞偶然複雜度。他也在1995年時在《人月神話》中的沒有銀彈一段中提出他的新論點[1][2][3] [4]

循環複雜度

編輯

若本質複雜度和循環複雜度並用時,本質複雜度有不同的含意。此時的本質複雜度是指一程式持續的將有良好結構的流桯控制指令改為單一敘述後,最後得到的循環複雜度。像if-then-else及while loop等控制結構都視為良好結構,因此不會增加本質複雜度。未限制使用的goto、break及continue指令會增加本質複雜度。

例如,以下的C語言程式片段的本質複雜度為1,因為內層的if指令及for迴圈都可以簡化為單一敘述。

  for(i=0;i<3;i++) {
     if(a[i] == 0) b[i] += 2;
  }

以下的C語言程式片段的本質複雜度大於1,其內容是要找到z陣列中第一個全部為0的列,若找到了,設定i為列編號,若找不到了,設定i為-1

      for(i=0;i<m;i++) {
          for(j=0;j<n;j++) {
              if(z[i][j] != 0) goto non_zero;
          }
          goto found;
  non_zero:
      }
      i = -1;
  found:

相關條目

編輯

參考資料

編輯
  1. ^ Brooks, Fred P. No Silver Bullet - Essence and Accident in Software Engineering. Proceedings of the IFIP Tenth World Computing Conference. 1986: 1069–1076. 
  2. ^ Brooks, IEEE Computer
  3. ^ Brooks, Mythical Man-Month, Silver Bullet Refired
  4. ^ McCabe, Watson. Structured Testing: A Testing Methodology Using the Cyclomatic Complexity Metric Chapter 10: Essential Complexity. 1996. (原始內容存檔於2012-08-28).