1全国计算机二级公共基础知识一、数据结构与算法数据结构指的是数据之间的相互关系,即数据的组织形式。数据结构用来反映一个数据的内部构成,即一个数据由哪些成分构成、以什么方式构成、呈现什么样的结构。数据结构有逻辑上的数据结构和物理上的数据结构之分。逻辑上的数据结构反映数据之间的逻辑关系,而物理上的数据结构反映数据在计算机内部的存储安排。数据结构是数据存在的形式。算法是解题的步骤,是指令的有限序列。它们规定了解决某一特定类型问题的一系列运算,是对解题方案的准确与完整的描述。一个问题的解决方案要以算法为基础。1.1概念介绍◆算法的时间复杂度:算法的时间复杂度是指执行算法所需要的计算工作量。算法的工作量用算法所执行的基本运算次数来度量,而算法所执行的基本运算次数是问题规模的函数,即算法的工作量=f(n)其中n是问题的规模。例如,两个n阶矩阵相乘所需要的基本运算(即两个实数的乘法)次数为n3,即计算工作量为n3,也就是时间复杂度为n3。2◆算法的空间复杂度:算法的空间复杂度一般是指执行这个算法所需要的内存空间。◆数据的逻辑结构数据元素相互之间的关系,称为结构。数据的逻辑结构:是指反映数据元素之间逻辑关系的数据结构。◆数据的存储结构数据的存储结构:是数据的逻辑结构在计算机存储空间中的存放形式。也称数据的物理结构。各数据元素在计算机存储空间中的位置关系与它们的逻辑关系不一定是相同的。同一种数据的逻辑结构可以根据需要表示成任意一种或几种不同的存储结构。数据的顺序存储方式:是将逻辑上相邻的结点存储在物理位置上亦相邻的存储单元里。也就是将所有存储结点相继存入在一个连续相邻的存储区里。数据的链式存储方式:是在存储每个结点信息的同时,增加一个指针来表示结点间的逻辑关系。该方式不要求逻辑上相邻结点在物理位置上亦相邻,结点间的逻辑关系是由附加的指针字段表示的。因此,链式存储结构中的每个结点都由两部分组成:一部分用于存储结点本身的信息,称为数据域;另一部分用于存储该结点的后继结点(或前驱结点)的存储单元地址,称为指针域。指针域可以包含一个或多个指针,这由结点之间的关系所决定。◆线性结构和非线性结构如果在一个线性结构中,一个数据元素都没有,则称该数据结构为空数据结构。线性结构的逻辑特征:在一个非空的数据结构中,除第一个数据元素只有一个后继没有前驱、最后一个数据元素只有一个前驱没有后继外,其他的3每一个数据元素仅有一个前驱和一个后继。线性结构也称为线性表。注:某个元素直接相邻的前一个元素称为此元素的前驱、直接相邻的后一个元素称为此元素的后继。非线性结构的逻辑特征:在一个非空的数据结构中,某数据元素可能有多于一个前驱或后继。如树型结构等。习题:(一)选择题(单选)1.算法的时间复杂度是指(D)A)算法的执行时间B)算法所处理的数据量C)算法程序中的语句或指令条数D)算法在执行过程中所需要的基本运算次数1.2线性表线性表是由同一类型的数据元素构成的一种线性的数据结构。是一种最基本、最常用的数据结构。线性表常用的存储方式有两种:顺序存储方式和链接存储方式。线性表的数学定义:L=(a1,a2,a3,…,an)说明:线性表是具有相同类型的n(n≥0)个数据元素组成的有限序列。L:为表的名称。ai(i=1,2,…,n):为表的元素,也称为线性表中的一个结点。它可以是一个数、一个字符、一个字符串,也可以是一条记录,还可以是复杂的数据对象。a1是a2的前驱、a2是a1的后继,a2是a3的前驱、a3是a2的后继,…,依次类推。4n:为线性表的长度(元素个数),当n=0时称线性表为空表。线性表的特点:在非空的线性表中:存在唯一的一个“第一个元素”(根结点)。存在唯一的一个“最后一个元素”(终端结点)。除第一个元素外,其他的元素均有唯一的前驱。除最后一个元素外,其他的元素均有唯一的后继。1.3栈和队列栈和队列本质上也是线性表,只是它们的操作受到了限制。1.3.1栈栈是限定仅在表尾进行插入和删除操作的线性表。表尾称为栈顶(top),表头称为栈底(bottom)。栈这种数据结构,类似于子弹夹,底端是封闭的,最后压入的子弹总是最先被弹出,最先压入的子弹只能最后被弹出。栈顶元素总是最后被插入的元素,从而也是最先能被删除的元素;栈底元素总是最先被插入的元素,从而也是最后能被删除的元素。即栈是按照“先进后出”或“后进先出”的原则组织数据的。因此,栈也被称为“先进后出”表或“后进先出”表。由此可以看出,栈具有记忆作用。1.3.2队列队列是指只允许在表的一端插入元素、在另一端删除元素的线性表。允许插入的一端称为队尾(rear),允许删除的一端称为队头(front)。在队列这种数据结构中,最先插入的元素将最先能够被删除,反之最后插入的元素将最后才能被删除。因此,队列又称为“先进先出”或“后进后出”的线性表。51.4树和二叉树1.4.1树树形结构是数据结构中一种很重要的非线性结构。在树形结构中,所有数据元素之间的关系具有明显的层次特性。树形结构很像自然界中的树,像一棵倒长的树。在现实生活中,能用树形结构表示的例子很多。参见下面的图形:树形结构的基本特征及基本术语:以下图为例:6树的根:在树形结构中,没有前驱的结点只有一个,称为树的根结点,简称为树的根。如:上图中的“R”。父结点:在树形结构中,每一个结点(除了树的根结点)只有一个前驱,称为父结点。如:上图中的“R”是K、P、Q、D的父结点;“N”是X、Y的父结点。子结点:在树形结构中,每个结点可以有多个后继,称为该结点的子结点。如:上图中的K、P、Q、D是“R”的子结点;X、Y是“N”的子结点。叶子结点:在树形结构中,没有后继的结点称为叶子结点,也称终端结点。如:上图中的C、M、F、E、X、G、S、L、Z、A均为叶子结点。结点的度:在树形结构中,一个结点所拥有的后继个数称为该结点的度。如:上图中根结点R的度是4;结点T的度是3;结点P、Q、D、O、Y、W的度都为1。叶子结点的度为0。7树的度:在树形结构中,所有结点中的最大的度称为树的度。如:上图中树的度为4,因为结点R的度最大,是4。树的深度:在树形结构中,树的最大层数称为树的深度(或高度)。如:上图中树的深度是5。说明:树形结构具有明显的层次关系,即树是一种层次结构。在树形结构中一般按如下原则分层:1)根结点在第1层。2)其余结点的层数等于其父结点的层数加1。子树:在树形结中,以某结点的一个子结点为根构成的树称为该结点的一棵子树。如:上图中,结点R有4棵子树,它们分别以K、P、Q、D为根结点;结点P有1棵子树,其根结点为N;结点T有3棵子树,它们分别以W、Z、A为根结点。在树形结构中,子树间互不相交,叶子结点没有子树。森林:森林是M(M≥0)棵互不相交的树的集合。删去一棵树的根,就得到一个森林;反之,加上一个结点作树根,森林就变为一棵树。1.4.2二叉树(1)二叉树的特点①非空二叉树只有一个根结点。②二叉树中的每个结点,最多有两棵子树,分另称为该结点的左子树与右子树。当一个结点即没有左子树也没有右子树时,该结点就是叶子结点。在下面的图中,左面是只有根结点的二叉树,右面是深度为4的二叉树:8(2)满二叉树与完全二叉树1)满二叉树:满二叉树是指除最后一层外,每一层上的所有结点都有两个子结点。就是说,在满二叉树中,每一层上的结点数都达到最大值,即在满二叉树的第k层上有2i-1(k≥1)个结点,且深度为k的满二叉树有2k-1(k≥1)个结点。在下图中分别是深度为2、3、4的满二叉树:满二叉树中不存在度数为1的结点,每个分支结点均有两棵深度相同的子树,且叶子结点都在最下一层。2)完全二叉树:若一棵二叉树最多只有最下面的两层上结点的度数可以小于2,并且最下一层上的所有结点都集中在该层最左边的若干位置上,则此二叉树称为完全二叉树。9在下图的4棵二叉树中,分别是深度为3和4的完全二叉树:满二叉树是完全二叉树,完全二叉树不一定是满二叉树。在满二叉树的最下一层上,从最右边开始连续删去若干结点后得到的二叉树仍然是一棵完全二叉树。在完全二叉树中,若某个结点没有左子结点,则它一定没有右子结点,即该结点必是叶子结点。(3)二叉树的性质假设定义根结点的层数为1(注意:有些资料中规定根结点的层数为0)。性质1:在二叉树的第i层上,最多有2i-1(i≥1)个结点。性质2:深度为k的二叉树最多有2k-1(k≥1)个结点。性质3:在任意二叉树中,若度为0的结点(即叶子结点)的个数为n0,度为2的结点的个数为n2,则:n0=n2+1(对于完全二叉树还有如下属性)性质4:具有n个结点的完全二叉树,其深度为[log2n]+1。注:[log2n]表示取log2n的整数部分。性质5:如果将一棵有n个结点的完全二叉树自顶向下、同一层自左向右连续给结点编号1、2、3、…、n,则对于任意结点i(1≤i≤n)有如下结论:1)如果i=1,此结点为根结点,无前驱(即无父结点);如果i1,则该结点的父结点编号为Int(i/2)。也可表示成[i/2],都10表示取整数。2)如果2in,则结点i无左子结点,显然也没有右子结点,是叶子结点。如果2i≤n,则结点i的左子结点是编号为2i的结点。3)如果2i+1n,则结点i无右子结点。如果2i+1≤n,则结点i的右子结点的编号为2i+1。(4)二叉树的遍历二叉树的遍历就是遵从某种次序,访问二叉树中的所有结点,使得每个结点仅被访问一次。一棵非空二叉树是由根结点、左子树和右子树三部分组成。因此遍历一棵非空二叉树的问题就可以分解为三项“子任条”:①访问根结点(假设用D表示)。②遍历左子树(假设用L表示)。③遍历右子树(假设用R表示)。在遍历二叉树的过程中,一般先遍历左子树,然后再遍历右子树。在先左后右的原则下,根据访问根结点的次序,二叉树的遍历可分为三种:前序遍历(DLR)、中序遍历(LDR)、后序遍历(LRD)。以下图中的二叉树为例:前序遍历(DLR):首先访问根结点,然后遍历左子树,最后遍历右子树。在遍历左、右子树时,11仍然先访问子树的根结点,然后遍历其左子树,最后遍历其右子树。即,前序遍历是指访问所有的根结点(包括子树的根结点)都在遍历其左、右子树之前。前序遍历的操作:若二叉树为空,则结束反返回。否则:①访问根结点②前序遍历左子树③前序遍历右子树如,对上图中的二叉树进行前序遍历的结果是:FCADBEGHP中序遍历(LDR):首先遍历左子树,然后访问根结点,最后遍历右子树。在遍历左、右子树时,仍然先遍历其左子树,然后访问子树的根结点,最后遍历其右子树。即,中序遍历是指访问所有的根结点(包括子树的根结点)都在遍历其左子树之后、在遍历其右子树之前。中序遍历的操作:若二叉树为空,则结束反返回。否则:①中序遍历左子树②访问根结点③中序遍历右子树如,对上图中的二叉树进行中序遍历的结果是:ACBDFEHGP后序遍历(LRD):首先遍历左子树,然后遍历右子树,最后访问根结点。在遍历左、右子树时,仍然先遍历其左子树,然后遍历其右子树,最后访问子树的根结点。即,后序遍历是指访问所有的根结点(包括子树的根结点)都在遍历其左、右子树之后。后序遍历的操作:若二叉树为空,则结束反返回。否则:①后序遍历左子树②后序遍历右子树12③访问根结点如,对上图中的二叉树进行后序遍历的结果是:ABDCHPGEF1.5查找查找又称检索。查找是指在一个给定的数据结构中查找某个指定的元素。通常,根据不同的数据结构,应采用不同的查找方法。1.5.1顺序查找顺序查找又称顺序搜索或线性查找。顺序查找一般是指在线性表中查找指定的元素。顺序查找的基本思想:在n个结点组成的线性表中,从线性表的一端开始,依次将线性表中的元素与被查元素进行比较,若相等则表示找到,即查找成功;若线性表中所有的元素都与被查元素进行了比较但都不相等,则表示线性表中没有要找的元素,即查找失败。在顺序查找中,查找成功时最多需要比较n次、最少比较1次、平均比较次数约为表长的一半。查找失败时比较n+1次。顺序查找的时间复杂度为O(n)。对于无序表(即表中的元素的排列是无序的)和链式存储结构