究竟是什么算法?


12

我知道这听起来可能有点开箱即用,实际上我以前总是在盒子里思考,但是最近我一直在思考,可能是因为计算机科学提供了高度的自由度,所以除了设计程序以外,大学里教过的

考虑阶乘函数。通常我们将这个函数定义为

 int fact(int n) 
 { 
 int r = 1; 
 for(int i=2;i<=n;i++) 
 r = r*i; 
 return r; 
 } 

我将其称为算法,并且毫无疑问,这是正确的方法。然后,我想知道“我可以在固定时间内执行此操作吗?”,这使我想到了以下几点:如果我有一个整数数组,其中array [n]容纳n的阶乘怎么办?一旦这个数组被填充,我可以简单地将事实定义为:

 int fact(int n) 
 { 
 return array[n]; 
 } 

即使它提供了正确的结果并在恒定的时间O(1)中运行,我仍然似乎无法为该算法定标。这可以称为算法吗?否则,为什么不呢?我可以争辩说,填充数组将需要某种算法在某个时间运行,即使它在我们的大脑中才能填充数组,但这是否是标准?这些方面如何得到正式处理?

请注意,该概念可以扩展到任何在整数上操作的函数,而与参数的数量无关,如果函数具有2个参数,则仅需使用矩阵;如果函数具有3个参数,则仅需使用3,等等。而且,难道不是仅由于内存消耗而使用这些解决方案吗?

同样,该功能也可能不包含任何带有输出的程序,因为我可以找到一种方法来索引程序可以提供的每个可能的输出。

再举一个例子,考虑一下数组的一般用法:我首先分配一个大小为N的数组,然后通过将值存储在索引n处并将n增加一个单位来向数组添加元素。然后,如果我想寻找一个元素,我不禁要对数组执行线性搜索。相反,如果我创建一个大小为Integer.MAXVALUE的数组来存储整数(用零初始化),则可以通过在其索引处放置1来存储整数。然后我可以在O(1)时间中搜索它在数组中的存在。如果我希望能够放置多个相同编号的设备怎么办?没问题,我只是增加存储在整数索引处的值。

排序会稍微复杂一些,但是仍然可以在O(1)时间内执行查找和加法。


您的第二个函数应将数组作为参数。否则,您会迷失在隐式状态的命令性陷阱中,这在编程中很有用,但会使代码难以推理。
jmite 2014年

是的,您的第二个代码可以称为输入为n且具有所有阶乘的数组的算法。在第一个代码中,算法只有一个输入,即数字n。
Ankur 2014年

强制性的:今天我不会尝试进一步定义我理解包含在该速记描述中的材料的种类[“ algorithm”],也许我在理解上不可能成功。但是我一看到它就知道了,下面的帖子中所描述的并不是那样。
Patrick87

与此问题相关(但未直接回答),阅读“什么是算法?”也很有趣。尤里古列维奇,微软研究院,技术报告MSR-TR-2011-116 research.microsoft.com/pubs/155608/209-3.pdf
godfatherofpolka

您说:“ ...如果我有一个整数数组,其中array [n]存放n的阶乘怎么办?一旦该数组被填充...。” 您将如何用所有整数的阶乘填充数组?该数组将具有无限的大小,并且将花费无限的时间来填充。因此,您的问题提出来了。
美联社

Answers:


9

在流行的教科书中,算法的非正式定义如下:

算法是(1)定义明确的计算过程(2)接受一些输入,(3)产生定义明确的计算问题的某些输出(4)。

在第一种情况下,您已经编码了一种算法,其中:问题是要找到阶乘(定义的第4部分),给定int n作为输入(定义的第2部分),代码描述要执行的计算(定义的第1部分) ),输出是阶乘(定义的第3部分)。

在第二种情况下:问题是找到位置n(定义的第4部分)的数组元素,给定n作为输入(定义的第3部分),代码描述了要执行的计算(定义的第2部分),输出是位置n(定义的第1部分)上的元素。

