原文地址:https://my.oschina.net/gooke/blog/684026

一下为本人笔记:)


场景:在解决计算机科学领域的问题时,经常有好多个方法都可以,想找到最优的方法,就有了时间复杂度。

时间复杂度

1.基于时间来衡量算法的效率高低。

2.时间:算法执行一个特定输入规模的函数所需要的时间。

案例!:

编写一个函数,找出数组中的最小值。

方法一:只是简单的遍历数组的每一个元素,然后用变量curMin保持当前的最小值。

int CompareSmallestNumber(int array[]) {

  int curMin;

  //把数组的第一个元素赋值给当前最小值

  curMin = array[0];

  /*

   * 遍历数组找出最小值

   */

  for (int x = 1; x < 10; x++) {

    if (array[x] < curMin) {

      curMin = array[x];

    }

  }

  // 返回最小值

  return curMin;

​}

方法二:让数组中的每一个元素和数组中的所有元素对比,如果某个元素小于或等于数组中所有的元素,那么这么元素就是数组中的最小元素。

int CompareToAllNumbers(int array[]) {

  boolean isMin;

  int  min =0 ;

  /*

   * 遍历数组中的每一个元素

   */

  for (int i = 0; i < 10; i++) {

    isMin = true;

    for (int j = 0; j < 10; j++) {

          /*

       * array[i]和数组的其他元素比较

       * 如果array[i]大于数组中的任何一个元素

       * 就说明array[i]不是最小值 

       */

      if (array[i] > array[j]){

        isMin = false;

      }

    }

    //如果是最小元素,保存下该元素并结束外层循环

    if (isMin){

      min =array[i];

      break;

    }

  }

  return min;

}

如何计算呢

“大O”会设法表达出n个输入项被“使用”了多少次。“使用”一词在不同的算法中会有不同的意思,在一个算法中表示“输入项”和一个常量了多少次,而在另外一个算法中可能表示“输入项”被往数据结构中添加了多少次,等等。

先来看方法一:

n(例子中是10)个输入项,每一个输入项仅在和最小值比较的时候被使用了一次。在“大O表示法”(Big-O Notation)中,它被写作O(n),也就是我们熟知的线性时间(linear time)。线性时间意味着,算法运行所需的时间和输入规模成正比。

我们把变量curMin初始化为数组的第一个值,也就是说,“输入项”被使用了一次。所以“大O表示法”应该是O(n+1)才对。实际上,“大O表示法”关心的是当输入规模n趋于无穷大时算法的运行时间。当‘n’趋于无穷大时,常量1就变得微不足道,可以忽略了。

所以,函数CompareSmallestNumber的“大O表示法”是O(n)而不是O(n+1)。

 

再看方法二:

这个算法最坏的情况是怎样的?数组中的最小值是数组的最后一个元素,就是最坏的情况,因为为了找到最小值,它不得不把数组从头到尾遍历一遍。数组中的每一个元素,都要和其他元素(包括自己)比较一次,一共做了100次比较,因为我们的输入规模是10,10x10=100=10²。当输入规模是n时,输入项会被使用n²次。O(n²)。

 

还有一些常见的大O符号,如 O(n²),O(log n),O(n log n)。