用于学习数据结构和algorithm的编程语言select

你会推荐哪种编程语言 来学习 数据结构和algorithm

考虑以下几点:

  • 个人经验
  • 语言特性(指针,OO等)
  • 适合学习DS&A概念

我问,因为有一些书是在编程语言不可知论(从math的angular度来看,并使用伪代码)。 如果我从中学习,我想select一种编程语言来编写和运行algorithm。

然后,还有其他一些书介绍DS&A的概念,用特定的编程语言编写的例子 – 我也想对这些algorithm进行编码 – 因此,在一定程度上,语言也会select这本书。

无论哪种方式,我必须select一种语言,我宁愿坚持一个。 抛开个人语言偏好,哪一个最适合这个目的?

这个问题的答案取决于你想学的东西。

Python和Ruby

像Python和Ruby这样的高级语言经常被build议,因为它们是高层次的,语法是非常可读的。 但是,这些语言都具有对常见数据结构的抽象。 没有什么能阻止你实现你自己的版本作为一个学习练习,但你可能会发现你正在其他高层次的数据结构之上构build高层次的数据结构,这并不一定有用。

另外,Ruby和Python是dynamictypes的语言。 这可能是好的,但对于初学者也可能会感到困惑,因为它们通常在运行时才会显而易见,因此可能会更难以捕捉错误(最初)。

C

C在另一个极端。 如果你想学习真正的底层细节,比如如何pipe理内存,但是如果正确使用malloc()/ free(),内存pipe理突然成为一个重要的考虑因素,那就太好了。 这可以分散注意力。 另外,C不是面向对象的。 这不是一件坏事,只是值得注意。

C ++

C ++已被提及。 正如我在评论中所说,我认为这是一个可怕的select。 即使在简单的用法中,C ++也是非常复杂的,并且有一些荒谬的“陷阱”。 另外,C ++没有公共基类。 这很重要,因为像散列表这样的数据结构依赖于共同的基类。 你可以实现一个名义基类的版本,但没有多大用处。

Java的

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

C#

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

C#基本上和Java有着同样的优点和缺点。

Haskell(等)

最后,你有function语言:Haskell,OCaml,Scheme / Lisp,Clojure,F#等等。这些思维以一种非常不同的方式思考所有的问题,值得学习,但是这又回到了你想要学习的东西:函数式编程或数据结构? 我会坚持一次学习一件事,而不是混淆这个问题。 如果你确实在某种程度上学习了一个函数式语言(我会推荐的),Haskell是一个安全的,很好的select。

我的build议

selectJava或C#。 两者都有免费的,优秀的IDE(用于J​​ava的Eclipse,Netbeans和IntelliJ Community Edition,用于C#的Visual Studio Express,Visual Studio社区版),使编写和运行代码变得简单。 如果不使用比数组和自己写的任何对象更复杂的本机数据结构,则可以学习基本上与在C / C ++中所做的相同的事情,但不必实际pipe理内存。

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

Python或Ruby(哪个并不重要)将成为我的下一个select(并且非常接近于另外两个),因为dynamictypes一开始可能会有问题。

我会推荐Java主要是因为:

  • 垃圾收集
  • 引用
  • 丰富的collections

编辑:向下选民请解释。

