数据结构和算法(Golang实现)(10)基础知识-算法复杂度主方法

算法复杂度主方法

有时候,咱们要评估一个算法的复杂度,可是算法被分散为几个递归的子问题,这样评估起来很难,有一个数学公式能够很快地评估出来。算法

1、复杂度主方法

主方法,也能够叫主定理。对于那些用分治法,有递推关系式的算法,能够很快求出其复杂度。segmentfault

定义以下:数组

若是对证实感兴趣的能够翻阅书籍:《算法导论》。若是以为太难思考,能够跳过该节。数据结构

因为主定理的公式十分复杂,因此这里有一种比较简化的版原本计算:并发

2、举例

  1. 二分搜索,每次问题规模减半,只查一个数,递推过程以外的查找复杂度为O(1),递推运算时间公式为:T(n) = T(n/2) + O(1)
  2. 快速排序,每次随机选一个数字做为划分进行排序,每次问题规模减半,递推过程以外的排序复杂度为O(n),递推运算时间递推公式为:T(n) = 2T(n/2) + O(n)

按照简化版的主定理,能够知道:数据结构和算法

二分查找:a = 1,b = 2,d = 0,能够知道a = b^d,因此二分查找的时间复杂度为:O(logn)函数

快速排序:a = 2,b = 2,d = 1,能够知道a = b^d,因此快速排序的时间复杂度为:O(nlogn)spa

强调:并不是全部递推关系式均可应用主定理,可是大部分状况下均可以。code

由于须要较多的数学知识,因此咱们只简单介绍到这里。协程

延伸-计算理论:P和NP问题

在计算机科学中,有一个专门的分支研究问题的可计算性,叫作计算理论。

咱们用计算机算法来解决一个问题,若是一个问题被证实很难计算,或者只能暴力枚举来解决,那么咱们就没必要花大力气去质疑使用的算法是否是错了,为何这么慢,计算怎么久都没出结果,到底有没有更好的算法。

计算机科学把一个待解决的问题分类为:P问题,NP问题,NPC问题,NP-hard问题。

1、P 和 NP 问题

相似于O(1)O(logn)O(n)等复杂度,规模n出如今底数的位置,计算机能在多项式时间解决,咱们称为多项式级的复杂。

相似于O(n!)O(2^n)等复杂度,规模n出如今顶部的位置,计算机能在非多项式时间解决,咱们称为非多项式级的复杂度。

若是一个问题,能够用一个算法在多项式时间内解决,它称为P问题(PPolynominal的缩写,多项式)。

好比求1加到100的总和,它的时间复杂度是O(n),是多项式时间。

然而有些问题,只能用枚举的方式求解,时间复杂度是指数级别,非多项式时间,可是只要有一个解,咱们能在多项式时间验证这个解是对的,这类问题称为NP问题。

也就是说,若是咱们只能靠猜出问题的一个解,而后能够用多项式时间来验证这个解,这些问题都是NP问题。

因此,按照定义,全部的P问题都是NP问题。

计算理论延伸出了图灵机理论,自动机=算法。

有两种自动机,一种是肯定性自动机,机器从一个状态到另一个状态的变化,只有一个分支能够走,而非肯定性自动机,从一个状态到另一个状态,有多个分支能够走。P问题均可以用两种机器来解决,当非肯定性自动机退化就变成了肯定性自动机,而NP问题只能用非肯定性自动机来解决。

自动机对NNP问题的定义:

能够在肯定性自动机以多项式时间解决的问题,称为P问题,能够在多项式时间验证答案的问题称为NP问题。而NP问题是能够在非肯定型自动机以多项式时间解决的问题(NP两字为Non-deterministicPolynomial的缩写,非肯定多项式)。

数学,计算机科学,哲学,三个学科其实交融在一块儿,自动机是一台假想的机器,世界其实也能够认为是一个假想的机器,因此世界能够等于一台自动机吗,你们能够发挥想象力,在之后的日子里慢慢体会,建议购买书籍《计算理论》补习相关知识。

2、NPC 和 NP-hard 问题

存在这样一个NP问题,全部的NP问题均可以约化成它。换句话说,只要解决了这个问题,那么全部的NP问题都解决了。其定义要知足2个条件:

  1. 它得是一个NP问题。
  2. 全部的NP问题均可以约化到它。

这种问题称为NP彻底问题(NPC)。按照这种定义,NP问题要比NPC问题的范围广。

那什么是NP-hard问题,其定义要知足2个条件:

  1. 全部的NP问题均可以约化到它。
  2. 它不是一个NP问题。

也就是说,NP-hard问题更难,你只要解决了NP-hard问题,那么全部的NP问题均可以解决。可是,这个问题自己不是一个NP问题,也就是解不能在多项式时间内被验证。

好比你有一个交际网,每一个人是一个节点,认识的人之间相连。你要经过一个最快、最省钱、最能提高你我的形象、最没有威胁、最不影响你平常生活的方式认识一个萌妹,你怎么证实你认识这个萌妹是最省钱的呢?-来自知乎回答。

咱们一旦发现一个问题是NPC问题,那么咱们很难去准确求出其解,只能暴力枚举,靠猜。

3、总结

各种问题能够用这个图来表示:

"P=NP" 问题的目标,就是想要知道PNP这两个集合是否相等。为了证实两个集合(AB)相等,通常都要证实两个方向:

  1. A包含B
  2. B包含A

咱们已经说过NP包含了P。由于任何一个非肯定性机器,都能被当成一个肯定性的机器来用。你只要不使用它的“超能力”,在每一个分支点只探索一条路径就行。

因此 "P=NP" 就在于P是否也包含了NP。也就是说,若是只使用肯定性计算机,可否在多项式时间以内,解决全部非肯定性计算机能在多项式时间内解决的问题。

系列文章入口

我是陈星星,欢迎阅读我亲自写的 数据结构和算法(Golang实现),文章首发于 阅读更友好的GitBook

相关文章
相关标签/搜索