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

算法的时间复杂度——"大O分析法"(转载)的更多相关文章

  1. 算法的时间复杂度(大O表示法)

    定义:如果一个问题的规模是n,解这一问题的某一算法所需要的时间为T(n),它是n的某一函数 T(n)称为这一算法的“时间复杂性”. 当输入量n逐渐加大时,时间复杂性的极限情形称为算法的“渐近时间复杂性 ...

  2. 习题一初步理解时间复杂度大O表示法案例

    1.如果 a+b+c=1000,且 a^2+b^2=c^2(a,b,c 为自然数),如何求出所有a.b.c可能的组合? 如上:a+b+c=1000, a平方+b平方=c平方  求出所有abc可能的组合 ...

  3. 算法图解之大O表示法

    什么是大O表示法 大O表示法可以告诉我们算法的快慢. 大O比较的是操作数,它指出了算法运行时间的增速. O(n) 括号里的是操作数. 举例 画一个16个格子的网格,下面分别列举几种不同的画法,并用大O ...

  4. 重拾算法之复杂度分析(大O表示法)

    .katex { display: block; text-align: center; white-space: nowrap; } .katex-display > .katex > ...

  5. C#中常用的排序算法的时间复杂度和空间复杂度

    常用的排序算法的时间复杂度和空间复杂度   常用的排序算法的时间复杂度和空间复杂度 排序法 最差时间分析 平均时间复杂度 稳定度 空间复杂度 冒泡排序 O(n2) O(n2) 稳定 O(1) 快速排序 ...

  6. 白话算法:时间复杂度和大O表示法

    转自:https://www.jianshu.com/p/59d09b9cee58 每一个优秀的开发者脑中都有时间概念.他们想给用户更多的时间让用户做他们想做的事情.他们通过最小化时间复杂度来实现这一 ...

  7. 算法时间复杂度、空间复杂度(大O表示法)

    什么是算法? 计算机是人的大脑的延伸,它的存在主要是为了帮助我们解决问题. 而算法在计算机领域中就是为了解决问题而指定的一系列简单的指令集合.不同的算法需要不同的资源,例如:执行时间或消耗内存. 如果 ...

  8. python数据结构与算法学习自修第二天【时间复杂度与大O表示法】

    #!/usr/bin/env python #! _*_ coding:UTF-8 _*_ from Queue import Queue import time que = Queue() time ...

  9. 常见算法的时间复杂度(大O计数法)

    定义 ​ 对于不同的机器环境而言,确切的单位时间是不同的,但是对于算法进行多少个基本操作(即花费多少时间单位)在规模数量级上却是相同的,由此可以忽略机器环境的影响而客观的反应算法的时间效率. 对于算法 ...

随机推荐

  1. 【转】[STL]vector和deque的内存释放(clear)

    vector的clear成员函数可以清除vector中的元素,使其大小减至0.但它却不能减小vector占用的内存. [cpp] view plain copy int main() { vector ...

  2. Laravel with 查询指定的字段(非复制的哦)

    问题: 在with里面指定查询字段,结果是null. 在模型里面指定查询字段,结果是null. 解决办法: 在查询指定字段的时候要顺带着查询关联的外键,例: // user 表 id name // ...

  3. 字蛛webfont 安装及使用方法

    先安装nodejs和git,比如放在D:/nodejs/  文件夹 cmd 进入该文件夹,安装npm install express 安装 npm install font-spider -g 安装  ...

  4. ADF一个EO的事物提交周期

    客户端通过传递键对象调用实体定义的findByPrimaryKey(),获得EO.ADF框架首先检查实体缓存, 如果在实体缓存中没有找到实体,就执行SQL SELECT查询,从数据库读取行.示例如下: ...

  5. linux centos安装nginx1.7.4

    原文转自 jerryhe326:https://www.cnblogs.com/jerrypro/p/7062101.html一.安装准备 首先由于nginx的一些模块依赖一些lib库,所以在安装ng ...

  6. 【nodejs代理服务器一】nodejs http-proxy 开发反向代理服务器,防火墙,过滤常见的web渗透

    事出有因 最近web系统引来了黑客的攻击,经常被扫描,各种漏洞尝试. 分析攻击日志,有几种常见的攻击手段: 上传webshell 远程执行命令漏洞 sql注入 xxs 攻击 试探各种开源框架爆出来的漏 ...

  7. Image Processing and Analysis_8_Edge Detection:Edge and line oriented contour detection State of the art ——2011

    此主要讨论图像处理与分析.虽然计算机视觉部分的有些内容比如特 征提取等也可以归结到图像分析中来,但鉴于它们与计算机视觉的紧密联系,以 及它们的出处,没有把它们纳入到图像处理与分析中来.同样,这里面也有 ...

  8. 【异常】airflow-psutil/_psutil_common.c:9:20: fatal error: Python.h: No such file or directory

    1 异常信息 usr/include/python3.6m -c psutil/_psutil_common.c -o build/temp.linux-x86_64-3.6/psutil/_psut ...

  9. 测试某网站的SMS验证码

    to=18911121211&sms_type=sms_registration&captcha_num=9JCMw4yN5EjI6ISYoNGdwF2YiwiIw5WNwlmb3xm ...

  10. 用js刷剑指offer(矩形覆盖)

    题目描述 我们可以用21的小矩形横着或者竖着去覆盖更大的矩形.请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 牛客网链接 思路 依旧是斐波那契数列 2 * n的大矩形,和n个 ...