数据结构:是相互之间存在一种或多种特定关系的数据元素的集合。
数据结构是一门研究非数值计算的程序设计问题中的操作对象,以及他们之间的关系和操作等相关问题的学科。
程序设计的实质是对确定的问题选择一种好的结构,加上设计一种好的算法。
程序设计 = 数据结构 + 算法
数据:是描述客观事物的符号,是计算机中可以操作的对象,是能被计算机识别,并输入给计算机处理的符号集合。
数据其实就是符号,必须具备两个前提:
1)可以输入到计算机中
2)能被计算机程序处理
数据元素:是组成数据的,有一点意义的基本单位,在计算机中通常作为整体处理。
数据项:一个数据元素可以由若干个数据项组成。数据项是数据不可分割的最小单位。
数据对象:是性质相同的数据元素的集合,是数据的子集。
不同数据元素之间不是独立的,而是存在特定的关系,我们将这些关系称为结构
为编写出一个"好"的程序,必须分析待处理对象的特性及各处理对象之间存在的关系。这也就是研究数据结构的意义所在。
按照视点的不同,我们把数据结构分为逻辑结构和物理结构。
逻辑结构:是指数据对象中数据元素之间的相互关系。
1:集合结构
集合结构:集合结构中的数据元素除了同属于一个集合外,他们之间没有其他关系。
2:线性结构
线性结构:线性结构中的数据元素之间是一对一的关系。
3:树形结构
树形结构:树形结构中的数据元素之间存在一种一对多的层次关系。
4:图形结构
图形结构:图形结构的数据元素是多对多的关系。
逻辑结构是针对具体问题的,是为了解决某个问题,在对问题理解的基础上,选择一个合适的数据结构表示数据元素之间的逻辑关系。
物理结构(存储结构)
物理结构:是指数据的逻辑结构在计算机中的存储形式。
数据的存储结构应正确反映数据元素之间的逻辑关系。
数据元素的存储结构形式有两种:顺序存储和链式存储。
1:顺序存储结构
顺序存储结构:是把数据元素存放在地址连续的存储单元里,其数据间的逻辑关系和物理关系是一致的。
2:链式存储结构
链式存储结构:是把数据元素存放在任意的存储单元里,这组存储单元可以是连续的,也可以是不连续的。
逻辑结构是面向问题的,而物理结构是面向计算机的,其基本的目标就是将数据及其逻辑关系存储到计算机的内存中。
数据类型:是指一组性质相同的值的集合及定义在此集合上的一些操作的总称。
数据类型是按照值的不同进行划分的。在高级语言中,每个变量,常量和表达式都有各自的取值范围。类型就用来说明变量或表达式的取值范围和所能进行的操作。
数据类型可以分为两类:
原子类型:是不可以再分解的基本类型,包括整型,实型,字符型等。
结构类型:由若干个类型组合而成,是可以再分解的。例如,整型数组是由若干整型数据组成的。
抽象数据类型是指一个数学模型及定义在该模型上的一组操作。
抽象数据类型不仅仅指那些已经定义并实现的数据类型,还可以是计算机编程者在设计软件程序时自己定义的数据类型。
还包括在该模型上的一组操作。
抽象数据类型体现了程序设计中问题分解,抽象和信息隐藏的特性。
抽象数据类型把实际生活中的问题分解为多个规模小且容易处理的问题,然后建立一个计算机能处理的数据模型,并把每个功能模块的实现细节作为一个独立的单元,从而使具体实现过程隐藏起来。
算法:
算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。
算法具有五个基本特性:输入,输出,有穷性,确定性和可行性。
好的算法,应该具有正确性,可读性,健壮性,高效率和低存储的特征。
线性表:零个或多个数据元素的有限序列。
栈与队列:栈是限定仅在表尾进行插入和删除操作的线性表。
队列是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。
串:串(string)是由零个或多个字符组成的有限序列,又名字符串。
树:树是n(n>=0)个结点的有限集。n=0时称为空树。在任意一棵非空树种:(1)有且仅有一个特定的称为根的结点;(2)当n>1时,其余结点可分为m (m>0)个互不相交的有限集T1,T2,....,Tm,其中每一个集合本身又是一棵树,并且称为根的子树。
二叉树是n(n>=0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两棵互不相交的,分别称为根结点的左子树和右子树的二叉树组成。
二叉树的遍历是指从根结点出发,按照某种次序依次访问二叉树中所有结点,使得每个结点被访问依次且仅被访问一次。
访问和次序。
遍历方式:从左到右
1:前序遍历
规则是若二叉树为空,则空操作返回,否则先访问根结点,然后前序遍历左子树,再前序遍历右子树。
2:中序遍历
规则是若树为空,则空操作返回,否则从根结点开始(注意并不是先访问根结点),中序遍历根结点的左子树,然后是访问根结点,最后中序遍历右子树。
3:后序遍历
规则是若树为空,则空操作返回,否则从左到右先叶子后结点的方式遍历访问左右子树,最后是访问根结点。
4:层序遍历
规则是若树为空,则空操作返回,否则从树的第一层,也就是根结点开始访问,从上而下逐层遍历,在同一层中,按从左到右的顺序对结点逐个访问。
指向前驱和后继的指针称为线索,加上线索的二叉链表称为线索链表,相应的二叉树就称为线索二叉树。
树转换为二叉树
1:加线。在所有兄弟结点之间加一条连线。
2:去线。对树中每个结点,只保留它与第一个孩子节点的连线,删除它与其他孩子结点之间的连线。
3:层次调整。以树的根结点为轴心,将整棵树顺时针旋转一定的角度,使之结构层次分明。注意第一个孩子是二叉树结点的左孩子,兄弟转换过来的孩子是结点的右孩子。
森林转换为二叉树
1:把每个树转换为二叉树。
2:第一棵二叉树不动,从第二棵二叉树开始,依次把后一棵二叉树的根结点作为前一棵二叉树的根结点的右孩子,用线连接起来。当所有的二叉树连接起来后就得到了由森林转换来的二叉树。
图:图是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合。
图的存储结构:
1)邻接矩阵
2)邻接表
3)十字链表
4)邻接多重表
从图中某一顶点出发访遍图中其余顶点,且使每一个顶点仅被访问一次,这一过程就叫做图的遍历。
1:深度优先遍历
2:广度优先遍历
连通网的最小生成树,经典的两种算法,普里姆算法和克鲁斯卡尔算法
拓扑排序,其实就是对一个有向图构造拓扑序列的过程。
查找:查找就是根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素(或记录)。
排序:假设含有n个记录的序列为{r1,r2,......,rn},其相应的关键字分别为{k1,k2,......,kn},需确定1,2,......,n的一种排列p1,p2,......,pn,使其相应的关键字满足Kp1<=Kp2<=......<=Kpn(非递减或非递增)关系,即使得序列称为一个按关键字有序的序列{Rp1,Rp2,......,Rpn},这样的操作就称为排序。
排序算法:
简单算法:冒泡排序,简单选择排序,直接插入排序
改进算法:希尔排序,堆排序,归并排序,快速排序