这个功能的最佳情况是什么?

时间:2015-01-18 20:44:37

标签: java performance max big-o

/* Returns the largest integer in the array */
int CompareToAll(int array[], int n)
{
   int i, j;
   bool isMax;

  /* Make sure that there is at least one element in the array. */
  if (n <= 0)
   return -1;

  for (i = n-1; i > 0; i--) 
  {
    isMax = true;
    for (j = 0; j < n; j++) 
    {
      /* See if any value is greater. */
      if (array[j] > array[i])
      { 
        isMax = false; /* array[i] is not the largest value. */
        break;
      }
    }
      /* If isMax is true, no larger value exists; array[i] is max. */
      if (isMax) break;
   }
  return array[i];
}

我在某处读到了这段代码,它说最好的情况是当max元素位于数组的开头。这是正确的,因为每次与第一个元素进行比较时它都会突破第二个循环,因此进行比较。但是如果最终元素到底是不是仍然是最好的情况呢?因为isMax标志在第一次运行第二次for循环后遍历所有n个元素后才会为真?如果我错了,请纠正我。

1 个答案:

答案 0 :(得分:3)

这段代码有很多错误,很难知道从哪里开始,但是当你把它作为第三方代码呈现并有一个特定的问题时 - 让我们来看看

/* Returns the largest integer in the array */
int CompareToAll(int array[], int n)

那不是Java并且不会编译 - 让我们假设它意味着int CompareToAll(int[] array, int n)

 /* Make sure that there is at least one element in the array. */
 if (n <= 0)
     return -1;

这意味着n是数组的长度,但没有检查n实际上是array的长度。考虑调用CompareToAll(new int[]{}, 100)CompareToAll(null, 100),代码将落入异常循环堆中。

接下来,考虑假设n == array.length的逻辑。我们从最后一个元素向下运行数组iji的每次迭代中从第一个到最后一个运行array[i]。一旦找到大于array[i]的元素,内部循环就会中断,当且仅当array大于n的每个其他成员时,代码才会终止。因此,最佳情况是当max位于数组的第一个位置时的断言是真的,但不完整。如OP建议的那样,最好的情况也是当max元素位于数组的最后位置时,在这种情况下将执行{{1}}检查。

这是非常糟糕的代码和一个并不涵盖每个案例的断言。 OP在评论中建议它来自一本书。除非这是一个检查陈述是否完整的练习,否则我推荐一本新书。