14分钟阅读

可计算性理论与复杂性的介绍

在谷歌,埃克森和大师的经验's in CS, Mehmet'S Deep Expertise为他提供了一个全堆叠的JavaScript开发人员。
阅读 西班牙语es. 本文的版本翻译 Marisela Ordaz.

你有没有想过:你正在阅读这篇文章的设备究竟是什么?电脑是什么?

在这些现代计算设备甚至想象之前,计算科学日期返回到较长的时间。在一个行业中,常见问题围绕编程语言,框架和图书馆旋转,我们经常被视为理所当然的基本概念,使计算机勾选。

但这些计算机似乎拥有无穷无尽的潜力 - 他们是否有任何限制?电脑不能用来解决这些问题吗?

可计算性理论和复杂性

在本文中,我们将通过避免编程语言和计算机架构的详细信息来解决这些问题。通过了解计算机和算法的权力和限制,我们可以提高我们思考和更好理性的方式。

计算的抽象视图会产生结果的结果,这是当今今天对我们的价值,因为它们在20世纪70年代最初开发的时候。

计算性

电脑是什么?什么是问题?

在学校,我们往往教导了一些问题和功能的心理模型:

函数是您应用于输入x的过程,以查找输出f(x)。

事实证明 数学定义 is different:

函数是一组有序对,使得每对的第一元素来自SET X(称为域),每对的第二元素来自SET Y(称为Codomain或Range),以及每个元素域与范围的恰好一个元素配对。

那是一口。但是,这究竟是什么意思?

功能

此定义告诉我们计算机是用于计算功能的机器。

为什么?

因为计算机将任意输入转换为某些输出。换句话说,他们解决了问题。函数的两个定义,我们如此熟悉和正式的定义,恰逢许多实际目的。

然而,数学定义允许我们达到有趣的结论,例如存在无解扣功能(即,无法解决的问题):

因为,不是每个功能都可以被描述为算法。

游戏规则

为了帮助我们的论点,让我们想象计算机作为采用一些输入的机器,执行一系列操作,并在一段时间后,给出一些输出。

我们将调用输入机器的字母表;也就是说,来自一些有限集的一组字符串。例如,机器的字母可以是二进制(0s和1s),或者它可能是ASCII字符集。任何有限的字符序列是字符串 - 例如,“0110”。

此外,我们将代表一个机器的输出作为二进制接受拒绝决策,一旦机器(希望)完成其计算。这种抽象与早期功能的数学定义很好。

接受拒绝计算机

鉴于这些参数,重要的是表征一个类型:一个字符串的集合。也许我们关心一些机器接受的字符串,或者我们也许我们正在构建一台接受某一集合,也许没有其他机器的机器,或者我们也可以要求设计一台接受某些内容的机器特定设置,也没有其他的。

在所有这些情况下,一组字符串称为语言 - 例如,所有二进制字符串的集合表示偶数的二进制字符串或具有偶数字符的字符串集。事实证明,像数字一样的语言可能是 与运营商进行操作 如替代,联盟,交叉点等。

一个重要的操作员是Kleene Star操作员,也与正则表达式一起使用。这可以被认为是语言所有可能的能力的联盟。例如,如果我们的语言 A 是一组字符串{'01','1'},然后是一个成员 一种* 是字符串'0101111'。

可计算

在我们证明我们的索赔之前,难题的最后一块,并非所有功能都是可计算的,是可计算性的概念。直观地,我们的证据将显示有更多的语言;也就是说,比有可能的程序来解决它们的问题。这有效,因为字符串是否属于语言(是/否)本身是一个问题。

更确切地说,我们的证明声称,这组可能的程序是无数的,而字母表上的一组语言是无数的无限的。

此时,您可能会思考,“无限是一个奇怪的想法本身;现在我必须处理其中的两个!“

好吧,这并不糟糕。可选的无限集是可以枚举的。可以说这是第一个元素,这是第二个元素等,最终为集合的每个元素分配一个数字。例如,占据偶数。我们可以说2是第一个,4个,第二,第三,第三,等等。这样的集合是无限的或可数的。

有些集合,就像真实数字一样,你有多聪明无关紧要;简直没有枚举。这些集是 无数无限 或者 uncountable.