您已在其中存储阶乘,因此可以为您提供阶乘。如果存储了正方形或立方体,那么您将得到正方形或立方体,因此不能说第二个片段本身就是一种计算阶乘的算法。

而且,如果您说一个数组与在位置n处具有f(n)的一个数组一起查找是一种计算f(n)的算法,那么您做得太深了,下面不再进行任何计算。定义明确的计算过程应该是有限的信息。如果无限个阶乘数组是计算过程的一部分,则不成立。因此,这不是计算阶乘的算法。


OP建议的真正问题是“定义明确的计算过程”的描述不是有限的。当然,除非我们解释“定义明确的计算过程”的含义,否则无法预先判断OP的算法是否合法。给定无限数组,它实际上是一个“定义明确的计算过程”,那么为什么这是非法的呢?OP甚至可以用有限的术语描述如何填充数组。那怎么了?您的非正式定义无法区分超计算和(图灵)计算。
Yuval Filmus 2014年

定义明确的计算过程应表示为有限的信息。如果无穷多个阶乘是其中的一部分,则不成立。
兰比尔

2
正如OP所证明的,它可以表示为有限的信息。使用所有阶乘初始化数组。这是一个有限的描述。它不是操作上有限的。以同样的方式,中的具有有限的描述而不是有限的。{(n,n!):nN}
Yuval Filmus 2014年

数组的描述可以表示为有限的信息,但数组本身不是。
兰比尔

我认为两个OP的示例都是算法,并且都不计算所有整数的阶乘。我想那只是挑剔。
Patrick87

5

最广泛地说,算法是解决问题的一系列步骤

在CS中,使用术语“算法”时通常会理解/假定以下内容:

  • 该算法具有有限的描述和定义明确的过程,可以在给定任何问题实例的情况下执行其步骤。(下面有更多。)
  • 给出的问题实例为有限字符串(输入符号的序列),算法的输出可以编码为有限字符串。
  • 问题是问题实例的集合以及每个实例可能的“正确”输出。“解决”是指产生正确的输出。
  • (通常)问题实例可以任意大(有限算法必须解决的实例数量是无限的)。

在CS成立之前,数学家曾提出过与您相同类型的关注点,并介绍了计算的正式定义来解决这些关注点。因此,如今,我们可以通过简单地说“算法是可以在图灵机上实现的过程”来形式化上述所有假设。这可能是对您问题的最佳正式答案。

请注意,Church-Turing论文说,我们认为没有比Turing Machine更“强大”的算法形式化。

阶乘示例进入另一种计算模型,称为非均匀计算。图灵机是统一计算模型的一个示例:它具有单个有限的描述,并且可用于任意大尺寸的输入。换句话说,存在一个TM可以解决所有输入大小的问题。

现在,我们可以改为按以下方式考虑计算:对于每个输入大小,都有一个TM(或其他一些计算设备)可以解决该问题。这是一个非常不同的问题。注意,单个TM不能存储每个整数的阶乘,因为TM具有有限的描述。但是,我们可以制作一个TM(或C中的程序)来存储所有小于1000的数字的阶乘。然后,我们可以制作一个存储所有1000到10000之间的数字的阶乘的程序。依此类推。

这些非均匀类型的计算通常通过电路在理论CS中建模。您针对每种可能的输入大小考虑不同的电路构造。

尽管非均匀计算模型可能适合我的第一句话,但通常不将其视为算法。原因是它们不符合我们的关键假设:它们没有可用于解决任何输入大小的“整体”问题的有限描述。相反,随着问题变得越来越大,他们需要越来越大的描述(例如需要更大的查找表)。但是,它们仍然是有趣的计算模型。


