所以今年夏天我决定在学校开学前开始学习算法。我被告知课程节奏相当快,并且算法不是你应该掉以轻心的事情(我倾向于在学期期间完成所有的课程工作)。
我们要使用的这本书是Algorithms (4th Edition)。 无论如何,这是我的问题。
我几乎是通过这本书的第三部分,但我刚刚意识到我在做什么。例如,我会阅读并重新阅读我不太了解的部分。然后,如果我有足够的信心,我会尝试从头脑中重现相同的算法。但通过这样做,我的代码看起来几乎完全像书中的那些......在java中。
我不能说我只是在代码之后记住代码 - 我理解这些概念并帮助我编写这些算法 - 但我觉得我只能在java中实现这些算法。我应该注意到我现在只知道java。
tldr:我正在学习算法,好像我正在学习弹吉他 - 重复后重复。但通过这样做,我觉得我更加注重我只能在java中实现这些。如果你使用的书是特定于语言的,你究竟会如何学习算法呢?
提前致谢。
答案 0 :(得分:9)
你正在学习Java,所以用Java编写它们。特别是如果Java是你的第一语言。暂时不要混淆自己,因为你试图同时学习两件事:如何用Java编程,以及如何编程。 你正在学习一种新语言和一种思维方式。暂时不要做太多但是添加另一种语言。
稍后,或者如果你有足够的信心可以同时使用另一种语言,那么学习另一种语言并尝试复制算法显然是有益的。
我们建议您寻找算法的衍生物。已记录的已知变体,您可以在其中阅读变体的描述,以便您可以尝试从“基础”版本实现它,而无需阅读本书。
例如,如果您的图书将您引入链接列表,您应该能够为双向链接列表或循环链接列表提出算法,而无需阅读超出所需结果的描述。或者说你明显误解的原始概念是什么。
我建议您实际上甚至尝试在向您展示之前实施本书中描述的算法。看Sedgewick算法的目的是看一个规范的实现,它被认为是一个标准的蓝图。如果您只是阅读实施前的部分(希望首先显示),那么请坐下来阅读本书,并试着弄清楚如何做到这一点。如果你根本做不到这一点,那么你在书中走得太远,应该从头开始重新开始并重新开始。
答案 1 :(得分:2)
关于算法,它们基本上与语言无关。没有什么能阻止你用C,Python或其他语言做Sedgewick的例子。
如果你真的不懂任何其他语言,请专注于Java。当然,它有点重复,但这些位将以一种好的方式牢牢占据你的头脑并且来测试时间,你会对这些信息感到高兴。
你现在处于一个有趣的位置,因为编写程序所需的思维方式与正常思维非常不同。除此之外,您还要学习使用不同语法,标点符号等的全新语言。实践真的很完美,因为要记住很多点点滴滴。
哦,如果您想练习算法,请试用project euler,code kata和其他挑战网站。这些小挑战可以帮助您熟悉语言,并熟悉所需的思维类型。
答案 2 :(得分:1)
首先,祝贺您迈出了学习如何编写代码的第一步。我会说,在夏天开始向前看时,你已经领先于同龄人了。
至于您对只能在Java中实现算法的担心,您已经证明它对您来说不会有问题。听起来你很有兴趣尽早开始,所以在使用多种语言实现解决方案时应该没有问题。此外,大多数使用C / C ++(Java和C#等等)语言的语言都足够相似,您可以无缝地翻译您的知识。
我能给出的最好的建议是CODE,CODE,CODE !!不要只读到实际实现它们的算法。
答案 3 :(得分:0)
你没有说你对算法背后的数学有多了解。这对于使用代码确定您的设施至关重要。
塞奇威克的书非常好。我可以自由选择一些并查看其他书籍,如“数字食谱”和“有效的数值方法”。看看另一种观点是否可以为您澄清。
如果您不想复制Java,那么看看您是否可以将它们翻译成另一种语言,可能是Python或纯粹的功能替代品。如果你能做到这一点,你就会知道你已经得到了它。
答案 4 :(得分:0)
我要么尝试学习另一种语言来验证你实际上可以将它移植到另一种语言(javascript将是我的投票,因为它在前端和后端很简单和有用)或者以伪代码写出算法,因为那是更多语言不可知论者。大多数语言的代码看起来非常相似。唯一需要非常小心的是当你依赖语言的某些方面(例如java中的泛型或迭代器)时,你可能无法用另一种语言,这可能会让你的理解产生差距。 / p>
另一种验证您是否真正了解算法的方法是对问题进行细微更改,并确保您可以调整算法以使其仍然有效。例如,如果它是一个排序算法,那么尝试按几个不同的属性排序,而不只是一个,如果它是一个图算法,使图形成为有向图,看看事情应该如何变化。
答案 5 :(得分:0)
我正在学习算法,好像我正在学习算法 吉他 - 重复后的重复。
然后你不学习算法。你正在学习重复。两件不同的事情。算法手册对编程语言的使用是次要因素。它只是一个教学工具,一个实现细节。
您应该关注的是理解算法的结构,逻辑和数学特征(以及可能与之相关的数据结构。)
这就是你的重点。
但通过这样做,我觉得我更加注重我只能做到 在java中实现这些。
但那是因为你正在关注算法的编码方式(在这种特殊情况下是Java)。你专注于实现细节。
当你学会驾驶时,你不会专注于如何学习驾驶本田思域或日产千里马。您将了解驾驶的本质,拇指规则,必要的预防措施以及驾驶车辆的法律。
与学习算法相同。你不会学习“Java中的算法”只不过是“Haskell中的算法”。你首先学习算法,车辆(没有非常专业的情况)是次要的。
您应该专注于算法所做的, 以及 的原因。诸如“如何/为什么有效?”等问题,最重要的是*“性能特征是什么?”,这些都是你应该关注的事情。
每个好的算法书(包括Sedgewick)都带有这个信息。那是你应该关注的。如何重新聚焦,这是个人学习策略的一个功能。
如果您使用的图书是特定于语言的,那么您将如何学习算法呢?
不专注于语言。关注结构,关注所涉及的数据结构,不变量,前置条件和后置条件。理解Big-O(或Big-Omicron),Little-O / Little-Omicron和Omega符号中描述的渐近行为。
您正在学习算法,而不是通过编码算法在Java中编程。
如果你不能做到这种精神上的飞跃,那就意味着你没有足够的练习或抽象分析。这不是侮辱,而是观察和建议。编码,编程语言的使用通常是计算机数学分析的继承,计算机科学的焦点是计算机科学(其中算法是其中的一部分)。
注意我已经完成了Java超过10年,虽然我喜欢 for work ,但我坚信它是学习编程或CS主题的糟糕工具
通过学习算法可以更好地服务于A)一种程序性的系统级编程语言,如C或Ada,或高级伪装配器模拟器,或B)一种功能语言,如Lisp或Haskell。
纯/伪纯OO语言中面向对象的特性只会妨碍它。
算法是数学结构,其性质描述了(操作上)和/或(数学上)的方式。前者非常适合程序编程,后者适用于函数式编程。