数据结构与算法总结1

1 常用数据结构

1.1 常用数据结构和技巧

  • 数组、字符串
  • 链表
  • 队列
  • 双端队列

(1)数组、字符床优缺点

优点:构建一个数组非常简单;能让我们再O(1)的时间里根据数组的下标查询某个元素

缺点:构建时必须分配一段连续的空间;查询某个元素是否存在时需要遍历整个数组,耗费O(n)的时间;删除和添加某个元素时,同样需要耗费O(n)的时间

(2)链表

单链表:链表中的每个元素实际上是一个单独的对象,而所有的对象都通过每个元素中的引用字段链接在一起
在这里插入图片描述
双链表:与单链表不同的是,双链表的每个结点中都含有两个引用字段
在这里插入图片描述

优点:灵活地分配内存空间;能在O(1)时间内删除或者添加元素
缺点:查询元素需要O(n)时间
解题技巧:利用快慢指针(有时需要三个指针);构建一个虚假的链表头。例如:两个排序链表,进行整合排序;将链表的奇偶数按原定顺序分离,生成前半部分为奇数,后半部分为偶数的链表
(3)栈
特点:后进先出
算法基本思想:可以用一个单链表来实现;只关心上一次操作;处理完上一次的操作后,能在O(1)时间内查找到更前一次的操作
(4)队列
特点:先进先出
常用场景:广度优先搜索
(5)双端队列
基本实现:可以利用一个双链表;队列的头尾两端能在O(1)的时间内进行数据的查看、添加和删除
常用场景:实现一个长度动态变化的窗口或者连续区间
(6)树
树的共性:结构直观;通过树问题来考查递归算法掌握递归的熟练程度
面试中常考的树的形状有:
普通二叉树
平衡二叉树
完全二叉树
二叉搜索树
四叉树
多叉树
特殊的树:红黑树、自平衡二叉搜索树
遍历:前序遍历;中序遍历;后序遍历

2 高级数据结构

优先队列

前缀树
线段树
树状数组
(1)优先队列
与普通队列的区别:保证每次去除的元素是队列中优先级最高的;优先级别可自定义
最常用的场景:从杂乱无章的数据中按照一定的顺序(或者优先级)筛选数据
本质:二叉堆的结构,利用一个数组结构来实现完全二叉树
在这里插入图片描述
特性:
数组里的第一个元素array[0]拥有最高的优先级
给定一个下标i,那么对于元素array[i]而言,父节点对应的元素下标是(i-1)/2,左侧子节点对应的元素下标是2i+1,右侧子节点对应的元素下标是21+2
数组中每个元素的优先级都必须要高于它两侧子节点
基本操作有以下两个:
向上筛选
向下筛选
另一个最重要的时间复杂度:优先队列的初始化
(2)图
最基本的知识点如下:
阶、度
树、森林、环
有向图、无向图、完全有向图、完全无向图
连通图、连通分量
图的存储表达方式:邻接矩阵、邻接链表
图的算法多式多样:
图的遍历:深度优先,广度优先
环的检测:有向图、无向图
拓扑顺序
最短路算法
连通图相关算法
图的着色、旅行商问题
必须掌握的知识点:
图的存储和表达方式:邻接矩阵、邻接链表
图的遍历:深度优先,广度优先
二部图的检测、树的检测、环的检测:有向图、无向图
拓扑排序
联合-查找算法
最短路径
(3)前缀树
也称为字典树
这种数据结构被广泛地应用在字典查找当中
什么是字典查找
例如:给定一系列构成字典的字符串,要求在字典当中找出所有以"ABC"开头的字符串
方法一:暴利搜索法
方法二:前缀树
最基本的操作:创建
方法:遍历一遍输入的字符串,对每个字符串的字符进行遍历,从前缀树的根节点开始,将每个字符加入到节点的childran字符集当中,如果字符集已经包含了这个字符,跳过。如果当前字符是字符串的最后一个,把当前节点的isEnd标记为真
最基本的操作:搜索
方法:从前缀树的根节点出发,逐个匹配输入的前缀字符,如果遇到了,继续往下一层搜索,如果没遇到,立即返回
(4)线段树
假设我们有一个数组array[0,…,n-1],里面有n个元素,现在我们要经常对整个数组做两件事:
1.更新数组元素的数值
2.求数组任意一段区间里元素的总和(或者平均值)
方法一:遍历一遍数组,时间复杂度O(n)
方法二:线段树,时间复杂度O(logn)
什么是线段树:一种按照二叉树的形式存储数据的结构,每个节点保存的都是数组里某一段的总和
例如:数组[1,3,5,7,9,11]
在这里插入图片描述
(5)树状数组
也被称为Binary Indexed Tree
假设我们有一个数组array[0,…,n-1],里面有n个元素,现在我们要经常对整个数组做两件事:
1.更新数组元素的数值
2.求数组前k个元素的总和(或者平均值)
方法一:线段树
时间复杂度:O(logn)
方法二:树状数组
时间复杂度:O(logn)
重要的基本特征
利用数据来表示多叉树的结构,和优先队列有些类似
优先队列是用数组来表示完全二叉树,而树状数组是多叉树
树状数组的第一个元素是空节点
如果节点tree[y]是tree[x]的父节点,那么需要满足y=x-(x&(-x))

猜你喜欢

转载自blog.csdn.net/wqs12345612/article/details/113954588