算法和设计模式有啥区别

Posted

技术标签:

【中文标题】算法和设计模式有啥区别【英文标题】:What's the difference between an Algorithm and a Design Pattern算法和设计模式有什么区别 【发布时间】:2010-10-08 04:52:39 【问题描述】:

我正在搜索“撤消/重做算法”并找到标记为重复的内容,但该重复项是对“撤消设计模式”的请求。我真的很想要一个算法。我认为我不一定需要设计模式。

“设计模式”和“算法”之间是否存在根本区别,或者可以互换使用这两者?

我会挂断我的回答。

好的,请原谅我认为设计模式只是算法的抽象。这是我从答案中得到的一个小表格,这些结果都非常好。

设计模式 |算法 ------------------|---------------- 摘要 |具体的 控制结构 |一组动作 模板 |执行 灵活 |确定性 蓝图 |食谱

【问题讨论】:

令我震惊的是,您并不是真的在寻找算法。您将提供哪些输入,执行算法后您希望得到哪些输出? 这是一种算法还是一种设计模式(或灾难的秘诀)? 1. 执行查询时,将相反的“撤消”查询压入堆栈。 2.当按下撤消按钮时,从堆栈弹出查询并运行它。也许问题是不确定性? 【参考方案1】:

算法就像一个食谱:执行某些活动的分步过程。

设计模式就像一个蓝图:一个结构化的对象、关联和操作的集合,以实现某个目标。

【讨论】:

【参考方案2】:

是的,有区别。

算法是执行某些任务的秘诀 - 一组明确的有限指令,通过对输入进行操作并产生输出来实现某个目标。通常,算法以与语言无关的伪代码表示,然后可以用您选择的语言实现。

设计模式是一种结构化代码的方式,以便优雅地表达功能组件之间的关系。您可以在算法的实现中使用设计模式。例如,您可以使用一种算法进行树的有序遍历,以确保您按特定顺序访问树数据结构的所有节点。您还可以实现 visitor 设计模式来表达您的实现如何将控制权返回给调用上下文以指示节点已被访问。这不是算法的一部分,而是软件设计的一部分,以及如何构建软件的每个组件可以使用的接口。

算法和设计模式是正交的,尽管它们很可能同时使用。

【讨论】:

【参考方案3】:

设计模式是对如何在架构级别解决问题的相对模糊的描述,强调灵活性和可维护性。算法是对如何计算特定事物的精确描述,强调正确性和效率。

【讨论】:

【参考方案4】:

设计模式不能直接转换为代码。它是一种“策略”,可用于应用程序的设计。该术语的起源是计算机科学之外的。阅读 Christopher Alexander 以了解更多信息。

另一边的算法可以用代码表示。它是针对任何输入解决特定问题的一系列操作。

【讨论】:

【参考方案5】:

算法是一组步骤/操作/命令/指令,它们在所有情况或状态变化中以指定的顺序/方式工作。在撤消/重做的情况下,它将涉及在每个接合点存储先前的状态,然后根据命令复制它(通过应用程序具有的任何方式)。但由于这个定义非常模糊,而且每个特定情况都不同,我们希望创建一个更通用的设计模式,可以将特定应用的功能插入其中。

在软件工程中,设计模式是针对软件设计中常见问题的通用可重复解决方案。设计模式不是可以直接转换为代码的完成设计。它是关于如何解决问题的描述或模板,可以在许多不同的情况下使用。 --SourceMaking

Christopher Alexander 是建筑师,他首先研究了建筑和社区中的模式,并开发了一种“模式语言”来生成它们。

每个模式都描述了一个在我们的环境中反复出现的问题,然后描述了该问题解决方案的核心,以这样一种方式,您可以使用该解决方案一百万次,而无需这样做同样的方式两次。 ——克里斯托弗·亚历山大

所以这些术语不能互换,因为它们指的是不同的设计水平。

【讨论】:

【参考方案6】:

我会说设计模式定义了结构,而算法定义了行为。

例如,您可以将几种不同的算法与Strategy design pattern 结合使用。

【讨论】:

【参考方案7】:

算法是执行任务的一组特定步骤。解码音频或视频文件将使用算法。

设计模式更像是设计具有某些特征的系统的模板。

【讨论】:

【参考方案8】:

它们是不同的:http://en.wikipedia.org/wiki/Design_pattern_(computer_science) 与 http://en.wikipedia.org/wiki/Algorithm

使用命令设计模式(http://en.wikipedia.org/wiki/Command_pattern),很容易实现撤销/重做:http://www.cs.mcgill.ca/~hv/classes/CS400/01.hchen/doc/command/command.html

相关问题:Design Pattern for Undo Engine

【讨论】:

【参考方案9】:

当我第一次学习设计模式概念时,我也很惊讶为什么在算法存在的情况下引入设计模式。随着我对设计模式的了解不断增加,我发现算法是完全不同的解决问题的方法,设计模式也不同。

设计模式基本上是针对特定上下文中的软件应用程序的相同问题的重复解决方案,这与算法无关,因为算法是解决问题的分步说明。

【讨论】:

【参考方案10】:

设计模式将决定您如何设计算法(或者可能与算法无关,但假设我们正在处理的算法),而算法将是一组可靠的、可重复的、可实现的,做某事的步骤。所以不,我不会称它们为可互换的。

【讨论】:

【参考方案11】:

如何组织特征类型而不是特定特征可能是将“设计模式”与“算法”区分开来的关键......

设计模式描述了常见设计问题的通用解决方案。 “每个模式都描述了一个在我们的环境中反复出现的问题,然后描述了该问题解决方案的核心,以这样一种方式,您可以使用该解决方案一百万次,而无需以相同的方式使用它两次” (Christopher Alexander) 在编程中,这是通过描述软件对象之间的特定关系集(代表概念或现实世界对象)来完成的。应该避免描述具体的实现,因为它会降低设计模式的通用性。

算法是一组定义如何执行任务的步骤。算法中每个步骤的执行不需要创造性技能。相反,它只需要遵循指示的能力。 (警告:非确定性算法,不符合这个限制,是一个重要的研究课题)

所以,我认为对这种关系的一种描述可能是将特征与功能分开。然而,一个对象的特征集合将决定它的功能,因为每个子特征都有封装在其中的功能。当您将许多小对象组合成一个更大的对象(例如,将不同类的实例放入程序中)时,其中一些将协同工作以创建它们自己没有的新功能(整体大于其部分的总和) )。你可以说这只是一个新算法,但它也是一个新对象。特性和功能是同一枚硬币的两个方面,不可能完全分开。但是如何组织特征的类型而不是特定的特征可能是将“设计模式”与“算法”分开的关键,因为如果设计模式是关于组织特定的特征,即特定类的实例,那么算法已经提出并且每次实现都完全相同,即它不会是通用的,并且您不能“使用此解决方案一百万次,而不以相同的方式使用两次”。

【讨论】:

【参考方案12】:

设计模式:

一个常见但普遍问题的解决方案。 一般问题的一般解决方案。 通常每次使用时都必须实施。

算法:

您可以遵循的特定步骤来回答特定问题。 直接实施以解决具体问题。

【讨论】:

以上是关于算法和设计模式有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

反向传播和反向模式 autodiff 有啥区别?

AES共有ECB,CBC,CFB,OFB,CTR五种模式分别有啥区别

AES共有ECB,CBC,CFB,OFB,CTR五种模式分别有啥区别

工厂模式和策略模式有啥区别?

工厂设计模式和DAO设计模式有啥区别

设计模式和架构模式有啥区别?