选择用于学习数据结构和算法的编程语言[关闭]


79

的编程语言,你会推荐学习有关数据结构和算法吗?

考虑以下内容:

  • 个人经验
  • 语言功能(指针,OO等)
  • 适用于学习DS和A概念

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

然后,还有其他书籍介绍了DS&A概念,并以特定的编程语言编写了示例-我也想对这些算法进行编码-因此,在某种程度上,该语言也很适合。

无论哪种方式,我都必须选择一种语言,并且我希望始终坚持使用一种语言。撇开个人语言偏好,哪个最适合此目的?


除了特定的答案外,没有其他方法可以回答这个问题,并且需要更多信息。
David Thornley,2010年

@David Thornley:我知道它有点开放,但是它已经得到了很多非常好的答案!
bguiz 2010年

关于算法和数据结构的能源效率(过去是:时间)存在很多争议:如果以及何时要测量此效率,请寻找可重现(且容易)获得有意义数字的系统。
灰胡子

Answers:


88

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

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

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

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


1
@cletus:感谢您的合理解释!您会推荐什么DS&A书籍/其他指导材料(适用于Java或python)?
bguiz 2010年

3
@bguiz,您可能要问一个单独的问题。关于这个主题,有几个问题可以参考stackoverflow.com/search?q=book+data+structures+algoritms可以通过在搜索中添加[java]或[python]来完善。
cletus

2
我之所以不会使用Java和C#,主要是因为严格的面向对象(OO)导向,而这对于这是不必要的。此外:当重点是学习数据结构时,谁会关心编写通用代码?在我看来,要么选择一种脚本语言(Python)并专注于高级语言,要么选择一种低级语言C / C ++并尝试查看它在计算机级别如何实现。停在中间似乎不值得。
Matthieu M.

3
Python不是先编译为字节码吗?给我的新闻:docs.python.org/release/2.5.2/lib/bytecodes.html
Adam Crossland 2010年

这没有任何意义:“这很重要,因为像哈希表这样的数据结构依赖于一个通用的基类。” 哈希表依赖于可哈希的元素,但是如何以编程语言实现哈希的细节与数据结构的抽象定义无关。
pyon

44

我建议Java主要是因为:

  • 垃圾收集
  • 参考资料
  • 丰富的收藏

编辑:下选民请解释。


3
为什么每个人都对此表示反对?
Mantas Vidutis 2010年

19
我认为降低投票率是因为您不喜欢Java(这似乎正在发生)是不负责任的。您可能不喜欢Java,但是它很简单,可以用作学习语言。所以我+1。
cletus

7
+1。不是我的选择,但实际上,这并不可怕。投票分数就像您建议的COBOL。
罗伯·拉克兰

4
+1是因为对于初学者而言:1.确实,您不必担心内存分配/释放(至少对于小型程序而言)。相反,您可以专注于当前要学习的内容。2.是的,没有偷偷摸摸的指针或指向指针的指针。不要误会我的意思,我喜欢C ++。3. Java中的集合可能是我所见过的最完善的数据结构集。它们确实应该在数据结构下的字典中。:)
crunchdog

9
如果您不了解如何进行自己的资源管理,那么您就不会对数据结构了解太多。
艾伦(Alan)2010年

29

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


10
指针和动态内存分配对数据结构和算法没有任何帮助,但它们确实严重阻碍了您希望完成的工作。
JD

1
我同意。在处理了数十种不同的语言之后,并首先学习了一种更高层次的,高度抽象的语言,当我决定学习C / C ++时感到很痛苦,突然间,我不得不处理很多从来没有向我解释过的内容之前。首先学习C(而不是C ++)是一个不错的选择,因为它向您展示了计算机的实际工作方式,并且您具有首先要强制创建数据结构的所有限制。所有语言都为您提供函数(用于算法)和结构(用于数据结构)。理论与语言之间的差距确实很小。
拉斐尔·贝克尔

17

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

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

Python还可以通过图形制作工具Gato以对初学者友好的方式工作。学习算法和数据结构是一种可以通过可视化实现的顶部,使Gato易于实现(无需学习任何复杂的图形库)


@mvid:您会推荐一本基于Python的DS&A书吗?
bguiz 2010年

