-1

以下 java 代码给出了相当高的圈复杂度。我想找到一种适当减少它的方法。我将如何最好地做到这一点?

需要明确的是,代码根据值是否在两个限制之间来获取值的相应结果。该值本身可以是 -10000 到 +200000 之间的任何整数。问题主要出在“小于或等于”运算符上,这妨碍了库的简单使用。两个限制之间的范围可以不同,我们所说的范围是 10000 秒,一个示例间隔是 [<0...10000....25000...32500...]。范围是相当随意的数字,由业务决定。

您可以假设 LIMIT 值是常量,在类的开头定义。设置的结果值也是如此。将它们从常量更改为其他值是可能的。

有任何想法吗?

private int function getBasedOnInterval(int value){
  int result;
  if(value <= 0){
    result = RESULT1;
  }else if(value <= LIMIT1){
    result = RESULT2;
  }else if(value <= LIMIT2){
    result = RESULT3;
  }else if(value <= LIMIT3){
    result = RESULT4;
  }else if(value <= LIMIT4){
    result = RESULT5;
  }else if(value <= LIMIT5){
    result = RESULT6;
  }else if(value <= LIMIT6){
    result = RESULT7;
  }else if(value <= LIMIT7){
    result = RESULT8;
  }else if(value <= LIMIT8){
    result = RESULT9;
  }else if(value <= LIMIT9){
    result = RESULT10;
  }else if(value <= LIMIT10){
    result = RESULT11;
  }else if(value <= LIMIT11){
    result = RESULT12;
  }else if(value <= LIMIT12){
    result = RESULT13;
  }else if(value <= LIMIT13){
    result = RESULT14;
  }else{
    result = RESULT15;
  }
  return result;
}
4

2 回答 2

2

重构的第一步可能是将所有限制放入数组或列表中,然后对其进行迭代并测试每个限制:

private int function getBasedOnInterval(int value) {
    int result = RESULT15;

    // consider LIMITS as an array containing 0, LIMIT1...LIMIT13
    // consider RESULTS as an array containing RESULT1...RESULT14
    for(int index = 0; index < LIMITS.length; index++) {
        if(value <= LIMITS[index]) {
            result = RESULTS[index];
            breaks;
        }
    }

    return result;
}
于 2013-05-24T06:42:40.687 回答
1

您可能正在寻找BST(二叉搜索树)

来自维基百科;大 O 表示法的时间复杂度:

       | Average  | Worst case
----------------------------------
Space  | O(n)     | O(n)
Search | O(log n) | O(n)
Insert | O(log n) | O(n)
Delete | O(log n) | O(n)

如果您在开始时创建一次 BST 并简单地重复使用它,这将允许您加快搜索速度。如果您要向我们提供有关数据传播的更多信息,则可以使用其他技术进行改进

于 2013-05-24T06:37:32.360 回答