怎么学算法比较好?

2011-08-29 23:06:25 +08:00
 krazy
突然觉得还是要巩固一下算法的学习。

之前只是了解一些简单的数据结构和几个典型的查找和排序算法。

正准备看严蔚敏的《数据结构》(C语言版)

我在想要不要学一下ruby来实现这些算法,而不是用C语言。
是不是这样对算法的理解应该会更方便一点?

不知道这么做靠不靠谱?
还有关于算法的学习,各位有什么可以指导的。
特别是在痛苦的思维纠结时候,您当时是怎么克服的?

谢谢各位啦~~~
10939 次点击
所在节点    程序员
24 条回复
oldman
2011-09-11 17:14:02 +08:00
@krazy 也是可以的。纯用fp语言的好处就是逼迫你自己不要一下子就去想命令式的实现,而是重点关注算法本身的逻辑。给两个例子,haskell的(手边没环境,例子都不是我自己写的)

fibonacci 数列
fib :: Integer -> Integer
fib 0 = 0
fib 1 = 1
fib n = fib (n-1) + fib (n-2)

快排
quicksort :: [Char] -> [Char]
quicksort [] = []
quicksort (x:xs) = quicksort [y | y <- xs, y <= x] ++ [x] ++ quicksort [y | y <- xs, y > x]

=============
你看,基本就是把步骤用haskell描述一下就好了。当然这些用命令式语言也是可以写出来的(无论是用递归还是迭代的方式),用fp的意义就是更清楚的将“实现算法的步骤”和“为了这些步骤而去实现的步骤”区分开。

比如:快排中,“将数列按x分割成两部分,左边小于它,右边大于它”是一个“实现算法的步骤”,而“用两个指示ij去从头开始迭代,如果发现j指向的比x小,那么就交换下i与j指向的元素,等等等等”,这是“为了这些步骤而去实现的步骤”,先专注于“实现算法的步骤”,再去专注怎么去实现,要比一上来就去想实现,要好得多。呵呵,不知道我说明白了没有。
================

还有一点,如果想学习算法,一定要多思考多练,举个例子,关于搜索树:为啥搜索树要建成二叉的?为啥每种搜索树都有一个maintain操作,它们存在的意义是啥?因为这个maintain操作,不同的树分别引入了什么概念(比如红黑树、AVL),它们又是如何运作的,它们为啥是正确且高效的?等等。

希望对你有帮助。
krazy
2011-09-14 15:38:15 +08:00
@oldman 啊 非常感谢,还举这么详细的例子 ^_^
我想我明白你的意思了,就是区分好算法逻辑和算法实现部分。
"先专注于'实现算法的步骤',再去专注怎么去实现"....

不过还是感觉现在学haskell,成本太高了
还是按@keakon 的建议用C吧,应该会对数据结构理解更深一点....
orzzzzz
2011-09-14 19:52:20 +08:00
印象中网易公开课有算法导论的字幕版......
有一阵曾想用python一个一个的去做习题......没hold住...泪奔.
oldman
2011-09-14 22:58:32 +08:00
@krazy 恩,关键是理解其中的思想,别掉入实现的泥沼中。祝坚持到底!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/17488

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX