都说没有最好的数据结构,只有最适合的数据结构。
虽然我们现在竟然调用一些现成代码包,这东西看着不一定能马上使用,但蕴含着编程最本质的一些逻辑与思想,使我们能够创作出更优美的代码。
不过学习它的过程并不容易,有时候遇到一些难题需要硬啃,真正理解那些巧妙的解法,再通过不断练习让自己学会运用、举一反三。
后面会按主题一一记录一些题目与解题思路,主题可能按数据结构、也可能按主要解题方法,题目范围会有交叠。
基本概念
-
数据:描述客观事物的符号,计算机可以接收处理的对象
-
数据结构:相互之间存在一种或多种关系的数据元素集合
-
算法:解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作
-
计算机解决问题
- 1.从具体问题中抽象出数据模型
- 2.设计算法
- 3.设计程序=算法+数据结构,实质是对确定的问题选择一个好的数据结构,再加上一种好的算法
-
时间复杂度:算法语句的总执行次数量级(按最坏情况算)
-
空间复杂度:算法占用的存储空间大小量级
这两个概念的具体衡量方式如下,假设数据元素输入量为n,
O(1)<O(logn)<O(n)<O(nlogn)<O(
n
2
n^2
n2) <O(
2
n
2^n
2n)<O(n!)<O(
n
n
n^n
nn)
- 以上从函数渐进增长的角度来比较快慢程度,函数渐进增长是指给定两个函数f(n)和g(n),存在一个整数N,当n>N时,f(n)>g(n),则称f(n)增长渐进快于g(n),这里记为f(n)>g(n)
- 当n特别大时,只需关注最高阶项,常数项、非最高阶项、常数系数都可忽略
学习思路
入门阶段:
- 先熟悉每个数据结构:
- 数据结构是什么,基本操作的复杂度是多少,优缺点、应用场景
- 用自己的编程语言如何实现该数据结构,该数据结构目前在自己的编程 语言里怎么调用,以及如何用自己的编程语言实现一些基本操作
- 练习典型应用该数据结构的题目(两三个就好)
再熟悉常用解题算法套路:
- 套路是什么
- 一般遇到什么情况使用该套路
- 练习典型应用该套路的题目(两三个就好,如果特别不熟悉可以再多练几个,要练太多怕过拟合)
进阶阶段:
- 刷力扣题库,而且保证解题前不被剧透它的解题方向
- 重复刷了三轮+
- 第一轮只求做出、做不出看懂解题
- 第二轮以面试方式做出、基本控制15min内、较难的20min内,做不出继续看题解
- 第三轮面试10~15min内,并且能很快得到自己解题的复杂度,再看题解中的优秀答案进行优化
- 重复刷了三轮+
- 这里我选了两个题库
- (必选)剑指offer,75题
- (可选)腾讯精选50题,50题
自由阶段:
- 养成每日刷题的习惯
(这里学习了一位b站up主的思路,安利up主的作品,见参考资料)
目录
(待补充)
参考材料
- 程杰 《大话数据结构》
- up主:爱学习的饲养员