计算复杂性

现代理论计算机科学分支

计算复杂性理论是理论计算机科学的分支学科,使用数学方法对计算中所需的各种资源的耗费作定量的分析,并研究各类问题之间在计算复杂程度上的相互关系和基本性质,是算法分析的理论基础。

简介
我们当然不可能也不必要就一个个具体问题去研究它的计算复杂性,而是依据进行计算的难度去研究各种计算问题之间的联系,按复杂性把问题分成不同的类:
常见的时间复杂度按数量级递增排列依次为:常数 O(1)、对数阶 O(logn)、线性阶 O(n)、线性对数阶 O(nlogn)、平方阶 O(n2)、立方阶 O(n3)、…、k 次方阶 O(nk)、指数阶 O(2n)。显然,时间复杂度为指数阶 O(2n) 的算法效率极低,当 n 值稍大时就无法应用。
类似于时间复杂度的讨论,一个算法的空间复杂度 (Space Complexity) S(n) 定义为该算法所耗费的存储空间,它也是问题规模 n 的函数。渐近空间复杂度也常常简称为空间复杂度。算法的时间复杂度和空间复杂度均称为算法的复杂度。
注:为了表达的方便,计算机上的复杂度分析中使用的对数函数 log(n) 一般指取以 2 为底的对数
发展
现代理论计算机科学中最重要的分支之一,它研究各种问题类在计算时所需要耗费的时间、空间等资源的多少,是可计算性理论的新发展。
可计算性
什么样的问题类是可计算的?这是数学、数理逻辑学和早期计算机科学所关心的一个重要问题。为了回答这个问题,可以给出一个计算的模型,然后规定,凡是这个模型能计算的问题类就叫作可计算的,否则就叫作不可计算的。于是产生了各种计算的模型:图灵机、递归函数、λ 演算、马尔可夫算法和递归算法等。但是,会不会有一类问题,在一个模型中是可计算的,而在另一个模型中却是不可计算的呢?如果这样,一个问题类的可计算性就依赖于模型,而不是问题类本身的性质了。著名的丘奇-图灵论题回答了这个问题。这个论题说:“凡是合理的计算模型都是等价的,即一个模型能算的问题类别的模型也能算,一个模型不能算的别的模型也不能算。”这个论题不是一个严格的命题,无法给于一般的证明,但可以对一个个具体的模型去验证它的正确性。但是,对于一个问题类,只知道它能否计算还很不够,更有实际意义的是要知道计算起来要耗费多少时间,要用多大的空间来存储计算的中间结果等等。为了回答这些进一步的问题,就产生了计算复杂性理论
资源计算时间、存储大小都称为资源。严格地讲,每一种资源的定义都依赖于特定的计算模型。对各种计算模型,资源的定义虽不一样,但主要的可分为三类:
① 串行时间(简称时间):它是计算过程中的总运算量,即把计算分成一些原始的步骤,完成这些步骤所需要的总时间。
② 空间:它是为了保存中间结果所需要的存储器的大小。例如在计算时用一块黑板来打草稿,每一单位面积假定可以写一个符号,不用了还可以擦掉。在计算时所需黑板面积就是空间。
③ 并行时间:它是并行计算所需要的时间,亦即如果多人或多处理机协同计算,解决一个问题所需要的时间。
度量
和可计算性一样,复杂性总是对于一个特定的问题类来讨论的,它包括无穷多个个别问题,有大有小。例如,对矩阵乘法这样一个问题类,相对地说,100 阶矩阵相乘是个大问题,而二阶矩阵相乘就是个小问题。可以把矩阵的阶 n 作为衡量问题大小的尺度。又如在图论问题中,可以把图的顶点数 n 作为衡量问题大小的尺度。一个个别问题在计算之前,总要用某种方式加以编码,这个编码的长度 n 就是衡量问题大小的尺度。当给定一个算法以后,计算大小为 n。的问题所需要的时间、空间等就可以表示为 n 的函数。这个函数就可作为该算法的时间或空间复杂性的度量。严格地讲,是这个特定的问题类在某一特定计算模型中某一特定算法的复杂性之度量。当要解决的问题越来越大时,时间、空间等资源耗费将以什么样的速率增长,即当 n 趋向于无穷大时,这个函数的性状如何,增长的阶是什么,这就是计算复杂性理论所要研究的主要问题。
上界和下界
在计算同一个问题类时,算法有好坏之别。例如,要确定一个具有n个顶点的无向图中有没有回路,以前最好的算法所需工作空间为 S(n)=O(log(2n)) (S(n)=O(f(n)) 的意思是当 n 充分大时,S(n) 不超过 f(n) 的一个正的常数倍)。但是最新的算法只需要 O(logn) 的工作空间就够了。这说明,O(log(2n)) 只是原来那个算法的复杂性,而并非这个回路问题的内在复杂性。或者说 O(log2n) 是回路问题空间复杂性的一个上界,而 O(logn) 则是一个更好的上界。对于回路问题来说,还可以证明,任何算法都至少需要正比于 logn 的工作空间。也即对于任何算法,空间复杂性 S(n)=Ω(logn)(S(n)=Ω(f(n)) 的意思是当 n 充分大时 S(n) 不小于 ƒ(n) 的一个正的常数倍)。因此可以认为 Ω(logn) 是回路问题空间复杂性的一个下界。一个问题类的内在复杂性介于最小的上界和最大的下界之间。在这个例子中两者重合了,因此可以说回路问题的空间复杂性正比于 logn,记为 S(n)=Θ(logn)。又如,两个 n 位二进整数的乘法在一个适当的模型之下,总运算量(时间)为 O(n2),对算法略加改进可以达到 O(n1.5),现在最好算法的时间只需 O(n·logn·loglogn)。如果进一步采用存储修改机器做模型,则时间可以进一步缩短到 O(n)。可见一个问题的复杂性是依赖于所选择的模型的。
相似性原理
如上所述,一个问题类的时间、空间等资源的复杂性是依赖于模型的:在有的模型中较高,在另一些模型中则较低。现在较为重要而有特色的计算模型有:多带图灵机器、多变址随机存取机器、存储修改机器、齐一线路、向量机器、硬件修改机器等等。这样一来,复杂性的问题仍然没有一个统一的客观依据。相似性原理解答了这个问题。按此原理,一个问题类内在的并行时间、空间和串行时间的复杂性在所有理想的计算模型中都没有本质的差异。用数学的说法,各种模型可以互相模拟,而且模拟者需用的并行时间、空间和串行时间都分别不超过被模拟者所需的并行时间、空间和串行时间的一个多项式,三者同时成立。所以在只差一个多项式的范围内,复杂性的确是一个不依赖于模型的客观实在。这是丘奇-图灵论题在复杂性理论中的新发展。对于上面提到的计算模型,相似性原理已被证明是正确的。
巡回和周相
在上面提到的模型中,有的是串行模型,有的则是并行模型。如前所述,并行模型的串行时间相当于计算过程中的总运算量。至于串行模型的并行时间,可以认为它是一个叫作巡回的量。简而言之,巡回是计算过程中周相的总数。而周相则是计算过程中的一个阶段,在此阶段内写入工作空间的信息不会在同一阶段中读出。由此可见,串行模型的巡回相应于并行模型的并行时间。对于一个问题类而言,存在一个高速并行算法的充要条件是可以找到一个具有小的巡回数的串行算法。
对偶性原理
并行时间和空间之间还呈现出某种对称的性质,这就是对偶性原理。例如可以证明,对于一个问题类而言,存在一个节省并行时间的算法的充要条件是存在一个节省工作空间的算法。因此在这个意义下并行时间和空间是可以互相转换的。 
复杂性
平均复杂性和最坏情况复杂性
对于大小都为 n 的不同问题,一个算法所需用的时间、空间等资源也可能不相同。那么如何定义它的复杂性?一种方法是考虑最不利的情况,例如,把大小为 n 的各问题中花费的最长时间作为时间的复杂性。另一种方法是对所有可能情况按某种分布取平均值,这就是平均复杂性。显然,它不高于最坏情况复杂性。由于平均复杂性依赖于问题的分布,难于作数学的处理,所以常用的是最坏情况复杂性。
代数复杂性
相似性原理所涉及的模型主要研究计算中按位运算的总量时间,按位计的中间结果存储量空间和计算的深度(并行时间)等等,所以可称为按位的复杂性。代数的复杂性理论则研究在一个代数系统中(例如实数域中)从给定变量出发去计算某些函数所需要的代数运算(例如加法、乘法)代数判断(例如大于或等于)的次数(时间),所需中间变元的个数(空间),计算的深度(并行时间)等等。在实际运算中,既不能给出一个无限长的实数,也不能在一个单位时间内完成两个实数的乘法。真正的算术运算都是通过近似小数的按位运算得出来的。所以按位的复杂性具有更为基本的意义。通过下面的例子,可以得到关于代数复杂性的一些感性认识。
通常,两个 n 阶矩阵相乘要做 n3 次乘法。1969 年,Volker Strassen 找到了一个算法,只需做 O(nlog7) 次乘法。至 1981 年,又改进为。D.科普尔史密斯和S.维诺格拉特还证明:最好的算法不存在,也就是说这个上界可以永远改进下去。
全国各地天气预报查询