在我看来,C将是学习数据结构和algorithm的最好的语言,因为它会迫使你写自己的。 这将迫使你理解指针,dynamic内存分配以及stream行数据结构(如链表,哈希表等)背后的实现。其中许多是您可以在更高级别的语言(Java,C#等)中理所当然的东西。 )。

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

Python已经是加州大学欧文分校select的algorithm语言,其描述如下:
Python代表了一种在教育领域非常需要的面向algorithm的语言,Python的优势包括教科书般的语法和交互性,鼓励实验。

Python也使用graphics制作工具Gato以初学者友好的方式工作。 学习algorithm和数据结构是一个可以帮助你成为可视化的顶端,GATO很容易做到(无需学习任何复杂的graphics库)

如果目的仅仅是学习数据结构algorithm ,我会说JavaScript。 您可以在浏览器中运行您的代码。 你有一个非常灵活的对象处理,你可以完全集中在数据结构和algorithm,而不是内存pipe理,语言结构或其他东西,将重点从您正在学习的实际计算机科学的重点。

另外,通过使用浏览器使用DOM和Canvas渲染graphics和树木,您可以轻松地查看各种数据结构。

多年来的CS课程倾向于改变学科教学的语言,只是因为更新,更好的语言学习实现缓解了学习,这使得更容易关注实际问题。

我会build议阿达。 它具有未在其他语言中find的数据结构的function,例如范围检查type Day is range 1 .. 31; 它也有非常严格的编译时间和运行时间检查(除非你selectclosures它),这样就更容易在你的实现中发现错误。

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

爱因斯坦曾经说过: “尽可能简单,但不简单”。 Niklaus Wirth教授select这个词作为原始Oberon语言报告的标语。 对于上述Oberon的后代来说,这是真的。

当谈到编程语言的完善时,我想引用圣·埃克苏普里(Antoine de Saint-Exupéry)的话:“一个devise师知道他已经完美了,而不是什么时候再添加任何东西,但是没有什么东西可以拿走了。 。 即使没有达到这个目标,沃斯也走在了正确的道路上。 在“Wirth编程语言行”(Algol – > Pascal – > Modula-2 – > Oberon – > Oberon-2)中,每个后续语言都比前一个更简单,同时也更强大。

强大而简单的语言遵循最less的惊喜原则。 强大的静态打字,简单的面向对象设施,垃圾收集。 function列表并不大,但足以提高生产力,而不会使事情复杂化,特别是在初始阶段。

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

但是,如果语言真的很强大(具有很好的certificatefunction),语言本身就是第二位的。 没有那么多的树木,所以你可以做几个步骤…呃,我认为这是足够的类比。 =)

另外, 许多有关algorithm和数据结构的书籍 使用Algol / Pascaltypes的伪代码,并且很容易将这些语言中的示例转换。 你可以直接使用Wirth的“algorithm和数据结构”书中的例子。 Oberon版(2004), PDF (1.2 MB)。

一些额外的链接:

  • 用于Linux,Windows,Mac OS X的Oxford Oberon-2编译器 。
  • BlackBox Component Builder – Component Pascal的开发环境。 仅Windows。 在葡萄酒中工作得很好。
  • Anany V. Levitin介绍algorithmdevise和分析 – 我最喜欢的algorithm书籍。

如果你想采取阻力最小的path,那么Python。 这将有最less量的不必要的锅炉板等。

理想情况下,我想学习C语言的algorithm,这样你就可以在内存层次上了解到底是怎么回事。 我也想学习函数式语言的algorithm,所以你可以看到相似的algorithm是如何处理持久化的数据结构的。

Knuth的着名书籍包含大量(发明的平台)汇编代码。 如果你想成为超级核心的话,build议这样做。 就我个人而言,当我正在通过algorithm类工作时,我曾经在C工作(披露:这只是几年前)。 我有时候在Knuth上面解决了一些问题,但是我不知道我是否会将MMIX完全作为学习algorithm的select语言。 我觉得这有点矫枉过正

编辑 :这也取决于你所熟悉的。 如果你现在想开始编写一个algorithm文本,而且你从来没有用过很多的C语言,那么Python就是一个很好的答案。 你希望语言不是一个巨大的障碍来克服,因为你想享受这一点。 我知道我做到了。

最后一点:至less在我学习algorithm的时候,我花了很多时间在纸上写作。 我认为这很重要 – 我的意思是说你想学习渐进式等等。花时间用任何语言来实现algorithm都不是要做的事情。

我认为Lisp值得研究。

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

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

Lisp也使用相同的代码和数据表示forms,这些代码和数据可以用于dynamic生成的代码,然后执行,从而开发有趣的algorithmdevise。

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

学习至less几种语言。

另外,你的select取决于你的目的。

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

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

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

我有几个build议给你。

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

(二)如果你是在Windows世界,从C#开始,因为在.NET中运行的C#。 如果可以的话,从Microsoft Press获得Tom Archer的“Inside C#”的副本。 你可以通过下载微软的快速版本来获得一个免费的C#开发系统。

(三)学习使用TDD / BDD …不pipe语言如何,先写个小testing叫做unit testing; 接下来你写出生产码通过unit testing; 一步一小步……这不仅是你使用的语言,也是方法论。

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

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

没有最好的语言。

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

您不仅希望学习非常具体的algorithm,还希望学习更一般的模式,并帮助您select解决给定问题的方法。

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

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

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

我意识到这不是真的回答你的问题,但我无法抓住你要找的东西; 学习数据结构/algorithm或学习新的语言。

您可能会喜欢代数数据types和模式匹配的语言,如Standard ML,OCaml,F#或Haskell。 例如,下面是一个重新平衡用OCaml / F#编写的红黑二叉search树的函数:

 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) 

除了fugly C ++以外的任何语言都应该可以。

我更喜欢C ++ 🙂