1
@bguiz:尽管我还没有亲自阅读它,但是这本免费的电子书着眼于Python中使用OO的算法和数据结构: brpreiss.com/books/opus7
Mantas Vidutis 2010年

仅当您考虑使用空格作为极好的编码时,Python才是很棒的
Woot4Moo 2010年

空格作为分隔符很棒!
Marcel Valdez Orozco 2012年

我个人不喜欢Python,因为它在语法上使用缩进。我发现比起基于花括号等的语法(由于需要额外的类似于nroff的对齐方式),更难发现由于未对齐而导致的愚蠢错误。
迈克尔

13

如果目的是仅了解数据结构算法,那么我会说JavaScript。您可以在浏览器中运行代码。您具有非常灵活的对象处理,并且您可以完全专注于数据结构和算法,而不能专注于内存管理,语言构造或其他将使您的注意力从正在学习的实际计算机科学上移开的东西。

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

多年来,CS课程趋向于改变授课语言,这仅仅是因为已经出现了更新且更好的简化学习语言的实现方式,这使得更容易专注于实际问题。


+1是因为JavaScript使人们可以轻松地学习函数式编程,并且具有使用它开发Web应用程序的广泛适用性。
Dan Dascalescu 2012年

非常真实 我在开发工具代码段中测试我的代码。同样,我可以类似地在其中编写自己的数据结构。没有链接列表或内置的任何其他结构。一切只是对象。除非进行竞争性编程,否则它将学习二进制搜索,特里和所有其他概念。没有?
HalfWebDev

完全同意,让您专注于逻辑而无需太多的仪式和简单的语法。
jtroconisa

8

如果您想走阻力最小的道路,那就使用Python。它将具有最少数量的不必要的样板之类的东西。

理想情况下,我想学习C语言中的算法,以便您可以了解内存级别的情况。我还想学习一种功能语言的算法,因此您可以看到类似的算法如何与持久数据结构一起工作。

努斯的名著包含大量的(发明平台)汇编程序代码。如果您想成为超级铁杆,建议您这样做。不过,就我个人而言,当我完成算法课程时,我曾在C中工作(公开:这只是几年前的事情)。有时我会处理Knuth中的一些问题,但是我不知道是否会完全选择MMIX作为学习算法的首选语言。我觉得这有点过头了。

编辑:这还取决于您所熟悉的内容。如果您想立即开始研究算法文本,而您从未使用C进行过多工作,那么Python无疑是正确的答案。您希望语言不是克服的巨大障碍,因为您想享受这一点。我知道我做到了

最后一点:至少在我学习算法时,我花了很多时间在纸上工作。我认为这很重要-我的意思是您想了解渐近理论等。所有时间都花在用什么语言来实现算法上的事情都无济于事。


@Rob Lachlan:您会推荐一本基于Python的DS&A书吗?
bguiz 2010年

@bguiz:我喜欢的关于算法的大多数体面的书籍都是语言无关的-Cormen等人,Kleinberg和Tardos。我真的不会选择一种语言。
罗伯·拉克兰

8

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


8

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

爱因斯坦曾经说过:“使它尽可能简单,但不要简单”。Niklaus Wirth教授选择了该短语作为原始Oberon语言报告的题词。对于上面提到的Oberon的后代来说确实如此。

关于编程语言的完美性,我想引用Antoine deSaint-Exupéry:“设计师知道,达到完美性的原因不是不再需要添加任何东西,而是不再需要任何东西。” 。即使没有做到这一点,沃斯也走在正确的道路上。在“ Wirth编程语言行”(Algol-> Pascal-> Modula-2-> Oberon-> Oberon-2)中,每种后续语言都比上一种更简单,同时功能也更强大。

功能强大但简单的语言遵循最少的原则。强大的静态类型,易于使用的面向对象的设施,垃圾回收。功能列表虽然不大,但足以提高工作效率,并且不会使事情复杂化,尤其是在初始阶段。