上海市

  • 市辖区
  • 云南省

  • 临沧市
  • 云南省

  • 丽江市
  • 云南省

  • 保山市
  • 云南省

  • 大理白族自治州
  • 云南省

  • 德宏傣族景颇族自治州
  • 云南省

  • 怒江傈僳族自治州
  • 云南省

  • 文山壮族苗族自治州
  • 云南省

  • 昆明市
  • 云南省

  • 昭通市
  • 云南省

  • 普洱市
  • 云南省

  • 曲靖市
  • 云南省

  • 楚雄彝族自治州
  • 云南省

  • 玉溪市
  • 云南省

  • 红河哈尼族彝族自治州
  • 云南省

  • 西双版纳傣族自治州
  • 云南省

  • 迪庆藏族自治州
  • 内蒙古自治区

  • 乌兰察布市
  • 内蒙古自治区

  • 乌海市
  • 内蒙古自治区

  • 兴安盟
  • 内蒙古自治区

  • 包头市
  • 内蒙古自治区

  • 呼伦贝尔市
  • 内蒙古自治区

  • 呼和浩特市
  • 内蒙古自治区

  • 巴彦淖尔市
  • 内蒙古自治区

  • 赤峰市
  • 内蒙古自治区

  • 通辽市
  • 内蒙古自治区

  • 鄂尔多斯市
  • 内蒙古自治区

  • 锡林郭勒盟
  • 内蒙古自治区

  • 阿拉善盟
  • 北京市

  • 市辖区
  • 吉林省

  • 吉林市
  • 吉林省

  • 四平市
  • 吉林省

  • 延边朝鲜族自治州
  • 吉林省

  • 松原市
  • 吉林省

  • 白城市
  • 吉林省

  • 白山市
  • 吉林省

  • 辽源市
  • 吉林省

  • 通化市
  • 吉林省

  • 长春市
  • 四川省

  • 乐山市
  • 四川省

  • 内江市
  • 四川省

  • 凉山彝族自治州
  • 四川省

  • 南充市
  • 四川省

  • 宜宾市
  • 四川省

  • 巴中市
  • 四川省

  • 广元市
  • 四川省

  • 广安市
  • 四川省

  • 德阳市
  • 四川省

  • 成都市
  • 四川省

  • 攀枝花市
  • 四川省

  • 泸州市
  • 四川省

  • 甘孜藏族自治州
  • 四川省

  • 眉山市
  • 四川省

  • 绵阳市
  • 四川省

  • 自贡市
  • 四川省

  • 资阳市
  • 四川省

  • 达州市
  • 四川省

  • 遂宁市
  • 四川省

  • 阿坝藏族羌族自治州
  • 四川省

  • 雅安市
  • 天津市

  • 市辖区
  • 宁夏回族自治区

  • 中卫市
  • 宁夏回族自治区

  • 吴忠市
  • 宁夏回族自治区

  • 固原市
  • 宁夏回族自治区

  • 石嘴山市
  • 宁夏回族自治区

  • 银川市
  • 安徽省

  • 亳州市
  • 安徽省

  • 六安市
  • 安徽省

  • 合肥市
  • 安徽省

  • 安庆市
  • 安徽省

  • 宣城市
  • 安徽省

  • 宿州市
  • 安徽省

  • 池州市
  • 安徽省

  • 淮北市
  • 安徽省

  • 淮南市
  • 安徽省

  • 滁州市
  • 安徽省

  • 芜湖市
  • 安徽省

  • 蚌埠市
  • 安徽省

  • 铜陵市
  • 安徽省

  • 阜阳市
  • 安徽省

  • 马鞍山市
  • 安徽省

  • 黄山市
  • 山东省

  • 东营市
  • 山东省

  • 临沂市
  • 山东省

  • 威海市
  • 山东省

  • 德州市
  • 山东省

  • 日照市
  • 山东省

  • 枣庄市
  • 山东省

  • 泰安市
  • 山东省

  • 济南市
  • 山东省

  • 济宁市
  • 山东省

  • 淄博市
  • 山东省

  • 滨州市
  • 山东省

  • 潍坊市
  • 山东省

  • 烟台市
  • 山东省

  • 聊城市
  • 山东省

  • 菏泽市
  • 山东省

  • 青岛市
  • 山西省

  • 临汾市
  • 山西省

  • 吕梁市
  • 山西省

  • 大同市
  • 山西省

  • 太原市
  • 山西省

  • 忻州市
  • 山西省

  • 晋中市
  • 山西省

  • 晋城市
  • 山西省

  • 朔州市
  • 山西省

  • 运城市
  • 山西省

  • 长治市
  • 山西省

  • 阳泉市
  • 广东省

  • 东莞市
  • 广东省

  • 中山市
  • 广东省

  • 云浮市
  • 广东省

  • 佛山市
  • 广东省

  • 广州市
  • 广东省

  • 惠州市
  • 广东省

  • 揭阳市
  • 广东省

  • 梅州市
  • 广东省

  • 汕头市
  • 广东省

  • 汕尾市
  • 广东省

  • 江门市
  • 广东省

  • 河源市
  • 广东省

  • 深圳市
  • 广东省

  • 清远市
  • 广东省

  • 湛江市
  • 广东省

  • 潮州市
  • 广东省

  • 珠海市
  • 广东省

  • 肇庆市
  • 广东省

  • 茂名市
  • 广东省

  • 阳江市
  • 广东省

  • 韶关市
  • 广西壮族自治区

  • 北海市
  • 广西壮族自治区

  • 南宁市
  • 广西壮族自治区

  • 崇左市
  • 广西壮族自治区

  • 来宾市
  • 广西壮族自治区

  • 柳州市
  • 广西壮族自治区

  • 桂林市
  • 广西壮族自治区

  • 梧州市
  • 广西壮族自治区

  • 河池市
  • 广西壮族自治区

  • 玉林市
  • 广西壮族自治区

  • 百色市
  • 广西壮族自治区

  • 贵港市
  • 广西壮族自治区

  • 贺州市
  • 广西壮族自治区

  • 钦州市
  • 广西壮族自治区

  • 防城港市
  • 新疆维吾尔自治区

  • 乌鲁木齐市
  • 新疆维吾尔自治区

  • 伊犁哈萨克自治州
  • 新疆维吾尔自治区

  • 克孜勒苏柯尔克孜自治州
  • 新疆维吾尔自治区

  • 克拉玛依市
  • 新疆维吾尔自治区

  • 博尔塔拉蒙古自治州
  • 新疆维吾尔自治区

  • 吐鲁番市
  • 新疆维吾尔自治区

  • 和田地区
  • 新疆维吾尔自治区

  • 哈密市
  • 新疆维吾尔自治区

  • 喀什地区
  • 新疆维吾尔自治区

  • 塔城地区
  • 新疆维吾尔自治区

  • 巴音郭楞蒙古自治州
  • 新疆维吾尔自治区

  • 昌吉回族自治州
  • 新疆维吾尔自治区

  • 自治区直辖县级行政区划
  • 新疆维吾尔自治区

  • 阿克苏地区
  • 新疆维吾尔自治区

  • 阿勒泰地区
  • 江苏省

  • 南京市
  • 江苏省

  • 南通市
  • 江苏省

  • 宿迁市
  • 江苏省

  • 常州市
  • 江苏省

  • 徐州市
  • 江苏省

  • 扬州市
  • 江苏省

  • 无锡市
  • 江苏省

  • 泰州市
  • 江苏省

  • 淮安市
  • 江苏省

  • 盐城市
  • 江苏省

  • 苏州市
  • 江苏省

  • 连云港市
  • 江苏省

  • 镇江市
  • 江西省

  • 上饶市
  • 江西省

  • 九江市
  • 江西省

  • 南昌市
  • 江西省

  • 吉安市
  • 江西省

  • 宜春市
  • 江西省

  • 抚州市
  • 江西省

  • 新余市
  • 江西省

  • 景德镇市
  • 江西省

  • 萍乡市
  • 江西省

  • 赣州市
  • 江西省

  • 鹰潭市
  • 河北省

  • 保定市
  • 河北省

  • 唐山市
  • 河北省

  • 廊坊市
  • 河北省

  • 张家口市
  • 河北省

  • 承德市
  • 河北省

  • 沧州市
  • 河北省

  • 石家庄市
  • 河北省

  • 秦皇岛市
  • 河北省

  • 衡水市
  • 河北省

  • 邢台市
  • 河北省

  • 邯郸市
  • 河南省

  • 三门峡市
  • 河南省

  • 信阳市
  • 河南省

  • 南阳市
  • 河南省

  • 周口市
  • 河南省

  • 商丘市
  • 河南省

  • 安阳市
  • 河南省

  • 平顶山市
  • 河南省

  • 开封市
  • 河南省

  • 新乡市
  • 河南省

  • 洛阳市
  • 河南省

  • 漯河市
  • 河南省

  • 濮阳市
  • 河南省

  • 焦作市
  • 河南省

  • 省直辖县级行政区划
  • 河南省

  • 许昌市
  • 河南省

  • 郑州市
  • 河南省

  • 驻马店市
  • 河南省

  • 鹤壁市
  • 浙江省

  • 丽水市
  • 浙江省

  • 台州市
  • 浙江省

  • 嘉兴市
  • 浙江省

  • 宁波市
  • 浙江省

  • 杭州市
  • 浙江省

  • 温州市
  • 浙江省

  • 湖州市
  • 浙江省

  • 绍兴市
  • 浙江省

  • 舟山市
  • 浙江省

  • 衢州市
  • 浙江省

  • 金华市
  • 海南省

  • 三亚市
  • 海南省

  • 三沙市
  • 海南省

  • 儋州市
  • 海南省

  • 海口市
  • 海南省

  • 省直辖县级行政区划
  • 湖北省

  • 十堰市
  • 湖北省

  • 咸宁市
  • 湖北省

  • 孝感市
  • 湖北省

  • 宜昌市
  • 湖北省

  • 恩施土家族苗族自治州
  • 湖北省

  • 武汉市
  • 湖北省

  • 省直辖县级行政区划
  • 湖北省

  • 荆州市
  • 湖北省

  • 荆门市
  • 湖北省

  • 襄阳市
  • 湖北省

  • 鄂州市
  • 湖北省

  • 随州市
  • 湖北省

  • 黄冈市
  • 湖北省

  • 黄石市
  • 湖南省

  • 娄底市
  • 湖南省

  • 岳阳市
  • 湖南省

  • 常德市
  • 湖南省

  • 张家界市
  • 湖南省

  • 怀化市
  • 湖南省

  • 株洲市
  • 湖南省

  • 永州市
  • 湖南省

  • 湘潭市
  • 湖南省

  • 湘西土家族苗族自治州
  • 湖南省

  • 益阳市
  • 湖南省

  • 衡阳市
  • 湖南省

  • 邵阳市
  • 湖南省

  • 郴州市
  • 湖南省

  • 长沙市
  • 甘肃省

  • 临夏回族自治州
  • 甘肃省

  • 兰州市
  • 甘肃省

  • 嘉峪关市
  • 甘肃省

  • 天水市
  • 甘肃省

  • 定西市
  • 甘肃省

  • 平凉市
  • 甘肃省

  • 庆阳市
  • 甘肃省

  • 张掖市
  • 甘肃省

  • 武威市
  • 甘肃省

  • 甘南藏族自治州
  • 甘肃省

  • 白银市
  • 甘肃省

  • 酒泉市
  • 甘肃省

  • 金昌市
  • 甘肃省

  • 陇南市
  • 福建省

  • 三明市
  • 福建省

  • 南平市
  • 福建省

  • 厦门市
  • 福建省

  • 宁德市
  • 福建省

  • 泉州市
  • 福建省

  • 漳州市
  • 福建省

  • 福州市
  • 福建省

  • 莆田市
  • 福建省

  • 龙岩市
  • 西藏自治区

  • 山南市
  • 西藏自治区

  • 拉萨市
  • 西藏自治区

  • 日喀则市
  • 西藏自治区

  • 昌都市
  • 西藏自治区

  • 林芝市
  • 西藏自治区

  • 那曲市
  • 西藏自治区

  • 阿里地区
  • 贵州省

  • 六盘水市
  • 贵州省

  • 安顺市
  • 贵州省

  • 毕节市
  • 贵州省

  • 贵阳市
  • 贵州省

  • 遵义市
  • 贵州省

  • 铜仁市
  • 贵州省

  • 黔东南苗族侗族自治州
  • 贵州省

  • 黔南布依族苗族自治州
  • 贵州省

  • 黔西南布依族苗族自治州
  • 辽宁省

  • 丹东市
  • 辽宁省

  • 大连市
  • 辽宁省

  • 抚顺市
  • 辽宁省

  • 朝阳市
  • 辽宁省

  • 本溪市
  • 辽宁省

  • 沈阳市
  • 辽宁省

  • 盘锦市
  • 辽宁省

  • 营口市
  • 辽宁省

  • 葫芦岛市
  • 辽宁省

  • 辽阳市
  • 辽宁省

  • 铁岭市
  • 辽宁省

  • 锦州市
  • 辽宁省

  • 阜新市
  • 辽宁省

  • 鞍山市
  • 重庆市

  • 重庆市

  • 市辖区
  • 陕西省

  • 咸阳市
  • 陕西省

  • 商洛市
  • 陕西省

  • 安康市
  • 陕西省

  • 宝鸡市
  • 陕西省

  • 延安市
  • 陕西省

  • 榆林市
  • 陕西省

  • 汉中市
  • 陕西省

  • 渭南市
  • 陕西省

  • 西安市
  • 陕西省

  • 铜川市
  • 青海省

  • 果洛藏族自治州
  • 青海省

  • 海东市
  • 青海省

  • 海北藏族自治州
  • 青海省

  • 海南藏族自治州
  • 青海省

  • 海西蒙古族藏族自治州
  • 青海省

  • 玉树藏族自治州
  • 青海省

  • 西宁市
  • 青海省

  • 黄南藏族自治州
  • 黑龙江省

  • 七台河市
  • 黑龙江省

  • 伊春市
  • 黑龙江省

  • 佳木斯市
  • 黑龙江省

  • 双鸭山市
  • 黑龙江省

  • 哈尔滨市
  • 黑龙江省

  • 大兴安岭地区
  • 黑龙江省

  • 大庆市
  • 黑龙江省

  • 牡丹江市
  • 黑龙江省

  • 绥化市
  • 黑龙江省

  • 鸡西市
  • 黑龙江省

  • 鹤岗市
  • 黑龙江省

  • 黑河市
  • 黑龙江省

  • 齐齐哈尔市