数据结构
定义:数据结构是计算机存储、组织数据的方式。是一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成。
精心选择的数据结构可以带来高效运行和或者存储效率。 与检索算法,索引有关系。
简单来说,数据结构是带”结构”的数据元素集合。
结构:分为逻辑结构和存储结构(物理结构)
意义:从具体(实际问题)到抽象(数据结构)的过程,核心是分解和抽象,
1)分解可以划分出数据的三个层次,通过抽象,舍弃数据元素的的具体内容,得到逻辑结构。
2)通过分解将处理要求划分成各种功能,在通过抽象舍弃现实细节,得到运算定义
将上述两方面结合起来,将问题变成数据结构。通过增加对实现细节的考虑进一步得到存储结构和实现运算,从而完成设计任务
逻辑结构
指的是反映数据元素之间的逻辑关系的数据结构,逻辑关系指的是数据元素之间的前后关系,而与其在计算机中的存储位置没有关系。
逻辑结构包括:
{
集合:数据结构中元素之间除了同属一个集合之间的相互关系之外,无别的关系
线性结构: 数据结构中的元素存在一对一的相互关系
树形结构: 数据结构中元素存在一对多的相互关系
图形结构: 数据结构中的元素存在多对多的相互关系
}
物理结构
指的是数据的逻辑结构在计算机存储空间的存放形式,包括①元素的计算机内表示以及 ②元素之间关系的计算机机内表示。
物理结构实现方法:顺序,链式,索引,散列(hash) 所以一种数据结构可以表示成多种存储结构
{
①元素机内表示:节点(节点是二进制的(bit)的位串 0101001这种,多片数据节点 在一起称之为数据域)
②元素关系的表示:机内表示可分为顺序映像和非顺序映像,常用的两种存储结构: 顺序存储结构,链式存储结构
}
分类:这是从逻辑上分为线性和非线性
1.线性结构:有线性关系的结构
特点:①非空集和 ②有且只有一个起点与一个终点 ③所有节点都最多只有一个前节点和后节点
典型: 线性表,栈,队列和串(字符串)
2.非线性结构:各个节点之间是多个对应关系
特点:①非空集和 ②一个节点可能有多个前节点和后节点
典型:数组,广义表,,树结构, 图结构等
常用数据结构
数组:非线性结构
逻辑上是非线性结构,相同类型的多个变量组合在一起的集合
逻辑结构 :集合
存储结构:可以是多种,一般来说是顺序存储,JavaScript中是链式存储
代码实现:基础数据结构数组
栈:线性结构
线性结构,逻辑上是一种特殊的线性表
特点:只能从一个表的一端插入和删除数据,后进先出,先进后出
逻辑结构: 线性结构
物理结构:存储方式可以使顺序(数组)或者链式(链表)。栈更多用顺序表实现。
实现方式可以是数组或者链表,前者容量有限且固定,后者不受限,但是操作不方便,并且每次入栈要申请内存,出栈要释放内存,容易内存泄漏。
代码实现:Go可以用数组 和切片实现
队列:线性结构
特点:队列允许从表的一端进行插入操作,在另一端进行删除操作,进行插入的是队尾,删除的是队头,没有元素为空队列
逻辑结构:线性结构
物理结构:顺序结构和链式结构都可以存储,一般来说用链式结构存储队列更合适,头指针指向头结点,尾指针指向尾结点,空队列,两个都指向头结点
代码实现:
链表:非线性结构,二叉链表
特点:链式结构存储数据的数据结构,每个数据节点包括数据域和指针域,指针域保存了数据结构中下一个元素存放的地址。链表结构中数据元素的逻辑顺序是通过链表中的指针链接次序来实现的
逻辑结构:非线性
物理结构:链式存储
代码实现:
树:非线性结构
特点:有且仅有一个顶点,顶点没有前节点。且其他每个节点有且仅有一个前节点。但是子节点可以有多个
逻辑结构:非线性
物理结构:可以用顺序存储和链式存储
代码实现
堆:特殊的树形结构。完全二叉树,非线性结构
特点:堆的特点是根结点的值是所有结点中最小的或者最大的,并且根结点的两个子树也是一个堆结构,
逻辑结构:非线性
物理结构:
代码实现:
图:另一种非线性结构
特:数据结点一般称为顶点,而边是顶点的有序偶对。如果两个顶点之间存在一条边,那么就表示这两个顶点具有相邻关系
逻辑结构:非线性
物理结构:
代码实现:
散列表:散裂函数