8

所以暑假我决定还是在开学前开始学习算法。有人告诉我,这门课的节奏相当快,算法不是你应该掉以轻心的东西(我倾向于在学期中的所有课程作业中都这样做,哈哈)。

我们要使用的书是这本算法(第 4 版)。无论如何,这是我的问题。

我几乎是通过这本书的第三个方式,但我才意识到我在做什么。例如,我会反复阅读我不太理解的部分。然后,如果我有足够的信心,我会尝试从我的脑海中用 java 重现相同的算法。但是通过这样做,我的代码看起来几乎与书中的代码一模一样……在 java 中。

我不能说我只是在一个接一个地记住代码——我确实理解这些概念,它们帮助我编写这些算法——但我觉得我只能在 java 中实现这些算法。我应该注意,我目前只知道 java。

tldr:我正在学习算法,就好像我在学习弹吉他一样——重复一遍又一遍。但是通过这样做,我觉得我更加专注于我只能在 java 中实现这些。如果您使用的书是特定语言的,您将如何学习算法?

提前致谢。

4

6 回答 6

10

不要迷惑​​自己

您正在学习 Java,所以用 Java 编写它们。特别是如果 Java 是您的第一语言。现在不要混淆自己,因为您正在尝试一次学习两件事:如何用 Java 编程,以及如何编程你正在学习一种新的语言和一种思维方式。不要做太多,但现在在酱汁中添加另一种语言。

多样化

稍后,或者如果您有足够的信心可以同时学习另一种语言,那么学习另一种语言并尝试在不看书的情况下复制算法显然是有益的。

复制和扩展

我们可以向您推荐的是寻找算法的衍生物。已知变体,已记录在案,您可以在其中阅读变体的描述,以便您可以尝试从“基本”版本实现它,而无需阅读本书。

例如,如果您的书向您介绍了一个链表,您应该能够想出一个双向链表或循环链表的算法,而无需阅读对所需结果的描述。或者您明显误解了原始概念的某些内容。

先试后读

我建议您甚至在向您展示之前尝试实现您书中描述的算法。看到 Sedgewick 算法的重点是看到一个规范的实现,它被认为是一个标准的蓝图。如果您只是阅读了实现的部分(希望首先显示),那么只需坐下来看这本书,并尝试弄清楚如何做到这一点。如果你根本无法做到这一点,那么你的书就太超前了,应该回溯并从头开始。

于 2012-06-14T23:27:02.720 回答
2

关于算法,它们本质上与语言无关。真的没有什么能阻止你用 C、Python 或其他语言编写 Sedgewick 的示例。

如果你真的不知道任何其他语言,请专注于 Java。当然,它有点重复,但这些部分会很好地留在你的脑海中,到了测试时间,你会很高兴得到这些信息。

您现在处于一个有趣的位置,因为编写程序所需的思维方式与正常思维方式非常不同。除此之外,您正在学习一门具有不同语法、标点符号等的全新语言。熟能生巧,因为有很多零碎的东西要记住。

哦,如果您想练习算法,请尝试project eulercode kata和其他挑战网站。这些小挑战可以帮助您熟悉语言并熟悉所需的思维类型。

于 2012-06-14T23:31:39.837 回答
1

首先,恭喜您迈出了学习编码的第一步。我会说你已经领先于你的同龄人,在夏天开始展望未来。

至于您对只能在 Java 中实现算法的恐惧,您已经证明这对您来说不是问题。听起来您有足够的热情尽早开始,因此您应该可以毫无问题地实施多种语言的解决方案。此外,大多数具有 C/C++(Java 和 C# 仅举几例)类似语法的语言将非常相似,您将能够无缝地翻译您的知识。

我能给的最好的建议是 CODE, CODE, CODE!!不要只阅读实际实现它们的算法。

于 2012-06-14T23:40:34.960 回答
0

你没有说你对算法背后的数学有多了解。这将是确定您使用代码的设施的关键。

Sedgewick 的书非常好。我也可以随意挑选一些书并查看其他书籍,例如“数值食谱”和“有效的数值方法”。看看另一种观点是否可以为您澄清。

如果你觉得你从复制 Java 中获得了足够的东西,看看你是否可以将它们翻译成另一种语言,也许是 Python 或纯粹的功能替代品。如果你能做到这一点,你就会知道你已经做到了。

于 2012-06-14T23:28:06.370 回答
0

我要么尝试学习另一种语言,以验证您是否可以将其实际移植到另一种语言(javascript 将是我的投票,因为它在前端和后端都很简单且有用),或者用伪代码编写算法,因为这与语言无关. 大多数语言的代码看起来都非常相似。唯一需要非常小心的是,当您依赖于语言的某些方面(例如 java 中的泛型或迭代器)时,您可能无法在另一种语言中使用,这可能会在您的理解上留下空白。

验证您是否真正理解算法的另一种方法是对问题进行轻微更改,并确保您可以调整算法以使其仍然有效。例如,如果它是一种排序算法,那么尝试按几个不同的属性进行排序,而不仅仅是一个,如果它是一种图算法,则使图成为有向图,看看事情应该如何改变。

于 2012-06-14T23:30:29.813 回答
0

我正在学习算法,就好像我在学习弹吉他一样——重复一遍又一遍。

那么你不是在学习算法。你正在学习重复。两种不同的东西。算法书对编程语言的使用是次要因素。它只是一个指导工具,一个实施细节。

你应该关注的是理解算法的结构、逻辑和数学特征(可能还有与之相关的数据结构)。

这就是你应该关注的焦点。

但是通过这样做,我觉得我更加专注于我只能在 java 中实现这些。

但那是因为您只关注算法的编码方式(在这种特殊情况下是 Java)。您关注的是实现细节。

当您学习驾驶时,您不会专注于如何学习驾驶本田思域或日产千里马。您将了解驾驶的本质、经验法则、必要的预防措施以及管理车辆驾驶的法律。

与学习算法相同。您不会学习“Java 中的算法”,而不会超过“Haskell 中的算法”。您首先学习算法,车辆(没有非常专业的情况)是次要的。

您应该关注算法的作用、方式原因。诸如“它如何/为什么起作用?”之类的问题。最重要的是*“性能特征是什么?”,这些是您应该关注的事情。

每本优秀的算法书(包括 Sedgewick 的)都带有这一信息。这才是你应该关注的。你如何重新聚焦,这是个人学习策略的一个功能。

如果您使用的书是特定语言的,您将如何学习算法?

通过不专注于语言。关注结构,关注所涉及的数据结构,不变量,前置条件和后置条件。理解 Big-O(或 Big-Omicron)、Little-O/Little-Omicron 和 Omega 符号中描述的渐近行为。

您正在学习算法,而不是通过编码算法在 Java 中编程。

如果你做不到这种精神上的飞跃,那说明你没有足够的练习或抽象的分析。这不是侮辱,而是观察和建议。编码,编程语言的使用通常次于计算的数学分析,这是计算机科学的重点(其中算法是其中的一部分。)

注意我已经使用 Java 超过 10 年了,虽然我喜欢在工作中使用它,但我坚信它对于学习编程或 CS 主题来说是一个糟糕的工具。

最好通过以下两种方式学习算法:A) 像 C 或 Ada 这样的过程式系统级编程语言,或者高级伪汇编程序模拟器,或者 B) 像 Lisp 或 Haskell 这样的函数式语言。

纯/伪纯 OO 语言中的面向对象特性只是阻碍。

算法是具有描述如何(操作上)和/或内容(数学上)的性质的数学结构。前者非常适合过程式编程,后者适合函数式编程。

于 2012-06-15T01:12:56.787 回答