【问题标题】:Choice of programming language for learning data structures and algorithms [closed]选择用于学习数据结构和算法的编程语言 [关闭]
【发布时间】:2011-02-09 02:14:38
【问题描述】:

您会推荐使用哪种编程语言学习了解数据结构和算法

考虑以下几点:

  • 个人经历
  • 语言功能(指针、OO 等)
  • 适合学习 DS 和 A 概念

我问是因为那里有一些与编程语言无关的书(从数学角度编写,并使用伪代码)。如果我从其中一个中学习,我想选择一种编程语言来编码和运行算法。

然后,还有其他书籍介绍了 DS & A 概念以及用特定编程语言编写的示例——我也想编写这些算法的代码——因此,在某种程度上,该语言也选择了这本书。

无论哪种方式,我都必须选择一种语言,而且我更愿意始终坚持使用一种语言。抛开个人语言偏好,哪一个最适合这个目的?

【问题讨论】:

  • 除了具体的,没有办法回答这个问题,这需要更多的信息。
  • @David Thornley :我知道这有点开放,但它已经得到了很多非常好的答案!
  • 关于算法和数据结构的能量(过去是:时间)效率有很多争论:如果以及当您想要测量这一点时,请寻找可重复(且容易)获得有意义数字的系统。

标签: algorithm data-structures language-agnostic


【解决方案1】:

我更喜欢 C++ :)

【讨论】:

  • -1 C++ 是一种糟糕的学习语言(可以说您可以从该语句中删除“学习”限定词)。
  • 他不需要学习 C++ 的黑暗角落就可以用 C++ 编写他的算法。 C++ 非常好。
  • 所以你认为尝试在 C++ 中为 DS 编写一个类并了解复制构造函数与覆盖等于运算符、引用和超出范围的指针之间的差异是个好主意,由于不正确的新/删除使用等导致的内存泄漏?所有这些都是 C++ 的基础。
  • 但关键是您不必在 python 或 java 中学习这些东西。 C++ 需要更大的初始投资,并且对 OP 请求的功能没有任何价值
  • 有什么正当理由不推荐使用 Javascript 来学习 @cletus?
【解决方案2】:

Python 很棒。易于阅读,功能齐全。如果您打算使用伪代码,Python 看起来会很熟悉。

Python 已经是 UC Irvine 选择的算法语言,它的描述如下:
Python 代表了一种面向算法的语言,在教育中非常需要它。Python 的优点包括其类似于教科书的语法和鼓励实验的交互性。

Python 还可以与图形制作工具 Gato 一起以初学者友好的方式工作。学习算法和数据结构是一个可以通过可视化来提供帮助的顶级课程,Gato 可以轻松做到这一点(无需学习任何复杂的图形库)

【讨论】:

  • @mvid : 有没有你推荐的基于 python 的 DS & A 书?
  • @bguiz:虽然我没有亲自阅读过,但有这本免费的电子书,主要介绍在 Python 中使用 OO 的算法和数据结构:brpreiss.com/books/opus7
  • 只有在你认为使用空格作为分隔符的编码很棒时,Python 才会很棒
  • 空白作为分隔符很棒!
  • 我个人不喜欢 Python,因为它在语法上使用了缩进。我发现由于未对齐而发现愚蠢的错误比基于花括号等的语法更难找到,并支持额外的类似 nroff 的对齐。
【解决方案3】:

如果你想走阻力最小的路,那么 Python。它将有最少数量的不必要的样板等。

理想情况下,我想学习 C 中的算法,这样您就可以了解内存级别的情况;我还想用函数式语言学习算法,这样你就可以看到类似的算法如何与持久数据结构一起工作。

Knuth's famous books 包含大量(发明平台)汇编代码。如果您想成为超级铁杆,建议您这样做。不过,就我个人而言,我在学习算法课时曾使用 C 语言(披露:这只是几年前的事)。我有时会在 Knuth 中解决一些问题,但我不知道我是否会完全使用 MMIX 作为学习算法的首选语言。我觉得这有点矫枉过正。

