数据结构和算法之间是什么关系?[关闭]


13

我一直在寻找有关数据结构的好的在线课程,但发现Google还会返回算法课程的结果,其中包含以下内容:

在本课程中,您将学习算法设计的一些基本原理:分而治之方法,图形算法, 实用的数据结构(堆,哈希表,搜索树),随机算法等等。[资源]

在本课程结束时,您将了解为图形和其他重要数据结构设计新算法 并评估这些算法的效率所需的关键概念。[资源]

本课程介绍了计算问题的数学建模。它涵盖了用于解决这些问题的通用算法,算法范例和数据结构[资源]

我的问题是:算法和数据结构是否紧密相连,这意味着它们必须被一起理解,或者一个主题比另一个主题更基础?

编辑:对于那些投票赞成关闭这个问题的人,您能告诉我为什么以及也许如何改善这个问题吗?学习提出正确的问题是教育过程的一部分。


17
数据结构是静态的,无法执行任何操作。算法只是一组对某些数据执行的指令。没有一个,另一个就没有用。他们一起制作计算机程序。它们都是基本的。
Phoshi 2014年

2
@Phoshi错误。数据结构与处理数据的算法紧密相关。因此,紧密联系在一起的那些算法被视为数据结构的一部分。例如,“内联列表”数据结构告诉您如何保存数据以及如何读取和操作数据。
欣快2014年

7
@Euphoric我认为说算法是数据结构的一部分是错误的。实现二进制搜索的方法不止一种:例如,您可以进行朴素的if less than recurse to the left; if greater than, recurse to the right; if equal, return搜索,也可以进行更为复杂的搜索if less than recurse to the left; otherwise keep track of this value as a potential candidate and recurse to the right; check for equality once we reach the leaves。它们的比较次数略有不同。两者都是您可以选择对树执行的许多操作之一。
2014年

4
@Euphoric您将数据结构与数据结构和算法的组合所实现的抽象数据类型混淆了。
2014年

7
@Euphoric,我不同意。合并排序是一种算法。数组是一种数据结构。链表是不同的数据结构。我可以编写一个MergeSort的实现以对其中任何一个进行操作。对于特定的算法,某些数据结构可能更自然或更有效,但是它并不是绝对的要求(您确实必须有一个堆才能实现堆排序)。尼古拉斯·沃思(Nicholas Wirth)在1980年代写了一部很受欢迎的教科书,题为:“算法+数据结构=程序”
查尔斯·E·格兰特

Answers:


20

确实存在各种各样的混合物。您有不与算法相关联的数据结构,有不需要(实际)数据结构的算法,但是大多数情况下,两者是打包在一起的。

编辑:正如@Doval正确指出的那样,数据结构本身没有任何关联的操作。数据结构和算法相结合的行为形成了抽象的数据类型。

没有算法的数据结构

考虑例如用于存储二维坐标的数据结构,适当地称为Point。对于一个点,在算法上没有什么可做的,它实际上只是一个xy值的容器。当然,有了这种数据结构,您现在可以在其之上添加各种算法(距离计算,凸包,具有所需功能)。

您可以想到很多数据结构,它们只是单个数据的累积。尽管这些在实践中确实经常发生,但它们并不能构成很好的教材,因为没有什么可学的,一旦您了解了,单个数据项就可以累积到一个新的数据结构中(就像您学到的一样)在上面的Point示例之后,如果我为您提供了一个名为的出色数据结构Point3D,它可以对3维空间做同样的事情?)

没有(真实)数据结构的算法

“真实”,因为显然每个有趣的算法都需要原始数据类型,例如整数或布尔值,因此在此上下文中我们不希望将它们视为数据结构。与上述类似,这些算法通常非常简单。特别是,它们不会带有任何复杂的状态,因为它通常进入数据结构中(请参阅下一节)。

这种算法的一个示例是计算两个数字的最大公约数。Euklid的gcd算法实际上只需要保存两个整数并对其进行操作。

一旦事情变得越来越有趣,您很快就会进入抽象数据类型的世界。例如,Eratosthenes的筛子是基于数组的。现在我们可以讨论数组是否仍然是原始数组,或者实际上,您可以讨论整数是否还不是数据结构。无论哪种方式,即使您接受了孤立存在的算法,但完全没有数据结构的算法却很无聊。

结合数据结构(又称为抽象数据类型)的算法

现在这些是有趣的,但是出于两个截然不同的原因。通常,您可以从两个方向处理这些问题:首先是数据结构,或者首先是算法。

虽然抽象数据类型是通过数据结构+算法/操作的组合来定义的,但我们通常将其重点放在其中的一种上,而将另一种视为促成因素。

