数据结构和算法
一 算法
算法是指对解决方案准确而完整的描述,简单的说,算法就是解决问题的操作步骤(有一个很著名的公式 “程序=数据结构+算法”)
算法不等于数学上的计算方法,也不等于程序(程序可以描述算法)
算法的基本特征
有穷性:算法的指令或者步骤的执行次数和时间都是有限的。
确切性:算法的指令或步骤都有明确的定义。
输入:有相应的输入条件来刻画运算对象的初始情况。
输出:一个算应有明确的结果输出。
可行性:算法的执行步骤必须是可行的。
算法的复杂度
①时间复杂度
算法的时间复杂度是指执行算法所需要的计算工作量
算法的时间复杂度不等于算法程序执行的具体时间
算法所需要的计算工作量是用算法所执行的基本运算次数来度量的(基本运算次数与问题的规模和输入有关)
②空间复杂度
算法的空间复杂度是指执行这个算法所需要的存储空间
执行这个算法所需要的存储空间包括3部分:输入数据所占的存储空间,程序本身所占的存储空间,算法执行过程中所需要的额外空间
为了降低算法的空间复杂度,主要应该减少输入数据所占的存储空间和算法执行过程中所需要的额外空间,通常采用压缩存储技术实现
二 数据结构
数据结构是指相互有关联的数据元素的集合,它包含两个要素,即“数据”和“结构”
数据:数据是需要处理的数据元素的集合(比如,早餐,午餐,晚餐这3个元素有一个共同特征,即他们都是一日三餐,从而构成了“一日三餐”的集合)
结构:所谓的结构就是关系,是集合中各个元素之间的关系,在数据处理领域中通常把数据元素两两之间的关系用前件/后件关系来描述(比如,当考虑一日三餐的顺序关系时,早餐是午餐的前件午餐是早餐的后件,午餐时晚餐的前件,以此类推)
数据结构分为数据的逻辑结构和存储结构
逻辑结构:反映数据元素之间的逻辑关系(前件/后件关系)
存储结构:又称数据的物理结构,时数据的逻辑结构在计算机存储空间中的存放方式
数据结构的表示
基本概念 | 含义 | 例子 |
根节点 | 数据结构中没有前件的节点 | 图一中早餐时根节点 图二中连长是根节点 |
终端节点(或叶子节点) | 数据结构中没有后件的节点 | 图一中晚餐是终端节点 图二中士兵是终端节点 |
内部节点 | 数据结构中除了根节点和终端节点以外的节点 | 图一中午餐时内部节点 图二中排长和班长时内部节点 |
线性结构和非线性结构
类型 | 含义 | 例子 |
线性结构 | 一个非空的数据结构如果满足以下两个条件就成为线性结构: ①有且只有一个根节点 ②每一个节点最多有一个前件也最多有一个后件 | 如(一日三餐图) |
非线性结构 | 不满足以上两点的数据结构就成为非线性结构非线性结构主要是指树形结构和网状结构 | 如(部队军职图) |
线性结构
①线性表
简介:数据结构中线性结构习惯成为线性表,线性表是由n(n>=0)个数据元素构成的有限序列表中除了第一个元素外有且只有一个前件,除了最后一个元素外有且只有有个后件,线性表要么是空表,要么可以表示为:(a1,a2,...,ai,...,an),通常线性表可采用顺序存储和链式存储
非空线性表具有以下特征:
①有且只有一个根节点,即节点a1,它无前件
②有且只有一个终端节点,即an,它无后件
③除了根节点和终端节点外其他节点有且只有一个前件和一个后件
线性表的顺序存储:
线性表的顺序存储结构是指用一段地址连续的存储单元依次存储线性表的数据元素。
线性表的链式存储:
链式存储时,相邻数据元素可随意存放,但所占存储空间分两部分,一部分存放结点 值,另一部分存放表示结点间关系的指针
优点:插入或删除元素时很方便,使用灵活,存储空间利用率高。
缺点:存储密度小(<1),查找和修改需要遍历整个链表。
②栈
简介:栈是一种特殊的线性表,他所有的插入和删除都限定在同一端,允许插入和删除的一端叫栈顶,不允许插入和删除的一段成为栈底,当栈中没有元素时称为空栈
栈的运算:栈的修改原则是“先进后出”和“后进先出”
通常指针top用来指示栈顶的位置,指针bottom用来指示栈底的位置,假设栈s=(a1,a2,a3,...,an),则称a1为栈底元素,an为栈顶元素,栈中元素按a1,a2,a3,...,an依次进栈,退栈的第一个元素应该为栈顶元素an。
栈的基本运算有三种:入栈,退栈和读栈顶元素
栈和一般线性表的存储方法类似,通常 也可以采用顺序存储和链式存储
③队
队列的定义:队列是允许在一段插入,在另一端进行删除的线性表,允许进行删除的一端称为队头(排头),允许进行插入运算一端的成为队尾
队列的运算:与栈相反,“先进先出”后进后出“
若有队列q=(1,2,3,4,5,......,6,7,8),那么1为队头元素,8为队尾元素队列中的元素按照1,2,3,4,5,......,6,7,8的顺序依次入队,退出队列也按照这个顺序退出
队列的运算:可以采用顺序存储的线性表来表示队列,且队列的顺序存储一般采用循环队列的形式
非线性结构
树形结构:
①树:是一种简单的非线性结构
基本概念 | 含义 | 例子 |
父节点(根) | 在树结构中,每一个节点只有一个前件,称为该节点的父节点,没有前件的节点只有一个,称为树的根节点,简称树的根 | 节点A是树的根节点 |
子节点和叶子节点 | 在树结构中每一个节点可以有多个后件,称为该节点的子节点,没有后件的节点称为叶子节点 | 图中D,H,I,F,G都为叶子节点 |
度 | 在树结构中,一个节点所拥有的后件个数称为该节点的度,所有节点中的最大的度称为树的度 | 图中,根节点A和节点E的度为2,节点B的度为3,节点C的度为一,叶子节点DHIFG,的度为0,所以,该树的度为3 |
深度 | 定义一棵树的根节点所在的层次为1,其他节点的层次等于它的父节点的层次加一,树的最大层次称为树的深度 | 根节点A的层次为1,节点BC在第二层,节点DEFG在第三层,节点HI在第四层,因此,该树的深度为4 |
子树 | 在树中,以某节点的一个子节点为根,构成的树称为该节点的一颗子树 | 图中,节点A有两颗子树,他们分别以BC为根节点 |
②二叉树:二叉树和树不同,但它和树的结构很相似
二叉树的特点:①二叉树可以为空,空的二叉树没有节点,非空二叉树有且只有有一个根节点
②每个节点最多有两棵子树,即二叉树中不存在度大于2大的节点
③二叉树的子树有左右之分,其次序不能颠倒
满二叉树和完全二叉树:
①满二叉树是指出最后一层外,每层上的所有节点都有两个子节点的二叉树
②完全二叉树是指除了最后一层外,每一层上的节点数均达到最大值,在最后一层上只缺少右边的若干节点的二叉树
③由完全二叉树可知,满二叉树一定是完全二叉树,完全二叉树一般不是满二叉树
二叉树的存储结构:在计算机中,二叉树通常采用链式存储结构
二叉树的遍历:二叉树的遍历是指不重复的访问二叉树中的所有节点,可以分为三种遍历“前序遍历”,“中序遍历”,“后序遍历”
①前序遍历:首先访问根节点,然后遍历左子树,最后遍历右子树,并且在遍历左子树和右子树时任然先访问根节点,在访问左子树,在访问右子树,图中遍历顺序为:A,B,D,H,E,I,C,F,G
②中序遍历:先遍历左子树,然后访问根节点,最后遍历右子树,并且在遍历左子树和右子树时,任然先遍历左子树,在遍历根节点,最后遍历右子树,图中遍历顺序为:H,D,B,E,I,A,C,G,F
③后序遍历:先遍历左子树,然后遍历右子树,最后访问根节点,并且在遍历左子树和右子树时仍然先遍历左子树,右子树,根节点,图中的遍历顺序为:H,D,I,E,B,G,F,C,A