文章目录
数据结构类型及其复杂度
每个数据结构我们关注比较多的操作有:
- 访问(Access)
- 搜索(Search)
- 插入(Insert)
- 删除(Delete)
除此之外还有创建操作 长度.size()方法/.length属性/len()方法以及**是否为空.isEmpty()**等
(一)数组:“读多写少”
数组特点:在空间上是①”连续存储“,并且存储内容是②同类型的。
- 访问:时间复杂度O(1),因为当我们知道数组下标时可以直接计算得知其存储位置直接访问。
- 搜索:时间复杂度O(n),根据元素值进行搜索需要遍历整个数组,故时间复杂度为O(n)。
- 插入:时间复杂度O(1)或O(n),根据数组的空间连续性,新增元素之后的元素需要全部移动,时间O(n),如果是在尾部插入元素则时间复杂度为O(1)。
- 删除:根据索引则直接删除元素值本身,该操作O(1),(接着移动元素则为O(n))。根据数值搜寻删除则O(n)。
由于数组的两个特性,与链表相比,数组更适合多访问,少增删。因为时间复杂度较低。
LeetCode简单题:
- 485 最大连续1的个数
- 283 移动零
- 27 移动元素
(二)链表:“读少写多”
链表本身①根据指针相连,在①空间上并不连续。
- 访问:时间复杂度O(n),根据数值访问链表需要从头遍历到尾指针。
- 搜索:时间复杂度O(n),理同上,需要遍历整个链表。
- 插入:时间复杂度O(1),不考虑寻找插入位置的时间,从插入操作本身与数组对比,只需要修改前(后)指针的位置即可,时间复杂度低。
- 删除:时间复杂度O(1),不考虑寻找插入位置的时间,从删除操作本身与数组对比,只需要修改前(后)指针的位置即可,时间复杂度低。
链表的特性就是空间不连续,故不适合频繁的访问与读取,适合写入和删除。“读少写多”。
LeetCode简单题:
- 206 反转链表
- 203 删除链表元素
(三)队列:先进先出 (FIFO, First In First Out)
队列在底层实现的结构是链表,我们只提供队列的操作方法。(个人理解,不必深究)
- 访问:时间复杂度O(n),队列的访问与遍历都从删除栈顶元素开始,故时间复杂度是O(n)。
- 搜索:时间复杂度O(n),理同上,需要逐个删除栈顶元素,从而遍历整个链表。
- 插入:时间复杂度O(1),队列的特性就是先进先出,添加元素只在队伍后面”排队“添加。
- 删除:时间复杂度O(1),同上,删除队列元素只删除队头元素,时间复杂度为O(1)。
队列和栈分别是先进先出FIFO、先进后出FILO。
LeetCode简单题:
- 933 最近的请求次数(PING方法体,经典队列)
(四)栈:后进先出(LIFO,Last In First Out)
栈的底层实现是数组。(或链表)
- 访问:时间复杂度O(n),栈的访问从弹出栈顶元素开始,从头到尾时间复杂度是O(n)。
- 搜索:时间复杂度O(n),理同上,需要逐个弹出栈顶元素,从而遍历整个栈。
- 插入:时间复杂度O(1),栈的特性就是后入先出,压栈只需要在栈顶压入元素即可。
- 删除:时间复杂度O(1),同上,弹出元素只弹出栈顶元素,时间复杂度为O(1)。
队列和栈在生活中的应用非常多:排队的时候是”队列“、流水线加工是”队列“;栈的话盘子的堆叠和取就是”栈“、页面后退返回撤销等操作都是”栈”实现。
LeetCode简单题:
- 20 有效的括号
- 496 下一个更大元素 I
(五)哈希表:“散列表”
哈希表①键值对(键Key,值Value):哈希表的底层可以是数组。在python中可使用字典结构。
②哈希表存在冲突问题。
- 访问:通常提到的是搜索。
- 搜索:时间复杂度O(1)索引,通过hash函数key值可以映射到存放内容的地址。但是如果冲突则根据冲突个数K的多少退化为O(K)。
- 插入:时间复杂度O(1),提供键值对就可以插入该元素。
- 删除:时间复杂度O(1),提供元素的键即可hash到元素的位置进行删除操作。
Hash因为性能优越被广泛应用在各个领域,比如加密算法等。通常需要避免因为冲突导致时间复杂度退化,我们会选择分布均匀的映射,冲突的搜索通常采用基于链表结构进行。(暂时略写)
LeetCode简单题:
- 217 存在重复元素
- 389 找不同
- 496 下一个更大元素
(六)集合:数学集合概念
集合的三个特性:①互异性、②无序性、③确定性。
集合可以采用哈希集合、链表集合、树集合等。以下操作基于哈希集合。
- 访问:通常提到的也是搜索。
- 搜索:同哈希表:时间复杂度O(1)索引,通过hash函数key值可以映射到存放内容的地址。但是如果冲突则根据冲突个数K的多少退化为O(K)。
- 插入:时间复杂度O(1),集合无序添加元素,如果空间冲突则为O(K)。
- 删除:时间复杂度O(1),找到即删除,如果冲突则O(K),删除键值对不影响其他键值对。
LeetCode简单题:
- 217 存在重复元素
- 705 设计哈希集合
(七)堆:最大堆、最小堆
- 搜索:时间复杂度O(1),只搜索堆顶元素。
- 插入:时间复杂度O(logN),2^n次,类似折半查找。
- 删除:时间复杂度O(logN),删除栈顶元素,需要重新排序,类似折半查找。
LeetCode简单题:
- 215 数组中第K个最大元素
- 692 前k个高频单词
(八)树:二叉树、满二叉树、完全二叉树。
树的属性:①高度、②深度、③层数
三序遍历:①前序遍历、②中序遍历、③后序遍历
LeetCode简单题:
- 144 二叉树前序遍历
- 94 二叉树中序遍历
- 145 二叉树后序遍历
(九)图:有向图、无向图、权重图
图的属性:①入度、出度 ②边、③结点、顶点
图和树结合非常多的算法:数据结构和算法带我学完算法再补充。
(十)待补充
参考视频:爱学习的饲养员
- 我一直觉得做题应该是动画、画图会好理解很多,不至于全是文字。饲养员的讲解算是很舒服,我也终于不是一题都写不出来的人了。
- 我有机会的话,本事差不多了也讲解点题目的视频,比博客的成本低很多,而且对大家帮助更大。
- 还有算法学习,估计要很久了。
书籍买了:
-
《大话数据结构》个人感觉不够深入也不够严谨。可能浅显收到很多好评吧
-
《算法导论》神书,基本没翻,是很底层的学习,暂时不够时间学习,非常想认真拜读。
-
《算法第四版》没买,在微信读书白嫖了。现在正在看,感觉刚刚好适合我
-
《算法图解》也感觉刚刚好适合我。