我认为您的基于电路的计算模型是不合适的。正如您所说,TM具有有限的描述。但这不排除要有一个辅助带,其中填充有列表形式的阶乘。一个人甚至可以做“更糟”的事情,但仍然有一个有限的描述。但是实际上,您需要的只是一个可计算的描述,它最终必定是有限的。有许多计算上统一的方法来定义具有列表式阶乘的图灵机,但没有一种方法能够真正提高TM的计算能力。因此,您的结论不成立。
2014年

@babou,我不明白你的意思。您所说的“不合适”是什么意思,我得出的结论是错误的?注意:我没有发明电路模型。也许我没有很好地描述它。关键是,对于每个输入,我们允许使用不同的计算设备(TM或电路),这意味着可能没有统一的算法来生成所有这些设备(针对所有输入大小),换句话说,不能描述所有这些。
usul 2014年

在我看来,将阶乘函数的制表视为非均匀计算是不合适的。实际上,它非常均匀,以至于其有限的部分可以看作是连续的,并且无穷大是整个表格。这就是用Scott的语义完成的。此外,整个表实际上可以以可计算的方式进行有限地描述,因此考虑使用带有包含预计算表的额外磁带的TM会具有计算意义。您的答案似乎得出结论,即预先计算的表不能视为算法。
2014年

任何特定的预计算表都可能是算法的一部分,并且对于数量不断增长的无限数量的预计算表,您可以使用算法来产生这些东西中的任何一个。但是我不会认为越来越大的无限个查找表集本身就是一种算法或统一的计算,因为它的大小是无限的。
usul 2014年

您不会将其视为一种算法。这是主观的。重要的是知道为什么不应该这么做。而且我没有理由看到。在这种情况下,任何对算法有意义的概念都有意义。它所做的只是抽象出表的创建,尽管可以单独考虑。实际上,这实际上是一个纯粹的语义问题,因为按原样考虑递增的序列,或将其替换为无限的限制,在数学上就等于该序列。计算的语义理论确实考虑了这种无限的限制,无论是产生还是表示。
2014年

4

算法是一种用C语言编写的程序,适用于任何长度的输入(假定无限内存和无界整数)。在您的示例中,如果我们希望程序在所有长度的输入下可以工作,那么存储结果的表将无限大。C语言中的程序始终是有限的,因此无法使用此方法。

算法的定义非常灵活:在递归理论的早期,提出了许多定义,并且所有定义都等效。例如,可以使用图灵机代替C。但是,这些模型在效率方面不一定相等:与使用Turing机器相比,用C语言解决问题的效率更高。当对效率感兴趣时,我们应该将自己限制在所有与运行时间“足够接近” C的模型上。例如,如果我们被允许使用计算的指令以一个时间单位为单位,则生成的模型仍然定义了相同的可计算函数集,但是与C相比,其中一些函数(如)的计算效率更高。n n!n!

当担心实际计算机上的实际运行时间时,我们应该更加小心,但是不幸的是,这通常超出了理论计算机科学的范围。


如果我们非常挑剔,则需要弄清楚算法算法所计算的函数之间的区别。例如,阶乘函数将输入自然数并输出。阶乘函数可以通过算法来计算。我们说一个函数是可计算的,如果可以使用某种算法来计算它的话。n nn!

我们应该使用什么算法概念?上面概述的一项建议是使用C程序。我们可以将此概念称为C计算。使用图灵机时,您将获得图灵计算。事实证明,当且仅当函数是图灵可计算的时,函数才是C可计算的。从这个意义上讲,这两个计算模型是等效的。实际上,许多其他模型是等效的,例如,所有常用的编程语言(假设无限内存和无界变量)。

我们说编程语言P是图灵完备的,并且仅当它是可图灵运算的时才是P可运算的函数。Church-Turing假设是一个非正式陈述,其结果是所有具有有限描述和花费有限时间的合理计算模型都是Turing-complete。您的模型具有有限的描述,但不需要花费有限的时间。


3
大声笑“算法是用C ...编写的程序”?!?
vzn 2014年

2
“算法是用C编写的程序” ...为什么要指定语言?这是胡说八道。
2014年

