每种程序员的需求很不一样,与其谈具体的算法,不如说最基本应掌握复杂度、穷举、分治、回溯、贪心、动态规划等算法基础理论。
我来缅怀一下当年OI和ACM的日子……题目都在 Welcome To PKU JudgeOnline 上。
初期(校赛及省赛水题难度):
中级(校赛压轴及省赛中等难度):
高级(regional中等难度):
以下为建议:如果你不是要死磕acm搞出成绩来的话,多放点心思在数据结构上对以后的帮户会比较大,比如字符串相关的字典树、哈希、自动机、后缀树等等,而对脑力要求比较高的比如博弈论和各种花式动态规划(树型DP、集合DP、插头DP等等)就不用太关心了。
btw这些算法和数据结构如果能精通的话,对你以后做数据挖掘和机器学习是有极大的帮助的。
以下为建议:如果你不是要死磕acm搞出成绩来的话,多放点心思在数据结构上对以后的帮户会比较大,比如字符串相关的字典树、哈希、自动机、后缀树等等,而对脑力要求比较高的比如博弈论和各种花式动态规划(树型DP、集合DP、插头DP等等)就不用太关心了。
btw这些算法和数据结构如果能精通的话,对你以后做数据挖掘和机器学习是有极大的帮助的。其实程序员员掌握多少算法并不关键,关键的是能不能理解算法背后深层的理论,以及修练出解题的思路。就好像排序中的堆排序,本质就是二叉树的应用。快速排序、希尔排序等本质都是分治法的思路。等等。
见的多了就会发现,很多算法面向解决的问题明明相差很大,但底层实现都是非常类似;而又有些算法面向的问题很类似,而底层实现又相差巨大。现实世界的需求是千变万化的,即使你掌握再多的算法也不可能直接照搬某个算法去解决你面对的问题。
关键的是要通过学习算法过程中整理出解决问题的思路。例如面对高性能的需求附带一些个性化的情况时,是用hash表解决,还是用二叉树,选择哪种具体的实现以及一些细节处的处理。
因此在现实环境中,严格按照某种算法定义使用算法的情况很少见,大多都是变种。甚至多种算法拼凑组合。而为什么能产生这么多算法,这么多变种算法的原因,其实也是因为很多人在面对自己的需求时照搬经典算法解决不了问题,所以修改或优化了算法,才产生了变种算法甚至新算法。
所以,学习算法不要单纯去记忆算法的定义和实现代码,关键是要学会其中的思路。这个跟写代码学习设计模式、架构模式等的情况是一样的。真正严格匹配某种模式的情况很少,都是杂合。
关键是掌握其中的本质。就好像武功中的,看山还是山,看水还是水。无招胜有着的境界。
如果你正在找工作或者刚刚学校出来,又或者已经工作但是经常觉得难点很多,觉得自己java方面学的不够精想要继续学习的,想转行怕学不会的,可以加Q3300863615 了解咨询java继续学习。更有免费视频等你来领取。加我Q有以下几个要求,不达标的勿扰:
1、大学学习的是Java相关专业,毕业后面试受挫,找不到对口工作可以
2、在公司待久了,现在过得很安逸,但跳槽时面试碰壁。需要在短时间内进修、跳槽拿高薪的
3、参加过线下培训后,知识点掌握不够深刻,就业困难,想继续深造
4、已经在Java相关部门上班的在职人员,对自身职业规划不清晰,混日子的
5、有一定的C语言基础,接触过java开发,想转行的
小号勿扰,不喜勿加