前言
自从大学毕业后,数据结构相关知识已忘的差不多,现在准备复习下数据结构相关知识,并记录下来。
正文
常见的数据结构如下:
数组
链表
栈
队列
树
图
哈希表
以下会逐一细说。
1、数组:
数组是一种连续存储线性结构,通过使用整型索引值来访问它们的元素。
数组的优缺点:
(1)优点:
数组查询效率高
(2)缺点:
数组插入和删除效率低
需要大块连续的内存块
创建时需要指定数组的长度
2、链表:
n个节点离散分布,彼此之间用指针相连。每个节点(除了首节点、尾节点)有一个前驱节点和一个后续节点,首节点只有一个后续节点,尾节点只有一个前驱节点。
链表的优缺点:
(1)优点:
链表的插入或删除效率高
(2)缺点:
链表的查询效率低
链表分类:
①单向链表:只有一个指针域,指向该节点的后续节点。
②双向链表:有两个指针域,指向该节点的前驱节点和后续节点。
③循环链表:(单向或者双向)链表的尾指针指向头节点,实现循环链表。通过任意一个节点都可以推出整个链表。
3、栈:
先进后出,后进先出。
4、队列:
先进先出,后进后出。
5、树:
一种非线性的数据结构。
树的分类:
①二叉树:每个节点最多只有两个分支。(注:后面会有一篇文章专门写二叉树的遍历)
完全二叉树:若设二叉树的深度为h,除第 h 层外,其它各层 (1~(h-1)层) 的结点数都达到最大个数,第h层所有的结点都连续集中在最左边,这就是完全二叉树;
满二叉树:是一种特殊的完全二叉树。除了最后一层节点无任何子节点外,其他节点都有两个子节点。
②二叉搜索树(二叉查找树、二叉排序树):若左子树不空,则左子树上所有结点的值均小于它的根结点的值;若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值,并且左、右子树也分别为二叉搜索树。
③平衡二叉树:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
AVL树:是一种最先发明的自平衡的二叉查找树。
红黑树:是一种自平衡(不是绝对的平衡)的二叉查找树,树上的每个节点都遵循下面的规则:
每个节点都有红色或黑色;
根节点是黑色;
每个红色节点必须有两个黑色的子节点。(从每个叶子到根的所有路径上不能有两个连续的红色节点;
从任一节点到其任何后代NULL节点(叶子结点下方挂的两个空节点,并且认为他们是黑色的)的每条路径都具有相同数量的黑色节点。
④B树:是一种自平衡的查找树,但不是二叉树。
⑤B+树:类似于B树,区别是B+树只有达到叶子结点才命中(B树可以在非叶子结点命中),其性能也等价于在关键字全集做一次二分查找;
6、图:
一种非线性的数据结构。所有的顶点构成一个顶点集合,所有的边构成边的集合,一个完整的图结构就是由顶点集合和边集合组成。 图结构中顶点集合不能为空,必须包含一个顶点,而图结构边集合可以为空,表示没有边。
图的分类:
①无向图:如果一个图结构中,所有的边都没有方向性,那么这种图便称为无向图。
②有向图:一个图结构中,边是有方向性的。
③无向完全图:在一个无向图中, 每两个顶点之间都存在条边,那么这种图结构称为无向完全图。
④有向完全图:在一个有向图中,每两个顶点之间都存在方向相反的两条边,那么这种图结构称为有向完全图。
⑤有向无环图(DAG图):在一个有向图无法从某个顶点出发经过若干条边回到该点,则这个图是一个有向无环图。
7、哈希表:
是一种根据关键码去寻找值的数据映射结构。
(1)哈希函数:根据数据的关键词 key ,通过一定的函数关系,计算出该元素存储位置的函数。
①直接定址法:取关键字或关键字的某个线性函数值为散列地址。即 H(key) = key 或 H(key) = a*key + b,其中a和b为常数。
②除留余数法:取关键字被某个不大于散列表长度 m 的数 p 求余,得到的作为散列地址。即 H(key) = key % p, p < m。
③数字分析法:当关键字的位数大于地址的位数,对关键字的各位分布进行分析,选出分布均匀的任意几位作为散列地址。仅适用于所有关键字都已知的情况下,根据实际应用确定要选取的部分,尽量避免发生冲突。
④平方取中法:先计算出关键字值的平方,然后取平方值中间几位作为散列地址。随机分布的关键字,得到的散列地址也是随机分布的。
(2)哈希冲突:对于不同的key,通过哈希函数获取到相同的结果时,产生哈希冲突。
解决哈希冲突的方法如下:
①拉链法(链接法):将所有关键字为同义字的记录存储在一个单链表中,我们称这种单链表为同义词子表,散列表中存储同义词子表的头指针。
②开放定址法:当冲突发生时,使用某种探查(亦称探测)技术在散列表中寻找下一个空的散列地址,只要散列表足够大,空的散列地址总能找到。
按照形成探查序列的方法不同,可将开放定址法区分为线性探查法、二次探查法、双重散列法等。