最近开始转战传统算法分析的研究工作了,重新拾起以前学过的一些内容。

目录

一、概述

二、对常见的Ο和Ω进行分析

2.1 大O表示法

2.2 大Ω表示法

三、P问题,NP问题,NP-hard问题,NPC问题

3.1 P问题和NP问题

3.2 NPC问题和NPH问题

3.3 总结

参考文献:



一、概述

Ο,读音:big-oh;表示上界,小于等于

Ω,读音:big omega、欧米伽;表示下界,大于等于

Θ,读音:theta、西塔;既是上界也是下界,称为确界,等于。

ο,读音:small-oh;表示上界,小于。

ω,读音:small omega;表示下界,大于。

Ο是渐进上界,Ω是渐进下界。Θ需同时满足大Ο和Ω,故称为确界。Ο极其有用,因为它表示了最差性能。

二、对常见的Ο和Ω进行分析

2.1 大O表示法

大O是我们在分析算法复杂度时最常用的一种表示法。

f(x) = O(g(x)) 表示的含义是f(x)以g(x)为上界

当函数的大小只有上界,没有明确下界的时候,则可以使用大O表示法,该渐进描述符一般用于描述算法的 最坏复杂度

f(x) = O(g(x))正式的数学定义:存在正常数c、n、n0,当 n>n0 的时,任意的 f(n) 符合 0 <= f(n) <= c.g(n)。如下图所示

我们在分析各种排序算法时,一般都使用大O来表现算法的性能。当然,我们这里以一个很简单的嵌套循环为例,在分析这种简单算法的复杂度时,我们通常计算其中 关键步骤的执行次数 作为此算法的时间复杂度。

