算法:专业选手与业余人员的差距
作者:
| 更新日期:作为业余选手参加 Leetcode 比赛有十几场了,说几个事实。
本文首发于公众号:天空的代码世界,微信号:tiankonguse
一、背景
关注我公众号比较久的人应该知道,我大学期间曾参加过ACM算法比赛,不过也没拿到什么大奖。
工作多年后,我开始尝试分享一些算法和数据结构。
由于理论需要与实践结合,所以我选择使用Leetcode 上的题来讲解各种算法和数据结构。
在 Leetcode 上做了一些题后,再回忆一下工作上使用的算法和数据结构,我想给大家说一些我对这些的看法。
二、专业选手
先来看看算法比赛专业选手都做的是什么数据和算法吧!
初级的算法是数论、二分、三分、线段树、树状数组、最短路、最小生成树、简单DP等。
而中级算法则是树套树、划分树、AC自动机、离散化、RMQ、LCA、DFA、KMP、后缀树、博弈理论、网络流、二分匹配、连通图等。
至于高级的,则不是单纯的某一类算法或数据结构了。
或者说高级的,已经不能成为算法了,而是一个实际的现实问题抽象简化而来,都是要使用多个数据结构和算法,综合运用来解决一道问题。
专业选手毕竟是专业化的人员,在解决各种算法问题的过程中,他们使得自己的分析问题能力、代码能力,查错问题能力得到很大的提高。
分析问题能力可以让他们分析出一道题该如何解决(类似于工作中的项目或者问题,能够快速找找到解决方案)。
而代码能力则是将解决问题的想法具体实现。
查错问题能力则是在代码实现的过程中,发生了不符合预期的结果时,快速找到原因(比如发现原先的分析思路有误,重新分析问题),并最终解决问题。
专业选手通过不断的训练自己,个人能力已经是我们这些业余选手远远不能想象的了。
在中国,最出名的专业选手就是楼天城楼教主了。
如果你没听过楼教主,建议你搜索了解一下,他简直是开挂的人生。
二、业余选手
工作上,大部分程序员只能算是业务选手,因为只会最基础的数据结构和算法。
但即使是最基础的知识,其实很多人也是不会的。
比如实现一个递归算法、链表、LRU等,很多人都不能独立实现。
会这样的原因是因为,实际工作做项目时,一般都有各种成熟的基础系统,互联网上也丰富的各种第三方开源库。
我们只需要在这些系统和开源组件的基础上实现对应的业务逻辑就行了。
那业务逻辑也一般很简单,比如从多个地方拉去数据,做一些过滤,然后聚合返回给前端。
这样久而久之,就导致大家工作多年,最最基础的数据结构和算法依旧很差,甚至分析问题、解决问题的能力也不高。
回头看看 LeetCode 上的题,会发现题型变来变去就是那几种。
比如简单计算、排序、二分、DFS、BFS、动态规划、简单字符串、模拟等。
那些专业选手来到这里做这些比赛的时候,对于大部分人本来是一个半小时也做不完的比赛,他们轻松的在一个小时内全部做完了。
这就是专业选手和业余人员的差距吧。
四、最后
我们工作后时间没有那么多了,由于没有大量的时间来刻意练习,已经没有机会成为专业选手了。
可是,我们还是有可以提高自己的能力,从而做一个比其他业余选手更强的人。
这个机会就是坚持学习算法和数据结构,并不断实践,挑战越来越难的问题。
当然,我并不认为是因为学习算法和数据结构导致我们更强。
而是因为我们不断的挑战自己,做到了更有难度的事情,从而使得自己的能力更强。
如果做项目时,也不断的有各种技术挑战。
然后我们分析问题,设计架构,最终实现代码,按照预期的方式解决问题。
那我们的能力也会不断的增强。
这个其实就是一万小时定律里面的道理,也是网络游戏里面打怪升级的道理,也是玄幻修真武侠小说里面主角为啥越来越厉害的道理。
这就是为什么我们和专业选手有这么大的差距的原因。
你明白这个道理了吗?
-EOF-
本文首发于公众号:天空的代码世界,微信号:tiankonguse
如果你想留言,可以在微信里面关注公众号进行留言。