大O符号是算法复杂度的相对表示。它描述了时空复杂度.

大O符号是我在大学里学过的东西之一,我了解过这个算法的概念。我知道的不算多,可以回答一些基本的问题,仅此而已。从大学毕业以后,我对这个算法的了解基本没有改变,因为自从我开始工作以来,我没有使用过它,也没有听到任何同事提到过它。所,我想我应该花点时间回顾一下它,并在这篇文章中总结大O符号的基础知识,以及一些代码示例来帮助解释它。

什么是大O符号?简而言之

  1. 它是算法复杂度的相对表示。

  2. 它描述了一个算法如何执行和缩放。

  3. 它描述了函数增长率的上限,可以考虑最坏的情况。

现在快速看一下语法:O(n2)

n是函数作为输入接收的元素个数。这个例子是说,对于n个输入,它的复杂度等于 n2

共同复杂性的比较

从这个表中可以看出,随着函数复杂度的增加,完成一个函数所需的计算量或时间可能会显著增加。因此,我们希望将这种增长保持在尽可能低的水平,因为如果函数不能很好地伸缩而增加了输入,可能会出现性能问题。

显示操作数量如何随复杂性增加的图表。

一些代码示例应该有助于澄清一些关于复杂性如何影响性能的问题。下面的代码是用Java编写的,但是很明显,它可以用其他语言编写。

O(1)

  return numbers.get(0) == 1;
}

O(1) 表示一个函数,无论输入大小如何,该函数总是取相同的值。

O(n)

public boolean containsNumber(List<Integer> numbers, int comparisonNumber) {
  for(Integer number : numbers) {
    if(number == comparisonNumber) {
      return true;
    }
  }
  return false;
}

O(n)表示一个函数的复杂度,该函数的复杂度与输入的个数成线性正比增长。这是一个很好的例子,说明大O符号如何描述最坏的情况,因为函数在读取第一个元素后返回true,或者在读取所有n个元素后返回false。

O(n2)

public static boolean containsDuplicates(List<String> input) {
  for (int outer = 0; outer < input.size(); outer++) {
    for (int inner = 0; inner < input.size(); inner++) {
      if (outer != inner && input.get(outer).equals(input.get(inner))) {
        return true;
      }
    }
  }
  return false;
}

O(n2)  表示一个函数,其复杂度与输入大小的平方成正比。通过输入添加更多的嵌套迭代将增加复杂性,然后可以用3次总迭代表示O(n3),用4次总迭代表示O(n4) 

public int fibonacci(int number) {
  if (number <= 1) {
    return number;
  } else {
    return fibonacci(number - 1) + fibonacci(number - 2);
  }
}

O(2n) 表示一个函数,其性能对输入中的每个元素都加倍。这个例子是斐波那契数列的递归计算。函数属于O(2n),因为函数对每个输入数递归地调用自身两次,直到该数小于或等于1。

O(log n)

public boolean containsNumber(List<Integer> numbers, int comparisonNumber) {
  int low = 0;
  int high = numbers.size() - 1;
  while (low <= high) {
    int middle = low + (high - low) / 2;
    if (comparisonNumber < numbers.get(middle)) {
      high = middle - 1;
    } else if (comparisonNumber > numbers.get(middle)) {
      low = middle + 1;
    } else {
      return true;
    }
  }
  return false;
}

O(log n)表示一个函数,该函数的复杂度随输入大小的增加呈对数增长。这使得O(log n)函数可以很好地伸缩,这样处理较大的输入就不太可能导致性能问题。上面的示例使用二分查找来检查输入列表是否包含某个数字。简单地说,它在每次迭代中将列表一分为二,直到找到数字或读取最后一个元素。此方法具有与O(n)示例相同的功能,尽管实现完全不同且更难于理解。但是,这样做的回报是更大的输入会带来更好的性能(如表中所示)。

这种实现的缺点是二进制搜索依赖于元素已经处于正确的顺序。如果在遍历元素之前需要对元素进行排序,那么这就增加了一些开销。

关于大O符号还有很多内容要讲,但希望你们现在对大O符号的含义有了一个基本的概念以及如何将它转换成你写的代码。如果有必要,大O符号还有后续要讲,若有不懂,欢迎下方留言关注,我会一一解答。

长按二维码 ▲

订阅「架构师小秘圈」公众号

如有启发,帮我点个在看,谢谢↓

