排序研究前戏_计算复杂性

计算复杂性理论(Computational complexity theory)是理论计算机科学和数学的一个分支,它致力于将可计算问题根据它们本身的复杂性分类,以及将这些类别联系起来。一个可计算问题被认为是一个原则上可以用计算机解决的问题,亦即这个问题可以用一系列机械的数学步骤解决,例如算法。

如果一个问题的求解需要相当多的资源(无论用什么算法),则被认为是难解的。计算复杂性理论通过引入数学计算模型来研究这些问题以及定量计算解决问题所需的资源(时间和空间),从而将资源的确定方法正式化了。其他复杂性测度同样被运用,比如通信量(应用于通信复杂性),电路中门的数量(应用于电路复杂性)以及中央处理器的数量(应用于并行计算)。计算复杂性理论的一个作用就是确定一个能或不能被计算机求解的问题的所具有的实际限制。

在理论计算机科学领域,与此相关的概念有算法分析和可计算性理论。两者之间一个关键的区别是前者致力于分析用一个确定的算法来求解一个问题所需的资源量,而后者则是在更广泛意义上研究用所有可能的算法来解决相同问题。更精确地说,它尝试将问题分成能或不能在现有的适当受限的资源条件下解决这两类。相应地,在现有资源条件下的限制正是区分计算复杂性理论和可计算性理论的一个重要指标:后者关心的是何种问题原则上可以用算法解决。

判定性问题和可计算性

我们考虑对一个算法问题,什么样的回答是我们所需要的。比如搜索问题:给定数组A,和一个数s,我们要问s在不在A中(判定性问题,decision problem)。而进一步的,s如果在A中的话,s的位置是什么(搜索型问题,search problem)。再比如完美匹配问题(perfect matching):给定一个二分图G=(V,E),我们问是不是存在边集E,使得二分图中每个结点恰好属于该边集的一条边(判定型问题)。而进一步的,E存在的话,E具体是什么(搜索型问题)。

自然的,我们会发现对于一般的算法问题A,我们都可以这样来问:首先,解是不是存在的?其次,如果解存在,这个解具体是什么?这就是A的判定型问题和A的搜索型问题(又称函数型问题)区分来源的直观解释。对判定型问题的回答只需是“是”或“否”,而对搜索型问题,需要返回解的具体形式或者“解不存在”。所以一个对A的搜索型问题的算法自然的也是对A的判定型问题的算法。反之,给定了一个A的判定型问题的算法,是否存在A的搜索型问题的算法,在可计算性理论和计算复杂性理论中有着不同的回答,这也是理解计算复杂性理论与它的前身可计算性理论不同的一个基本的观察。

可计算性理论中,可以说明,判定型问题和搜索型问题在可计算性的意义下是等价的(见Decision
problem
)。而在计算复杂性中,Khuller和Vazirani在1990年代证明了在P≠NP的假设下,平面图4-着色问题的判定型问题是在P中的,而寻找其字典序第一的着色是NP难的。[1]

所以在可计算性理论中,只关注判定型问题是合理的。在计算复杂性理论中,虽然一些基本的复杂性类(如P,NP和PSPACE),以及一些基本的问题(P和NP关系问题等)是用判定型问题来定义的,但函数型问题复杂性类也被定义(如FP,FNP等),而且一些特别的函数型问题复杂性类,如TFNP,也正在逐渐受到关注。

算法分析

上面提到计算复杂性理论的研究对象是执行一项计算任务所用的资源,特别的,时间和空间是最重要的两项资源。

我们用时间作例子来讨论算法分析的一些基础知识。如果将输入的长度(设为n)作为变量,而我们关注的是算法运行时间与n的函数关系T(n)。因为一个算法在不同的计算模型上实现时T(n)可能会有常数因子的差别(参见可计算性理论),我们使用大O表达式来表示T(n),这使得我们可以忽略在不同计算模型上实现的常数因子。

以搜索这个计算任务为例。在搜索问题中,给定了一个具体的数s,和长度为n的数组A(数组中数的位置用1到n作标记),任务是当s在A中时,找到s的位置,而s不在A中时,需要报告"未找到"。这时输入的长度即为n+1。下面的过程即是一个最简单的算法:我们依次扫过A中的每个数,并与s进行比较,如果相等即返回当前的位置,如果扫遍所有的数而算法仍未停止,则返回"未找到"。

如果我们假设s在A中每个位置的机率都相同,那么算法在找到s的条件下需要1/n (1+2+...+n)=n(n+1)/2n=(n+1)/2的时间。如果s不在A中,那么需要(n+1)的时间。由大O表达式的知识我们知道算法所需的时间即为O(n)。

而如果我们进一步假设A是已排序的,那么我们有二分查找算法,使得算法的运行时间是O(logn)。可以看出执行一项计算任务,不同的算法在运行时间上是有很大差异的。

时间: 2024-11-15 00:26:17

排序研究前戏_计算复杂性的相关文章

[C/C++标准库]_[初级]_[使用std::sort排序各种类型数据]

std::sort 场景: 1. 在使用sort排序时,有时候需要对对象的某个值进行排序,比如对类对象的某个id的int类型值或者bool类型值,其实bool类型值排序研究了半天.. test_sort.cpp #include <stdlib.h> #include <string.h> #include <string> #include <vector> #include <algorithm> #include <iostream&