编辑: 这也取决于你熟悉什么。如果您现在想开始研究算法文本,并且您从未使用过 C 语言,那么 Python 无疑是正确的答案。你不希望语言成为一个巨大的障碍,因为你想享受它。我知道我做到了。

最后一点:至少在我学习算法的时候,我在纸上花了很多时间。我认为这很重要——我的意思是你想学习渐近学等。把所有的时间都花在用任何语言实现算法上是不该做的事情。

【讨论】:

  • @Rob Lachlan : 有没有你推荐的基于 python 的 DS & A 书?
  • @bguiz:我喜欢的大多数关于算法的体面书籍都与语言无关——Cormen 等人、Kleinberg 和 Tardos。我真的不会根据语言选择一个。
【解决方案4】:

我推荐Java主要是因为:

  • 垃圾回收
  • 参考文献
  • 丰富的收藏

编辑:请反对的选民解释一下。

【讨论】:

  • 为什么大家都投票反对?
  • 我认为因为你不喜欢 Java(这似乎正在发生)而对此投反对票是不负责任的。您可能不喜欢 Java,但它很简单,可以用作学习语言。所以我要 +1。
  • +1。不是我的选择,但实际上,这并不可怕。投票分数就像你建议的 COBOL。
  • +1 因为对于初学者: 1. 确切地说,您不必担心内存分配/释放(至少对于小型程序)。相反,您可以专注于暂时要学习的内容。 2. 是的,没有偷偷摸摸的指针或指向指针的指针。不要误会我的意思,我喜欢 C++。 3. Java 中的集合可能是我见过的最精炼的数据结构集。它们确实应该在数据结构下的字典中。 :)
  • 如果您不了解如何进行自己的资源管理,那么您对数据结构的了解并不多。
【解决方案5】:

