哪种编程语言,你会推荐学习有关数据结构和算法吗?
考虑以下因素:
个人经验
语言功能(指针,面向对象等)
适合学习DS&A概念
我问,因为有些书是编程语言无关的(从数学角度编写,并使用伪代码).如果我从其中一个中学习,我想选择一种编程语言来编写和运行算法.
然后,还有其他书籍介绍了DS&A概念和用特定编程语言编写的示例 - 我也想编写这些算法 - 因此,在某种程度上,语言也会选择这本书.
无论哪种方式,我必须选择一种语言,我宁愿坚持一个.撇开个人语言偏好,哪一个最适合此目的?
这个问题的答案取决于你想要学习的内容.
经常建议使用像Python和Ruby这样的高级语言,因为它们是高级语言,语法非常易读.但是,这些语言都具有公共数据结构的抽象.没有什么可以阻止你将自己的版本作为学习练习来实现,但是你可能会发现你在其他高级数据结构之上构建高级数据结构,这不一定有用.
此外,Ruby和Python是动态类型语言.这可能是好的,但它也可能让初学者感到困惑,并且可能更难(最初)捕获错误,因为它们通常直到运行时才会显现.
C处于另一个极端.如果你想学习真正的低级细节,例如如何管理内存,但内存管理突然是一个重要的考虑因素,就像正确使用malloc()/ free()一样.这可能会分散注意力.此外,C不是面向对象的.这不是一件坏事,只是值得注意.
已经提到过C++.正如我在评论中所说,我认为这是一个可怕的选择.即使在简单的使用中,C++也非常复杂,并且具有大量的"陷阱".此外,C++没有共同的基类.这很重要,因为像哈希表这样的数据结构依赖于共同的基类.您可以为名义基类实现一个版本,但它的用处不大.
Java也被提到过.许多人喜欢讨厌Java,而且这种语言非常冗长,缺乏一些更现代的语言功能(例如闭包),但这些都不重要.Java是静态类型的并且具有垃圾收集.这意味着Java编译器将捕获动态类型语言不会发生的许多错误(直到运行时)并且没有处理分段错误(这并不是说你不能在Java中泄漏内存;显然你可以).我认为Java是一个不错的选择.
C#语言就像是一个更现代的Java版本.与Java一样,它是在虚拟机上运行的托管(垃圾收集)中间编译语言.此处列出的所有其他语言形式C/C++也在虚拟机上运行,但Python,Ruby等直接解释而不是编译为字节码.
C#基本上和Java一样有利有弊.
最后你有函数语言: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(它并不重要)将是我的下一个选择(并且非常接近其他两个)只是因为动态类型最初可能会有问题.
我建议Java
主要是因为:
垃圾收集
引用
丰富的藏品
编辑:唐代选民请解释.
在我看来,C语言是学习数据结构和算法的最佳语言,因为它会迫使你自己编写.它将迫使您理解指针,动态内存分配以及流行数据结构(如链表,哈希表等)背后的实现.其中许多是您可以在更高级语言(Java,C#等)中理所当然的事情. ).
Python
是很棒的.易于阅读,功能齐全.如果您打算使用伪代码,Python看起来会非常熟悉.
Python已经是UC Irvine的首选算法语言,其描述如下:
" Python代表了一种在教育中非常需要的面向算法的语言.Python的优势包括类似教科书的语法和交互性,鼓励实验. "
Python也可以通过图形制作工具Gato以初学者友好的方式工作.学习算法和数据结构是一个可以帮助实现视觉效果的顶级,Gato使其易于操作(无需学习任何复杂的图形库)
如果目的只是了解数据结构和算法,我会说JavaScript.您可以在浏览器中运行代码.您有一个非常灵活的对象处理,您可以完全专注于数据结构和算法,而不是内存管理,语言结构或其他将远离您正在学习的实际计算机科学的东西.
还有一个好处是,您可以使用浏览器使用DOM和Canvas渲染图形和树,从而轻松地可视化各种数据结构.
多年来CS课程倾向于改变教授该科目的语言,仅仅因为更容易学习的语言的更新和更好的实现已经到来,这使得更容易关注实际问题.
Oberon-2或Component 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版(2004年),PDF(1.2 MB).
一些额外的链接:
适用于Linux,Windows,Mac OS X的Oxford Oberon-2编译器.
BlackBox Component Builder - Component Pascal的开发环境.仅Windows.在Wine中运作良好.
Anany V. Levitin的算法设计和分析介绍 - 我最喜欢的算法书.
我会建议阿达.它具有在其他语言中找不到的数据结构的功能,例如范围检查.type Day is range 1 .. 31;
它还具有非常严格的编译时和运行时检查(除非您选择将其关闭),从而更容易在实现中查找错误.
如果您想走阻力最小的道路,那就使用Python。它将具有最少数量的不必要的样板之类的东西。
理想情况下,我想学习C语言中的算法,以便您可以了解内存级别的情况。我还想学习一种功能语言的算法,因此您可以看到类似的算法如何与持久数据结构一起工作。
Knuth的著名书籍包含大量的(发明平台)汇编代码。如果您想成为超级铁杆,建议您这样做。不过,就我个人而言,当我完成算法课程时(当时是几年前),我在C中工作。有时我会处理Knuth中的一些问题,但是我不知道是否会完全选择MMIX作为学习算法的首选语言。我觉得这有点过头了。
编辑:这还取决于您所熟悉的内容。如果您想立即开始研究算法文本,而您从未使用C进行过多工作,那么Python无疑是正确的答案。您希望语言不是克服的巨大障碍,因为您想享受这一点。我知道我做到了
最后一点:至少在我学习算法时,我花了很多时间在纸上工作。我认为这很重要-我的意思是您想了解渐近性等。花费所有时间来用任何语言实现算法都不是要做的事情。