计算机二级考试公共基础知识——数据结构与算法

一、算法

1、算法的基本概念

算法是指一系列解决问题的清晰指令。
(1)两种基本要素:对数据对象的运算和操作、算法的控制结构(运算和操作时间的顺序)
(2)4个基本特征:可行性确定性有穷性拥有足够的情报
(3)设计的基本方法:列举法归纳法递推法递归法减半递推技术和回溯法

2、算法的复杂度

(1)算法的空间复杂度:执行算法所需的内存空间
(2)算法的时间复杂度:执行算法所需要的计算工作量

二、数据结构的基本概念

数据结构是指相互有关联的数据元素的集合,即数据的组织形式。它包含两个要素,即“数据”和“结构”。数据是需要处理的数据元素的集合,一般来说,这些数据元素,具有某个共同的特征。结构就是关系,是集合中各个数据元素之间存在的某种关系(或联系)。数据结构分为数据的逻辑结构和数据的存储结构,其中逻辑结构反应数据元素之间的逻辑关系;存储结构为数据的逻辑结构在计算机存储空间中的存放形式,有顺序存储、链式存储、索引存储和散列存储四种方式。
数据结构按各元素之间前后件关系的复杂程度可划分为如下两种
(1)线性结构:有且只有一个根结点,且每个结点最多只有一个前件,也最多只有一个后件的非空数据结构。
(2)非线性结构:不满线性结构的数据结构。

三、线性表及其顺序存储结构

1、线性表的基本概念

线性结构又称线性表,是最简单最常用的一种数据结构。

2、线性表的顺序存储结构

(1)元素所占的存储空间必须连续
(2)元素在存储空间的位置是按照逻辑顺序存放的。

3、线性表的插入运算

在第i(1<=i<=n)个元素之前插入一个新的元素的步骤如下:
(1)把原来第n个结点至第i个结点依次往后移动一个元素位置。
(2)把新的结点放在第i个位置上。
(3)修正线性表的结点个数。

4、线性表的删除运算

删除第i(1<=i<=n)个位置的元素的步骤如下:
(1)把第i个元素之后不包括第i个元素的n-i个元素依次前移一个位置。
(2)修正线性表的结点个数

四、栈和队列

1、栈及其基本运算

(1)基本概念

栈是一种特殊的线性表,其插入运算与删除运算都只在线性表的一端进行,也被称为先进后出表或后进先出表。
栈的结构如图:
栈的结构图
【说明】

  1. 栈顶:允许插入和删除的一端。
  2. 栈底:不允许插入和删除的一端。
  3. 空栈:栈中没有元素的栈。

(2)主要特点

  • 栈顶元素是最后被插入最早被删除的元素。
  • 栈底元素是最早被插入最后被删除的元素。
  • 栈有记忆作用。
  • 在顺序存储结构下,栈的插入和删除运算不需要移动表中其他数据元素。
  • 栈顶指针top动态反映了栈中元素的变化情况。

(3)顺序存储和运算

  • 程序设计语言中,用一维数组S(1:m)作为栈的顺序存储空间,其中m为栈的最大容量。在栈的顺序存空间S(1:m)中,S(bottom)通常为栈底元素(在栈非空的情况下),S(top)为栈顶元素。top=0表示栈空,top=m表示栈满。
  • 栈的基本运算有三种,即入栈退栈读栈顶元素

2、队列及其基本运算

(1)基本概念

队列是指允许在一端进行插入,在另一端进行删除的线性表,又称先进先出的线性表。
线性队列的入队和出队如图:
在这里插入图片描述

【说明】
1、队尾:允许插入的一端,用尾指针(rear)指向队尾元素。
2、队头:允许删除的一端,用头指针(front)指向队头元素的前一位置。

(2)循环队列及其运算

所谓循环队列,就是将队列存储空间的最后一个位置绕到第一个位置,形成逻辑上的环状空间,供队列循环使用。在实际使用循环队列时,为了能区分队列满还是队列空,通常还需要增加一个标志s,s=0时表示队列空,s=1时表示队列非空。
入队运算是指在循环队列的队尾加入一个新元素。当循环队列非空(s=1)且队尾指针等于队头指针时,说明循环队列已满,不能进行入队运算,这种情况称为“上溢”。
退队运算是指在循环队列的队头位置退出一个元素并赋给指定的变量。当循环队列为空(s=0)时,不能进行退队运算,这种情况称为“下溢”

五、线性链表

在定义的链表中,若只含有一个指针域来存放下一个元素地址,则称这样的链表为单链表或线性链表。
在链式存储方式中,要求每个结点由两部分组成:一部分用于存放数据元素值,称为数据域;另一部分用于存放指针,称为指针域。其中,指针用于指向该结点的前一个或后一个结点(即前件或后件)。

六、树和二叉树

1、树的基本概念

树是简单的非线性结构,树中有且仅有一个没有前件的结点称为“根”,其余结点分为m个互不相交的有限集合T1,T2,···,Tm,每个集合又是一棵树,称T1,T2,···,Tm为根结点的子树。
树的图例:
在这里插入图片描述
【说明】
1、父结点:每一个结点只有一个前件,称为父结点,无前件的结点只有一个,称为树的根结点(简称树的根)。
2、子结点:每一个结点可以有多个后件,它们都称为该结点的子结点,无后件的结点称为叶子结点。
3、树的度:一个结点所拥有的后件个数称为该结点的度,所有结点中最大的度称为树的度。
4、树的深度:树的最大层次

2、二叉树的定义及其基本性质

(1)二叉树的定义