在我看来,C 将是学习数据结构和算法的最佳语言,因为它会迫使您编写自己的语言。它将迫使您了解指针、动态内存分配以及流行数据结构(如链表、哈希表等)背后的实现。其中许多在高级语言(Java、C# 等)中是理所当然的。 )。

【讨论】:

  • 指针和动态内存分配对数据结构和算法一无所知,但它们确实严重阻碍了您希望完成的工作。
  • 我同意。在处理了几十种不同的语言之后,并且首先学习了一种更高级、高度抽象的语言,当我决定学习 C/C++ 时,我感到很痛苦,突然间我不得不处理很多从未向我解释过的东西前。首先学习 C(而不是 C++)是一个很好的选择,因为它向您展示了机器的实际工作方式,并且您首先拥有强制创建数据结构的所有限制。所有语言为您提供的都是函数(用于算法)和结构(用于数据结构)。理论与语言之间的差距非常小。
【解决方案6】:

这个问题的答案取决于你想学什么。

Python 和 Ruby

​​>

通常建议使用 Python 和 Ruby 等高级语言,因为它们是高级语言且语法可读性强。然而,这些语言都有对通用数据结构的抽象。没有什么可以阻止您将自己的版本作为学习练习来实现,但您可能会发现您正在其他高级数据结构之上构建高级数据结构,这不一定有用。

此外,Ruby 和 Python 是动态类型语言。这可能很好,但也可能让初学者感到困惑,并且(最初)捕获错误可能更难,因为它们通常要到运行时才会显现出来。

C

C 是另一个极端。如果您想学习真正的低级细节(例如如何管理内存),这很好,但内存管理突然成为一个重要的考虑因素,例如正确使用 malloc()/free()。这可能会让人分心。此外,C 不是面向对象的。这不是一件坏事,但值得一提。

C++

已经提到了 C++。正如我在评论中所说,我认为这是一个糟糕的选择。即使在简单的使用中,C++ 也非常复杂,并且有大量可笑的“陷阱”。此外,C++ 没有通用的基类。这很重要,因为像哈希表这样的数据结构依赖于一个通用的基类。您可以为名义上的基类实现一个版本,但它的用处有点小。

Java

Java 也被提及。许多人喜欢讨厌 Java,而且该语言确实非常冗长并且缺乏一些更现代的语言特性(例如闭包),但这些都不重要。 Java 是静态类型的并且具有垃圾收集功能。这意味着 Java 编译器将捕获许多动态类型语言不会捕获的错误(直到运行时),并且没有处理分段错误(这并不是说您不能在 Java 中泄漏内存;显然您可以)。我认为 Java 是一个不错的选择。

C#

C# 语言 就像是更现代的 Java 版本。与 Java 一样,它是一种在虚拟机上运行的托管(垃圾收集)中间编译语言。除了 C/C++ 之外,这里列出的所有其他语言也可以在虚拟机上运行,​​但 Python、Ruby 等是直接解释的,而不是编译为字节码。

基本上,C# 与 Java 具有相同的优缺点。

Haskell(等)

最后,你有函数式语言:Haskell、OCaml、Scheme/Lisp、Clojure、F# 等。这些语言以非常不同的方式思考所有问题,在某些时候值得学习,但又归结为你想要什么学习:函数式编程还是数据结构?我会坚持一次学习一件事,而不是混淆这个问题。如果您确实在某个时候学习了一门函数式语言(我会推荐),Haskell 是一个安全且不错的选择。

我的建议

选择 Java 或 C#。两者都有免费的优秀 IDE(Java 的 Eclipse、Netbeans 和 IntelliJ 社区版、C# 的 Visual Studio Express、Visual Studio 社区版),使编写和运行代码变得轻而易举。如果您不使用比数组和您自己编写的任何对象更复杂的本地数据结构,您将学到与 C/C++ 中基本相同的东西,但不必实际管理内存。

让我解释一下:如果添加了足够的元素,则需要调整可扩展哈希表的大小。在任何实现中,这意味着将支持数据结构(通常是数组)的大小加倍并复制现有元素。所有命令式语言的实现基本相同,但在 C/C++ 中,当您未正确分配或取消分配某些内容时,您必须处理分段错误。

Python 或 Ruby(哪个并不重要)将是我的下一个选择(并且与其他两个非常接近),因为一开始动态类型可能会出现问题。

【讨论】:

  • @cletus :感谢您的合理回答!你会推荐什么 DS&A 书籍/其他说明材料(对于 java 或 python)?
  • @bguiz 你可能想问一个单独的问题。关于这个主题有几个问题可以参考stackoverflow.com/search?q=book+data+structures+algoritms您可以通过在搜索中添加 [java] 或 [python] 来细化。
  • 我不会使用 Java 和 C#,主要是因为严格的面向 OO 方向,这对我来说是不必要的。此外:当重点是学习数据结构时,谁会关心编写通用代码?在我看来,要么选择一种脚本语言(Python)并专注于高级语言,要么选择一种低级语言 C/C++ 并尝试查看它是如何在机器级别实现的。中间停下来似乎不值得。
  • Python 没有先编译成字节码?给我的消息:docs.python.org/release/2.5.2/lib/bytecodes.html
  • 这毫无意义:“这很重要,因为像哈希表这样的数据结构依赖于一个通用的基类。”哈希表依赖于可哈希的元素,但如何在编程语言中实现这一点的细节与数据结构的抽象定义无关。
【解决方案7】:

“如果你唯一的工具是锤子,那么你所有的问题都会看起来像钉子”

至少学习几门语言。

此外,您的选择取决于您的目的。

爱好? Windows 世界的工作? Linux/UNIX 系列?

应用类型:商业与科学;硬件驱动程序或应用程序?

桌面应用还是网络应用?

我有几个建议给你。

(a) 一定要学习一些 J(从 jsoftware.com 免费获得;APL 的继任者;J 和 APL 都是图灵奖得主 Ken Iverson 的创作……图灵奖就像计算机领域的诺贝尔奖)。

(b) 如果您在 Windows 世界中,请从 c# 开始,因为 .NET 中的很多内容都在 c# 上运行。如果可以,请从 Microsoft Press 获取 Tom Archer 的“Inside c#”的副本。您可以通过下载微软的 express 版本获得一个免费的 c# 开发系统。

(c) 学会使用TDD/BDD……不管是什么语言,先写一个小测试,叫做单元测试;接下来您编写生产代码以通过单元测试;一次一小步……这不仅仅是您使用的语言,还有方法。

(d) 学习一些汇编语言...汇编语言是低级的,几乎是机器语言,它会让你很好地了解幕后发生的事情。

(e) 在 Windows 世界之外,我推荐使用 c++。

没有最好的语言。

如果只是语言,编程会更容易。

您不仅想学习非常具体的算法,还想学习更通用的模式,可以帮助您选择解决给定问题的方法。

有一件事是肯定的:如果你要成为一名程序员,你可能永远不会用完要学习的东西。

【讨论】:

  • @bguiz 数据结构可以完全独立于语言的所有意图;这是学习不同语言的原因之一。您还会遇到可能导致沮丧甚至悲伤的细微差异;例如,数据类型命名:SQL Server 的位是 c# 的 bool 和 vb 的 Boolean。数据类型大小也不同;例如,c# 中的 int 固定为 32 位,而在 c++ 中它的大小和存储容量取决于平台。字符集也会影响您的数据结构大小;例如,7 位 ASCII、8 位 ASCII、Unicode。然后是固定大小与变化等。
  • “数据结构可以用于完全独立于语言的所有意图”。要以不提供垃圾收集的语言实现大多数纯函数式数据结构,您基本上必须编写垃圾收集器。这是一个严重的障碍。
  • 一旦精通OO,尝试涵盖声明式编程。
【解决方案8】:

我可能错了,但数据结构和算法不是独立于编程语言吗?

说到底,数据结构只是一种组织数据的方式;任何高级语言都将支持这一点。当然,某些语言将具有实现基本数据结构的机制(例如 Java 中的 Collections Framework 或 C++ STL),但这不会阻止您使用您选择的编程语言来编程数据结构。此外,算法是用伪代码编写的,使其与语言无关。

我意识到这并没有真正回答您的问题,但我无法掌握您要查找的内容;学习数据结构/算法或学习一门新语言。

【讨论】:

  • @Pran :我知道算法在伪代码中 - 但伪代码不会编译。我是一个动手类型的学习者,所以要真正理解这些概念,我需要用一种可以编译和运行的语言对其进行编码。因此,我的问题确实是什么语言最适合这个,因为每种语言都有自己的优缺点,这使得其中一些语言比其他语言更适合学习 DS&A。
  • @Pran:“我可能错了,但数据结构和算法不是独立于编程语言的吗?”。如果该语言不提供 GC,那么您可能必须编写一个。
【解决方案9】:

如果目的只是了解数据结构算法,我会说JavaScript。您可以在浏览器中运行您的代码。你有一个非常灵活的对象处理,你可以完全专注于数据结构和算法,而不是内存管理、语言结构或其他会让你把注意力从你正在学习的实际计算机科学中转移开的东西。

好处还在于,您可以通过使用浏览器使用 DOM 和 Canvas 呈现图形和树来轻松可视化各种数据结构。

多年来,CS 课程倾向于改变教授该科目的语言,这仅仅是因为易于学习的更新更好的语言实施已经到来,这使得更容易专注于实际问题。

【讨论】:

  • +1 因为 JavaScript 让人们可以轻松学习函数式编程,并且能够使用它开发 Web 应用程序的广泛适用性。
  • 非常正确。我在开发工具 sn-p 中测试我的代码。此外,我可以类似地在其中编写自己的数据结构。没有链接列表或任何其他内置结构。一切都只是对象。除非我在做有竞争力的编程,否则它可以学习二进制搜索、trie 和所有其他概念。没有?
  • 完全同意,让你专注于逻辑,没有太多仪式和简单的语法。
【解决方案10】:

我建议艾达。它具有其他语言中没有的数据结构功能,例如范围检查type Day is range 1 .. 31; 它还具有非常严格的编译时和运行时检查(除非您选择将其关闭),从而更容易在您的实施。

【讨论】:

    【解决方案11】:

    Oberon-2Component Pascal。最后一个是第一个的超集。

    爱因斯坦曾经说过“让它尽可能简单,但不要简单。” 这句话被 Niklaus Wirth 教授选为原始 Oberon 语言报告的题词。上面提到的奥伯伦的后代也是如此。

    谈到编程语言的完美,我喜欢引用 Antoine de Saint-Exupéry 的话:“设计师知道他已经达到了完美,而不是不再需要添加任何东西,而是不再需要任何东西。离开。”。 Wirth,即使没有做到这一点,也正走在正确的道路上。在“Wirth 编程语言行”(Algol -> Pascal -> Modula-2 -> Oberon -> Oberon-2)中,每种后续语言都比前一种更简单,同时更强大。

    强大而简单的语言遵循最小意外原则。强大的静态类型,简单的面向对象设施,垃圾收集。功能列表并不大,但足以提高生产力并且不会使事情复杂化,尤其是在初始阶段。

    当您想学习算法和数据结构时,您就是认真的。但是,如果您的语言“强大”(具有 C++、C#、Java、Python 等许多特性),您将浪费大量时间学习语言,而不是算法和数据结构。你不会只见树木不见森林。 =)您可以将树视为语法元素(和任何其他特性),将森林视为重要概念(任何算法、数据结构,可能是 OOP 等等)。您的语言中的特征(树)越多,后退一步并理解概念(看森林)的任务就越复杂。

    但是,如果语言真的很强大(具有少量经过验证的功能),那么语言本身就会排在第二位。没有那么多树,所以你可以退后几步......好吧,我认为这已经足够类比了。 =)

    还有许多关于算法和数据结构的书籍使用类似 Algol/Pascal 的伪代码,并且很容易将示例转换为这种语言。您可以直接使用 Wirth 的“算法和数据结构”一书中的示例。 Oberon 版 (2004),PDF (1.2 MB)。

    一些额外的链接:

    【讨论】:

    • @kemiisto :感谢 uniuue 和新颖的回答 - 以及类比!我也会研究 Oberon-2。
    • 谚语的英文版是“只见树木不见森林”。
    【解决方案12】:

    您可能会喜欢具有代数数据类型和模式匹配的语言,例如标准 ML、OCaml、F# 或 Haskell。例如,这里有一个用 OCaml/F# 编写的重新平衡红黑二叉搜索树的函数:

    let balance = function
      | R(R(a, x, b), y, c), z, d | R(a, x, R(b, y, c)), z, d
      | a, x, R(R(b, y, c), z, d) | a, x, R(b, y, R(c, z, d)) ->
          R(B(a, x, b), y, B(c, z, d))
      | a, x, b -> B(a, x, b)
    

    【讨论】:

    • 感谢您的讽刺,先生。
    【解决方案13】:

    除了丑陋的 C++ 之外的任何语言都可以。

    【讨论】:

      【解决方案14】:

      我认为 Lisp 值得研究。

      我的第一门大学编程课程是 Lisp。在此之前,我已经用多种语言编写程序 10 年了。我以为第一次编程课程会很无聊,但我错了。

      Lisp 是一种非常有趣的语言,因为它的语法非常简单。重点从语法转移到功能。函数式编程风格也是非常值得学习的东西。在完成 Lisp 课程后,我发现自己以一种全新的、更好的方式用 C++ 编写程序,这要归功于 Lisp 教给我的新概念。

      Lisp 也对代码和数据使用相同的表示,这为有趣的算法设计开辟了道路,代码是动态生成然后执行的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-21
        • 2011-02-22
        • 2011-02-04
        • 2018-04-09
        • 2013-10-21
        • 2012-11-19
        • 2011-10-01
        • 1970-01-01
        相关资源
        最近更新 更多