当您想学习算法和数据结构时,就是您想要的。但是,如果您的语言“功能强大”(具有C ++,C#,Java,Python等许多功能),您将浪费大量时间来学习语言,而不是算法和数据结构。您将看不到树木环绕的森林。=)您可以将树视为语法元素(和任何其他功能),并将森林视为重要概念(任何算法,数据结构,可能是OOP,无论如何)。语言所具有的功能(树)越多,则向后退和理解概念(查看森林)的任务就越复杂。

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

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

一些其他链接:


@kemiisto:感谢您的新颖性,答案和类推!我也会研究Oberon-2。
bguiz 2010年

2
谚语的英文版是“看不见树木的森林”。
Daniel Rose

6

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

学习至少几种语言。

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

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

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

桌面应用程序还是Web应用程序?

我有几个建议给你。

(a)肯定学习一些J(可从jsoftware.com免费获得; APL的后继产品; J和APL都是图灵获胜者Ken Iverson的创造……图灵奖就像诺贝尔计算机奖一样)。

(b)如果您使用的是Windows,请从c#开始,因为.NET中的大部分内容都在c#上运行。如果可以,请从Microsoft Press获得Tom Archer的“ Inside c#”副本。您可以通过下载Microsoft的Express版本获得免费的c#开发系统。

(c)学会使用TDD / BDD ...无论使用哪种语言,首先要编写一个称为单元测试的小型测试;接下来,编写生产代码以通过单元测试;一次只迈出一小步……不仅是您使用的语言,还是方法。

(d)学习一些汇编语言...汇编语言是低级的,几乎是机器语言,它将使您对幕后发生的事情有很好的了解。

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

没有最好的语言。

如果仅是语言,那么编程会更容易。

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

可以肯定的是,如果要成为一名程序员,您可能永远不会耗尽学习的东西。


@bguiz数据结构可以针对所有意图完全独立于语言;这是学习不同语言的原因之一。您还将遇到细微的差异,这些差异可能导致沮丧甚至悲伤。例如,数据类型命名:对于SQL Server,SQL Server的位是bool,对于vb是布尔值。数据类型的大小也有所不同;例如,在c#中int固定为32位,在c ++中int的大小因此存储容量取决于平台。字符集也会影响您的数据结构大小;例如7位ASCII,8位ASCII,Unicode。然后是固定大小vs.可变等等。
gerryLowry

“数据结构可以针对所有意图完全独立于语言”。要使用不提供垃圾收集的语言来实现大多数纯功能数据结构,您基本上必须编写一个垃圾收集器。这是一个严重的障碍。
JD

一旦精通OO,请尝试涵盖声明式编程。
灰胡子

4

我认为Lisp值得研究。

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

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

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


3

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

10
先生,您的讽刺很感激。
ergosys 2010年

2

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

最后,数据结构只是组织数据的一种方式。任何高级语言都将支持。当然,某些语言将具有实现基本数据结构的机制(例如Java或C ++ STL中的Collections Framework),但不会阻止您使用所选的编程语言对数据结构进行编程。此外,算法以伪代码编写,从而使它们与语言无关。

我意识到这并不能真正回答您的问题,但是我很难把握您的需求。学习数据结构/算法或学习新语言。


1
@Pran:我知道算法是在伪代码中-但是伪代码不会编译。我是一个动手型学习者,因此要真正理解这些概念,我需要使用可以编译和运行的语言对其进行编码。因此,我的问题确实是什么才是最适合的语言,从某种意义上说每种语言都有其自身的优缺点,这使得其中某些语言比其他语言更适合学习DS&A。
bguiz

@Pran:“我可能是错的,但是数据结构和算法不独立于编程语言吗?”。如果该语言不提供GC,则可能需要编写一个。
JD


0

我更喜欢C ++ :)


19
-1 C ++是一种糟糕的学习语言(可以说您可以从该语句中删除“学习”限定词)。
cletus

4
他不需要学习C ++的黑暗角落就可以用C ++编写算法。C ++非常好。
Prasoon Saurav

9
因此,您认为尝试在C ++中为DS编码一个类并抓住复制构造函数与覆盖equals运算符,引用和指针超出范围,不正确的new / delete导致内存泄漏之间的差异是个好主意用法等?所有这些对于C ++来说都是非常基础的。
cletus

5
但关键是您不必在python或java中学习这些东西。C ++需要大量的初始投资,并且对OP所请求的功能没有任何价值
Mantas Vidutis 2010年

2
不建议您使用Java的任何正当理由学习@cletus吗?
HalfWebDev
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.