for (int i = 0; i < n; i++) {for (int j = i; j < n; j++) {...        // 关键步骤}}

该算法外层执行了 n 次循环,如果内层也是 n 次循环,我们便可知道该算法时间复杂度为 n^2,但是该算法内层执行的循环次数会随着外层循环的进行依次减少,最大为n。所以,我们便可以确定该算法的时间复杂度有一个上界 n^2,即T(n) = O(n^2)

根据之前的介绍:即双重for循环的最差执行次数为 n^2,也就是O(n^2)。

常见的时间复杂度如图所示:

所耗时间从小到大依次是:

我们可以画一个函数图像清晰的看每个复杂度的时间对比:

2.2 大Ω表示法

大Ω是我们在分析算法复杂度时另外最常用的一种表示法。

f(x) = Ω(g(x)) 表示的含义是f(x)以g(x)为下界

当函数的大小只有下界,没有明确的上界的时候,可以使用大Ω表示法,该渐进描述符一般用与描述算法的 最优复杂度 。

f(n)= Ω(g(n)) 正式的数学定义:存在正常数c、n、n0,当 n > n0 的时,任意的 f(n) 符合 0 <= c.g(n) <= f(n)。如下图所示

从定义中,我们可以看到,大Ω是有一个下确界的,即最小是多少。

Note: 在online算法的竞争性分析中,如果算法A的性能是Ω(k),算法B的性能是Ω(k^2),由于我们要求竞争ratio越小越好,则Ω(k)优于Ω(k^2)。

三、P问题,NP问题,NP-hard问题,NPC问题

先看一下定义:

P问题:
一个问题可以在多项式(O(n^k))的时间复杂度内解决。
NP问题:
一个问题的可以在多项式的时间内被验证
NP-hard问题:
任意NP题都可以在多项式时间内归约为该问题,但该问题本身不一定是NP问题。归约的意思是为了解决问题A,先将问题A归约为另一个问题B,解决问题B同时也间接解决了问题A。
NPC问题:
既是NP问题,也是NP-hard问题。

3.1 P问题和NP问题

P问题的概率很容易理解,如果一个问题可以找到一个能在多项式的时间复杂度里解决它的算法,那么这个问题就属于P问题。P类问题相信不用举太多的例子来说明了,排序问题就是一个P类问题。

而NP问题的理解并不是NotP,NP问题不是非P类问题。NP问题是指可以在多项式的时间里验证一个解的问题,NP问题的另一个定义是,可以在多项式的时间里猜出一个解的问题。而要更好的理解NP问题需要另外举一个例子。大整数因式分解问题-比如有人告诉你数9938550可以分解成两个数的乘积,你不知道到底对不对,但是如果告诉你这两个数是1123和8850,那么很容易就可以用最简单的计算器进行验证。

再举一个最短路径的例子:某顶点出发,沿图的边到达另一顶点所经过的路径中,各边上权值之和最小的一条路径。

如上图,比如告诉你从点0到点5的最短路径是22,要验证的话只需要0->1,加上1->5,13+9=22,时间复杂度是常量O(n),假如从上图的六个点扩大到n个点的话,验证过程所需要的算法时间很杂度也都是O(n)。如果没有告诉你最短路径是多少,要用算法来求解的话,我们可以这样来“猜测”它的解:先求一个总路程不超过 100的方案,假设我们可以依靠极好的运气“猜出”一个路线,使得总长度确实不超过100,那么我们只需要每次猜一条路一共猜n次。接下来我们再找总长度不超过 50 的方案,找不到就将阈值提高到75…… 假设最后找到了总长度为 90 的方案,而找不到总长度小于90的方案。们最终便在多项式时间O(n^k)内“猜”到了这个问题的解是一个长度为 90 的路线。

是否有不是NP问题的问题呢?有。就是对于那些验证解都无法在多项式时间复杂度内完成的问题。比如问:一个图中是否不存在Hamilton回路?从图中的任意一点出发,最终回到起点,路途中经过图中每一个结点当且仅当一次,则成为哈密顿回路。

验证Hamilton回路只需要把给定的路径走一次看是不是只每个结点只经过一次,而验证不存在Hamilton回路则需要把每条路径都走一遍否则不敢说不存在Hamilton回路

之所以要特别的定义NP问题,就在于我们不会去为那些无法在多项式时间复杂度内验证的问题去在多项式的时间复杂度内求它的解,有点拗口,但是多看几遍应该明白,通俗的讲就是对于一个问题告诉你答案让你去验证都需要很长很长时间,可以想象要用算法去求解的话必定需要更长时间。

我们已经知道,所有的P类问题都是NP问题。也就是说,能多项式地解决一个问题,必然能多项式地验证一个问题的解——既然正解都出来了,验证任意给定的解也只需要比较一下就可以了。关键是,人们想知道,是否所有的NP问题都是P类问题,也就是说是否所有可以用多项式时间验证的问题,也可以在多项式时间内求解。我们可以用集合的观点来说明。如果把所有P类问题归为一个集合P中,把所有NP问题划进另一个集合NP中,那么,显然有P属于NP。现在,所有对NP问题的研究都集中在一个问题上,即究竟是否有P=NP?通常所谓的“NP问题”,其实就一句话:证明或推翻P=NP。

说到这里什么是P类问题什么是NP类问题就讲完了。可能有一些人还不是很清楚,再用通俗但不是很严谨的表述来总结一下。
P类问题就是指那些计算机比较容易算出答案的问题。
NP类问题就是指那些已知答案以后计算机可以比较容易地验证答案的问题。

3.2 NPC问题和NPH问题

我们先来看一副集合示意图,这副图反映的是P=NP或P!=NP时候的两个集合的效果,其中就出现了NP-Hard和NPC两个新的概念。要说明为什么目前为止P是否等于NP还没有结论,不得不先弄清楚NPC和NP-Hard。

在引入NPC之前我们先来学习一个概念-归约。简单地说,一个问题A可以归约为问题B的意思是说,可以用问题B的解法解决问题A,或者说,问题A可以“变成”问题B。举个例子,现在有两个问题:求解一个一元一次方程和求解一个一元二次方程。那么我们说,前者可以归约为后者,因为知道怎么样解一个一元二次方程那么一定能解出一元一次方程,因为一元一次方程是一个二次项系数为零的一元二次方程。“问题A可归约为问题B”,那么很容易理解问题B比问题A难,要解决问题B的时间复杂度也就应该大于或等于解决问题A的时间复杂度。而且归约有一项重要的性质:传递性。如果问题A可归约为问题B,问题B可归约为问题C,则问题A一定可归约为问题C,这应该很容易理解吧。现在再来说一下归约的标准概念:如果能找到这样一个变化法则,对任意一个程序A的输入,都能按这个法则变换成程序B的输入,使两程序的输出相同,那么我们说,问题A可归约为问题B.

从归约的定义中我们看到,一个问题归约为另一个问题,时间复杂度增加了,问题的应用范围也增大了。通过对某些问题的不断归约,我们能够不断寻找复杂度更高,但应用范围更广的算法来代替复杂度虽然低,但只能用于很小的一类问题的算法。那么如果把一个NP问题不断地归约上去,那么最后是否有可能找到一个时间复杂度最高,并且能“通吃”所有的NP问题的这样一个超级NP问题?答案居然是肯定的。也就是说,存在这样一个NP问题,所有的NP问题都可以归约成它,并且这种问题不只一个,它有很多个,它是一类问题。这一类问题就是传说中的NPC问题,也就是NP-完全问题。所以NPC问题的定义非常简单。同时满足下面两个条件的问题就是NPC问题。首先,它得是一个NP问题;然后,所有的NP问题都可以归约到它。

既然所有的NP问题都能归约成NPC问题,那么只要任意一个NPC问题找到了一个多项式的算法,那么所有的NP问题都能用这个算法解决了,那么NP也就等于P了。因此,目前NPC问题还没有多项式的有效算法,只能用指数级甚至阶乘级复杂度的算法来解决,那么意思就是如果能够找到一个能用多项式时间复杂度解决的NPC问题就证明了P=NP了

而说到NP-Hard问题。NP-Hard问题是这样一种问题,它满足NPC问题定义的第二条但不一定要满足第一条,就是说所有的NP问题都能归化到它,但它本身并不一定是个NP问题,也就是即使有一天发现了NPC问题的多项式算法,但NP-Hard问题仍然无法用多项式算法解决,因为它不是NP问题,对于答案的验证都很困难。

3.3 总结

  • P问题:多项式时间内可解
  • NP问题:多项式时间内可构造并验证解
  • NPC问题:任何NP问题都可以在多项式时间被归约到此问题,并且可以在多项式时间内构造并验证此问题的解(同时属于NP与NP-hrad)
  • NP-hard问题:任何NP问题都可以在多项式时间被归约到此问题

这意味着,如果NP-hard可以用多项式解决,那么所有NP问题都可以用多项式解决。不过目前还没人找到多项式算法。

文献【6】写的更好。

参考文献:

【1】算法时间复杂度分析

【2】算法分析—大O、大Ω、大θ

【3】NP问题真的很难理解

【4】NP完全理论

【5】如何证明一个问题是NP-Hard或NP-Complete?

【6】什么是P问题、NP问题和NPC问题

算法时间复杂度分析——大O、大Ω、大θ、小o,小ω相关推荐

  1. 算法时间复杂度分析基础

    摘要       本文论述了在算法分析领域一个重要问题--时间复杂度分析的基础内容.本文将首先明确时间复杂度的意义,而后以形式化方式论述其在数学上的定义及相关推导.从而帮助大家从本质上认清这个概念. ...

  2. 随机选择算法时间复杂度分析

    随机选择算法时间复杂度分析 首先提供算法的伪代码: 算法是递归算法 时间复杂度分析思路:计算每一次递归语句所消耗的时间,再求和. 为了分析需要,我们先定义如下的量: 定义状态j:数组长度在[(3/4) ...

  3. python数据结构和算法 时间复杂度分析 乱序单词检测 线性数据结构 栈stack 字符匹配 表达式求值 queue队列 链表 递归 动态规划 排序和搜索 树 图

    python数据结构和算法 参考 本文github 计算机科学是解决问题的研究.计算机科学使用抽象作为表示过程和数据的工具.抽象的数据类型允许程序员通过隐藏数据的细节来管理问题领域的复杂性.Pytho ...

  4. 算法时间复杂度分析专题一(帮助快速解题)

    笔试: 题目告诉数据范围,根据题目的数据范围来考虑用什么解法 c++竞赛:一般时限1~2秒 时间范围内指令操作次数<10^8 不同数据范围下,代码时间复杂度和算法该如何选择: n<=30, ...

  5. 【排序算法时间复杂度分析】递推式

    关于包含递归调用的时间复杂度分析-以归并排序为例子 T(n) = 2*T(n/2)+O(n) T(n/2) 代表一次递归 O(n)代表合并 T(1) = T(1) T(n)/n = T(n/2)/(n ...

  6. Dijkstra算法时间复杂度分析

    文章目录 Dijkstra算法的思路与关键点 Dijkstra算法的时间复杂度 之前一直默认Dijkstra算法时间复杂度为 o(n2)o(n^{2})o(n2),没有思考过具体的时间复杂度,今天把这 ...

  7. 【数据结构学习笔记】算法时间复杂度与同阶无穷大之捉大放小

    常用的时间复杂度比较:(其中O是同阶无穷大的意思) 其实不用刻意去记,直接算就好了,比如O(n)级与O(log2 n)可以通过比较图像看出来,y=x增长明显快于y=log2 x,所以O(n)>O ...

  8. 排序算法时间复杂度分析

    排序算法中比较次数与初始元素序列排序无关的只有选择排序和基数排序,其他的都有关.元素的移动次数与关键字的初始排列次序无关的是:基数排序 元素的比较次数与初始序列无关是:选择排序.折半插入排序 算法的时 ...

  9. JS: 算法时间复杂度分析

    语句频度:设 n 为求解的问题的规模,基本操作(或语句)执行次数总和称为语句频度,记做f(n). 时间复杂度:算法(或程序)中基本操作(或语句)重复执行的次数总和称为时间复杂度,记做T(n),且有T( ...

最新文章

  1. [ACM] hdu 1253 胜利大逃亡 (三维BFS)
  2. 分享几段祖传的 Python 代码,拿来直接使用!
  3. 机器学习神器Scikit-Learn保姆教程!
  4. [资料整理] Decentralized Services Orchestration, Choreography相关的几篇论文
  5. 教你 7 招,迅速提高服务器并发能力!
  6. linux ls模糊查询,linux – 找到和ls的通配符
  7. vue 访问 const 变量_var与let、const的区别
  8. RHEL 6.5 + Oracle 11g安装
  9. 互联网晚报 | 1月26日 星期三 | 春晚正式入驻视频号;小红书合并社区与电商业务;中国电信5G消息正式商用...
  10. python面向对象中的私有属性和私有化方法
  11. 蓝桥杯 ALGO-129 算法训练 特殊的数字四十
  12. mooc上c语言怎么改作业,C语言的编写、运行和修复代码
  13. C#和C++中的float类型
  14. 复合线转权属线lisp_三权发证中使用MAPGIS CASS如何应用复合线 简单、快速生成集体土地所有权权属线 -...
  15. Linux解压缩.tar.bz2
  16. 阻止中文输入时触发input事件
  17. 【洞察】报复性消费并未到来,但户外广告持续向好
  18. 【PC工具】PC好用的迅雷下载版本合集,hash资源下载方法,石皮版迅雷软件去广告优化增强典藏版...
  19. EXCEL 小tips
  20. springboot毕设项目线上跳蚤市场平台iy7e7(java+VUE+Mybatis+Maven+Mysql)

热门文章

  1. 做IT项目经理什么要求?
  2. tailscale自建derper服务器中转,使用自定义端口
  3. RTKlib相对定位源码解析: udstate函数
  4. 《高仿支付宝运动轨迹七日曲线图》
  5. 用python绘制叠加等边三角形_使用turtle库绘制叠加等边三角形
  6. 开源MySQL数据仓库解决方案:Infobright
  7. 申请SSL证书需要多长时间
  8. BGA封装扇出过孔-BGA芯片的布局布线技巧
  9. NotePad++ HexEditor.dll下载地址,32位,64位
  10. 【蓝桥杯】单片机学习(7)——UART串口通信