一、数据结构基本概念
数据结构是计算机存储、组织数据的方式。
数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。
通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。
数据结构往往同高效的检索算法和索引技术有关。
二、数据结构的意义
一般认为,一个数据结构是由数据元素依据某种逻辑联系组织起来的。
在许多类型的程序的设计中,数据结构的选择是一个基本的设计考虑因素。
许多大型系统的构造经验表明,系统实现的困难程度和系统构造的质量都严重的依赖于是否选择了最优的数据结构。
三、常见的数据结构
常用的数据结构有八种:数组,栈,队列,链表,树,图,堆,散列表。
1、数组
数组是按序排列的同类数据元素的集合,是最简单、也是使用最广泛的数据结构。栈、队列等其他数据结构均由数组演变而来。
数组是在内存中连续存储多个元素的结构,数组中的元素通过数组下标进行访问,下标从0开始。
数组分为一维数组和多维数组。
数组的基本操作:
Insert——在指定索引位置插入一个元素
Get——返回指定索引位置的元素
Delete——删除指定索引位置的元素
Size——得到数组所有元素的数量
优点:
按照索引查询元素速度快。
按照索引遍历数组方便。
缺点:
数组的大小固定后就无法扩容。
数组只能存储一种类型的数据。
添加,删除的操作慢,因为要移动其他的元素。
适用场景:
频繁查询,对存储空间要求不大,很少增加和删除的情况。
2、栈
栈是只能在某一端插入和删除的特殊线性表。
它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。
即特点是:先进后出,或者说是后进先出,从栈顶放入元素的操作叫入栈,取出元素叫出栈。
栈的基本操作:
Push——在顶部插入一个元素
Pop——返回并移除栈顶元素
isEmpty——如果栈为空,则返回true
Top——返回顶部元素,但并不移除它
栈常应用于实现递归功能方面的场景,例如斐波那契数列。
3、队列
一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列是按照“先进先出”或“后进后出”的原则组织数据的。队列中没有元素时,称为空队列。
队列的基本操作:
Enqueue()——在队列尾部插入元素
Dequeue()——移除队列头部的元素
isEmpty()——如果队列为空,则返回true
Top()——返回队列的第一个元素
使用场景:因为队列先进先出的特点,在多线程阻塞队列管理中非常适用。
4、链表
链表是一种物理存储单元上非连续、非顺序的存储结构,它既可以表示线性结构,也可以用于表示非线性结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。
根据指针的指向,链表能形成不同的结构,例如单链表,双向链表,循环链表等。
链表的基本操作:
InsertAtEnd - 在链表的末尾插入指定元素
InsertAtHead - 在链接列表的开头/头部插入指定元素
Delete - 从链接列表中删除指定元素
DeleteAtHead - 删除链接列表的第一个元素
Search - 从链表中返回指定元素
isEmpty - 如果链表为空,则返回true
优点:
链表是很常用的一种数据结构,不需要初始化容量,可以任意加减元素。
添加或者删除元素时只需要改变前后两个元素结点的指针域指向地址即可,所以添加,删除很快。
缺点:
因为含有大量的指针域,占用空间较大。
查找元素需要遍历链表来查找,非常耗时。
适用场景:
数据量较小,需要频繁增加,删除操作的场景。
5、树
树是包含n(n>0)个结点的有穷集合K,且在K中定义了一个关系N,N满足 以下条件:
(1)有且仅有一个结点 K0,他对于关系N来说没有前驱,称K0为树的根结点。简称为根(root)。
(2)除K0外,K中的每个结点,对于关系N来说有且仅有一个前驱。
(3)K中各结点,对关系N来说可以有m个后继(m>=0)。
树数据结构中使用的基本术语:
Root - 根节点
Parent - 父节点
Child - 子节点
Leaf - 叶子节点
Sibling - 兄弟节点
树形结构的主要类型:
N元树
平衡树
二叉树
二叉搜索树
AVL树
红黑树
2-3树
其中,二叉树和二叉搜索树是最常用的树。
树形结构被广泛应用于人工智能和复杂算法,它可以提供解决问题的有效存储机制。
6、图
图是由结点的有穷集合V和边的集合E组成。
为了与树形结构加以区别,在图结构中常常将结点称为顶点,边是顶点的有序偶对,若两个顶点之间存在一条边,就表示这两个顶点具有相邻关系。
图的类型:无向图、有向图
程序语言中,图可以用两种形式表示:邻接矩阵、邻接表
常见图遍历算法:广度优先搜索、深度优先搜索
7、堆
堆是一种特殊的树形数据结构,每个结点都有一个值。通常我们所说的堆的数据结构,是指二叉堆。
堆的特点是根结点的值最小(或最大),且根结点的两个子树也是一个堆。
因为堆有序的特点,一般用来做数组中的排序,称为堆排序。
8、散列表
也叫哈希表,若结构中存在关键字和K相等的记录,则必定在f(K)的存储位置上。由此,不需比较便可直接取得所查记录。称这个对应关系f为散列函数(Hash function),按这个思想建立的表为散列表。
散列函数能使对一个数据序列的访问过程更加迅速有效,通过散列函数,数据元素将被更快地定位。
实际工作中需视不同的情况采用不同的哈希函数,通常考虑的因素有:
计算哈希函数所需时间
关键字的长度
哈希表的大小
关键字的分布情况
记录的查找频率