数据结构|-常见数据结构整理
归纳总结了一下数据机构的常用类型,个人理解常用的数据机构可以分为线性表、栈、队列、树,线性表包括顺序表和链表,栈和队列应当属于特殊的线性表,有几个概念和误区需要先说一下
顺序表和线性表的关系:
-
- 线性表是逻辑概念,只要所有的数据在逻辑上是一维的便算是线性表,线性表中数据元素之间的关系是一对一的关系(每个元素首尾相接),比如数组和链表,都是数据一个接一个的线性表。与线性表对应的是树、堆等。
- 顺序表是空间概念,是线性表的顺序存储结构,指的是数据在存储空间上顺序排列,比如数组,数组便是划分一块连续的内存区域用于存储,与顺序表相对应的是链表。
队列、栈和线性表的关系:
-
- 线性表可以在表中任意位置进行插入、删除等操作。
- 栈是一种特殊的线性表,其逻辑结构和线性表相同,但也有差别,栈被限定为只能在其一端进行插入删除的操作。
- 队列也是一种特殊的线性表,逻辑结构与线性表相同,但操作上有限制,队列限制在表的一端进行插入,在表的另一端进行删除。
数组、链表、栈、队列、哈希表、树、图、堆
数组
数组是可以在内存中连续存储多个元素的结构,在内存中的分配也是连续的,数组中的元素通过数组下标进行访问,数组下标从0开始。
优点:
-
- 按照索引查询元素速度快
- 按照索引遍历数组方便
缺点:
-
- 数组的大小固定后就无法扩容了
- 数组只能存储一种类型的数据
- 添加,删除的操作慢,因为要移动其他的元素。
适用场景:
频繁查询,对存储空间要求不大,很少增加和删除的情况。
链表
链表是物理存储单元上非连续的、非顺序的存储结构,数据元素的逻辑顺序是通过链表的指针地址实现,每个元素包含两个结点,一个是存储元素的数据域 (内存空间),另一个是指向下一个结点地址的指针域。根据指针的指向,链表能形成不同的结构,例如单链表,双向链表,循环链表等。
链表的优点:
-
- 链表是很常用的一种数据结构,不需要初始化容量,可以任意加减元素;
- 添加或者删除元素时只需要改变前后两个元素结点的指针域指向地址即可,所以添加,删除很快;
缺点:
-
- 因为含有大量的指针域,占用空间较大;
- 查找元素需要遍历链表来查找,非常耗时。
适用场景:
数据量较小,需要频繁增加,删除操作的场景
PS:C#中没有链表,根本原因是 .net 框架中出于安全考虑取消了指针类型,因此也就没有链表了。而事实上,数组和哈希表的组合在各方面都不输链表,链表也就没有存在空间了。
栈
栈是一种特殊的线性表,仅能在线性表的一端操作,栈顶允许操作,栈底不允许操作。 栈的特点是:先进后出,或者说是后进先出,从栈顶放入元素的操作叫入栈,取出元素叫出栈。
栈的结构就像一个集装箱,越先放进去的东西越晚才能拿出来,所以,栈常应用于实现递归功能方面的场景,例如斐波那契数列。
队列
队列与栈一样,也是一种线性表,不同的是,队列可以在一端添加元素,在另一端取出元素,也就是:先进先出。从一端放入元素的操作称为入队,取出元素为出队,示例图如下:
使用场景:因为队列先进先出的特点,在多线程阻塞队列管理中非常适用。
哈希表
散列表,也叫哈希表,是根据关键码和值 (key和value) 直接进行访问的数据结构,通过key和value来映射到集合中的一个位置,这样就可以很快找到集合中的对应元素。
记录的存储位置=f(key)
从图中可以看出,左边很明显是个数组,数组的每个成员包括一个指针,指向一个链表的头,当然这个链表可能为空,也可能元素很多。我们根据元素的一些特征把元素分配到不同的链表中去,也是根据这些特征,找到正确的链表,再从链表中找出这个元素。
可以看作是数组和链表的组合。
树
这里仅讨论二叉树,以图加深印象
相关性质
-
- 二叉树的每个结点至多只有2棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。
- 二叉树的第i层至多有2^(i-1)个结点;深度为k的二叉树至多有2^k-1个结点。
- 一棵深度为k,且有2^k-1个节点的二叉树称之为 满二叉树 ;
- 深度为k,有n个节点的二叉树,当且仅当其每一个节点都与深度为k的满二叉树中,序号为1至n的节点对应时,称之为 完全二叉树 。(简单来理解就是依次从左子树一直排过去,有任何一个结点只有右子没左子便不是完全二叉树)
三种遍历(三种遍历很容易搞混,其实只需要顾名思义,先序中序后序就是指的父结点遍历的先后次序,先序:先根后左再右,中序:左根右,后序:左右根)下面的图多跟着走几遍就理解透彻了
图
未完待续……
堆
未完待续……
参考来源:https://blog.csdn.net/yeyazhishang/article/details/82353846、https://www.cnblogs.com/wanghuaijun/p/7302303.html