小编典典

我对发现直觉的建议是思想实验,如下所示:

首先,认识到m和n是 输入的 两个 不同度量

。它们可能是两个输入流的长度,矩阵边的长度,或同一数据结构的两个不同属性的计数,例如同一图形的边和节点计数,或任何类似的度量。

直觉是big-O用一个简单的函数-称R(m,n)-乘以某个值来表示算法的 真实

运行时间(或其他方面,例如比较计数或所需空间)的界限。任意常数。我们忽略了常数因素,并通过调用运行时间O(R(m,n))来考虑所有以同一R为界的算法。

因此,大O(m + n)表示,对于合适的大m和n,实际运行时间受某个函数R(m,n)= C(m +

n)限制。对于图示例,这表示算法的实际运行时间将受顶点和边的数量之和的倍数限制。

您可以将边界函数看作是3d中具有轴m,n和R(m,n)的图形。或者您可以想到图表:

R(m,n) = m + n

--------------

m= 1 2 3 4

n=1 1 2 3 4

2 3 4 5 6

3 4 5 6 7

4 5 6 7 8

对于R(m,n)= mn,您有

R(m,n) = mn

--------------

m= 1 2 3 4

n=1 1 2 3 4

2 2 4 6 8

3 3 6 9 12

4 4 8 12 16

作为3d图形,第一个函数是一个平面,第二个函数是在几乎所有点上都快得多的增长函数。这意味着,如果m和n足够大,则O(mn)边界最终将比O(m +

n)大(对应于可能更慢的程序),因为常量变得无关紧要了。

以快速增长的成本为例,假设O(m + n)算法在其运行时范围内具有3的额外常数(与上述两种算法相比,在小输入量下它的运行速度可能非常慢):

R(m,n) = 3(m + n)

--------------

m= 1 2 3 4

n=1 3 9 12 15

2 9 12 15 18

3 12 15 18 21

4 15 18 21 24

因此,与上表中的O(mn)相比,O(m + n)的约束似乎受约束的程度要小。但是看一下m = n = 100的情况。此处,在O(m +

n)算法上的界限是3(m + n)=600。但是常数较小的O(mn)算法的界限mn =10000。显然,如果m和n大,则您要第一个。

@Anonymous在本文的初始版本中提出了一个很好的观点,它混淆了big-O和big-Theta。Big-O仅处理被测数量的界限或 上限

。例如,这意味着 每个 O(n)算法也是O(n log n)和O(n ^ 2)。如果实际运行时间受较慢增长的函数限制,则它也受所有较快增长的函数限制。

然而,人们常常说“此算法为O(n)”,而这意味着边界是 紧密的

。也就是说,对于某些常数C,Cn是运行时间的上限,而对于其他常数D(合适的是较大的n),Dn也是下限。这样的严格界限正确地表示为Theta(n),而不是O(n)。Theta(R(m,n))算法的运行时间(大致而言)与R(m,n)成比例。

最后我要补充一点,在许多情况下,您不能忽略常量。文献中存在许多算法,它们比通常使用的算法渐近“快”,但是常数太大,以至于实际问题的规模总是太慢。计算几何有很多例子。基数2排序是另一种。它是Theta(n),但实际上,一个好的快速排序(Theta(n

log n)平均大小)将在大小至少为10 ^ 8的整数数组上胜过它。

2020-07-28

