什么是算法?


12

算法到底是什么,算法是什么意思?我对这个词的一点理解是,它不是特定于特定的语言或设计模式,而是最基本的原则之一(因此我想这个问题会让我看起来很愚蠢)。

我所理解的“选项”之一是,它意味着完成某些工作的方法,可以将其编写为伪代码列表。

当我编写更复杂的代码时,我认为需要做什么,要做什么以及如何达到目标(不是用编程语言),然后用代码编写。这是个好方法吗,并且与算法有关吗?

(我想在这里问的是Stackoverflow,因为这与特定的问题/语言无关,而且我觉得这里的大多数人都知道“为什么”,或者至少这里的答案更详细,而不是在Stackoverflow上。不一样的地方,很抱歉我是否应该在那里问过)


5
谷歌?维基?google.com/search?q=algorithm
Maglob

1
@Apalala:我认为这些限制并不适用。
乔什K

2
@Apalala:有限未知
乔什(Josh K)

2
@乔纳森:“我必须查寻的词”?哪个字 要具体。这个网站不是魔术。我们不认识你 我们不知道您读了什么。我们不知道是什么让您感到困惑。请具体说明
S.Lott

1
@Apalala:“有限”的意思是“有限的”,仅此而已。保证算法会在某个时间停止。当您以某种方式预测有限性时,证明有限性会容易得多,因此算法趋于可预测,但可预测性不在算法的通常定义中。
David Thornley

Answers:


19

算法是定义明确的指令的有限序列,用于计算以定义明确的结束状态终止的函数(或执行过程)。


1
+1。“有限,定义明确和有效”是Wikipedia条目中的三个条件。你们三个都有。
S.Lott

我准备观看@Jörg引用的视频,但我目前的观点是,不仅步骤必须是有限的。如果资源(包括时间)不受限制,则可以将过程调用或标记为任何东西,而不是算法
2011年

@Apalala-我一直在阅读我的教科书,但在任何地方都看不到这种限制。对于特定的数据集或输入,算法可能不会终止(例如,用于求根的Newton-Raphson方法之类的算法可能会陷入永无止境的循环中),但这并不会使该算法成为一种算法。
John Bode

可以在牛顿-拉弗森(Newton-Raphson)中常规检测到@John振荡。
2011年

1
@Apalala:听起来更像是程序的定义,而不是算法的定义。图灵机,套准机,随机存取机中,当然还有我们实际的物理计算机中,也存在着几乎每种编程语言,甚至更确切地说是lambda演算中的离散步骤的想法。但这是一个任意的限制,并不是算法固有的。模拟的算法,例如,就不能有不连续的步骤(事实上,即定义的模拟算法的),并且它们可以被实际使用模拟计算机实现。
约尔格W¯¯米塔格

15

这实际上是一个非常有趣的问题,并且实际上仍然是一个开放的研究问题。

算法理论的巨头之一Yuri Gurevich目前正在Microsoft社区网站Channel9上进行视频讲座系列:

如您所见,您的问题实际上就是第二堂课的标题。但是,我强烈建议您观看所有这三个内容。

特别是第一个,包含几个算法示例,这些示例几乎使此处大多数其他答案中给出的所有定义无效。


2
感谢您的链接。作为算法定义的一部分,您会在第一个视频随附的文本中注意到以下内容:“最终以最终的结束状态终止”。终止是算法定义的重要组成部分。这就是为什么操作系统和非终结服务器不是算法的原因。
LIProf

4

算法就像一个好的烹饪食谱。您将提供一些输入,一些明确定义的中间步骤并获得最终结果。

应用于编程时,它毫无疑问地描述了解决特定问题所需的步骤。您可以用自己选择的编程语言写下的任何内容都可以看作是一种算法-但通常该术语仅用于常见的逻辑或数学任务,例如排序或搜索。


有很多算法不一定能得出最终结果。例如,操作系统或Web服务器是一种算法,对于该算法,给出最终结果通常被认为是错误。
约尔格W¯¯米塔格

@JörgWMittag,但是操作系统或Web服务器是“算法”吗?我认为它们不是-他们可以使用算法解决领域的子问题-在每种情况下,它们肯定都需要最终结果-但它们也有一部分不是算法,总的来说不是。 t算法。(就像您在另一条评论中所说的那样-操作系统和Web服务器是程序,但不一定是算法)。
Andres F.

2

算法是用于解决问题的一组规则或过程(在计算中)。基本上,有一个问题,您需要一个解决方案,而此解决方案的过程是一个算法。一个算法具有一组有限的规则/过程来达成解决方案。

如果您像Edsger W. Dijkstra一样,将您的算法写在纸上,然后在纸上制定/优化该算法,直到对算法满意为止。否则(尤其是在编写文档时),将使用流程图以图形方式表示算法/流程的流程。这允许其他人对流程图进行批判并在需要时进行改进(而不必担心需要哪种编程语言)。

我不知道这是否回答您的问题。


我不喜欢这个词,因为它的意思是“未排序”。我希望“顺序”或事件元组留在数学区域
BenjaminB

@Ubiquité,Set不一定表示“未排序”。您可以按照所需的顺序(例如随机顺序)对集合进行分类。尽管如此,由于人们对“集合”一词的解释,这并不需要投票。另外,您可以有一个复合集,它是一组集合,也是算法的一部分。因此,“集合”可以是任何东西,只要它可以适当地用作问题的算法解决方案即可。
Buhake Sindi 2011年

我没有投票!
本杰明·B

抱歉,我无意将您的票数怪罪您。拒绝投票者应明确提供拒绝理由。
Buhake Sindi

1

