zoukankan      html  css  js  c++  java
  • 算法的时间复杂度——"大O分析法"(转载)

    原文地址: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)。

  • 相关阅读:
    Apache Spark 2.2.0 中文文档
    Apache Spark 2.2.0 中文文档
    Apache Storm 1.1.0 中文文档 | ApacheCN
    mysql生成随机字符串
    nginx的5个特点
    虚拟机网络配置
    (mapreduce题) 找出有共同好友的 users --好好玩
    activemq-5.15.10 启动不了
    mysql导出 Excel数据字典(全)
    WebStorm 免注册码
  • 原文地址:https://www.cnblogs.com/mogujiang/p/7779545.html
Copyright © 2011-2022 走看看