1
@nouney我只是想具体一点。您最喜欢的编程语言也是图灵完备的。
Yuval Filmus 2014年

@YuvalFilmus嗯,您并不具体,令人困惑。
诺伊2014年

@nouney欢迎您添加您自己的答案。
Yuval Filmus 2014年

4

您缺少的算法通用定义的重要部分是规范必须是有限的,并且规范的大小不能随输入的大小而变化。

内存可以任意大,输入也可以任意大,但是要成为算法的有用定义,代码空间必须是有限的。否则,您将得到刚刚发现的问题。

O(logA)AO(logn)O(logn!)O(n(logn)2)sn=O(2s)O(2s s2)O(1)


“代码空间必须是有限的 ”:您的意思是说一个Lisp程序eval不能视为一种算法,该程序在刚刚创建的大型数据结构上调用该函数并表示lLisp表达式。我怀疑20世纪MIT产生的许多代码都不符合算法。这只是一个非正式的论点,但是形式上的问题在于有限规范是什么的观点,您以过于严格的方式来阅读它。
2014年

如果生成了表达式,则它是有限的。不管有多大。但是,消除对代码空间有限性的限制可能会很有用,它可用于证明运行时的下限(例如证明列表排序的运行时的下限)。但是,几乎所有关于算法本身的有趣结果都将需要有限的代码空间。这类似于多项式必须具有有限数量的系数,但是幂级数也很有用。
DanielV 2014年

我不是如何计算复杂度的专家(不是我的专业领域),但是您拥有或没有数学能力的事实不应该影响算法。关键是,Lisp程序可以无限制地增加其代码大小。然后,将其分析为具有特定计算属性的无限代码可能更有意义。从这个角度可以看出列表功能的情况。我很惊讶答案对算法的理解如此有限(我只是说狭义的)。
2014年

3

一些观察可能会有所帮助:

问题是关于允许输入和相应输出的声明。他们是我们要解决的问题。算法是计算过程。可以说,如果算法接受问题允许的输入并根据问题描述产生输出,则该算法对于问题是正确的

您的两个示例都是算法,因为它们都是明显的计算过程。算法是否正确取决于您如何定义问题以及如何解释算法的表示形式。一些问题陈述:

  1. nn!
  2. n>0n!< INT_MAXn!

您的第一个代码段的一些解释:

  1. 除细节外,这是类似于C / C ++的伪代码。int例如,真正的意思是“任何整数”。
  2. 可以将其解释为真实的C / C ++程序。

只要阶乘假设负数的值为1,解释1就对问题陈述1是正确的(否则,我们可以修改问题陈述以限制域,或者对算法进行解释以解决期望的行为)。对于问题陈述2,具有相同的警告说明,解释2是正确的。

arrayarraynn>0n!< INT_MAXn!n<0

nn!232n!264

kknknk+n


我认为算法的概念在某种程度上超出了计算机的字数限制。我觉得您只是在回避问题。
2014年

1

一种算法是写在一个程序图灵完备的语言能够在所有有效输入可证明的暂停。所有标准编程语言都是图灵完备的。这个词源自波斯语数学家,天文学家和地理学家al-Khwārizmī这个名字的欧洲译本,其工作建立在7世纪印度数学家Brahmagupta的工作上,后者将印度数字系统引入了西方世界。

问题似乎基本上是关于查找表是否是算法的一部分。绝对!在图灵机(TM)中,表可以被编码在TM的状态表中。TM可以根据转换表中存储的有限数量的数据初始化磁带。但是,不是在无限输入上运行而仅在有限输入上运行的“算法”是“平凡的” 有限状态机(FSM)


3
为什么必须使用TUring完整语言?
2014年

1

简而言之:算法是给定问题具有解决方案的建设性证明的建设性部分。该定义的动机是程序与证明之间的Curry-Howard同构,认为程序只有在解决问题后才有兴趣,但可以证明是有兴趣的。该定义允许更多抽象,并为可能涉及的领域(例如,有限性)打开了一些大门。