算法:一组有序的操作,这些操作具有1)明确性和2)有效可计算性,因此从有限数量的操作开始,从第一个开始执行操作会产生结果。


反例:操作系统。实际上,它根本不会产生任何结果通常认为这是一个错误。
约尔格W¯¯米塔格

@Jörg,很好,OS产生了许多结果,这些结果加在一起,产生了为应用程序提供系统服务的总体结果。
ThomasMcLeod

@JörgWMittag就像我在对您的其他评论中说的那样,您得出的结论是,操作系统实际上并不是算法;)
Andres F.

1

算法它是顺序步骤(这些步骤可以是计算,数据处理和推理任务)的组合,用于以非常简单和有效的方式解决问题。

它的设计效率最高,可以在有限的空间和时间内表达出来。我们可以用任何编程语言来实现它。

算法的属性:以下是算法的主要属性:-

算法必须具有唯一的名称。它应该具有明确定义的输入和输出集。一个算法必须以明确的操作按顺序排列。它必须具有某个端点,即它在有限的时间内停止。 单击此处了解算法的设计和分析


0

我用这个术语来描述解决特定问题的公式。该公式不一定需要用数学编写,也不必与方法具有1:1关系。在学校中,算法和数据结构密切相关,可以将其编写为数学公式或使用证明进行证明。


0

算法是计算机程序的抽象,由一组指令组成,可以在有限的步骤中完成一些定义明确的任务,尽管步骤数的界限可能非常大,并且各个步骤可能很复杂(有限的任务)。尽管有一些(正确的)程序总体上是已知的非算法程序,但是它们都通过以某种模式重复算法片段来工作。(更有趣的是其终止状态未知的程序,但大多数程序员实际上并不故意处理此类事情;我知道我不知道!)


0

IMO没有人知道:)我见过该术语仅适用于数学计算函数,适用于接受输入并产生输出的任何函数以及适用于接受输入并对其执行某种操作的任何东西

您是否认为以下任何/全部是算法?

  1. 计算20年期贷款利率的函数
  2. 检查是否已在贷款申请中输入所有信息的业务逻辑
  3. finder,对于客户对象查询数据库功能
  4. 一个“帮助程序”功能,用于清理和格式化数据输入
  5. 解析XML文件并将数据映射到业务对象的函数
  6. 接受输入并将其写入文本文件的类

0

算法是一种用于计算或执行本质上抽象的任务的概念,方法,技术,“智能”,但由于它在现实世界中的计算机上运行,​​我们希望它使用尽可能少的资源,在计算机世界中是时间和内存。


0

算法是一系列定义明确的步骤,这些步骤可以在有限的时间内产生结果。

定义明确的步骤:这是您可以执行或计算的精确定义的步骤。仅通过阅读步骤,您就知道您必须做什么以及如何去做。具体来说,您可以使用已知的编程语言编写它,并确保程序片段与该步骤完全匹配。

顺序:按照指定的顺序执行步骤。根据数据(循环)的不同,步骤可以执行多次,也可以根据数据(if语句)完全不执行步骤。并行算法仅在步骤上强加了部分顺序,因此在这里我简化了。将其描述为部分有序的集合而不是序列会更正确,但是我想让这些单词更简单。此外,很容易将完整排序的部分排序集合嵌入。

结果:结束状态或值。它不一定是预先可预测的,但必须是满足某些条件的明确目标。这确实意味着操作系统不是算法,尽管它使用了大量算法。

有限:至少在可以运行足够长的机器上,算法一定会停止。不一定要保证它在可预测的时间内停止,也不能保证它会在太阳膨胀并在任何现有机器上变红之前停止。这也意味着操作系统不是算法,因为理想情况下它将永远运行。我已经见过“过程”一词,用于描述如果我们确定它会在某个时候停止的话,那将是一种算法。(有可能有一个算法会在未知的时间内停止。假设,例如,在非构造性证明中,哥德巴赫猜想在数学上被证明是错误的,因此有一个偶数> 2而不是两个质数之和。简单地测试偶数的算法最终会终止,

该算法是一种有意抽象的事物,因此我们不考虑诸如“在宇宙热死之前物理上可以执行此操作?”之类的问题。他们很难回答。如果它与计算机操作有关,那么很容易用编程语言来实现它。


-1

如果我必须给出一个广义的定义,我会说算法是一种解决计算问题的公式,该计算问题比明显/蛮力解决方案更为复杂,并且最终效率更高。

另外,重要的是要注意,算法不是任何特定的源代码;它是计算本身。除其他外,这意味着任何图灵完备的语言都可以实现任何其他图灵完备的语言都可以实现的算法。


我非常喜欢这个答案,并且我认为我们可以进一步说(尽管与原始问题无关):任何算法都是蛮力/树搜索解决方案的优化。想知道是否可以正式证明。
mojuba 2011年

-1“算法”是一个定义明确的数学术语。
2011年

1
@Apalala那么,为清楚起见,或者说是更好地理解其本质,是什么阻止您重新定义它?算法作为“指令集”对我几乎什么也没说。
mojuba 2011年

1
@mojuba我真的不在乎是否要重新定义该术语,但是我认为传统定义很有用,因为它至少在解决问题的方式之间有所区别:算法是使用有限资源解决问题的秘诀。更改该定义,可预见的结果是,我们将不得不提出另一个含义相同的词。该死!在过去的一个世纪中,关于可计算性和复杂性的所有知识在没有合理定义算法的情况下就消失了!
2011年

1
蛮力搜索是一种算法。通常这不是一个漂亮的算法,通常也不值得编写。我看不到将暴力排除在外没有真正的用处,而且在许多情况下,尚不清楚“比暴力更好”的实际含义。
David Thornley
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.