首页 > 编程知识 正文

时间复杂度计算的例题,各种排序的时间复杂度

时间:2023-05-03 11:06:53 阅读:134595 作者:4868

最近开始转战传统算法分析的研究,重新拾起了一些以前学到的东西。

目录

一.概要

二.分析常见和

2.1大o表示法

2.2大表示法

三. p问题、NP问题、NP-hard问题、NPC问题

3.1P问题和NP问题

3.2 NPC问题和NPH问题

3.3总结

参考文献:

一.概述,读音: big-oh; 代表上界,小于等于

,阅读: big omega,欧米茄; 表示下界,大于等于

,阅读: theta、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,当nn0时,任意f ) n )等于0=f(n )=c.g(n ) n。 如下图所示

我们在分析各种排序算法时,一般采用较大的o来表达算法的性能。 当然,这里以简单的嵌套循环为例。 在分析这种简单算法的复杂度时,通常会计算关键步骤的执行次数作为该算法的时间复杂度。

for(intI=0; i n; I ) for(intj=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问题

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。