文章导读:
众所周知,计算机的程序是对信息进行处理。在大多数情况下,这些信息并不是没有组织的,信息(数据)之间往往具有重要的结构关系,这就是数据结构的内容。什么是数据结构呢?今天系统的进行一个学习。
数据结构概述:
数据结构是以某种方式组织在一起的数据的集合。最基本的数据结构是序列。
线性表、栈和队列、串和数组、树和二叉树、图:
图的遍历
深度优先算法|广度优先算法
生成树和最小生成树:Prim算法|Kruskal算法
最短路径:Dijkstra算法|floy算法
拓扑排序:无前驱的顶点优先的拓扑排序方法|无后继的顶点优先拓扑排序方法
===============以下作为参考信息,详细看下章节==================
一、数据结构
①什么是数据结构
数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。
关于数据结构的起源,请点击了解起源。
②基本概念和术语
具体请参考数据结构相关概念。
1)数据:指的是能输入到计算机中、并能被计算机程序处理的对象。相对应的就有数据类型(整型、字符型、浮点型等等)。
2)数据元素:指组成数据的、有意义的基本单位,也被称为记录。
3)数据项:是数据不可分割的最小单位,一个数据元素可以由若干数据项组成。
4)数据对象:指性质相同的数据元素的集合,是数据的子集。
5)数据结构:指互相之间存在一种或多种特定关系的数据元素的集合。
③数据结构类型
1、逻辑结构
逻辑结构是指反映数据元素之间的逻辑关系的数据结构,其中的逻辑关系是指数据元素之间的前后件关系,而与他们在计算机中的存储位置无关。
逻辑结构分为:集合结构、线性结构、树形结构、图形结构。
集合结构
数据结构中的元素之间除了“同属一个集合” 的相互关系外,别无其他关系;
线性结构
数据结构中的元素存在一对一的相互关系;
树性结构
数据结构中的元素存在一对多的相互关系;
图形结构
数据结构中的元素存在多对多的相互关系。
2、物理结构
指数据的逻辑结构在计算机存储空间的存放形式。
数据的物理结构是数据结构在计算机中的表示(又称映像),它包括数据元素的机内表示和关系的机内表示。由于具体实现的方法有顺序、链接、索引、散列等多种,所以,一种数据结构可表示成一种或多种存储结构。
数据元素的机内表示(映像方法):用二进制位的位串表示数据元素。通常称这种位串为节点。当数据元素有若干个数据项组成时,位串中与个数据项对应的子位串称为数据域。因此,节点是数据元素的机内表示(或机内映像)。
关系的机内表示(映像方法):数据元素之间的关系的机内表示可以分为顺序映像和非顺序映像,常用两种存储结构:顺序存储结构和链式存储结构。顺序映像借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系。非顺序映像借助指示元素存储位置的指针来表示数据元素之间的逻辑关系。
顺序存储结构
把数据元素存放在地址连续的的存储单元里,其数据间的逻辑关系和物理关系一致;
链式存储结构
把数据元素存放在任意的存储单元里,这组存储单元可以是连续的也可以是不连续的。数据元素的存储关系不反映其逻辑关系,用指针存放数据元素的地址,我们通过地址可以找到相关联数据元素的位置。
④常用的数据结构
数组
在程序设计中,为了处理方便, 把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数据元素的集合称为数组。在C语言中, 数组属于构造数据类型。一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型。因此按数组元素的类型不同,数组又可分为数值数组、字符数组、指针数组、结构数组等各种类别。
队列
一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列是按照“先进先出”或“后进后出”的原则组织数据的。队列中没有元素时,称为空队列。
栈
是只能在某一端插入和删除的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。
堆
在计算机科学中,堆是一种特殊的树形数据结构,每个结点都有一个值。通常我们所说的堆的数据结构,是指二叉堆。堆的特点是根结点的值最小(或最大),且根结点的两个子树也是一个堆。
链表
是一种物理存储单元上非连续、非顺序的存储结构,它既可以表示线性结构,也可以用于表示非线性结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。
链表的种类:单向、双向、循环链表
1)单项链表
A->B->C->D->E->F->G->H,类似于这种结构就是单向链表,H是头,A 是尾。
2)双向链表
H<- A->B->C->D->E->F->G->H,类似于这种结构就是双向链表,有头没尾。
3)循环链表
A->B->C->D->E->F->G->H绕成一个圈,最后H->A,类似于这种结构就是循环链表。
详情请看链表的基本知识。
树
是包含n(n>0)个结点的有穷集合K,且在K中定义了一个关系N,N满足 以下条件:
(1)有且仅有一个结点 K0,他对于关系N来说没有前驱,称K0为树的根结点。简称为根。
(2)除K0外,K中的每个结点,对于关系N来说有且仅有一个前驱。
(3)K中各结点,对关系N来说可以有m个后继(m>=0)。
知识补充
1)堆和栈的内存管理
堆是需要手动释放内存的,而栈是由系统自动释放内存的。
2)二叉树的基本知识