数据结构,然后是算法

您将遇到抽象数据类型,这些数据类型使用起来非常简单,但是涉及或多或少的复杂算法以使其在内部工作。例如,a HashMap使用起来很琐碎,但是涉及一个漂亮的哈希函数并处理内部的哈希冲突。但是,从您作为用户的角度来看,您关心的是它为您保留了数据,而不是为您提供服务的东西。

与下面的最后一组相反,这些数据结构不会将其用户暴露给这些算法。您无需了解或关心HashMaps的内部哈希函数就可以使用它。(但是,要有效地使用它,您可能想知道这些事情;)

算法,然后是数据结构

另一个方向意味着您拥有一种算法,希望能够简单地使用它,但是需要内部使用数据结构来使其按预期工作。一个示例就是二进制空间分区(BSP)算法,您可以简单地Point从一组最接近给定查询点的点中请求二维。但是,您实际上需要在内部使用树结构(甚至包括距离计算在内的其他算法)来编写算法。

通常,可以说该组中的算法使用相关的数据结构来表示其内部状态。我会争辩说,这组算法是最多样化的,您会发现许多适合这种通用方案的算法。就观点而言,我们认为它们很有趣,因为它们为我们做了一些事情(例如排序),并且不太在意数据保存部分。

紧密相关的数据结构和算法

最后,您拥有数据结构,这些数据结构与直接对应于它们的算法非常相关。一个典型的例子是一棵二叉树,当您想对它进行有意义的处理时,它会强制您执行树遍历算法的主题(深度优先,宽度优先等)。

对于这些情况,我们经常更改结果抽象数据类型的视图重点。有时,您关心树的结构,几分钟后,您关心的是能够在树上运行查找操作,然后您想知道是否删除节点,然后马上考虑结构的外观。尽管上述所有其他部分也都适用,但例如,当您将数据存储到中或从中检索数据Map时,或者在对链表进行排序时,这并不是您要关注的重点。


1
您正在混合数据结构和抽象数据类型。数据结构没有任何作用。说“您将遇到使用起来相当简单的数据结构”是没有意义的,因为数据结构只是一个结构。A Map是一种抽象数据类型,可以使用特定的数据结构和一组算法来实现,这些算法通过遍历和操纵结构来产生所需的结果。数据结构不会隐藏算法,因为它没有算法。抽象数据类型皮的数据结构(这是什么使得它的抽象。)
Doval

请注意,从某种意义上讲,算法始终是隐藏的,因为无法检查功能。这可能就是为什么在lambda演算中将它们称为抽象(其唯一的数据类型是函数)的原因。
2014年

2
你是对的。不过,我看到了我们如何看待不同的ADT之间的区别。我已经编辑了答案,希望现在可以更清楚地了解它,并且不再将结构与ADT融合在一起,同时仍要强调,您可以专注于任何ADT的结构和/或操作。
弗兰克

说数据结构是名词而算法是动词真的太简单了吗?我想你可能会说,该算法是动词的实施,但你仍然寻找棵树,即使搜索是一个二进制搜索。这么说,您会错过所有技术细节的,但是它确实具有一定的优雅感。
Magus 2014年

@Doval:即使一个数据结构仅由数组中的一堆数字组成,这些数字必须彼此具有并保持某种关系,但是如果可以很容易地维护所需的不变式,那么这种事情就可能是“易于使用的”同时执行某人想要的操作,如果困难则“难以使用”。
2014年

5

数据结构通常会影响算法的细节。因此,这两个经常并存。

例如,考虑一种用于修剪草坪的算法。修剪草坪的方式可能会受到草坪实际结构的影响。如果您住在人口稠密的郊区的一所小房子里,而草坪只是面积为几平方米的小矩形,则您可能更希望使用推草机而不是拖拉机/割草机割草。如果您的草坪涉及许多英亩的平整草地,那么您可能更喜欢骑马割草机而不是推草机(尽管任一个割草机最终都能完成工作)。如果您的草坪涉及面积大且平坦的土地,但有几处小山丘和许多树木,那么您可能会开发出一种更有趣的算法来修剪草坪,既涉及割草机又包括推草机或其他一些草切割技术。

但最终,数据的结构可能会对您如何开发算法(或使用哪种算法)的决策产生重大影响。因此,这两个主题经常并存。

反之亦然:有时我们想要使用的算法(至少在计算开始时)会影响为支持该算法而开发的数据结构。例如,从数组列表到链接列表的概念,最后到BST,用于存储允许快速查找的有序列表。

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.