「这是我参与2022首次更文挑战的第1天,活动详情查看:2022首次更文挑战」
相信好多同学和我一样,面对笔试束手无策,平时不能坚持刷题,严苛一点的公司正式面试前都需要笔试,面试也会问大量的算法问题,尤其是对于初级程序员更加看重算法能力。那我们该如何学习数据结构和算法呢,本篇文章我们一起来聊一聊。
1 了解算法题意在考察什么
程序 = 数据结构 + 算法 | 工程化项目 = 框架 + 业务逻辑(CRUD)
通俗的理解: 数据结构相当于厨具,算法相当于烹饪秘技,程序员相当于厨师。
一个好的厨师才会各种烹饪秘技,想要发挥出烹饪秘技就需要借助各种厨具(煎需要用煎锅,烤需要用烤箱、炖需要用炖的锅...)。
同理,一个好的工程师也应该会各种算法,通过不同的数据结构去解决实际问题。
算法题不光能考察候选人对数据结构算法的掌握情况,还能直接看出候选人的动手能力,手撕代码,白纸写算法是最考察基本功的了,同时能看出候选人的编码风格是不是简洁、高效、规范等等。
2 知道算法好坏的评价标准
算法好坏的评价标准一般是从两个角度考量的时间与空间。
我们在学习一个算法时,必须得去了解它的时间复杂度和空间复杂度,从而对比算法的优劣。
时间与空间往往不能兼得,通常都是使用以空间换时间的策略,付出更多的硬件让用户得到更爽的访问体验。
分析算法复杂度时可以忽略常数,低次项,系数 3n²+2n+1 <=> n²
时间复杂度:时间复杂度往往是一个重点,可以表示算法执行效率。
空间复杂度:空间复杂度表示占用空间的情况。
算法复杂度排序,越小越优质。
O(1) < O(log₂n) < O(n) < O(nlog₂n) < O(n²) < O(n³) < O(nⁿ) < O(2ⁿ) < O(n!)
3 掌握每种数据结构的特性
学习算法和刷题之前最好能够去学习了解每种数据结构的特性,然后再学算法去灵活运用每种数据结构。
学数据结构一定要去了解它的访问、搜索、插入、删除的时间复杂度,这样才能了解它的优势是什么。
-
数组
- 简单数组
- 稀疏数组
-
链表
- 单链表
- 双链表
- 循环链表
-
队列
-
栈
-
树
- 二叉树
- 二叉搜索树
- AVL树
- 红黑树
- B树
- 哈夫曼树
- ...
-
图
-
复合数据结构
- 哈希表
- 跳表
- ...
-
...
4 学习常见的算法
算法其实就是一些大牛总结的一系列解决问题的方法,这点与设计模式很类似,设计模式是针对面向对象的程序设计,算法是面向过程的一些列运算规则。
-
十大排序算法
-
查找算法
- 二分查找
- RK算法
- BM算法
- KMP算法
- ...
-
贪心算法
-
动态规划
-
加密算法
- AES
- RSA
- ...
-
哈希算法
- MD5
- SHA
- ...
-
...
5 学习途径推荐指南
-
书籍 《小灰漫画算法》《算法》 《算法导论》
由简单到困难到进阶
-
视频
《手把手带你刷LeetCode》 UP:爱学习的饲养员 (教刷LeetCode,很精炼挺不错)
《数据结构与算法基础-Java版》(罗召勇) UP: DT课堂... (全面,不墨迹)
《数据结构》 UP :尚硅谷韩顺平 (有点墨迹,内容很全面)
-
文章
文章嘛,网上有很多,也有一些不错的公众号,我也会持续更新,关注我的算法专栏,哈哈。
6 总结
算法学习贵在坚持,任重而道远,希望我们能够一起加油,坚持学习。