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

bgu*_*uiz 72 language-agnostic algorithm data-structures

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

考虑以下因素:

  • 个人经验
  • 语言功能(指针,面向对象等)
  • 适合学习DS&A概念

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

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

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

cle*_*tus 81

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

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,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(它并不重要)将是我的下一个选择(并且非常接近其他两个)只是因为动态类型最初可能会有问题.

  • Python首先没有编译成字节码?给我的新闻:http://docs.python.org/release/2.5.2/lib/bytecodes.html (3认同)
  • @bguiz你可能想问一个单独的问题.有关此主题的几个问题可以参考http://stackoverflow.com/search?q=book+data+structures+algoritms您可以通过在搜索中添加[java]或[python]来优化它. (2认同)
  • 我不会使用 Java 和 C# 主要是因为严格的面向对象,这只是不必要的。此外:当重点是学习数据结构时,谁在乎编写通用代码?在我看来,要么选择一种脚本语言 (Python) 并专注于高级语言,要么选择一种低级语言 C/C++ 并尝试了解它是如何在机器级别实现的。停在中间似乎不值得。 (2认同)

cod*_*ict 40

我建议Java主要是因为:

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

编辑:唐代选民请解释.

  • 我认为低估这个因为你不喜欢Java(似乎正在发生)是不负责任的.您可能不喜欢Java,但它很容易用作学习语言.所以来自我的+1. (17认同)
  • 如果您不了解如何进行自己的资源管理,那么您对数据结构的了解并不多. (8认同)
  • +1.不是我的选择,但实际上,这并不可怕.投票得分就像你建议的COBOL一样. (7认同)
  • +1因为初学者:1.确切地说,你不必担心内存alloc/dealloc(至少对于小程序).你可以专注于你现在要学习的东西.是的,没有偷偷摸摸的指针,或指针的指针.不要误会我的意思,我喜欢C++.3. Java中的集合可能是我见过的最精确的数据结构集.它们应该在数据结构下的字典中.:) (4认同)
  • 为什么每个人都投票呢? (3认同)
  • Java 是一种日常工作语言,因此反对票是因为没有建议人们在晚上和周末使用一些性感的语言。 (2认同)

Tay*_*ese 28

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

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

Man*_*tis 14

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

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

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


Ern*_*lli 12

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

还有一个好处是,您可以使用浏览器使用DOM和Canvas渲染图形和树,从而轻松地可视化各种数据结构.

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


Wil*_*cat 8

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版(2004年),PDF(1.2 MB).

一些额外的链接:

  • 这句谚语的英文版是"看不见森林的树木". (2认同)

ger*_*wry 7

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

至少学习几种语言。

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

爱好?在 Windows 世界中工作?Linux/UNIX 家族?

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

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

我有几个建议给你。

(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++。

没有最好的语言。

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

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

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


Dan*_*ose 7

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


And*_*bel 6

我认为 Lisp 值得研究。

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

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

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


Rob*_*lan 5

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

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

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

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

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


Jon*_*rop 5

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

  • 先生,您的讽刺值得赞赏。 (12认同)