V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
krazy
V2EX  ›  程序员

怎么学算法比较好?

  •  
  •   krazy ·
    krazyLee · 2011-08-29 23:06:25 +08:00 · 11144 次点击
    这是一个创建于 4835 天前的主题,其中的信息可能已经有所发展或是发生改变。
    突然觉得还是要巩固一下算法的学习。

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

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

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

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

    谢谢各位啦~~~
    24 条回复    1970-01-01 08:00:00 +08:00
    Just1n
        1
    Just1n  
       2011-08-30 00:00:11 +08:00
    继续搭车,我最近也在看严蔚敏的那本书。
    不过我是属于半路出家,大学里没看过。
    zhouhua97
        2
    zhouhua97  
       2011-08-30 00:05:01 +08:00 via Android
    严的书不错,当年就是看这本。
    cabinw
        3
    cabinw  
       2011-08-30 00:39:05 +08:00
    用其他语言实现会了解更多,但是要了解本质的话建议还是用C,然后再用其他的
    fsw90628
        4
    fsw90628  
       2011-08-30 00:40:45 +08:00
    MIT - Introduction to Algorithms
    &playnext=1&list=PL8B24C31197EC371C
    simy
        5
    simy  
       2011-08-30 07:47:32 +08:00
    支持四楼,算法导论,算法界的神书~
    daqing
        6
    daqing  
       2011-08-30 08:53:52 +08:00
    慢慢学。
    kojp
        7
    kojp  
       2011-08-30 09:08:54 +08:00
    没学过高数的人看数据结构会不会很吃力?
    frittle
        8
    frittle  
       2011-08-30 09:26:01 +08:00
    4L的算法导论必须看
    fcicq
        9
    fcicq  
       2011-08-30 11:51:56 +08:00   ❤️ 1
    你需要定个目标, 学到哪一层. 可以用这个做参考
    http://www.indiangeek.net/wp-content/uploads/Programmer%20competency%20matrix.htm

    初级: 买简单的算法书, 比如大话数据结构 (但偶具体没有看过)
    中级: 直接到 Online Judge 上(推荐 POJ/ZOJ)刷简单题, 然后逐渐增加难度. 严xx 那本书没什么好看的. 参考书: 程序设计导引及在线实践(但书上用了另一个 OJ, 不影响做题, 这书也是面向新手的). 偶本人看过日文的蚁书, 有银子就可以找人代购繁体版.
    中高级: TopCoder SRM
    高级: 偶是中级水平... :D 上面的别问偶... :D
    krazy
        10
    krazy  
    OP
       2011-08-30 13:56:50 +08:00
    @fsw90628 嗯 这个好。 手机装一个网易公开课APP,就可以睡前看一看~
    krazy
        11
    krazy  
    OP
       2011-08-30 13:57:15 +08:00
    @kojp 听说严蔚敏曾经发帖说她的数学学得就不太好
    krazy
        12
    krazy  
    OP
       2011-08-30 14:02:28 +08:00
    @fcicq 本来是准备严那本书配合《数据结构习题集》的。现在看来你这个组合更好诶。
    我先努力学到中级就好了,哈哈~
    args
        13
    args  
       2011-08-30 17:51:50 +08:00
    @fcicq 话说你的博客根本就看不懂啊,意识流么。。。
    Sun
        14
    Sun  
       2011-08-31 19:06:43 +08:00
    算法导论
    kasuganosora
        15
    kasuganosora  
       2011-09-04 17:07:37 +08:00
    算法导论
    pursuit
        16
    pursuit  
       2011-09-08 16:42:33 +08:00
    刘汝佳的《算法竞赛入门经典》不错
    http://book.douban.com/subject/4138920/
    oldman
        17
    oldman  
       2011-09-11 15:50:57 +08:00
    推荐用fp的语言(比如lisp haskell)学习算法,比较能接近算法的数学意义。也可以用c++的元编程写,就是比较累。ruby没学过,给不了什么意见了。
    10201501
        18
    10201501  
       2011-09-11 16:09:05 +08:00
    最近对于C语言也很是发愁啊 同求意见啊
    krazy
        19
    krazy  
    OP
       2011-09-11 16:33:31 +08:00
    @oldman 这个也太高端了吧....弱弱的问,能用js的函数式凑合不?.....
    keakon
        20
    keakon  
       2011-09-11 16:49:09 +08:00
    @krazy 算法很有必要用C来写,因为在表达底层数据结构时更有优势,而且测试性能时也不会因为语言的因素受到影响。
    oldman
        21
    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
        22
    krazy  
    OP
       2011-09-14 15:38:15 +08:00
    @oldman 啊 非常感谢,还举这么详细的例子 ^_^
    我想我明白你的意思了,就是区分好算法逻辑和算法实现部分。
    "先专注于'实现算法的步骤',再去专注怎么去实现"....

    不过还是感觉现在学haskell,成本太高了
    还是按@keakon 的建议用C吧,应该会对数据结构理解更深一点....
    orzzzzz
        23
    orzzzzz  
       2011-09-14 19:52:20 +08:00
    印象中网易公开课有算法导论的字幕版......
    有一阵曾想用python一个一个的去做习题......没hold住...泪奔.
    oldman
        24
    oldman  
       2011-09-14 22:58:32 +08:00
    @krazy 恩,关键是理解其中的思想,别掉入实现的泥沼中。祝坚持到底!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2895 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 12:16 · PVG 20:16 · LAX 04:16 · JFK 07:16
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.