最多的程序

首先,我们想表明这组计算机程序是可计算的。出于我们的目的,我们通过观察有限字母表的所有字符串集是可计算的。这是有效的,因为计算机程序本身是有限字符串。

证据 很简单,我们在这里没有涵盖细节。关键的外卖是,在那里只有许多电脑程序,因为有了自然的数字。

重申:

任何字母(例如,所有计算机程序集)的所有字符串都是可计算的。

不可数地多种语言

鉴于此结论,这些字符串的子集呢?另一种方式问,所有语言的集合呢?事实证明,这套是不可数的。

任何字母表上的所有语言都是不可数的。

再一次,我们不覆盖 证据 here.

结果

虽然它们可能不会立即显而易见,但语言不可取的后果和所有计算机程序集的可数性都是深刻的。

为什么?

认为 A 是ASCII字符集; ASCII字符 只是撰写计算机程序所需的那些。我们可以看到表示,表示,JavaScript程序的字符串是一个子集 一种* (这里,*是Kleene Star Operator)。 JavaScript的选择是任意的。由于这组程序是可计算集的子集,因此我们有该组的JavaScript程序是可计算的。

此外,让我们考虑任何语言 L,我们可以定义一些功能 f 如果某些字符串,则评估为1 xL 否则为0。所有这些功能都是不同的。因为与所有语言的集合有1:1的对应关系,因为所有语言都是不可数的,所以我们拥有所有此类功能的集合是不可数的。

这是深刻点:

由于所有有效程序的集合是可数的,但功能集不是,那么必须有一些函数,我们根本无法编写程序。

我们还不知道这些功能或问题看起来像什么,但我们知道它们存在。这是一个谦卑的实现,因为那里有一些问题,没有解决方案。我们认为计算机非常强大,有能力,但有些事情甚至不可能。

现在问题变成了“这些问题是什么样的?”在我们继续描述此类问题之前,我们必须以广义的方式进行第一模型计算。

制作机器

计算机的第一个数学模型之一是由Alan Turing开发的。这个型号称为图灵机,是一个非常简单的设备,完全捕获了我们的计算概念。

制品

对机器的输入是输入的磁带。使用读/写头,机器通过一系列步骤将输入转换为输出。在每个步骤中,决定是否以及将其写入磁带以及是否向右移动或向左移动。该决定是基于两件事:

  • 头下的当前符号,和

  • 机器的内部状态,也被编写的符号更新

就是这样。

普遍性

1926年,Alan Tying不仅开发了图灵机,而且还有许多其他主要见解,当他在可计算的数字上写出了他的着名纸时的计算性质。“他意识到计算机程序本身可以被视为计算机输入。通过这一观点,他有一个美丽的想法,即图灵机可以模拟或执行该输入。

虽然我们今天接受这些想法,但是,在图灵的一天中,这种普遍机器的想法是允许提出制定无法解决的问题的重大突破。

教堂

在我们继续之前,让我们研究一个重要的一点:我们知道图灵机是一种计算型号,但它足够一般吗?要回答这个问题,我们转向了 教堂,这给予以下声明:

只有可计算的一切都可以通过图定机器计算。

在图灵开发了图灵机作为计算型号的同时,Alonzo教堂还开发了称为Lambda-Calmulus的计算模型。这些模型是强大的,因为它们都描述了计算,并以等于今天的任何计算机或任何计算机的方式。这意味着我们可以使用图灵机来描述我们寻求的无法解决的问题,知道我们的调查结果适用于过去,现在和超越的所有可能的计算机。

可识别性& Decidability

在我们具体描述一个无法解决的问题之前,我们必须覆盖更多的背景,即语言识别员和语言解柜者的概念。

如果有一个识别它的图灵机,则可以识别一种语言。

如果有一个决定它的图灵机,则可以删除语言。

要成为一种语言的识别器,图灵机必须接受语言中的每个字符串,并且不得接受任何不在语言中的任何内容。它可能拒绝或循环在这种字符串上。要成为一名诡计,必须通过接受或通过拒绝来始终停止其输入。

这里,停止输入的想法至关重要。事实上,我们看到解放者比识别人更强大。此外,问题是可解决的或另一种方式,仅当存在决定函数描述的语言的图灵机时,才能解密函数。

不可思议

如果您曾写过计算机程序,肯定是您必须知道坐在那里的感觉只是看电脑在程序执行时旋转其轮子。您不知道程序是否只是花了很长时间或者代码中存在一些错误,导致无限循环。您甚至可能想知道为什么编译器没有检查代码以查看运行时是否会停止或循环。

编译器没有这样的检查,因为它根本无法完成。这不是编译器工程师不够聪明或缺乏资源;根本无法检查任意计算机程序以确定它是否停止。

我们可以使用图灵机来证明这一点。图灵机可以描述为字符串,因此有一个可数号。假设M.1,M.2等等,弥补了所有图灵机的集合。让我们定义以下功能:

f(i,j)= 1如果mi accepts <Mj>, 0 otherwise

这里,<M>是“m,”的“字符串编码”的语法,并且此函数表示输出1(如果m)的问题i halts by accepting Mj 否则为输入和输出0。注意M.i 必须停止(即,成为一名诡计)。这是必要的,因为我们希望描述一个未定定的功能(即,无法解决的问题)。

现在,让我们还定义一种语言 L 由图灵机的字符串编码组成,不接受自己的描述:

l = {<M>| m不接受<M> }

例如,一些机器m1 可以在输入上输出0<M1>而另一台机器m2 可以在输入上输出1<M2>。为了证明这种语言是不可判定的,我们问了什么mL,决定语言l的机器,当它给出自己的描述时确实如此<ML>作为输入。有两种可能性:

ML accepts <ML>

或者

ML rejects <ML>

如果是L 接受自己的编码,那么这意味着<ML>不是语言l;但是,如果是这种情况,那么米L 不应首先接受其编码。另一方面,如果mL 不接受自己的编码,然后<ML>是语言l,所以mL 应该接受其字符串编码。

在这两种情况下,我们都有悖论,或数学术语,一个矛盾,证明语言L是不可判定的;因此,我们已经描述了我们的第一个无法解决的问题。

停止问题

虽然我们刚才描述的问题可能似乎似乎不相关,但它可以减少到额外的无法解决的实际重要性问题,最重要的是 停止问题 :

在空字符串上停止的图灵机编码的语言。

停止问题适用于为什么编译器无法从早期检测到无限循环的问题。如果我们无法确定程序是否终止在空字符串上,那么我们如何确定其执行是否会导致无限循环?

在这一点上,它看起来似乎我们刚刚挥舞着我们的手来达到一些简单的结论;但是,我们实际上意识到没有图灵机可以判断计算机程序是否将永远停止或留在循环中。这是实际应用的重要问题,无法在图灵机或任何其他计算机上解决。 iPhone无法解决这个问题。具有许多核心的桌面无法解决此问题。云无法解决这个问题。即使有人要发明量子电脑,它仍然无法解决停止问题。

概括

在我们对可计算性理论的检查中,我们已经看到了如何通过计数参数在任何普通的单词的任何普通感觉中计算的功能。我们精确地定义了我们的计算意味着什么,一路走回自己用笔和纸张的体验的灵感,以形式化图灵机。我们已经了解了该模型如何计算今天或明天可以设想的任何计算机,并且我们意识到一类没有可计算的问题。

但是,可计算性有一个缺点。仅仅因为我们可以解决问题并不意味着我们可以快速解决它。毕竟,如果在未来阳光下的新月之前没有结束,那么电脑是什么好的计算机?

留下可计算的功能和语言,我们现在讨论计算复杂性,测量有效的计算和着名的P与NP问题。

复杂

慢速比较

计算机科学家认识各种问题,以及我们关心的两个课程包括计算机可以快速或有效地求解的问题 P 和解决方案可以快速验证的问题,但无法快速获得 NP. .

例如,假设您负责开发在线约会服务的算法,有人会造成问题,“每个人都可以获得约会吗?”答案归结为配对兼容的人,以便每个人都配对。事实证明,有有效的算法来解决这个问题。这个问题是在集合中 P.

那么,如果我们想确定我们用户中最大的集团,该怎么办?通过Clique,我们的意思是最大的个人网络彼此兼容。当用户数量低时,可以快速解决此问题。我们可以轻松识别,例如,有3个用户的集团。然而,当我们开始寻找更大的派系时,问题变得越来越难以解决。这个问题是在集合中 NP. .

