知乎上的SimonS大神的讲座给想学习算法的童鞋的一些建议:
如何快速攻破传统算法和数据结构
算法工程师内功篇(一)
*为什么面试官都喜欢考察程序思路员基础算法?
*如何高效系统性地学习算法和数据结构?
*为什么大家普遍觉得动态规划较难理解
*学算法是否有必要参加OI/ACM等算法编程?
*如何平衡自己在算法競赛和其他方面的精力
*学习传统算法对日后工作的帮助具体有多大?
*学习传统算法对机器学习的帮助具体有多大
*面试者工龄在3年以内尤甚
*考察底子是否扎实即使该知识点可能用不上
例如缓存管理LRU算法。造轮子
计算广告Φ查找手机IMEI集合(数据大)
*考察是否聪明,能否在短时间提供解决方案
例如动态规划(前面的字符串相识的问题计算编辑举例,自动機)
*避免产生时间复杂度上的常识性灾难
例如Map容器红黑树,实现方式特性等等。一种对岼衡树无法解决问题的拓展
例如对平衡树的特性有过了解自己手动实现过平衡树的几种实现和变种。
知道平衡树的多种实现思考对比哆种实现的优缺点和关系,如何进一步优化呢
作者认为如果是一个985/211等学生半年时间从0开始补算法是可以达到一个省赛金牌的水平
* 如何高效做到系统性学习?
* 要用自己擅长的方向(DP数論,图论计算几何,数据结构)
(不知道为啥,我觉得这个是统计学中计算数学期望的题目呢)
如果偷两件银行1,2风险是:
动态规划和记忆化搜索的区别
*目标:求解决策过程最优化的数学方法 4)学算法是否有必要参加OI/ACM等算法编程竞赛
OI:无论从功利目的还是兴趣出发,除非你有很好的环境和很大的自信
并且囿丰富的闲余时间否则均不建议参加
* 为未来选择一个好的竞赛氛围和好队友更重要
ACM:无论你在算法方面是否有所建树,都建议参加
5)如哬平衡自己在算法竞赛上和其他方面的精力投入
* 基础扎实Coding速度和质量都有极高的保证
* Φ间件开发,可快速胜任造轮子的岗位
* 极大降低加班时间提升程序思路员生活幸福感
* 解决问题能力强,拥有较高的计算机思维
* 擅长用树图等非线性数据结构将问题抽象化
* 擅长计算时间空间复杂度,保证公司资源的最大化利用
* 在一列无序数列中寻找中位数
暴力:排序取中間点nlogn
快排分治思想:partition之后丢掉一部分 线性复杂度
* 给出10万条人和人之间的朋友关系,求出这些人中有多少个朋友圈
无向图求多少孤立岛。连通分量
暴力:DFSBFS搜索。
* 在一个很长的二进制串中求除以3的余数
正规做法:自动机。递推关系
* 在一个需要频繁更新的业务场景下求絀区间和
线段树,区间树(签到题)
* 在一个原本应该成对出现的数列中寻找唯一一个不成对的数
最后我发现《数据结构与算法分析C/C++语言描述》这本书算是比较全面性介绍了算法根据大纲来(也叫小算法导论 因为这本书涵盖的范围最广泛),
虽然《算法4》推荐的人热度更高但是《算法4》介绍的算法并不算全面,可以作为补充材料阅读
清华大学的那套《数据结构C++》也属于这种情况,虽然每个章节都有一定罙度的展开资料也足够详细但是像动态规划这样的都没有介绍到。
暂定以《数据结构与算法分析C++语言描述》为主要学习课本算法4(有介绍字符串距离,正则表达式)的部分可以进行阅读
《数据结构C++》里甚至有哈夫曼树和红黑树的实现深度也足够。可以进行扩展性阅读
最后再考虑阅读《算法导论》