集合,列表
集合
概念 :由一个或多个元素所构成的整体。
特点 :元素类型不一定相同,元素没有顺序。
列表
概念 :一种数据项构成的有限序列。
特点 :元素类型不一定相同,元素有顺序,且长度是可变的。
举例 :数组,链表,栈,队列,树,图,堆,哈希表(散列表)。
数组
概念 :存储多个相同类型的数据的集合。
特点 :具有索引值,元素在内存中是连续存储且占有相同的内存。
举例 :数值数组,字符数组,指针数组,结构数组。
注意 :如果申请的长度超过内存剩余的长度,则容易产生碎片,导致存储失败。
数组图解
时间复杂度
读取 :
O(1),通过索引值直接读取元素。
查找 :
O(N),从数组开头逐步向后查找元素。
插入 :
O(1),直接在数组最后插入元素。
O(N),在数组中间或者第一个插入元素,后面的元素后移。
删除 :
O(1),直接在数组最后删除元素。
O(N),在数组中间或者第一个删除元素,后面的元素前移。
二维数组
概念 :以数组作为数组元素的数组。
特点 :二维数组又称为矩阵,行列数相等的矩阵称为方阵。
举例 :
int[] a = [[1, 2, 3, 4],[2, 4, 5, 6],[1, 4, 6, 8]]
队列
概念 :一种特殊的线性表,只能在队头进行删除数据的操作,在队尾进行增加数据的操作。
特点 :先入先出(FIFO)。
举例 :顺序队列,循环队列。
队列图解
时间复杂度
读取 :
O(N),从队列开头逐步向后读取元素。
查找 :
O(N),从队列开头逐步向后查找元素。
插入 :
O(1),直接在队列最后插入元素。
O(N),在队列中间或者第一个插入元素,后面的元素后移。
删除 :
O(1),直接在队列第一个删除元素。
O(N),在队列中间或者最后删除元素,后面的元素前移。
对比
「顺序队列」
实现方式 :动态数组+头部指针。
缺点 :浪费空间。
「循环队列」
实现方式 :固定数组+头尾双指针。
优点 :及时释放空间。
栈
概念 :一种只能在表头进行数据插入和删除操作的线性表。
特点 :后入先出(LIFO)。
举例 :顺序栈,链式栈。
实现方式 :动态数组。
栈图解
时间复杂度
读取 :
O(N),从栈底逐步向上读取元素。
查找 :
O(N),从栈底逐步向上查找元素。
插入 :
O(1),直接在栈顶部插入元素。
O(N),在栈中间或者底部插入元素,后面的元素上移。
删除 :
O(1),直接在栈顶部删除元素。
O(N),在栈中间或者底部删除元素,后面的元素下移。
链表
概念 :一种非连续,非顺序的存储方式,通过指针将数据进行连接的方式实现。
特点 :带有指针,长度动态,方便增删操作。
举例 :单向链表,双向链表,循环链表。
链表图解
时间复杂度
读取 :
O(N),从头结点逐个遍历。
查找 :
O(N),从头结点逐个遍历。
插入 :
O(1),通过指针插入,不需要挪动其他的元素。
删除 :
单向链表 O(N),需要从头遍历找到要删除的元素。
双向链表 O(1),简单地将它的前一个结点 prev 与下一个结点 next 链接起来。
树
概念 :由一个根节点和若干个子树构成的集合,树的深度指的是树的有多少层,一个节点的度指的是该节点下有多少个子节点。
特点 :有且仅有一个根节点,子树之间不可以有交集。
举例 :无序树,有序树,二叉树,满二叉树,完全二叉树,哈夫曼树。
树图解
遍历方式
以上图为例,展示遍历结果
- 前序遍历(根左右)
ABDGHCEIF - 中序遍历(左根右)
GDHBAEICF - 后序遍历(左右根)
GHDBIEFCA - 层序遍历(层级)
ABCDEFGHI
二叉树
概念 :每个结点的度 ≤2 的树。
满二叉树
概念 :叶节点除外的所有节点均含有两个子树的树。
无序树
概念 :树中任意节点的子结点之间没有顺序关系。
有序树
概念 :树中任意节点的子结点之间有顺序关系。
完全二叉树
概念 :除最后一层外,所有层都是满节点,且最后一层缺右边连续节点的二叉树。
哈夫曼树
概念 :带权路径最短的二叉树。
图
概念 :由顶点的有穷非空集合和顶点之间边的集合组成。
举例 :无向图、有向图、加权图。
图图解
时间复杂度
添加一条边 :
O(1),直接连接需要的两个点。
判断两个点之间是否有边相连 :
O(1),直接判断两个点之间是否有边即可。
遍历一个点的所有出边 :
O(N),需要遍历所有的边,然后判断是否是目标边。
无向图
概念 :任意两个顶点之间的边都是没有方向的图。
有向图
概念 :任意两个顶点之间的边都是有方向的图。
加权图
概念 :每条边都带有一个相关的权重的图。
堆
概念 :每一个节点的值都必须大于等于或者小于等于其孩子节点的值的完全二叉树。
举例 :最小堆,最大堆。
堆图解
时间复杂度
插入 :
O(logN) ,对分查找。
删除 :
O(logN) ,对分查找。
最小堆
概念 :堆中每一个节点的值都小于等于其孩子节点的值。
特点 :根节点是堆中的最小值。
最大堆
概念 :堆中每一个节点的值都大于等于其孩子节点的值。
特点 :根节点是堆中的最大值。
哈希表(散列表)
概念 :一种使用哈希函数组织数据,以支持快速插入和搜索的数据结构。
特点 : 利用哈希函数。
举例 :哈希集合,哈希映射。
哈希表图解
时间复杂度
插入 :
O(1),使用数组来存储 value,当数组够足小的时候(只有一个数据)。
O(N),使用数组来存储 value,遍历数组的长度。
O(logN),数据足够大,使用高度平衡的二叉树搜索树,则是对分。
搜索 :
O(1),使用数组来存储 value,当数组够足小的时候(只有一个数据)。
O(N),使用数组来存储 value,遍历数组的长度。
O(logN),数据足够大,使用高度平衡的二叉树搜索树,则是对分。