二叉树是一种非线性结构,是有限的结点集合,该集合为空(空二叉树)或由一个根结点及两棵互不相交的左右二叉子树组成。
【说明】
二叉树可分为满二叉树和完全二叉树,其中满二叉树一定是完全二叉树,但完全二叉树不一定是满二叉树
二叉树具有以下两个特点:
1、二叉树可为空,空的二叉树无结点,非空二叉树有且只有一个根结点。
2、每个结点最多有两个棵子树,称为左子树,右子树。

(2)二叉树的基本性质

1、在二叉树的第k层上最多有2k-1个结点(k>=1)。
2、深度为m的二叉树最多有2m-1个结点。
3、对任何一棵二叉树,度为0的结点(即叶子结点)总是比度为2的结点多一个。
4、具有n个结点的二叉树的深度至少为[log2n]+1,其中[log2n]表示取log2n的整数部分。

3、满二叉树与完全二叉树

(1)满二叉树

除最后一层外,每一层上的所有结点都有两个子结点。满二叉树在其第i层上有2i-1个结点。
满二叉树的结构图:
在这里插入图片描述【说明】
从上面满二叉树定义可知,二叉树的每一层上的结点数必须都达到最大,否则就不是满二叉树。深度为m的满二叉树有2m-1个结点。

(2)完全二叉树

除最后一层外,每一层上的结点数均达到最大值;在最后一层上只缺少右边的若干结点。
完全二叉树的结构图:
在这里插入图片描述
【说明】
一棵具有n个结点的深度为k的二叉树,当且仅当它的每一个结点都与深度为k的满二叉树中编号从1~n个结点一一对应时,称之为完全二叉树。

4、二叉树的存储结构

二叉树通常采用链式存储结构,存储结点由数据域和指针域(左指针域和右指针域)组成。二叉树的链式存储结构也称为二叉链表,对满二叉树和完全二叉树可按层次进行顺序存储。

5、二叉树的遍历

二叉树的遍历是指不重复地访问二叉树中所有的结点,主要指非空二叉树,对于空二叉树则结束返回。
二叉树的遍历包括前序遍历、中序遍历、后序遍历。

(1)前序遍历

是指在访问根结点、遍历左子树与遍历右子树这三者中,首先访问根结点,然后遍历左子树,最后遍历右子树。此外,在遍历左右子树时,仍然先访问根结点,然后遍历左子树,最后遍历右子树。
前序遍历描述为:若二叉树为空,则执行空操作;否则首先访问根结点,然后遍历左子树,最后遍历右子树。

(2)中序遍历

是指在访问根结点、遍历左子树与遍历右子树这三者中,首先遍历左子树,然后访问根结点,最后遍历右子树。此外,在遍历左右子树时,仍然先遍历左子树,然后访问根结点,最后遍历右子树。
中序遍历描述为:若二叉树为空,则执行空操作;否则首先遍历左子树,然后访问根结点,最后遍历右子树。

(3)后序遍历

是指在访问根结点、遍历左子树与遍历右子树这三者中,首先遍历左子树,然后遍历右子树,最后访问根结点。此外,在遍历左右子树时,仍然先遍历左子树,然后遍历右子树,最后访问根结点。
后序遍历描述为:若二叉树为空,则执行空操作;否则首先遍历左子树,然后遍历右子树,最后访问根结点。

七、查找技术

(1)顺序查找

在线性表中查找指定元素;在最坏的情况下,最后一个元素才是要找的的元素,则需要与线性表中的所有元素作比较,比较次数为n。

(2)二分查找

二分查找法也称折半查找法,是一种高效的查找办法。但二分法有条件限制,它要求表必须用顺序存储结构,且表中元素必须按关键字有序排序(升序或降序)排列。对长度为n的有序线性表,在最坏的情况下,二分查找法只需要比较log2n次。

八、排序技术

1、交换类排序法

(1)冒泡排序法

通过对待排序序列从后向前或从前向后,依次比较相邻元素的排序码,若发现逆序则交换,使较大的元素逐渐从前部移向后部或较小的元素从后部移向前部,直到所有元素有序为止。
在最坏的情况下,对长度为n的线性表排序,冒泡排序需要比较的次数为n(n-1)/2。冒泡排序的最好时间复杂度是O(n),最坏时间复杂度是O(n2),平均时间复杂度是O(n2)。

(2)快速排序法

任取待排序序列中的某个元素作为基准(一般取第一个元素),通过一趟排序,将待排元素分为左右两个子序列,左子序列元素的排序码均小于或等于基准元素的排序码,右子序列的排序码则大于基准元素的排序码,然后分别对两个子序列继续进行排序,直至整个序列有序。
在最坏情况下,即每次划分,只得到一个序列,时间复杂度为O(n2),平均时间复杂度为O(nlog2n)。

2、插入类排序法

(1)简单插入排序法

把n个待排序的元素看成一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含n-1个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码依次与有序表元素比较,将它插入到有序表中的适当位置,使之成为新的有序表。
在最坏的情况下,即初始排序序列是逆序的情况下,比较次数为n(n-1)/2,时间复杂度O(n2),移动次数为n(n-1)/2。

(2)希尔排序法

先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。
在最坏的情况下,时间复杂度为O(n1.5)。

3、选择类排序法

(1)简单选择排序法

扫描整个线性表,从中选出最小的元素,将它交换到表的最前面,然后对剩下的子表采用同一种方法,直到子表空为止。
在最坏的情况下,需要比较的次数为n(n-1)/2,时间复杂度为O(n2)。

(2)堆排序法

首先将一个无序序列建成堆,然后将堆顶元素(序列中的最大项)与堆中最后一个元素交换(最大项应该在序列的最后),不考虑已经换到最后的元素,只考虑前n-1个元素构成的子序列,将该子序列调整为堆。反复进行交换,直到剩下的子序列为空为止。
在最坏的情况下,需要比较的次数为nlog2n。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值