php数组o m n mn,O(m + n)和O(mn)之间的区别?相关推荐

  1. python中定义变量和数组_Python中的线程和全局变量 - 数组和标准变量之间的区别?...

    我目前尝试使用线程编写一个更大的python程序,并遇到了数组不必被声明为全局的问题.Python中的线程和全局变量 - 数组和标准变量之间的区别? import numpy as np import ...

  2. 数组中冒泡排序、直接选择排序、反序排序原理与区别

    冒泡排序 冒泡排序是最常用的排序算法之一,它排序的原理是 比较相邻元素的值,如果满足条件就交换元素值,把较小的元素移动到数组前面,把较大的元素移动到数组后面,因为类似水中气泡往上升的动作,所以称作冒泡 ...

  3. GoLang笔记-数组和切片,本质是就是长度不可变的可变的区别

    数组 Arrays 数组是内置(build-in)类型,是一组同类型数据的集合,它是值类型,通过从0开始的下标索引访问元素值.在初始化后长度是固定的,无法修改其长度.当作为方法的入参传入时将复制一份数 ...

  4. C语言中,当计算字符数组长度时,用sizeof 和strlen 的原理及两者的区别

    字符数组的长度计算:必须以终止符'/0'作为边界,但对字符数组赋值时,有两种方式: 1: 定义时用字符初始化 (1)char chs[7] = {'a', 'c', '0', 'z', '3','d' ...

  5. 每天一道LeetCode-----将单词数组分成多行,每行长度相同,单词之间用空格分隔,要求空格尽量均匀分布

    Text Justification 原题链接Text Justification 将以这个字符串数组重组成几行,每个字符串用空格分隔,要求 每行的长度相同 每行的空格需要均匀分配,且每个单词之间至少 ...

  6. python中序列类型和数组之间的区别_「Python」序列构成的数组

    一.Python 标准库的序列类型分为: 容器序列: 能够存放不同类型数据的序列(list.tuple.collections.deque). 扁平序列: 只能容纳一种类型的数据(str.bytes. ...

  7. c语言sizeof测量字符组长度,C语言中,当计算字符数组长度时,用sizeof 和strlen 的原理及两者的区别...

    1:定义时用字符初始化 (1)char chs[7] = {'a', 'c', '0', 'z', '3','d'}; // 长度为6 上式等价于: (2)char chs[7] = {'a', 'c ...

  8. JavaScript入门→HTML引用JS、变量、表达式操作符、数组Array数组对象、选择结构循环结构、函数、JavaScript与JAVA区别

    插入引用JS 变量 表达式 操作符 数组 选择判断结构 循环结构 函数 JavaScript与JAVA区别 绝学无忧. 唯之与阿,相去几何? 善之与恶,相去何若? 人之所畏,不可不畏. 荒兮其未央哉! ...

  9. c语言字符数组的实际长度,C语言中,当计算字符数组长度时,用sizeof 和strlen 的原理及两者的区别...

    1:定义时用字符初始化 (1)char chs[7] = {'a', 'c', '0', 'z', '3','d'}; // 长度为6 上式等价于: (2)char chs[7] = {'a', 'c ...

最新文章

  1. Docker核心技术之Dockerfile
  2. 【运营】各大电商七夕活动对比
  3. c#如何操作excel文件、Interior.ColorIndex 色彩列表
  4. 统计学习笔记(3)——k近邻法与kd树
  5. 计算机考研考编程,计算机考研面试------编程语言
  6. php fopen 找不着文件,fopen 系统找不到指定路径 PHP文件包含详细讲述(4)
  7. th标签能包裹select吗_电影《八佰》过后,他能摘掉马思纯前男友标签了吗?
  8. keil5ARM编译器改字体大小和颜色的方法
  9. Django实战1-权限管理功能实现-10:用户管理
  10. onvif协议之初探
  11. myeclipse 创建和访问 servlet 项目
  12. 学习笔记:定积分的求解(矩形法)
  13. 【Java实现】南京地铁导航系统的简单实现(一)—— 存储站点信息
  14. java文件写入不覆盖_java写入文件不覆盖写入_Java写入文件–用Java写入文件的4种方法...
  15. 数据挖掘-朴素贝叶斯算法
  16. 【TCP专题】TCP连接断开
  17. 手把手教你如何批量修改视频尺寸
  18. redis哨兵、集群
  19. 编程题 进制转换(Java实现)
  20. 转发和重定向的区别和使用

热门文章

  1. 【计算机网络复习】1.1.2 标准化工作及相关组织
  2. 蓝桥杯 历届试题 小数第n位
  3. Leetcode--287. 寻找重复数
  4. 思科nat配置实例_Cisco ASA 5520(8.2.4)配置企业内网案例
  5. 管理系统 c++图形界面_锁螺母ERP系统,一站式各国语言管理系统
  6. 吴恩达《机器学习》学习笔记六——过拟合与正则化
  7. 吴恩达《机器学习》学习笔记一——初识机器学习
  8. seaborn的一些画图
  9. Linux中的chmod详解
  10. 如何阅读一本书~阅读的层次