警告我正在尝试找到适当的正式方法来回答这个问题。我确实认为这是必要的,但是到目前为止,似乎没有一个回复的用户(包括我本人,并且有些人在其他帖子中或多或少明确了此信息),没有适当的背景来适当地开发与以下内容相关的问题:构造数学,证明理论,类型理论以及证明与程序之间的Curry-Howard同构等结果。我在这里会尽我所能,无论我相信(或相信)拥有什么知识片段,我也太清楚这个答案的局限性。我只希望给出一些我认为答案应该是什么样的提示。如果您发现任何形式上明显(正式)存在错误的地方,请立即在评论中或通过电子邮件发送给我。

确定一些问题

考虑算法的标准方法是声明算法是某些计算设备的任意有限指定程序,包括那些不受内存限制的程序。语言也可以是计算机机器语言。实际上,为图灵完整的计算设备考虑所有程序就足够了(这意味着没有内存限制)。从某种意义上讲,算法必须以某种形式表达,该形式必须依赖于其解释细节(甚至是理论上)的细节,因为所有内容都取决于某种编码。但是,由于它将计算所有要计算的内容,因此它将以某种方式包括所有算法,直至编码为止。

π

π,可能在几乎所有数学意义上都是如此。但这将需要更精确的定义。

因此,真正的问题是要知道什么是有意义的算法。答案是有意义的算法是解决问题的算法,逐步解决该问题的“解决方案”,“答案”。如果算法与要解决的问题相关联,则该算法很有趣。

因此,给定一个正式问题,我们如何获得解决该问题的算法。无论是显式的还是隐式的,算法都与存在该问题的解决方案的想法相关联,这可以证明是正确的。我们的证明技术是否准确是另一回事,但我们至少尝试说服自己。如果您将自己限制在建设性数学上,而这实际上是我们要做的(并且对于大多数数学而言,这是一个非常可接受的公理约束),则证明解决方案存在的方法是通过证明实际上可以证明构造的证明步骤。代表解决方案,可能包括建立正确性的其他步骤。

所有程序员都这样想:如果我以某种方式摆弄数据,那么我会得到这个小部件,因为芝麻定理,该小部件具有正确的属性,并且运行此foo保留的转换,便得到了所需的答案。但是这种证明通常是非正式的,我们无法得出所有细节,这也解释了为什么卫星试图绕火星在地下运行(其中包括其他原因)。我们做了很多推理,但实际上我们只保留构建解决方案的建设性部分,我们用计算机语言描述它是解决问题的算法。

有趣的算法(或程序)

所有这些都是为了引入以下想法,这些想法是当前许多研究的对象(我不是其中的专家)。这里使用的“ 有趣算法 ” 的概念是我的,它是非正式的占位符,用于更精确的定义。

一个有趣的算法是给定问题具有解的建设性证明的建设性部分。这意味着证明必须实际显示解决方案,而不是简单地证明其存在(例如通过矛盾)。有关更多详细信息,请参见数学中的直觉逻辑建构主义

当然,这是一个非常严格的定义,只考虑了我所谓的有趣算法。因此,它几乎忽略了所有这些。但是我们所有关于算法的教科书也是如此。他们试图只教一些有趣的。

给定问题的所有参数(输入数据),它告诉您如何逐步获取指定的结果。一个典型的例子是方程的解析度(名称算法实际上是从波斯数学家MuḥammadibnMūsāal-Khwārizmī的名字衍生而来的,他研究了一些方程的解析度)。证明的某些部分用于确定算法中计算出的某些值确实具有某些属性,但是这些部分无需保留在算法本身中。

当然,这必须在正式的逻辑框架内进行,该框架确定使用哪些数据进行计算,允许使用哪些基本计算步骤以及使用哪些公理。

