我正在学习算法,就好像我在学习弹吉他一样——重复一遍又一遍。
那么你不是在学习算法。你正在学习重复。两种不同的东西。算法书对编程语言的使用是次要因素。它只是一个指导工具,一个实施细节。
你应该关注的是理解算法的结构、逻辑和数学特征(可能还有与之相关的数据结构)。
这就是你应该关注的焦点。
但是通过这样做,我觉得我更加专注于我只能在 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 语言中的面向对象特性只是阻碍。
算法是具有描述如何(操作上)和/或内容(数学上)的性质的数学结构。前者非常适合过程式编程,后者适合函数式编程。