时空复杂度(时间复杂度/空间复杂度)O(1)、O(n)、O(n^2)、O(log n)、O(n log n)是什么意思?...相关推荐

  1. 时空复杂度(时间复杂度/空间复杂度)O(1)、O(n)、O(n^2)、O(log n)、O(n log n)是什么意思,借鉴 然后自己借鉴出来

    附上借鉴的地址:https://blog.csdn.net/lkp1603645756/article/details/85013126 这些都是算法时空复杂度的表示.不仅仅用于表示时间复杂度,也用于 ...

  2. 时空复杂度(时间复杂度/空间复杂度)O(1)、O(n)、O(n^2)、O(log n)、O(n log n)是什么意思

    这些都是算法时空复杂度的表示.不仅仅用于表示时间复杂度,也用于表示空间复杂度.  O后面的括号中有一个函数,指明某个算法的耗时/耗空间与数据增长量之间的关系.其中的n代表输入数据的量. O(1)解析 ...

  3. PHP复杂度,php 算法复杂度 时间复杂度 空间复杂度

    算法复杂度分为时间复杂度和空间复杂度. 其作用: 时间复杂度是指执行算法所需要的计算工作量: 而空间复杂度是指执行这个算法所需要的内存空间. (算法的复杂性体现在运行该算法时的计算机所需资源的多少上, ...

  4. 交换两个变量ab的值PHP,由[交换两个变量的值问题]理解程序的时空复杂度

    由一个编程经典问题,交换两个变量的值入手,理解程序的时空复杂度(以下均使用PHP代码演示问题的解决方法)解决问题的方法一:1.方法文字描述:使用一个中间变量temp,实现两个变量值的互换2.实现的具体 ...

  5. 时空复杂度定义与分析

    时空复杂度定义与分析 时空复杂度 时间复杂度 基本认识 举个例子 空间复杂度 基本认识 单位换算 常见数据类型 一些例子 常数阶 线性阶 对数阶 循环嵌套 立方阶 练练手吧! NOIP2011 铺地毯 ...

  6. 数据结构与算法分析c++第四版_数据结构与算法 - 时空复杂度分析

    这周主要总结了时间复杂度的学习,跟小伙伴们分享下,欢迎指正. 一.为何需要分析算法复杂度 挺多同学本科都学习过数据结构和算法这门课,但是有没有想过这门课到底是解决什么问题?科学家设计这些数据结构和算法 ...

  7. 【数据结构初阶】八大排序算法+时空复杂度

    学会控制自己是人生的必修课 文章目录 一.插入排序 1.直接插入排序 2.希尔排序 二.选择排序 1.直接选择排序 2.堆排序(已经建好堆的基础之上) 三.交换排序(Swap) 1.冒泡排序(大学牲最 ...

  8. 数据结构<1>时空复杂度详解

    文章目录 什么是时间复杂度和空间复杂度 前言(算法效率) 时间复杂度的计算 空间复杂度的计算 oj练习 什么是时间复杂度和空间复杂度 前言(算法效率) 算法效率分析分为两种:第一种是时间效率,第二种是 ...

  9. 时空复杂度之珠心算测验

    时空复杂度之珠心算测验 问题 珠心算是一种通过在脑中模拟算盘变化来完成快速运算的一种计算技术.珠心算训练, 既能够开发智力,又能够为日常生活带来很多便利,因而在很多学校得到普及. 某学校的珠心算老师采 ...

最新文章

  1. 关于无法修改CheckBox样式的解决方案
  2. 在Redhat中添加微软雅黑字体
  3. linux系统下使用xampp 丢失mysql root密码【xampp的初始密码为空】
  4. MOS管的主要参数与重要特性
  5. 滑动窗口限流 java_Spring Boot 的接口限流算法优缺点深度分析
  6. java corba_Java编写CORBA的一个简单例子(CORBA入门)
  7. JQuery - Ajax和Tomcat跨域请求问题解决方法!
  8. 打开android studio项目,为什么我们没有一个文件来打开Android Studio项目?
  9. 剑指offer——面试题45:圆圈中最后剩下的数字(孩子们的游戏)
  10. python爬虫数据存储文本_Python爬虫开发系列之五》数据存储为TXT、JSON格式
  11. POJ1177(扫描线求周长并)
  12. Python与MongoDB的交互
  13. python关于类、self、_init_的应用
  14. win10突然复制粘贴用不了了
  15. Excel表格误删怎么恢复
  16. 【内网安全】——数据库提权姿势
  17. 今日头条面试经验分享
  18. Last Day Of Summer
  19. NXP RT1064学习笔记(六)— RTC
  20. Java学到什么程度才算精通?(2),学海无涯

热门文章

  1. 2018 ICPC 青岛 L. Sub-cycle Graph(生成函数)
  2. bae java_有人在BAE开发过java-tomcat应用吗?数据库老是链接失败
  3. 怎么看电脑电源多少w_电脑电源供电不足会怎么样 电脑电源供电不足坏处介绍【详解】...
  4. linux pipe函数 重定向,I/O重定向和管道——《Unix/Linux编程实践教程》读书笔记(第10章)...
  5. python 路径往上一层_Python常用模块之模块、包介绍和相关语法
  6. 前端性能优化 —— 项目瘦身
  7. Vmware的 管理工具概述
  8. Open***2.4.3 基于用户名密码验证方式(实战)
  9. nginx 负载均衡 重温之火与apache的碰撞
  10. Linux下sh/bash/source/.命令的区别(转)