最近还刷了剑指offer几十道基础题目,再次重刷2018年刷的时候心态完全不一样。
2018年夏天当时在牛客还有杂论坛刷了大概三个月时间,那时候几乎看着解题答案一路刷过来,后面时间去学习安全,算法也告一段落。2022年断续几个月刷了小50道题目,有贪心 - 双指针 - 排序 - 二叉树等,有着不一样的体会。
一直在思考,工作几年来自己用到的算法少之又少,但是编码的工程量一直再增加,为什么没有经常用到算法?当然也有一部分原因是做系统内核客户端开发,比起写后端或者搜索和存储引擎的工作接触算法的机会也少一些。
比如现在用c++排序,大几率不用Boost就直接上stl的方法,几乎不会自己造个轮子来做。同理,大量的数据存储键值和查增删改查std:: vector map list queue几乎满足大多数工程需求。
内核态c用过很多基础的数据结构,如列表和树,包括散列表优化等,与其算法倒不如是基础性的工程指针结构。
std::find方法几乎时时刻刻再用,比如替换字符串_查找字符串,其实内部就是上述比如双指针,散列优化字符串key有序查找等,比较更优的还有动态规划。
常见的折半(二分法),插值,稠密,分块,倒排等等,简单说排序是为了有序,有序的目的是为了使用二分法,插排法等加快查询速度,从O(n) --> logn --> O(1),大量运算让效果显而易见。
排序也衍生了很多排序,在那些古老的时光里,O(n)一直是屏障,冒泡,选择,直接插入等,始终提升不了。大量运算测试可以比O(n)相对更优的算法比如希尔,堆排,归并,快排等让我们更快的索引和查找到有用的数据且增删改。
我们都希望数据是有序的,当然这是不可能的,二叉树指针结构可以帮我们构建按照一定索引就可以通过遍历得到有序,倒序的元素,包括优化后的平衡,红黑树都是为了加快我们的索引和业务增删改查,真的业务场景中在无序和杂乱的存储中,树就更有优势,比如数据库,存储还得树。
算法和数据结构几乎在我们每一行代码中,不过都被封装很好。还有设计模式,分布式数据,分布式消息队列都有很不错三方库或者原生库,大家都不用关注实现和背后的复杂度逻辑,为什么快,而又为什么慢?慢就换库,不能用就是库不行。
不可否认算法高手都是数学和轮子高手,用更合适的的算法满足业务需求。就比如stl一群算法巨佬做出来的,但是你也要清楚的知道stl是模板库,它会做很多的兼容和选择运算,这个过程同样是复杂和耗费时间的。某些使用可能还没有你直接下标做算法来的更快,当然这是根据业务场景来说的。不可否认的是它完整且整体高效,stl是套了不起的泛型和算法库。