讨论} 什么是算法,为什么需要学算法,以及算法学到什么程度
您要发布帖子的论坛是一个
Usenet 新闻组 。在此论坛发帖会使您的电子邮件地址有机会给互联网上的所有人看到。
您的回复帖子尚未发送。
发帖成功
发件人:
pongba <pon... @gmail.com>
日期:Mon, 6 Oct 2008 16:51:18 +0800
当地时间:2008年10月6日(星期一) 下午4时51分
主题:{讨论} 什么是算法,为什么需要学算法,以及算法学到什么程度
第一个问题我觉得我无法给出完美的答案,这里搞竞赛的牛人蛮多,不妨说说体会:D
我个人觉得算法里面极大一部分内容是如何有效地进行搜索,这里的"有效"可以分为:避免不必要的计算(如A*寻路以及所有的启发式剪枝),缓存重复计算(如所有的动态规划)。当然,知道这些跟具体的设计出一个算法至少还有十万八千里,只能说有了这个大体的思路,就可以从这两个角度去审视手头的问题,往往是会有启发意义的罢了。如何避免不必要的计算?也有很多 rules of thumb 可以遵循,如启发式剪枝里面就要求去设计一个最优下界,而最一般的思路则是使劲瞅瞅问题里面有什么条件是没有利用的,这些条件组合起来可以得出什么性质,也许某个性质就能够被利用来减掉一大堆计算,至于如何从题目条件推出有价值的性质,有两个办法,一是试错(想到的结论都给写出来,陶哲轩在 Solving Mathematical Problems 里面就提到过这个办法。);另一个方向则是脑袋里揣着想要实现的目的往反方向归约。如何缓存重复计算?简单的动态规划问题如fibonacci数列计算,其重复计算是非常明显的,计算的过程本身就指明了哪些计算是重复的(An 项的计算是重复的)——当然,正如早前邓同学发的一个题目<https://groups.google.com/group/pongba/browse_frm/thread/2ca1f2bda0c8... >里面说的,其实fibonacci数列计算里面的线性变换本身也是有重复计算的——后者便是更隐蔽的重复计算了,一个 non-trivial 的动态规划问题往往涉及到非常隐蔽的重复计算,或者更难的是,你遍历组合空间的方式决定了你所能够缓存的重复计算到底有多少,也许某个遍历方式之下就没有办法去缓存计算。当然,算法的范畴其实是很大的,算法是一个 AI-Complete 的问题,所有的 Problem-Solving 过程都可以叫做算法。只是有很多实际当中的算法会掉入以上两类而已。
第二个问题我举一个例子:不像很多牛人在高中和本科就竞赛奖牌一堆,我直到大四的时候还不知道什么是动态规划,因为本科四年我一直只对底层技术感兴趣,最喜欢看 比如 Petzold 的《编码的奥秘》和 Richter 的《.NET 框架程序设计》(事实上这是我看的第一本英文原版书)这类书。研一的时候由于方向是自然语言处理,看的第一篇 paper 是 Rabiner 的 A Tutorial on Hidden Markov Models and Selected Applications in Speech Recognition 。Paper 的内容倒是完全能够理解,但是理解其实只是第一步,我发现理解了之后很快就忘掉了,这就说明理解得不够深刻。比如里面的 Viterbi 算法,花了时间去理解,但是一转头很快又忘掉了。一年后因为机缘巧合,对算法发生了一段短暂的兴趣,并学习了一些基础的算法,尤其是算法的思想,因为思想是有穷的,但算法是无穷的,尤其是题目是做不完的。之后一段时间,碰巧又需要翻一翻马可夫模型,搜出吴军的数学之美以及那篇 Paper ,发现 Viterbi 算法其实就是最简单的一类动态规划,由于对于动态规划的理解深刻了很多,所以对于 Viterbi 算法,在脑袋里面记住的不再是什么 Forward Variable/Backward Variable 之类的技术细节,而是它的本质,于是便不再容易忘掉,而即便忘掉,就如庞加莱所说,也可以非常迅速的将算法的细节自行构建出来。
其实我相信这样的例子是数不胜数的,所以我这个只是算一个 Yet Another Example ,由于对我来说比较特殊,所以印象较为深刻。
这个例子是关于"理解"的。有时候算法也会非常有用,如有一次写程序时需要用到 LCS 和 Edit-Distance (这样的机会很少,但遇到了时如果不知道有多项式复杂度的算法就很悲惨了),而做机器学习和数据挖掘的更是少不了一坨坨的算法,如果光是理解别人的做法然后实现出来,那么对算法的思想的把握有助于理解和记忆;如果需要自己设计算法,那就需要算法基础知识的辅助才行了。绝大多数人应该属于前者。
学习到什么程度?我觉得视人群而定。如果做底层开发、应用开发、系统开发,只要知道一个大概就可以了,知道经典的数据结构和算法没有任何困难,而且反正经典算法都有现成的库可用。对于有兴趣做一点 research 沾边的事情的人,则需要了解这些算法背后的一般性思路是什么,否则来一个特定的算法你就特定的理解记忆一下,肯定不牢靠,而且浪费大脑资源。对于搞 real deal 的 original research 的那就需要广泛的知识积累了,光知道一般性思路都不够。
另一方面,我觉得学完了经典算法,深刻理解了算法背后的一般性思路之后,如果再进一步去玩题目,做题库。效益却不是很大的,因为刀磨了是要用的,玩题目做题库就是进一步磨刀而不用(不去解决实际问题,能够产生影响力的,或生产力的问题)。实际上做了一些题目之后就完全没必要进一步做题目了,因为做来做去,拼的基本也就是谁的知识积累多(套路多),谁的耐心大(肯使劲去磨一道题目);实际上谁也不比谁笨,到最后区别就基本上显露在知识积累和耐心上了。所以接着做,刀也不会磨得更锋利,更何况大好的时光应该去做点有意义的事情(如果是为了 fun 而做题的,那么有意义的事情同样也可以是 extremely fun),比如我觉得最吸引人也最根本的问题就是人工智能问题(想想看,人脑是世界上迄今为止所知最为复杂的结构,这个结构具备了认识自然界"规律"的能力,具备了认识"自我"的能力,具备了归纳和演绎推理的能力,类比的能力,具备了难以置信的启发式搜索能力,具备完美的模式识别能力,而根据进化论的观点,这样的结构居然仅仅是通过变异——筛选得来的,如果真有上帝,那么利用上帝赋予我们的大脑去破解上帝这个顶级牛逼程序员写的程序——人脑的秘密,还有比这更带劲儿的事情吗?),所以我觉得有那么好的基础的牛人,不去直面真正 fundamental 的 problems ,就可惜了,须知题目是永远做不完的,一个公理系统的定理也是永远推导不完的,永远可以设计出题目来给你做,但是真正的问题其实只有一个。如果穷举不了世界上所有的问题,至少可以举出那些有趣、有意义的问题:)
-- 刘未鹏(pongba) Blog|C++的罗浮宫 http://blog.csdn.net/pongba TopLanguage http://groups.google.com/group/pongba Twitter http://twitter.com/pongba Delicious http://delicious.com/pongba Douban http://www.douban.com/people/pongba/
回复 答复作者 转发
为此帖评分:
Text for clearing space
您没有发帖的权限。
发件人:
"杨宏" <yh54733... @gmail.com>
日期:Mon, 6 Oct 2008 17:48:39 +0800
当地时间:2008年10月6日(星期一) 下午5时48分
主题:Re: [TopLanguage] {讨论} 什么是算法,为什么需要学算法,以及算法学到什么程度
我赞同你的看法 事实上我也是这样做的
-- 行到水穷处,坐看云起时
回复 答复作者 转发
为此帖评分:
Text for clearing space
您没有发帖的权限。
发件人:
allenchen <cmm... @gmail.com>
日期:Mon, 06 Oct 2008 17:55:40 +0800
当地时间:2008年10月6日(星期一) 下午5时55分
主题:Re: [TopLanguage] {讨论} 什么是算法,为什么需要学算法,以及算法学到什么程度
第一个问题“什么是算法”,无数算法书都已经定义过了,我自己也没有很好见解,
就不说了。
第二个问题“为什么要学算法”,相信更是仁者见仁、智者见智的问题。对于我,感 觉受Knuth的影响比较大,认为计算机科学就是关于算法的科学,所以个人感觉学 算法不需要为什么。
最后一个问题“算法学到什么程度”,我认为是最重要的。因为我自己也不知道算法 需要学到什么程度,pongba老大正好给了我建议,呵呵。我原本以为做research需 要的算法基础不是很高,因为毕竟不需要每天编程。现在看来完全错误,呵呵。本 来打算保研之后的这段时间多读以后研究方向的书和论文,算法作次要准备。未来 的这十个月要狂啃《算法导论》和《具体数学》了。因为我对自己的算法水平还是 很有自知之明的,呵呵,很多基础的经典算法不能手到擒来(惭愧)。我自己认为 我理想的算法有所小成的标志是至少把以上两本书完完整整的读一边,外加POJ提 交1000+题。我们学校有位老大在JOJ上AC了1000+题,还说自己是小牛,让我惭 愧,呵呵。今后这一年就向小成的水平的努力。至于小成以后,我现在还不能确 定,就请各位大牛赐教了。
在 2008-10-06一的 16:51 +0800,pongba写道:
> 第一个问题我觉得我无法给出完美的答案,这里搞竞赛的牛人蛮多,不妨说说体
> 会:D
> 我个人觉得算法里面极大一部分内容是如何有效地进行搜索,这里的"有效"可以 > 分为:避免不必要的计算(如A*寻路以及所有的启发式剪枝),缓存重复计算 > (如所有的动态规划)。当然,知道这些跟具体的设计出一个算法至少还有十万 > 八千里,只能说有了这个大体的思路,就可以从这两个角度去审视手头的问题, > 往往是会有启发意义的罢了。如何避免不必要的计算?也有很多 rules of > thumb 可以遵循,如启发式剪枝里面就要求去设计一个最优下界,而最一般的思 > 路则是使劲瞅瞅问题里面有什么条件是没有利用的,这些条件组合起来可以得出 > 什么性质,也许某个性质就能够被利用来减掉一大堆计算,至于如何从题目条件 > 推出有价值的性质,有两个办法,一是试错(想到的结论都给写出来,陶哲轩在 > Solving Mathematical Problems 里面就提到过这个办法。);另一个方向则是 > 脑袋里揣着想要实现的目的往反方向归约。如何缓存重复计算?简单的动态规划 > 问题如fibonacci数列计算,其重复计算是非常明显的,计算的过程本身就指明 > 了哪些计算是重复的(An 项的计算是重复的)——当然,正如早前邓同学发的一 > 个题目里面说的,其实fibonacci数列计算里面的线性变换本身也是有重复计算 > 的——后者便是更隐蔽的重复计算了,一个 non-trivial 的动态规划问题往往涉 > 及到非常隐蔽的重复计算,或者更难的是,你遍历组合空间的方式决定了你所能 > 够缓存的重复计算到底有多少,也许某个遍历方式之下就没有办法去缓存计算。 > 当然,算法的范畴其实是很大的,算法是一个 AI-Complete 的问题,所有的 > Problem-Solving 过程都可以叫做算法。只是有很多实际当中的算法会掉入以上 > 两类而已。
> 第二个问题我举一个例子:不像很多牛人在高中和本科就竞赛奖牌一堆,我直到 > 大四的时候还不知道什么是动态规划,因为本科四年我一直只对底层技术感兴 > 趣,最喜欢看 比如 Petzold 的《编码的奥秘》和 Richter 的《.NET 框架程序 > 设计》(事实上这是我看的第一本英文原版书)这类书。研一的时候由于方向是 > 自然语言处理,看的第一篇 paper 是 Rabiner 的 A Tutorial on Hidden > Markov Models and Selected Applications in Speech Recognition 。Paper > 的内容倒是完全能够理解,但是理解其实只是第一步,我发现理解了之后很快就 > 忘掉了,这就说明理解得不够深刻。比如里面的 Viterbi 算法,花了时间去理 > 解,但是一转头很快又忘掉了。一年后因为机缘巧合,对算法发生了一段短暂的 > 兴趣,并学习了一些基础的算法,尤其是算法的思想,因为思想是有穷的,但算 > 法是无穷的,尤其是题目是做不完的。之后一段时间,碰巧又需要翻一翻马可夫 > 模型,搜出吴军的数学之美以及那篇 Paper ,发现 Viterbi 算法其实就是最简 > 单的一类动态规划,由于对于动态规划的理解深刻了很多,所以对于 Viterbi > 算法,在脑袋里面记住的不再是什么 Forward Variable/Backward Variable 之 > 类的技术细节,而是它的本质,于是便不再容易忘掉,而即便忘掉,就如庞加莱 > 所说,也可以非常迅速的将算法的细节自行构建出来。
> 其实我相信这样的例子是数不胜数的,所以我这个只是算一个 Yet Another > Example ,由于对我来说比较特殊,所以印象较为深刻。
> 这个例子是关于"理解"的。有时候算法也会非常有用,如有一次写程序时需要用 > 到 LCS 和 Edit-Distance (这样的机会很少,但遇到了时如果不知道有多项式 > 复杂度的算法就很悲惨了),而做机器学习和数据挖掘的更是少不了一坨坨的算 > 法,如果光是理解别人的做法然后实现出来,那么对算法的思想的把握有助于理 > 解和记忆;如果需要自己设计算法,那就需要算法基础知识的辅助才行了。绝大 > 多数人应该属于前者。
> 学习到什么程度?我觉得视人群而定。如果做底层开发、应用开发、系统开发, > 只要知道一个大概就可以了,知道经典的数据结构和算法没有任何困难,而且反 > 正经典算法都有现成的库可用。对于有兴趣做一点 research 沾边的事情的人, > 则需要了解这些算法背后的一般性思路是什么,否则来一个特定的算法你就特定 > 的理解记忆一下,肯定不牢靠,而且浪费大脑资源。对于搞 real deal 的 > original research 的那就需要广泛的知识积累了,光知道一般性思路都不够。
> 另一方面,我觉得学完了经典算法,深刻理解了算法背后的一般性思路之后,如 > 果再进一步去玩题目,做题库。效益却不是很大的,因为刀磨了是要用的,玩题 > 目做题库就是进一步磨刀而不用(不去解决实际问题,能够产生影响力的,或生 > 产力的问题)。实际上做了一些题目之后就完全没必要进一步做题目了,因为做 > 来做去,拼的基本也就是谁的知识积累多(套路多),谁的耐心大(肯使劲去磨 > 一道题目);实际上谁也不比谁笨,到最后区别就基本上显露在知识积累和耐心 > 上了。所以接着做,刀也不会磨得更锋利,更何况大好的时光应该去做点有意义 > 的事情(如果是为了 fun 而做题的,那么有意义的事情同样也可以是 > extremely fun),比如我觉得最吸引人也最根本的问题就是人工智能问题(想 > 想看,人脑是世界上迄今为止所知最为复杂的结构,这个结构具备了认识自然 > 界"规律"的能力,具备了认识"自我"的能力,具备了归纳和演绎推理的能力,类 > 比的能力,具备了难以置信的启发式搜索能力,具备完美的模式识别能力,而根 > 据进化论的观点,这样的结构居然仅仅是通过变异——筛选得来的,如果真有上 > 帝,那么利用上帝赋予我们的大脑去破解上帝这个顶级牛逼程序员写的程序——人 > 脑的秘密,还有比这更带劲儿的事情吗?),所以我觉得有那么好的基础的牛 > 人,不去直面真正 fundamental 的 problems ,就可惜了,须知题目是永远做 > 不完的,一个公理系统的定理也是永远推导不完的,永远可以设计出题目来给你 > 做,但是真正的问题其实只有一个。如果穷举不了世界上所有的问题,至少可以 > 举出那些有趣、有意义的问题:)
> -- > 刘未鹏(pongba) > Blog|C++的罗浮宫 > http://blog.csdn.net/pongba > TopLanguage > http://groups.google.com/group/pongba > Twitter > http://twitter.com/pongba > Delicious > http://delicious.com/pongba > Douban > http://www.douban.com/people/pongba/
回复 答复作者 转发
为此帖评分:
Text for clearing space
您没有发帖的权限。
发件人:
"王宁" <nwang1... @gmail.com>
日期:Mon, 6 Oct 2008 18:59:29 +0800
当地时间:2008年10月6日(星期一) 下午6时59分
主题:Re: [TopLanguage] {讨论} 什么是算法,为什么需要学算法,以及算法学到什么程度
很有思考价值的问题。 什么是算法?很多教材都有定义,但我至今理解不深。我现在的想法和你比较接近,即算法就是解决问题的过程,只不过我们一般只关注特定模型(如图灵机,量子机等)上可计算的过程。至于现有模型能否描述所有过程,或者是否存在这样的模型,我想应该已经有人在研究了,我不知道罢了。
为什么要学习算法?我不太同意"计算机科学即研究算法的学科",除非剥离大部分工程内容,抑或扩大算法的定义。但我绝对同意算法是所有程序员必须了解的内容,无论科班与否。其一,算法教材所涉及的简单而基础的抽象模型是解决复杂问题的"零件库";其二,算法分析和设计领域数十年所积累的手段和方法是解决复杂问题的"工具箱";其三,学习算法的过程中可以接受或形成许多计算机科学和工程领域的基本思维方式:量化,权衡(trade-off),realistic,复杂 v.s. 简单,分解,组合,等等。
至于学到何种程度,恐怕很难找到一个大家都满意的答案。最基础的算法(包括数据结构)是必须知道的,如:表、树、图、堆、排序、选择、回溯、分治,等等。剩下的,按需索求。毕竟,目标明确的学习往往比泛泛而读更有效率。在这个方面,"功利"一点没有坏处。底线:你可以不喜欢她,但是也不必害怕而远离她。平常知其然即可,必要时也能知其所以然。
除了研究者和爱好者之外,大部分程序员都把算法当作一种工具。工具者,称手就好。坏了就修理,不够好就改进,有新的工具就拿过来用。解决问题才应该是我们的目标。
2008/10/6 pongba <pon... @gmail.com>
> 第一个问题我觉得我无法给出完美的答案,这里搞竞赛的牛人蛮多,不妨说说体会:D
> 我个人觉得算法里面极大一部分内容是如何有效地进行搜索,这里的"有效"可以分为:避免不必要的计算(如A*寻路以及所有的启发式剪枝),缓存重复计算(如所有的动态规划)。当然,知道这些跟具体的设计出一个算法至少还有十万八千里,只能说有了这个大体的思路,就可以从这两个角度去审视手头的问题,往往是会有启发意义的罢了。如何避免不必要的计算?也有很多 > rules of thumb > 可以遵循,如启发式剪枝里面就要求去设计一个最优下界,而最一般的思路则是使劲瞅瞅问题里面有什么条件是没有利用的,这些条件组合起来可以得出什么性质,也许某个性质就能够被利用来减掉一大堆计算,至于如何从题目条件推出有价值的性质,有两个办法,一是试错(想到的结论都给写出来,陶哲轩在 > Solving Mathematical Problems > 里面就提到过这个办法。);另一个方向则是脑袋里揣着想要实现的目的往反方向归约。如何缓存重复计算?简单的动态规划问题如fibonacci数列计算,其重复计算是非常明显的,计算的过程本身就指明了哪些计算是重复的(An > 项的计算是重复的)——当然,正如早前邓同学发的一个题目<https://groups.google.com/group/pongba/browse_frm/thread/2ca1f2bda0c8... >里面说的,其实fibonacci数列计算里面的线性变换本身也是有重复计算的——后者便是更隐蔽的重复计算了,一个 > non-trivial > 的动态规划问题往往涉及到非常隐蔽的重复计算,或者更难的是,你遍历组合空间的方式决定了你所能够缓存的重复计算到底有多少,也许某个遍历方式之下就没有办法去缓存计算。当然,算法的范畴其实是很大的,算法是一个 > AI-Complete 的问题,所有的 Problem-Solving 过程都可以叫做算法。只是有很多实际当中的算法会掉入以上两类而已。
> 第二个问题我举一个例子:不像很多牛人在高中和本科就竞赛奖牌一堆,我直到大四的时候还不知道什么是动态规划,因为本科四年我一直只对底层技术感兴趣,最喜欢看 > 比如 Petzold 的《编码的奥秘》和 Richter 的《.NET > 框架程序设计》(事实上这是我看的第一本英文原版书)这类书。研一的时候由于方向是自然语言处理,看的第一篇 paper 是 Rabiner 的 A > Tutorial on Hidden Markov Models and Selected Applications in Speech > Recognition 。Paper 的内容倒是完全能够理解,但是理解其实只是第一步,我发现理解了之后很快就忘掉了,这就说明理解得不够深刻。比如里面的 > Viterbi > 算法,花了时间去理解,但是一转头很快又忘掉了。一年后因为机缘巧合,对算法发生了一段短暂的兴趣,并学习了一些基础的算法,尤其是算法的思想,因为思想是有穷的,但算法是无穷的,尤其是题目是做不完的。之后一段时间,碰巧又需要翻一翻马可夫模型,搜出吴军的数学之美以及那篇 > Paper ,发现 Viterbi 算法其实就是最简单的一类动态规划,由于对于动态规划的理解深刻了很多,所以对于 Viterbi > 算法,在脑袋里面记住的不再是什么 Forward Variable/Backward Variable > 之类的技术细节,而是它的本质,于是便不再容易忘掉,而即便忘掉,就如庞加莱所说,也可以非常迅速的将算法的细节自行构建出来。
> 其实我相信这样的例子是数不胜数的,所以我这个只是算一个 Yet Another Example ,由于对我来说比较特殊,所以印象较为深刻。
> 这个例子是关于"理解"的。有时候算法也会非常有用,如有一次写程序时需要用到 LCS 和 Edit-Distance > (这样的机会很少,但遇到了时如果不知道有多项式复杂度的算法就很悲惨了),而做机器学习和数据挖掘的更是少不了一坨坨的算法,如果光是理解别人的做法然后实现出来,那么对算法的思想的把握有助于理解和记忆;如果需要自己设计算法,那就需要算法基础知识的辅助才行了。绝大多数人应该属于前者。
> 学习到什么程度?我觉得视人群而定。如果做底层开发、应用开发、系统开发,只要知道一个大概就可以了,知道经典的数据结构和算法没有任何困难,而且反正经典算法都有现成的库可用。对于有兴趣做一点 > research > 沾边的事情的人,则需要了解这些算法背后的一般性思路是什么,否则来一个特定的算法你就特定的理解记忆一下,肯定不牢靠,而且浪费大脑资源。对于搞 real > deal 的 original research 的那就需要广泛的知识积累了,光知道一般性思路都不够。
> 另一方面,我觉得学完了经典算法,深刻理解了算法背后的一般性思路之后,如果再进一步去玩题目,做题库。效益却不是很大的,因为刀磨了是要用的,玩题目做题库就是进一步磨刀而不用(不去解决实际问题,能够产生影响力的,或生产力的问题)。实际上做了一些题目之后就完全没必要进一步做题目了,因为做来做去,拼的基本也就是谁的知识积累多(套路多),谁的耐心大(肯使劲去磨一道题目);实际上谁也不比谁笨,到最后区别就基本上显露在知识积累和耐心上了。所以接着做,刀也不会磨得更锋利,更何况大好的时光应该去做点有意义的事情(如果是为了 > fun 而做题的,那么有意义的事情同样也可以是 extremely > fun),比如我觉得最吸引人也最根本的问题就是人工智能问题(想想看,人脑是世界上迄今为止所知最为复杂的结构,这个结构具备了认识自然界"规律"的能力,具备了认识"自我"的能力,具备了归纳和演绎推理的能力,类比的能力,具备了难以置信的启发式搜索能力,具备完美的模式识别能力,而根据进化论的观点,这样的结构居然仅仅是通过变异——筛选得来的,如果真有上帝,那么利用上帝赋予我们的大脑去破解上帝这个顶级牛逼程序员写的程序——人脑的秘密,还有比这更带劲儿的事情吗?),所以我觉得有那么好的基础的牛人,不去直面真正 > fundamental 的 problems > ,就可惜了,须知题目是永远做不完的,一个公理系统的定理也是永远推导不完的,永远可以设计出题目来给你做,但是真正的问题其实只有一个。如果穷举不了世界上所有的问题,至少可以举出那些有趣、有意义的问题:)
> -- > 刘未鹏(pongba) > Blog|C++的罗浮宫 > http://blog.csdn.net/pongba > TopLanguage > http://groups.google.com/group/pongba > Twitter > http://twitter.com/pongba > Delicious > http://delicious.com/pongba > Douban > http://www.douban.com/people/pongba/
回复 答复作者 转发
为此帖评分:
Text for clearing space
您没有发帖的权限。
发件人:
Nick Gu <simiu0... @gmail.com>
日期:Mon, 6 Oct 2008 04:41:10 -0700 (PDT)
当地时间:2008年10月6日(星期一) 下午7时41分
主题:Re: {讨论} 什么是算法,为什么需要学算法,以及算法学到什么程度
其实做题库也是很好的练习啊,一般做个项目啥的很多核心的东西在你被其他周遭的繁杂琐事所纠缠时你就没法很好的去思考它,而题库往往能集中训练你的脑
力,而且程序本身也是一种技巧,熟能生巧嘛,比如你训练到一定程度,你做东西时会发现很多东西都很好解决。而且做题有时候效果比读书好,比如告诉你个归
并排序,你"啊!"知道了,但很多时候你并不会去细想一些东西,但你自己做点题啥的拓宽思路你就会有自己的想法。
而且有时候开发比较像应用,就是比如我做题或者搞算法到了某个级别后你做开发就不会在这方面受到太大阻碍,但也就不会得到太大的提高。而且基础知识学习
到一定高度到特殊领域里你会发现去掉那些专有名词其实就是那么回事,比如搞游戏开发都会弄弄BSP啥的,其实那东西就以二叉树,搞竞赛的搞得熟的写起来
就很溜了。或者比如我们老师教了一个A*在二维地图上的寻路,但实际上你竞赛搞多了你思路广了你会先看看这个数据量再决定,比如没多大的地图就没必要启
发式了,一个广搜就足够了,很多书你看多了也就觉得它是一个很漂亮的东西,但没经过足够练习很难体会到里面的妙处的。
不过这东西说回来我觉得算法学习并不是为了学习某个算法,而是解决问题的办法。这才是最重要的。搞竞赛后期没多少题是直接你套个算法就能用的,思考量还
是比较大的。
On Oct 6, 4:51 pm, pongba <pon... @gmail.com> wrote:
> 第一个问题我觉得我无法给出完美的答案,这里搞竞赛的牛人蛮多,不妨说说体会:D
> 我个人觉得算法里面极大一部分内容是如何有效地进行搜索,这里的"有效"可以分为:避免不必要的计算(如A*寻路以及所有的启发式剪枝),缓存重复计算(如所有的动态规划)。当然,知道这些跟具体的设计出一个算法至少还有十万八千里,只能说有了这个大体的思路,就可以从这两个角度去审视手头的问题,往往是会有启发意义的罢了。如何避免不必要的计算?也有很多
> rules of thumb
> 可以遵循,如启发式剪枝里面就要求去设计一个最优下界,而最一般的思路则是使劲瞅瞅问题里面有什么条件是没有利用的,这些条件组合起来可以得出什么性质,也许某个性质就能够被利用来减掉一大堆计算,至于如何从题目条件推出有价值的性质,有两个办法,一是试错(想到的结论都给写出来,陶哲轩在
> Solving Mathematical Problems
> 里面就提到过这个办法。);另一个方向则是脑袋里揣着想要实现的目的往反方向归约。如何缓存重复计算?简单的动态规划问题如fibonacci数列计算,其重复计算是非常明显的,计算的过程本身就指明了哪些计算是重复的(An
> 项的计算是重复的)----当然,正如早前邓同学发的一个题目<https://groups.google.com/group/pongba/browse_frm/thread/2ca1f2bda0c8 ...>里面说的,其实fibonacci数列计算里面的线性变换本身也是有重复计算的----后者便是更隐蔽的重复计算了,一个
> non-trivial
> 的动态规划问题往往涉及到非常隐蔽的重复计算,或者更难的是,你遍历组合空间的方式决定了你所能够缓存的重复计算到底有多少,也许某个遍历方式之下就没有办法去缓存计算。当然,算法的范畴其实是很大的,算法是一个
> AI-Complete 的问题,所有的 Problem-Solving 过程都可以叫做算法。只是有很多实际当中的算法会掉入以上两类而已。
> 第二个问题我举一个例子:不像很多牛人在高中和本科就竞赛奖牌一堆,我直到大四的时候还不知道什么是动态规划,因为本科四年我一直只对底层技术感兴趣,最喜欢看
> 比如 Petzold 的《编码的奥秘》和 Richter 的《.NET
> 框架程序设计》(事实上这是我看的第一本英文原版书)这类书。研一的时候由于方向是自然语言处理,看的第一篇 paper 是 Rabiner 的 A
> Tutorial on Hidden Markov Models and Selected Applications in Speech
> Recognition 。Paper 的内容倒是完全能够理解,但是理解其实只是第一步,我发现理解了之后很快就忘掉了,这就说明理解得不够深刻。比如里面的
> Viterbi
> 算法,花了时间去理解,但是一转头很快又忘掉了。一年后因为机缘巧合,对算法发生了一段短暂的兴趣,并学习了一些基础的算法,尤其是算法的思想,因为思想是有穷的,但算法是无穷的,尤其是题目是做不完的。之后一段时间,碰巧又需要翻一翻马可夫模型,搜出吴军的数学之美以及那篇
> Paper ,发现 Viterbi 算法其实就是最简单的一类动态规划,由于对于动态规划的理解深刻了很多,所以对于 Viterbi
> 算法,在脑袋里面记住的不再是什么 Forward Variable/Backward Variable
> 之类的技术细节,而是它的本质,于是便不再容易忘掉,而即便忘掉,就如庞加莱所说,也可以非常迅速的将算法的细节自行构建出来。
> 其实我相信这样的例子是数不胜数的,所以我这个只是算一个 Yet Another Example ,由于对我来说比较特殊,所以印象较为深刻。
> 这个例子是关于"理解"的。有时候算法也会非常有用,如有一次写程序时需要用到 LCS 和 Edit-Distance
> (这样的机会很少,但遇到了时如果不知道有多项式复杂度的算法就很悲惨了),而做机器学习和数据挖掘的更是少不了一坨坨的算法,如果光是理解别人的做法然后实现出来,那么对算法的思想的把握有助于理解和记忆;如果需要自己设计算法,那就需要算法基础知识的辅助才行了。绝大多数人应该属于前者。
> 学习到什么程度?我觉得视人群而定。如果做底层开发、应用开发、系统开发,只要知道一个大概就可以了,知道经典的数据结构和算法没有任何困难,而且反正经典算法都有现成的库可用。对于有兴趣做一点
> research
> 沾边的事情的人,则需要了解这些算法背后的一般性思路是什么,否则来一个特定的算法你就特定的理解记忆一下,肯定不牢靠,而且浪费大脑资源。对于搞 real
> deal 的 original research 的那就需要广泛的知识积累了,光知道一般性思路都不够。
> 另一方面,我觉得学完了经典算法,深刻理解了算法背后的一般性思路之后,如果再进一步去玩题目,做题库。效益却不是很大的,因为刀磨了是要用的,玩题目做题库就是进一步磨刀而不用(不去解决实际问题,能够产生影响力的,或生产力的问题)。实际上做了一些题目之后就完全没必要进一步做题目了,因为做来做去,拼的基本也就是谁的知识积累多(套路多),谁的耐心大(肯使劲去磨一道题目);实际上谁也不比谁笨,到最后区别就基本上显露在知识积累和耐心上了。所以接着做,刀也不会磨得更锋利,更何况大好的时光应该去做点有意义的事情(如果是为了
> fun 而做题的,那么有意义的事情同样也可以是 extremely
> fun),比如我觉得最吸引人也最根本的问题就是人工智能问题(想想看,人脑是世界上迄今为止所知最为复杂的结构,这个结构具备了认识自然界"规律"的能力,具备了认识"自我"的能力,具备了归纳和演绎推理的能力,类比的能力,具备了难以置信的启发式搜索能力,具备完美的模式识别能力,而根据进化论的观点,这样的结构居然仅仅是通过变异----筛选得来的,如果真有上帝,那么利用上帝赋予我们的大脑去破解上帝这个顶级牛逼程序员写的程序----人脑的秘密,还有比这更带劲儿的事情吗?),所以我觉得有那么好的基础的牛人,不去直面真正
> fundamental 的 problems
> ,就可惜了,须知题目是永远做不完的,一个公理系统的定理也是永远推导不完的,永远可以设计出题目来给你做,但是真正的问题其实只有一个。如果穷举不了世界上所有的问题,至少可以举出那些有趣、有意义的问题:)
> --
> 刘未鹏(pongba)
> Blog|C++的罗浮宫http://blog.csdn.net/pongba
> TopLanguagehttp://groups.google.com/group/pongba
> Twitterhttp://twitter.com/pongba
> Delicioushttp://delicious.com/pongba
> Doubanhttp://www.douban.com/people/pongba/
回复 答复作者 转发
为此帖评分:
Text for clearing space
您没有发帖的权限。
发件人:
Wang Tianyu <richer.... @gmail.com>
日期:Mon, 6 Oct 2008 04:51:49 -0700 (PDT)
当地时间:2008年10月6日(星期一) 下午7时51分
主题:Re: {讨论} 什么是算法,为什么需要学算法,以及算法学到什么程度
一直认为算法是计算机的核心,在学校只学过基础的数据结构,出于兴趣买了一本算法导论,断断续续读了2年,总算完整的看过一遍,虽然感觉有所收获不过依
然有些迷惑。特别对于算法与数据结构的关系尤为不解,虽然大多数情况下数据结构是在某一算法的需求下产生出来的,不过有些经典的数据结构本身却已经是很
好的解决办法,比如Hash表在查找上的优势,使得其几乎成为索引的首选,当然还有B 树,B+树等可供选择。而对于算法的概念好像除了贪心,动态规
划,分治等方向性的策略外很难再找到其他的规律,不如数据结构那样比较有规律,适用场合与优缺点那样明显
回复 答复作者 转发
为此帖评分:
Text for clearing space
您没有发帖的权限。
发件人:
wang feng <wanng.fe... @gmail.com>
日期:Mon, 06 Oct 2008 21:44:42 +0800
当地时间:2008年10月6日(星期一) 下午9时44分
主题:Re: [TopLanguage] {讨论} 什么是算法,为什么需要学算法,以及算法学到什么程度
利用上帝赋予我们的大脑去破解上帝这个顶级牛逼程序员写的程序——人脑的秘密,
还有比这更带劲儿的事情吗?
即使我们的大脑足够简单,我们也会因为愚笨而难以理解它。 这是一个悖论,很难跳出 -- 一己之见
pongba wrote:
> 第一个问题我觉得我无法给出完美的答案,这里搞竞赛的牛人蛮多,不妨说说体
> 会:D
> 我个人觉得算法里面极大一部分内容是如何有效地进行搜索,这里的"有效"可以 > 分为:避免不必要的计算(如A*寻路以及所有的启发式剪枝),缓存重复计算 > (如所有的动态规划)。当然,知道这些跟具体的设计出一个算法至少还有十万 > 八千里,只能说有了这个大体的思路,就可以从这两个角度去审视手头的问题, > 往往是会有启发意义的罢了。如何避免不必要的计算?也有很多 rules of > thumb 可以遵循,如启发式剪枝里面就要求去设计一个最优下界,而最一般的思 > 路则是使劲瞅瞅问题里面有什么条件是没有利用的,这些条件组合起来可以得出 > 什么性质,也许某个性质就能够被利用来减掉一大堆计算,至于如何从题目条件 > 推出有价值的性质,有两个办法,一是试错(想到的结论都给写出来,陶哲轩在 > Solving Mathematical Problems 里面就提到过这个办法。);另一个方向则是 > 脑袋里揣着想要实现的目的往反方向归约。如何缓存重复计算?简单的动态规划 > 问题如fibonacci数列计算,其重复计算是非常明显的,计算的过程本身就指明 > 了哪些计算是重复的(An 项的计算是重复的)——当然,正如早前邓同学发的一 > 个题目 > <https://groups.google.com/group/pongba/browse_frm/thread/2ca1f2bda0c8... > > 里面说的,其实fibonacci数列计算里面的线性变换本身也是有重复计算的——后 > 者便是更隐蔽的重复计算了,一个 non-trivial 的动态规划问题往往涉及到非 > 常隐蔽的重复计算,或者更难的是,你遍历组合空间的方式决定了你所能够缓存 > 的重复计算到底有多少,也许某个遍历方式之下就没有办法去缓存计算。当然, > 算法的范畴其实是很大的,算法是一个 AI-Complete 的问题,所有的 > Problem-Solving 过程都可以叫做算法。只是有很多实际当中的算法会掉入以上 > 两类而已。
> 第二个问题我举一个例子:不像很多牛人在高中和本科就竞赛奖牌一堆,我直到 > 大四的时候还不知道什么是动态规划,因为本科四年我一直只对底层技术感兴 > 趣,最喜欢看 比如 Petzold 的《编码的奥秘》和 Richter 的《.NET 框架程序设 > 计》(事实上这是我看的第一本英文原版书)这类书。研一的时候由于方向是自 > 然语言处理,看的第一篇 paper 是 Rabiner 的 A Tutorial on Hidden > Markov Models and Selected Applications in Speech Recognition 。Paper > 的内容倒是完全能够理解,但是理解其实只是第一步,我发现理解了之后很快就 > 忘掉了,这就说明理解得不够深刻。比如里面的 Viterbi 算法,花了时间去理 > 解,但是一转头很快又忘掉了。一年后因为机缘巧合,对算法发生了一段短暂的 > 兴趣,并学习了一些基础的算法,尤其是算法的思想,因为思想是有穷的,但算 > 法是无穷的,尤其是题目是做不完的。之后一段时间,碰巧又需要翻一翻马可夫 > 模型,搜出吴军的数学之美以及那篇 Paper ,发现 Viterbi 算法其实就是最简 > 单的一类动态规划,由于对于动态规划的理解深刻了很多,所以对于 Viterbi > 算法,在脑袋里面记住的不再是什么 Forward Variable/Backward Variable 之 > 类的技术细节,而是它的本质,于是便不再容易忘掉,而即便忘掉,就如庞加莱 > 所说,也可以非常迅速的将算法的细节自行构建出来。
> 其实我相信这样的例子是数不胜数的,所以我这个只是算一个 Yet Another > Example ,由于对我来说比较特殊,所以印象较为深刻。
> 这个例子是关于"理解"的。有时候算法也会非常有用,如有一次写程序时需要用 > 到 LCS 和 Edit-Distance (这样的机会很少,但遇到了时如果不知道有多项式 > 复杂度的算法就很悲惨了),而做机器学习和数据挖掘的更是少不了一坨坨的算 > 法,如果光是理解别人的做法然后实现出来,那么对算法的思想的把握有助于理 > 解和记忆;如果需要自己设计算法,那就需要算法基础知识的辅助才行了。绝大 > 多数人应该属于前者。
> 学习到什么程度?我觉得视人群而定。如果做底层开发、应用开发、系统开发, > 只要知道一个大概就可以了,知道经典的数据结构和算法没有任何困难,而且反 > 正经典算法都有现成的库可用。对于有兴趣做一点 research 沾边的事情的人, > 则需要了解这些算法背后的一般性思路是什么,否则来一个特定的算法你就特定 > 的理解记忆一下,肯定不牢靠,而且浪费大脑资源。对于搞 real deal 的 > original research 的那就需要广泛的知识积累了,光知道一般性思路都不够。
> 另一方面,我觉得学完了经典算法,深刻理解了算法背后的一般性思路之后,如 > 果再进一步去玩题目,做题库。效益却不是很大的,因为刀磨了是要用的,玩题 > 目做题库就是进一步磨刀而不用(不去解决实际问题,能够产生影响力的,或生 > 产力的问题)。实际上做了一些题目之后就完全没必要进一步做题目了,因为做 > 来做去,拼的基本也就是谁的知识积累多(套路多),谁的耐心大(肯使劲去磨 > 一道题目);实际上谁也不比谁笨,到最后区别就基本上显露在知识积累和耐心 > 上了。所以接着做,刀也不会磨得更锋利,更何况大好的时光应该去做点有意义 > 的事情(如果是为了 fun 而做题的,那么有意义的事情同样也可以是 > extremely fun),比如我觉得最吸引人也最根本的问题就是人工智能问题(想 > 想看,人脑是世界上迄今为止所知最为复杂的结构,这个结构具备了认识自然界 > "规律"的能力,具备了认识"自我"的能力,具备了归纳和演绎推理的能力,类比 > 的能力,具备了难以置信的启发式搜索能力,具备完美的模式识别能力,而根据 > 进化论的观点,这样的结构居然仅仅是通过变异——筛选得来的,如果真有上帝, > 那么利用上帝赋予我们的大脑去破解上帝这个顶级牛逼程序员写的程序——人脑的 > 秘密,还有比这更带劲儿的事情吗?),所以我觉得有那么好的基础的牛人,不 > 去直面真正 fundamental 的 problems ,就可惜了,须知题目是永远做不完 > 的,一个公理系统的定理也是永远推导不完的,永远可以设计出题目来给你做, > 但是真正的问题其实只有一个。如果穷举不了世界上所有的问题,至少可以举出 > 那些有趣、有意义的问题:)
> -- > 刘未鹏(pongba) > Blog|C++的罗浮宫 > http://blog.csdn.net/pongba > TopLanguage > http://groups.google.com/group/pongba > Twitter > http://twitter.com/pongba > Delicious > http://delicious.com/pongba > Douban > http://www.douban.com/people/pongba/
回复 答复作者 转发
为此帖评分:
Text for clearing space
您没有发帖的权限。
发件人:
pongba <pon... @gmail.com>
日期:Mon, 6 Oct 2008 22:01:07 +0800
当地时间:2008年10月6日(星期一) 下午10时01分
主题:Re: [TopLanguage] Re: {讨论} 什么是算法,为什么需要学算法,以及算法学到什么程度
回复 答复作者 转发
为此帖评分:
Text for clearing space
您没有发帖的权限。
发件人:
wang feng <wanng.fe... @gmail.com>
日期:Mon, 06 Oct 2008 22:07:46 +0800
当地时间:2008年10月6日(星期一) 下午10时07分
主题:Re: [TopLanguage] Re: {讨论} 什么是算法,为什么需要学算法,以及算法学到什么程度
pongba wrote:
> 2008/10/6 wang feng <wanng.fe... @gmail.com <mailto:wanng.fe... @gmail.com>>
> 利用上帝赋予我们的大脑去破解上帝这个顶级牛逼程序员写的程序——人脑的 > 秘密, 还有比这更带劲儿的事情吗?
> 即使我们的大脑足够简单,我们也会因为愚笨而难以理解它。
> 的确如此,但如果它足够复杂,它就能够理解它自身。这里没有悖论。
不管怎么说,很容易让人联想到 一个试图举起自己的人
回复 答复作者 转发
为此帖评分:
Text for clearing space
您没有发帖的权限。
发件人:
pongba <pon... @gmail.com>
日期:Mon, 6 Oct 2008 22:12:14 +0800
当地时间:2008年10月6日(星期一) 下午10时12分
主题:Re: [TopLanguage] Re: {讨论} 什么是算法,为什么需要学算法,以及算法学到什么程度
回复 答复作者 转发
为此帖评分:
Text for clearing space
您没有发帖的权限。
发件人:
"li li" <popil1... @gmail.com>
日期:Tue, 7 Oct 2008 09:31:54 +0800
当地时间:2008年10月7日(星期二) 上午9时31分
主题:Re: [TopLanguage] Re: {讨论} 什么是算法,为什么需要学算法,以及算法学到什么程度
2008/10/6 pongba <pon... @gmail.com>
如果没有"人权",如果没有"伦理",如果现在还有人类,我估计没有什么是不能理解的了。
回复 答复作者 转发
为此帖评分:
Text for clearing space
您没有发帖的权限。
发件人:
hayate <hayate... @gmail.com>
日期:Tue, 7 Oct 2008 10:40:34 +0800
当地时间:2008年10月7日(星期二) 上午10时40分
主题:Re: [TopLanguage] Re: {讨论} 什么是算法,为什么需要学算法,以及算法学到什么程度
这个既不能证明也不能证伪啊
2008/10/6 pongba <pon... @gmail.com>
回复 答复作者 转发
为此帖评分:
Text for clearing space
您没有发帖的权限。
发件人:
STL-BOOST <wartal... @gmail.com>
日期:Mon, 6 Oct 2008 20:16:01 -0700 (PDT)
当地时间:2008年10月7日(星期二) 上午11时16分
主题:Re: {讨论} 什么是算法,为什么需要学算法,以及算法学到什么程度
一直在poj上做题,不知道什么工作会用到这些算法。
回复 答复作者 转发
为此帖评分:
Text for clearing space
您没有发帖的权限。
发件人:
"Yang Xiao" <xiao.y... @thomson.net>
日期:Tue, 7 Oct 2008 11:19:55 +0800
当地时间:2008年10月7日(星期二) 上午11时19分
主题:RE: [TopLanguage] Re: {讨论} 什么是算法,为什么需要学算法,以及算法学到什么程度
坦白讲, poj, acs这些东西很多地方的是不会用的, 出去做工程, 更需要实际经验和行业背景知识.. 算法的东西无论如何应用面不会太宽(google之类的公司可能会用, 不过业界并没有多少google), 不过在研究上是比较重要的
-----Original Message-----
From: pongba@googlegroups.com [mailto:pongba@googlegroups.com] On Behalf Of STL-BOOST
Sent: Tuesday, October 07, 2008 11:16 AM
To: TopLanguage
Subject: [TopLanguage] Re: {讨论} 什么是算法,为什么需要学算法,以及算法学到什么程度
一直在poj上做题,不知道什么工作会用到这些算法。
回复 答复作者 转发
为此帖评分:
Text for clearing space
您没有发帖的权限。
发件人:
"Kenny Yuan" <yuankain... @gmail.com>
日期:Tue, 7 Oct 2008 12:22:39 +0800
当地时间:2008年10月7日(星期二) 下午12时22分
主题:Re: [TopLanguage] Re: {讨论} 什么是算法,为什么需要学算法,以及算法学到什么程度
不同工作要求不同,从工作角度出发来谈的话,没有一个共同的基础。
我举个我所在的公司、所在的team的例子(坏方向上的反例) - 不重视对语言的把握 - 不重视对计算机体系结构的理解 - 不重视对算法和数据结构的理解 - 不重视行业背景和研发经验 - 不重视一切优秀程序员的要素和潜质 重视的是对产品的熟悉程度,虽然从工作的角度来看这一方向也是正确的(否则根本没法干活) P.S. 前些天某位资深人士在写邮件择清责任时,用的是according to my 11+ years experience with <this product>,现在这句话在我们team内部流传成了缩写 "ATM11YE"
2008/10/7 Yang Xiao <xiao.y... @thomson.net>
> 坦白讲, poj, acs这些东西很多地方的是不会用的, 出去做工程, 更需要实际经验和行业背景知识.. > 算法的东西无论如何应用面不会太宽(google之类的公司可能会用, 不过业界并没有多少google), 不过在研究上是比较重要的
> -----Original Message----- > From: pongba@googlegroups.com [mailto:pongba@googlegroups.com] On Behalf > Of STL-BOOST > Sent: Tuesday, October 07, 2008 11:16 AM > To: TopLanguage > Subject: [TopLanguage] Re: {讨论} 什么是算法,为什么需要学算法,以及算法学到什么程度
> 一直在poj上做题,不知道什么工作会用到这些算法。
--
Kenny Yuan
C++, UI, LISP, MMA, Psychology and Automobile.
BLOG: CS巴别塔(Computer Science Babel)
URL:
http://blog.csdn.net/yuankaining/
回复 答复作者 转发
为此帖评分:
Text for clearing space
您没有发帖的权限。
发件人:
allenchen <cmm... @gmail.com>
日期:Tue, 07 Oct 2008 14:37:08 +0800
当地时间:2008年10月7日(星期二) 下午2时37分
主题:Re: [TopLanguage] Re: {讨论} 什么是算法,为什么需要学算法,以及算法学到什么程度
在 2008-10-06一的 20:16 -0700,STL-BOOST写道:
> 一直在poj上做题,不知道什么工作会用到这些算法。
我感觉在poj上做题会提高自己的思维水平,就像大学里学的高数一样,锻炼了思
维。
有点说教了,不过应该有点道理吧,呵呵。
回复 答复作者 转发
为此帖评分:
Text for clearing space
您没有发帖的权限。
发件人:
pongba <pon... @gmail.com>
日期:Tue, 7 Oct 2008 16:12:01 +0800
当地时间:2008年10月7日(星期二) 下午4时12分
主题:Re: [TopLanguage] Re: {讨论} 什么是算法,为什么需要学算法,以及算法学到什么程度
2008/10/7 allenchen <cmm... @gmail.com>
> 在 2008-10-06一的 20:16 -0700,STL-BOOST写道: > > 一直在poj上做题,不知道什么工作会用到这些算法。 > 我感觉在poj上做题会提高自己的思维水平,就像大学里学的高数一样,锻炼了思 > 维。 > 有点说教了,不过应该有点道理吧,呵呵。
做数学题的思维和解决现实中的问题的思维还是有不一样的,后者需要沟通、倾听、表达、分析。更重要的是,问题解决很大程度上其实是一个领域相关的任务,解数学题
尤其是狭窄、精专的数学题中使用到的领域知识很少能够沿用到现实中的其他各类问题中去,此外就算在思维上,解决现实中各类问题需要用到的思维强度往往不需要数学问题那么强,而是很多时候需要弄清的是"问题是什么",解数学题我们总是知道问题是什么,然而现实中的问题往往只显露出它的一个细小的局部,所以往往有人解决了一个问题又产生一堆新问题;弄清问题本质上是什么就解决了一大半问题,这方面可以参考《你的灯亮着吗?》。当然,数学解题思维也有一些是可以沿用到一般性的问题解决中的,譬如简单的穷举式搜索,以前我曾经举过一个这样的例子,关于分众传媒是如何想到在电梯中做广告的。然而话说回来这些其实不需要数学题也可以锻炼出来。 这倒不是说做题不好,练专注力,练耐心。并且如果需要从事跟数学密切相关的领域,做题中积累出来的领域知识也是很有用的。
所以我的意思是,如果认为做题锻炼了一般性/跨领域的问题解决思维,那么其实并不一定需要通过切题来锻炼。切题更多的价值体现在如果这个人从事数学相关的任务上。
-- 刘未鹏(pongba) Blog|C++的罗浮宫 http://blog.csdn.net/pongba TopLanguage http://groups.google.com/group/pongba Twitter http://twitter.com/pongba Delicious http://delicious.com/pongba Douban http://www.douban.com/people/pongba/
回复 答复作者 转发
为此帖评分:
Text for clearing space
您没有发帖的权限。
发件人:
chai2010 <chaishus... @gmail.com>
日期:Tue, 7 Oct 2008 03:11:36 -0700 (PDT)
当地时间:2008年10月7日(星期二) 下午6时11分
主题:Re: {讨论} 什么是算法,为什么需要学算法,以及算法学到什么程度
在大学的时候喜欢关注计算机相关的算法,
现在基本不怎么去研究那些很复杂的算法了。
现在更喜欢找那些已经实现的相应功能的库,
至于采用哪个算法实现的无所谓了。
最近还发现一个事情:
即使不懂算法,但是同样可以优化算法,而且获得的效率很高。
前提是要知道很多常识(好像和数据结构里的算法关系不大),
例如整数算法能比浮点运算快几个数量级...
看到Fibonacci我就会想到以前写的一个程序:
static const int Fibonacci[] =
{
0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,
2584,4181,6765,10946,17711,28657,46368,75025,121393,196418,
317811,514229,832040,1346269,2178309,3524578,5702887,9227465,
14930352,24157817,39088169,63245986,102334155,165580141,267914296,
433494437,701408733,1134903170,1836311903,-1323752223
// 注意:数列到F47已经发生溢出!!!
};
int f(int i){ return Fibonacci[i]; }
我不知道这个能不能叫算法....
On 10月6日, 下午4时51分, pongba <pon... @gmail.com> wrote:
> 第一个问题我觉得我无法给出完美的答案,这里搞竞赛的牛人蛮多,不妨说说体会:D
--
http://sites.google.com/site/chaishushan/
回复 答复作者 转发
为此帖评分:
Text for clearing space
您没有发帖的权限。
发件人:
xxmplus <xxmp... @gmail.com>
日期:Tue, 7 Oct 2008 21:13:38 +1100
当地时间:2008年10月7日(星期二) 下午6时13分
主题:Re: [TopLanguage] Re: {讨论} 什么是算法,为什么需要学算法,以及算法学到什么程度
嗯。。。可以吧,空间换时间咯,查表的不都是这么干的嘛
2008/10/7 chai2010 <chaishus... @gmail.com>:
> 在大学的时候喜欢关注计算机相关的算法,
> 现在基本不怎么去研究那些很复杂的算法了。
> 现在更喜欢找那些已经实现的相应功能的库, > 至于采用哪个算法实现的无所谓了。
> 最近还发现一个事情:
> 即使不懂算法,但是同样可以优化算法,而且获得的效率很高。 > 前提是要知道很多常识(好像和数据结构里的算法关系不大), > 例如整数算法能比浮点运算快几个数量级...
> 看到Fibonacci我就会想到以前写的一个程序:
> static const int Fibonacci[] = > { > 0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597, > 2584,4181,6765,10946,17711,28657,46368,75025,121393,196418, > 317811,514229,832040,1346269,2178309,3524578,5702887,9227465, > 14930352,24157817,39088169,63245986,102334155,165580141,267914296, > 433494437,701408733,1134903170,1836311903,-1323752223
> // 注意:数列到F47已经发生溢出!!! > };
> int f(int i){ return Fibonacci[i]; }
> 我不知道这个能不能叫算法....
> On 10月6日, 下午4时51分, pongba <pon... @gmail.com> wrote: >> 第一个问题我觉得我无法给出完美的答案,这里搞竞赛的牛人蛮多,不妨说说体会:D
> -- > http://sites.google.com/site/chaishushan/
--
Any complex technology which doesn't come with documentation must be the best
available.
回复 答复作者 转发
为此帖评分:
Text for clearing space
您没有发帖的权限。
发件人:
PtwCJ <ptwcjs... @gmail.com>
日期:Tue, 7 Oct 2008 18:58:19 -0700 (PDT)
当地时间:2008年10月8日(星期三) 上午9时58分
主题:Re: {讨论} 什么是算法,为什么需要学算法,以及算法学到什么程度
直接用到的应该不多,不过肯定不会没有用
其实我觉得为了找工作,学算法玩命做POJ不是一条好的道路。
如果单纯为了job hunting,看CLRS足够了,甚至都多了。语言的熟练掌握和项目(也就是实际运用更重要)
我做POJ完全是for fun,小学是搞OI的,后来丢了好久,直到研究生才捡起来,时不时做着玩玩,还有topcoder也是,不要在乎AC数和
rate。