数据结构 —— 及其操作复杂度 糙版

数据结构类型及其复杂度

每个数据结构我们关注比较多的操作有:

  • 访问(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 二叉树后序遍历

(九)图:有向图、无向图、权重图

图的属性:①入度、出度 ②边、③结点、顶点

图和树结合非常多的算法:数据结构和算法带我学完算法再补充。

(十)待补充

参考视频:爱学习的饲养员

  • 我一直觉得做题应该是动画、画图会好理解很多,不至于全是文字。饲养员的讲解算是很舒服,我也终于不是一题都写不出来的人了。
  • 我有机会的话,本事差不多了也讲解点题目的视频,比博客的成本低很多,而且对大家帮助更大。
  • 还有算法学习,估计要很久了。

书籍买了:

  1. 《大话数据结构》个人感觉不够深入也不够严谨。可能浅显收到很多好评吧

  2. 《算法导论》神书,基本没翻,是很底层的学习,暂时不够时间学习,非常想认真拜读。

  3. 《算法第四版》没买,在微信读书白嫖了。现在正在看,感觉刚刚好适合我

  4. 《算法图解》也感觉刚刚好适合我。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值