回到您的阶乘示例,它可以被解释为一种算法,尽管它是微不足道的。正常阶乘函数对应于以下证明:给定某种算术框架,给定整数n,存在一个数字,该数字是前n个整数的乘积。这非常简单,阶乘计算也是如此。其他功能可能更复杂。

现在,如果您决定对阶乘进行制表(假设可以),这并非对所有整数都适用(但对于某些有限域的值可能适用),则您要做的就是通过定义a为变量,从而在您的公理中包括阶乘的存在。新公理为其每个整数提供值,因此您不再需要证明(因此无需计算)任何东西。

但是公理系统应该是有限的(或至少是有限定义的)。阶乘的值无穷大,每个整数一个。因此,如果您对无限函数进行公理化(即在无限域上定义),那么您将为有限公理系统带来麻烦。这实际上是无法对所有整数实现可能要进行的表查找的事实,从而进行了计算转换。这将消除通常对算法的有限性要求(但是是否像经常提出的那样严格?)。

您可以决定使用有限定义的公理生成器来处理所有情况。这或多或少等于在您的算法中包括标准阶乘程序以根据需要初始化数组。这被程序员称为记忆。实际上,这是您最接近预先计算表的等效项。可以理解,它具有一个预先计算的表,但实际上该表实际上是在需要时以惰性评估模式创建的。此讨论可能需要更多的正式注意。

您可以根据需要定义原始操作(与正式系统保持一致),并在算法中使用时将选择的任何成本分配给它们,以进行复杂性或性能分析。但是,如果实际实现您的算法的具体系统(例如计算机或大脑)无法遵守这些成本指标,那么您的分析可能会很有趣,但对于现实世界中的实际使用却毫无价值。

21000

哪些程序很有趣

这种讨论应该更恰当地与诸如程序和证明之间的Curry-Howard同构之类的结果联系起来 。如果任何程序实际上是某物的证明,则按照上述定义,任何程序都可以解释为有趣的程序。

但是,据我(有限的)理解,这种同构仅限于可以在某些适当的类型系统中很好地键入的程序,其中类型对应于公理理论的命题。因此,并非所有程序都可以被视为有趣的程序。我的猜测是,从这个意义上讲,一种算法应该可以解决问题。

这可能不包括大多数“随机生成”的程序。

这也是什么是“有趣的算法”的开放定义。任何可以被视为有趣的程序都是如此,因为有一个确定的类型系统使其变得有趣。但是,到目前为止尚未可打字的程序可以使用更高级的打字系统来打字,从而变得有趣。更准确地说,它总是很有趣,但是由于缺乏适当的类型系统的知识,我们无法知道。

然而,已知的是,并不是所有的程序都分型,因为它是已知一些lambda表达式,例如实现Y组合不能在声音类型的系统类型

这种观点仅适用于可以与某些公理证明系统直接相关的编程形式主义。我不知道如何将其扩展到诸如Turing Machine之类的低层计算形式主义。但是,由于算法和可计算性通常是对问题和解决方案进行编码的游戏(想想用lambda演算编码算术),因此可以认为,任何形式上可以显示为算法编码的正式定义计算也是一种算法。这样的编码可能只使用了诸如图灵机之类的低级形式主义所能表达的很小一部分。

该方法的一个兴趣在于,它给出了一种算法概念,该概念更加抽象并且与实际编码问题无关,与计算域的“物理可表示性”无关。因此,例如,只要存在一种计算合理的使用方式,就可以考虑使用无限对象的领域。


2
尽管这是一个基本问题,但这并不是一个简单的看法。我不得不简化工作,可能犯了错误。但是,如果您不赞成投票,请告诉我原因。
2014年

是的,我不确定下降票是什么。
别名2014年

@Pseudonym以我为例。我想我知道。它怀疑这是语义学家和算法学家之间的老战,尤其是那些从事可计算性工作的人们。那就是哲学与商业之间的斗争,它是什么,它所花费的成本。我对“有意义”的算法感兴趣。我做了相应的修改(但是我的知识似乎还比大多数更好)。您可能会遭受相同的贫民窟化。---但是。很明显,在这个微妙的话题上,任何意见只占半分钱的人都不会梦想没有适当的解释就投降。
2014年

