# 3.增删查:掌握数据结构基本操作
# 3-1 代码对数据的处理
回顾上一个例子,在数组中找到出现次数最多的元素,在处理数据时,我们主要做了以下几个步骤
- 查找:看能否在数据结构中找到该元素,也就是判断元素是否出现过
- 新增:针对没有出现过的情况,新增这个元素
- 改动:针对出现过的情况,需要对这个元素出现的次数加1
k-v 数据结构方式查找数据时,时间复杂度为O(1)
# 3-2 数据处理的基本操作
设计合理的数据结构,才能达到降低时间损耗的目的,而设计合理的数据结构,需要从问题本身出发
- 首先我们分析这段代码到底对数据先后进行了哪些操作
- 然后再根据分析出来的数据操作,找到合理的数据结构
代码对数据处理的操作类型非常少,代码对数据的处理就是代码对输入数据进行计算,得到结果并输出的过程。
数据处理的操作就是找到需要处理 的数据,计算结果,再把结果保存下来,总结过程为:
- 找到要处理的数据,这就是按照某些条件进行查找
- 把结果存到一个新的内存空间中,这就是在现在数据上进行新增
- 把结果存到一个已使用的内存空间中,这就需要先删除内存空间中的已有数据,再新增新的数据
经过对代码的拆解,会发现即使很复杂的代码,对数据处理也就3个基本操作:新增、删除、查找;总结步骤:
- 首先,这段代码对数据进行了哪些操作?
- 其次,这些操作中,哪个操作最影响效率,对时间复杂度的损耗最大
- 最后,哪种数据结构最能帮助你提高数据操作的使用效率
# 3-3 数据操作与数据结构的案例
# 3-3-1 第一个例子:查找
例子:从复杂的数据结构中,找到满足某个条件的元素 对于一个数组,找到第二个元素并输出
这个例子很简单
直接使用数组的index索引就可以,这个和数组的长度无关
所以复杂度为O(1)
# 3-3-2 第二个例子:链表查找
例子:如果是链表,如果查找链表中第二个元素并输出
链表和数组一样,,都是O(n)空间复杂度,区别在于,数组有index索引,链表没有,链表有指针
链表,查找时,需要一个一个元素,按照顺序逐一去查找,所以时间复杂度就是O(n)
# 3-3-3 第三个例子:数值查找
例子:要查找数组中,值为5的元素,是否存在
按照顺序一个一个去查找,这样时间复杂度为O(n)
有没有办法,可以降低时间复杂度呢?答案是按照字典的方式k-v来查找
# 3-3-4 第四个例子:复杂数据结构中新增一条数据
- 第一个是在这个复杂的数据结构的最后,新增一条数据
- 第二个是在这个复杂的数据结构中的某一个位置,新增一条数据
这两个的区别在于:新增数据之后,是否导致原数据位置顺序改变
- 1.假设在最后新增
首先,通过查找操作找到数据结构中最后一个数据的位置
接着,在这个位置之后,通过新增操作,赋值或插入一条新的数据即可
- 2.假设在数据结构中间某个位置新增
如果是在中间插入,就会对插入元素的位置之后的元素产生影响,导致数据的位置变化
# 3-3-5 第五个例子:复杂数据结构中删除一条数据
- 第一个是在这个复杂的数据结构的最后,删除一条数据
- 第二个是在这个复杂的数据结构中的某一个位置,删除一条数据
这两个的区别在于:删除数据之后,是否导致原数据位置顺序改变
# 3-3-5 第六个例子:在第二个元素后新增一个元素、再删除第一个满足大于6的元素
第一步:在第二个元素之后新增一条数据;这里面包含了查找和新增两个操作
第二步:删除第1个满足数值大于6的元素;这里包含了查找和删除两个操作
# 3-4 总结
- 处理数据的基本操作只有三个:增、删、查;
- 增和删又可以细分为在中间删除新增还是在末尾删除新增
- 几乎所有的数据处理都是这些基本操作的叠加