为什么“算法”和“数据结构”被视为单独的学科?

时间:2010-03-14 10:38:54

标签: algorithm data-structures

This问题是最后一根稻草;我一直想知道它,

为什么人们会将“算法”和“数据结构”视为可以相互分离的东西?

我看到很多证据表明他们在程序员心中已经分开了。

  • 他们request“数据结构和算法”书籍
  • 他们将“数据结构”和“算法”称为单独的大学课程
  • 他们“知道算法”,但“在数据结构中很弱”(找不到链接,抱歉)。

在我看来,“数据结构”算法,因为“数据结构”的概念是关于算法来操作进出结构的数据。但这种观点似乎不是主流。我错过了什么?

编辑:遗憾的是,我没有很好地提出问题。人们编写的程序中数据结构和算法的分离是很自然的,因为前者是数据,后者是函数(在STL这样的半功能框架中,它是整体的核心)的东西)。

但上述观点和问题本身指的是人们认为的方式,以及他们在脑海中安排知识的方式。这甚至不需要与代码编写相关联。


以下是人们将“算法”和“数据结构”分开时的一些链接:

9 个答案:

答案 0 :(得分:14)

他们是不同的。考虑图表或树木更具体。现在,树似乎只是一棵树。但您可以按预订,订购或后序浏览(3 算法,一个结构)。

一个节点可以有多个或只有2个子节点。树可以是平衡的(如AVL)或包含其他信息(如数据库中的B树索引)。这是不同的结构。但是你仍然使用相同的算法来遍历它们。

现在看?

另一点:算法有时是,有时不是独立于数据结构。某些算法在不同结构上具有不同的复杂性(在图中找到表示为列表或2D表的路径)。

答案 1 :(得分:2)

人们将它们称为不同的实体,因为它们是。假设我想从一组数据中找到一个元素。如果我将数据放入数组中,则数组是数据结构。一旦它在数组中,我可以使用多种不同的算法来找到我感兴趣的元素。我可以对数组进行排序(使用多种排序中的任何一种)然后使用二进制搜索,我可以线性检查每个元素,等等。选择数组作为我将使用的数据结构,而不是链表,而不是选择算法。

那就是说,理解另一个是很重要的。如果您不能很好地理解算法,那么不同数据结构的优点和缺点并不明显,反之亦然。因此,同时教他们是有意义的。然而,它们是不同的实体。

[编辑]想一想:如果查看大多数算法的伪代码,则不指定数据结构。你可能有一个元素的“列表”来迭代等,但是该列表的确切实现对于算法的正确性并不重要。

答案 2 :(得分:2)

算法和数据结构紧密结合在一起。算法依赖于数据结构,如果更改其中任何一个,复杂性将发生很大变化。它们不一样,但绝对是同一枚硬币的两面。选择一个好的数据结构本身就是一种更好的算法。

For instancePriority Queues可以使用二进制堆二项式堆实现,二进制堆允许窥视恒定时间内的最高优先级元素,而二项式堆需要O(log N)时间进行偷看。

因此,特定算法最适合特定数据结构(在特定上下文中),因此算法数据结构齐头并进! / p>

答案 3 :(得分:1)

我想说这是因为函数式编程将操作的内容与操作本身区分开来。目标和行动肯定是不同的,即使它们紧密相连。

这是面向对象的编程,它将数据和操作放在一个组件中。也许如果OO早些时候出现,就会有一门学科。

答案 4 :(得分:1)

我认为算法是 数据结构的算法,因此两者之间存在差异。一个简单的数据结构是一个数组,但是有很多算法在简单数组上运行,因此必须有一种方法将两者分开。数组也可以表示树,并且使用专门的算法处理树。

差别并不大,因为大多数时候你不可能没有其他的,但有时你可以。考虑确定数字是否为素数的简单算法 - 它不使用数据结构。考虑GCD算法,也没有数据结构。您可以在不讨论数据结构的情况下讨论算法,但如果不经常讨论算法,就无法谈论数据结构。你可以谈论一棵树,但你需要插入,删除等算法。

我觉得有区别是因为它们在概念上是不同的东西。算法是用于完成任务的一组步骤,而数据结构是用于存储数据的东西,所述数据的操作是通过算法完成的。

答案 5 :(得分:1)

他们单独的大学课程。通常,数据结构课程强调编程,是算法课程的先决条件,强调算法的数学分析。我不认为很难理解为什么许多在CS接受过本科教育的人可能认为他们是分开的。

答案 6 :(得分:0)

我同意你的看法。两者都是同一件事的两面。

在谈论数据结构时,总是以某种方式存储数据以优化对这些数据的某些操作,这导致我们算法和复杂性。

答案 7 :(得分:0)

当然,这两者紧密相连。这就是为什么你提到的帖子都要求书籍。但并不总是如此。例如,无论您正在处理何种数据结构,排序算法的核心都将保持不变。

答案 8 :(得分:0)

Algorithm + Data Structures = Programs(1975)这本书的标题正是由Niklaus Wirth提出的,表明两者对于编写程序都是必不可少的。