在阅读了问题和您的答案之后,我很想对它投下反对票,因为它对实际问题的关注不够,而且包含太多未完成的想法。另外,我不认为“解决问题”是算法定义中缺少的部分。但是我同意在定义算法的构成时不应忽略“语义学”。
Thomas Klimpel

@ThomasKlimpel正如我所说,在实际问题上我不够专业。我补充说,没有其他答案。制定算法与理解它们是不同的。我对我有限的知识的意识(隐藏起来是不科学的)是这种未完成的思想感觉的来源。强调问题的存在似乎更好,而不是忽略它们。我确实解决了每个示例,更多的是从语义pov而非算法的角度出发,因为问题是一个语义问题(“什么是……?”)。您是否认为其他答案能带来任何正式的理解。比照我的意见
babou

0

在撰写本文时,“算法”还没有很好的正式定义。但是,有聪明的人在努力。

我们知道的是,无论“算法”是什么,它都位于“数学函数”和“计算机程序”之间。

数学函数是从输入到输出的映射的形式概念。因此,例如,“排序”是可订购项目的序列与相同类型的可订购项目的序列之间的映射,该映射将每个序列映射到其订购的序列。可以使用不同的算法(例如合并排序,堆排序)来实现此功能。每种算法又可以使用不同的程序(即使使用相同的编程语言)来实现。

因此,我们对“算法”的最佳处理是程序上的某种等效类,如果两个程序“本质上是同一件事”,则它们是等效的。实现相同算法的任何两个程序必须计算相同的函数,但反之则不成立。

类似地,算法之间存在一个等价类,其中两个算法如果计算相同的数学函数,则是等效的。

所有这一切中最困难的部分是试图捕捉“本质上是同一件事”的含义。

我们应该包括一些显而易见的东西。例如,如果两个程序仅因变量重命名而不同,则它们实际上是相同的。大多数编程语言模型都具有“等效性”的固有概念(例如,lambda演算中的beta减少和eta转换),因此我们也应该将其纳入。

无论我们选择什么等价关系,这都会给我们一些结构。由于算法是程序的商类别,因此形成了类别。已知一些有趣的等价关系会产生有趣的类别结构。例如,原始递归算法的类别是类别类别中的通用对象。每当您看到这样有趣的结构时,您就会知道这条查询线可能会很有用。


1
我认为没有很好的算法正式定义是不公平的。大约100年前就是这种情况。
Juho 2014年

1
@Juho也许,Pseudonym听起来太强了,尽管他确实努力减轻这种说法,特别是情况正在取得进展。但是,我认为他的评估是正确的。我反应迟了,因为我花了很多时间在此上,并且感觉差不多。人们已经大大提高了他们的理解,但是整个讨论表明没有真正的共识……而且我认为,鉴于所涉及人员的水平,大多数贡献都还不成熟。如果他不公平,您认为谁给了一个很好的正式定义?
2014年

您是100%正确的。而且我认为,如果图灵还活着,或者是复杂性理论中的任何其他理论家,他都会100%同意您的看法。学术界需要放弃他们的惯性。它实际上阻碍了该领域。一旦他们死亡,这最终将以任何方式发生。感谢老天爷。
EnjoysMath

-4

您的问题和描述关系不大。算法是理论上的,与任何编程语言都不相关。算法是解决问题的一组规则或步骤(过程)。您的问题可以通过多种方式或多种算法来解决。

您的第二个解决方案意味着首先计算大量的阶乘,最初将花费大量时间,然后将其存储。它会消耗更多的存储空间,但最终会更快,而第一个不消耗存储空间却消耗计算能力,因此您必须根据环境选择。


是的,绝对没有关系。突破性的东西。
EnjoysMath
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.