可选择用于学习数据结构和算法的编程语言

时间:2010-04-17 06:30:12

标签: algorithm data-structures language-agnostic

您会建议使用学习 数据结构和算法

考虑以下因素:

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

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

然后,还有其他书籍介绍DS&一个用特定编程语言编写的例子的概念 - 我也想编写这些算法 - 因此,在某种程度上,语言也会选择这本书。

无论哪种方式,我都必须选择一种语言,而我宁愿坚持使用一种语言。撇开个人语言偏好,哪一个最适合此目的?

14 个答案:

答案 0 :(得分:78)

这个问题的答案取决于你想要学习的内容。

Python和Ruby

通常建议使用Python和Ruby等高级语言,因为它们是高级语言,语法非常易读。但是,这些语言都具有公共数据结构的抽象。没有什么可以阻止你实现自己的版本作为学习练习,但你可能会发现你在其他高级数据结构之上构建高级数据结构,这不一定有用。

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

C

C处于另一个极端。如果你想学习真正的低级细节,例如如何管理内存,但内存管理突然是一个重要的考虑因素,就像正确使用malloc()/ free()一样。这可能会分散注意力。此外,C不是面向对象的。这不是一件坏事,只是值得注意。

C ++

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

爪哇

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(Eclipse,Netbeans和IntelliJ Community Edition for Java,Visual Studio Express for C#,Visual Studio社区版),使编写和运行代码变得轻而易举。如果你没有使用比数组更复杂的本机数据结构和你自己编写的任何对象,你将学习与在C / C ++中基本相同的东西,但不必实际管理内存。

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

Python或Ruby(它并不重要)将是我的下一个选择(并且非常接近其他两个)只是因为动态类型最初可能会有问题。

答案 1 :(得分:38)

我建议Java主要是因为:

  • 垃圾收集
  • 引用
  • 丰富的藏品

编辑:请选民下来解释。

答案 2 :(得分:26)

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

答案 3 :(得分:13)

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

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

Python还可以通过图形制作工具Gato以初学者友好的方式工作。学习算法和数据结构是一个可以帮助实现视觉效果的顶级,Gato使其易于操作(无需学习任何复杂的图形库)

答案 4 :(得分:10)

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

通过使用浏览器使用DOM和Canvas渲染图形和树木,您可以轻松地可视化各种数据结构。

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

答案 5 :(得分:7)

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

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

当谈到编程语言的完善时,我想引用Antoine de Saint-Exupéry:“设计师知道他已经达到了完美状态,而不是在没有任何东西需要补充的时候,但是已经不再需要采取任何措施了。远。”。即使没有实现这一点,Wirth仍在正确的道路上。在“Wirth编程语言行”(Algol - > Pascal - > Modula-2 - > Oberon - > Oberon-2)中,每个后续语言都比以前的语言更简单,同时也更强大。

强大而简单的语言遵循最少惊喜的原则。强大的静态类型,易于面向对象的设施,垃圾收集。功能列表并不大,但它足以提高工作效率,而不是使事情复杂化,特别是在初始阶段。

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

但是,如果语言真的很强大(具有很好的证明功能),语言本身就排在第二位。没有那么多的树木,所以你可以做几步之后......我认为这是足够的类比。 =)

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

其他一些链接:

答案 6 :(得分:6)

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

答案 7 :(得分:4)

如果你想采取阻力最小的路径,那么Python。它会有最少量的不必要的锅炉板等。

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

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

修改: 这还取决于你熟悉的内容。如果你现在想要开始编写算法文本,并且你从未使用过C,那么Python就是正确的答案。你希望语言不是一个需要克服的巨大障碍,因为你想要享受这个。我知道我做到了。

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

答案 8 :(得分:4)

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

学习至少几种语言。

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

业余爱好?在Windows世界中工作? Linux / UNIX系列?

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

桌面应用程序或Web应用程序?

我有几个建议。

(a)肯定学习一些J(免费从jsoftware.com; APL的继承者; J和APL都是Ken Iverson的创作,Turing的获奖者......图灵奖就像诺贝尔计算机奖。)

(b)如果您在Windows世界中,请从c#开始,因为在.NET上运行的c#非常多。如果可以,请从Microsoft Press获取Tom Archer的“Inside c#”副本。您可以通过下载Microsoft的快速版本来获得免费的c#开发系统。

(c)学习使用TDD / BDD ...无论语言如何,首先你要编写一个称为单元测试的小测试;接下来你编写生产代码来通过单元测试;一步一小步......这不仅仅是你使用的语言,它也是方法论。

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

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

没有最好的语言。

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

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

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

答案 9 :(得分:4)

我认为Lisp值得研究。

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

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

Lisp也对代码和数据使用相同的表示形式,这为有趣的算法设计提供了动态生成的代码然后执行。

答案 10 :(得分:3)

您可能会欣赏具有代数数据类型和模式匹配的语言,例如标准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)

答案 11 :(得分:2)

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

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

我意识到它并没有真正回答你的问题,但我很难理解你在寻找什么;学习数据结构/算法或学习新语言。

答案 12 :(得分:1)

除了乱七八糟的C ++之外的任何语言都可以。

答案 13 :(得分:-2)

我更喜欢C ++:)