排序高级之选择排序_选择排序

选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理如下.首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾.以此类推,直到所有元素均排序完毕. 选择排序的主要优点与数据移动有关.如果某个元素位于正确的最终位置上,则它不会被移动.选择排序每次交换一对元素,它们当中至少有一个将被移到其最终位置上,因此对n个元素的表进行排序总共进行至多n-1次交换.在所有的完全依靠交换去移动元素的排序方

排序高级之交换排序_鸡尾酒排序

鸡尾酒排序,也就是定向冒泡排序, 鸡尾酒搅拌排序, 搅拌排序 (也可以视作选择排序的一种变形), 涟漪排序, 来回排序 or 快乐小时排序, 是冒泡排序的一种变形.此算法与冒泡排序的不同处在于排序时是以双向在序列中进行排序. 与冒泡排序不同的地方: 鸡尾酒排序等于是冒泡排序的轻微变形.不同的地方在于从低到高然后从高到低,而冒泡排序则仅从低到高去比较序列里的每个元素.他可以得到比冒泡排序稍微好一点的效能,原因是冒泡排序只从一个方向进行比对(由低到高),每次循环只移动一个项目. 以序列(2,3,4,

排序高级之交换排序_冒泡排序

冒泡排序(Bubble Sort,台湾另外一种译名为:泡沫排序)是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成.这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端. 冒泡排序对个项目需要O()的比较次数,且可以原地排序.尽管这个算法是最简单了解和实现的排序算法之一,但它对于少数元素之外的数列排序是很没有效率的. 冒泡排序是与插入排序拥有相等的

排序高级之交换排序_奇偶排序

奇偶排序,或奇偶换位排序,或砖排序,是一种相对简单的排序算法,最初发明用于有本地互连的并行计算.这是与冒泡排序特点类似的一种比较排序. 该算法中,通过比较数组中相邻的(奇-偶)位置数字对,如果该奇偶对是错误的顺序(第一个大于第二个),则交换.下一步重复该操作,但针对所有的(偶-奇)位置数字对.如此交替进行下去. 处理器数组的排序 在并行计算排序中,每个处理器对应处理一个值,并仅有与左右邻居的本地互连.所有处理器可同时与邻居进行比较.交换操作,交替以奇-偶.偶-奇的顺序.该算法由Habermann

近十年one-to-one最短路算法研究整理【转】

前言:针对单源最短路算法,目前最经典的思路即标号算法,以Dijkstra算法和Bellman-Ford算法为根本演进了各种优化技术和算法.针对复杂网络,传统的优化思路是在数据结构和双向搜索上做文章,或者针对不必要的循环进行排除.近年来,最短路算法大量应用于需要高及时性的领域,比如GIS领域,也大量应用于网络规模巨大的社会网络分析领域,这使得传统思路并不能很好地解决,于是把最短路算法思路本身抽象成两阶段算法,第一阶段为数据预处理,第二阶段为实时地搜索.这二者是互相矛盾的,如何找到平衡是各种算法技术

物联网RFID安全研究

最经学习了一些物联网RFID的相关安全方案,下面对相关的知识做一个总结. 目录: 0x00 RFID是啥? 0x01 RFID面临的问题 0x02 围观各类RFID安全方案 0x03 最新的研究成果和方向 0x04 参考文献 0x00 RFID是啥? RFID即无线射频识别,是一种广泛用于我们生活当中的通信技术. 怎么个广泛应用法呢?举个例子,门禁系统常见吧?我们知道,门禁系统里通常有两个显而易见的东西,一个是通行卡片,一个是门上的读卡器.只要我们将在卡片在读卡器上刷一下,我们就能合法的通过门禁

蒋介石最终对毛_泽_东的评价【转】

朝鲜战争结束后,蒋介石仰天长叹,对儿子蒋经国及毛人凤等军事将领说:在这个世界上,没有人是毛_泽_东的对手,盟国(美国)说我蒋介石不行,可是他们又怎样呢,我看他们西方国家也是一群蠢猪.他们与中共毛_泽_东比,从哪方面都无法相比!16个国家最精良的军队,竟然被毛_泽_东打的如此狼狈,耻辱啊!毛_泽_东也是中国人的骄傲啊,更是一名奇才.中共有多少能者,我都不放在眼里,唯有毛_泽_东把我挤到这几个小岛上了.盟国也不是毛_泽_东的对手,毛_泽_东打仗是艺术!各方面的领导都是艺术!蒋介石突然把声音提高了八度

排序(一)__综述

一.排序基本概念 1.排序概念 假设含有n个记录的序列为{r1,r2,r3--rn},其相应的关键字分别为{k1,k2--kn},需确定1,2--n的一种排序p1,p2,--pn,使其相应的关键字满足kp1<=kp2<=--kpn非递减(或非递增)关系,即使得序列成为按关键字有序的序列{rp1,rp2--rpn},这样的操作称为排序. 注意:(1)通常将数据元素称为元素.      (2)排序的依据是关键字之间的大小关系.      (3)关键字ki可以是记录r的主关键字,也可以是次关键字,甚