为什么要来学习算法?写在英雄的5月集训月末

一、引言

“12月,当我站在滑雪场的山顶,风又大又冷,坡又陡又弯,问自己,今天为什么要来滑雪?”

5月,这一天的算法又长又抽象,对应的题目又多又困难,那为什么要来学习算法、刷题呢?

为什么要来学习算法?写在英雄的5月集训月末_第1张图片

因为兴趣,这是自我决定论中的第一步。

它的契机可能是为了面试,但它的目的绝不止于面试。而一件值得坚持的事,有时也需要缘分,让我们遇到能指引我们的人、能一起抱团的人。

二、找寻引导

有一个B站UP,他说话逗比,他实力过硬,他是ACM全国金牌,他年过30岁出来将算法的金针度于你。

他的B站名为:英雄哪里出来。我称他为英雄。

三、刷题能切实增强工作能力

力扣等Online Judge的“拒绝”其实反映了工作中最常见的错误

为什么要来学习算法?写在英雄的5月集训月末_第2张图片

Compile Error 编译错

公司里面总有人把编译错误的代码提上来,固然现代git仓库带有钩子做检查,但自己不应小心么?别人拉完代码,挂了,很丢人的。

Runtime Error 运行错

a) 真RE / panic

工作中常见,不是说整体套一个recover就完事儿了。应该认真想清楚为什么算法会panic。

b) Out of Memory 内存超限

学了算法和数据结构你才对内存有“稍微深入一点的认知”。时空平衡,是程序员永远的话题。

Wrong Answer 结果错

工作中达成目标的路径有很多,有时有最优解、有时有次优解;但WA则是说,不满足目标,可能是边界问题、也可能是对工作目标理解有问题,这个反馈可能来自你的QA、PM、经理,那么虚心接受。

Output Limit Exceeded 输出过多

是不是想起了,写文件、写日志,把磁盘打爆的时刻?

Time Limit Exceeded 超时

我们都是先解决问题再考虑性能优化,工作中,500 QPS可能打不死你的服务。但有一天做了一个活动,瞬时QPS来了2w,你发现:php fpm不够了,上下游疯狂超时,DB load飙升了,消息队列堵了,哪哪哪儿不对。

可能就是因为一个算法的性能不足。所以,是不是要重视TLE起来呢?

// 示例
func twoSum(nums []int, target int) []int {
    var i int
    var a [][]int
    // for i<10 {
    for { // TLE
        i /= i // RE: panic
        i++
        fmt.Println("i:", i) // OLE
        a = append(a, make([]int, i)) // RE: OOM
    }
    return []int{i} // WA
}

四、如何面对“困难”知识的学习?

降阶

降阶很重要,和循序渐进是一个意思;也就是说,今天“图”我看不懂,那么是先去把“深搜”看了。

好了,是不是今天不仅要学“图”,还要学“深搜”,要学的东西反而变多了?不然,无法达到我们今天可能必须要解决一个“图”的问题之目的。

先解决问题,再考虑优化

我再给你讲一个和降阶不一样的:“今天学一半,即先把低处的果子摘了”。

为什么要来学习算法?写在英雄的5月集训月末_第3张图片 力扣307,年轻人的第一个线段树

俗话说,没有观测就没有优化。

307. 区域和检索 - 数组可修改 这题目要用线段树,不用就是1228ms,用了就是508ms。

今天先把题解了,但我不需要学容量不确定线段树的插入、Lazy-tag。

五、逆水行舟,不进则退,慢进也退

未来还需加油,按计划推进:基础算法、专业算法、工程实践、架构框架、领域设计。

六、一起学习,变得更强

如果你需要进英雄的星球,参加6月的集训,请用我推荐码。进入星球后截图告诉我。
1. 发你一个79.8元我的分成红包以兹鼓励。
2. 拉你进英雄的星球核心群。
3. 给你做一个“社牛”欢迎:)

为什么要来学习算法?写在英雄的5月集训月末_第4张图片

 

你可能感兴趣的:(学习)