正式定义

P 是在多项式时间可溶的一系列问题。也就是说,计算步骤的数量由关于问题大小的多项式函数界定。我们知道“每个人都会约会?”问题,也被称为 二分匹配问题,就在 P.

NP. 是多项式时间可核实的一组问题。这包括P中的每个问题,当然是;但是,我们不知道这座遏制是否严格。我们知道有效可验证但未有效可解决的问题,但我们不知道问题是否真正难以解决。 Clique问题是一个这样的问题。我们知道我们可以有效地验证解决方案,但我们不确定我们是否可以有效地解决问题。

最后, np-complete. 是一系列问题是最难的问题 NP. 。他们被称为最难的因为任何问题 NP. 可以有效地转化为 NP. C.。结果,如果有人要确定一个有效的解决问题 NP. C.,然后是整类的 NP. 会被吸收 P。 Clique问题也在 NP. C..

P与NP.

因此,我们到达了问题 P vs. NP. 。许多计算机科学家和数学家都相信 PNP. 不平等。如果他们是,含义将超越深刻。今天的大部分数字基础架构都依赖于存在问题的事实 NP. 那不是 P。如果不是这种情况,那么加密方法,例如,将折叠过夜,允许一个人拥有有效的解决方案 NP. C. 问题要颠覆即使是最紧密的安全协议。

易腐烂的微妙之处

对于计算机科学新手,匹配和集团问题之间的差异可能看起来不是很大的事。事实上,问题的差异 P 还有一个问题 NP. 可以非常微妙。能够讲述差异对于现实世界中的任何设计算法很重要。

考虑最短的路径问题。给定两个位置,目标是识别它们之间的最短路径。 iPhone在毫秒内计算出这一点。这是一个计算上的问题。

另一方面,考虑旅行推销员问题,目的是在旅行最短的距离时访问结束原点的可能目的地的可能性的子集。这个问题类似于最短的路径问题,但是np-complete;它还解释了为什么供应链物流是十亿美元的行业。

我们实际上甚至可以是副主者。我们可以在没有周期的情况下询问最长的路径而不是询问最短路径。结果最长的路径问题也是np-complete。

这种微妙区别的其他例子,包括鉴定二分中的顶点覆盖物与每条与三个文字的布尔公式的一般图或满足。重点是,它不是明显的问题是否在p或np中,这就是为什么运行时间分析是一个关键技能。如果算法必须设计是在P中存在的问题,那么我们知道有一个有效的解决方案。如果另一方面,问题是在NP中,那么我们有一个强有力的案例来争论追求解决方案,因为算法一般来说,只需要太长来解决问题。

概括

在这种复杂性检查中,我们定义了P和NP问题的类别。 P非正式地表示计算机可以通过计算机有效解决的问题,而NP代表有效可验证的那些。

没有人能够证明p不等于np。这两类问题是否等同于称为P与NP问题,并且如果不在所有数学中,它是今天的理论计算机科学中最重要的开放问题。事实上,在2000年,克莱数学研究所将P与NP问题命名为数学中七个最重要的开放问题之一,并为一个确定解决此问题的证据提供了一百万美元的赏金。

结论

在这篇文章中,我们揭示了计算性和复杂性的领域,回答了大问题,如“计算机是什么?”虽然细节可能是压倒性的,但有许多人的表情值得记住:

  • 有些东西根本无法计算,就像停止问题一样。

  • 有一些东西无法有效地计算,就像NPC中的问题一样。

比细节更重要的是考虑计算和计算问题的方法。在我们的专业生活中,即使在我们的日常生活中,我们可能会遇到以前从未见过的问题,我们可以使用尝试和真正的工具和技术来确定最佳行动方案。

理解基础知识

没有解决方案是否有计算问题?

由于所有有效程序的集合是可数的,但功能集不是,那么必须有一些函数,我们根本无法编写程序。

教会图论文是什么?

教堂的论文指出可计算的一切可通过图定机器计算。

什么是p与np问题?

如果可以在多项式时间中验证解决方案的每个计算问题,则确认是否也可以在多项式时间中解决问题。