2013年软件设计师考试知识结构(八)

第八章 数据结构

线性结构

线性表

线性表的顺序存储结构:在等概率下插入一个新元素需要移动元素的个数为n/2,删除一个元素需要移动的个数为(n-1)/2

线性表的链式存储结构:其基本节点结构为数据域+指针域

双向链表、循环链表和静态链表.

栈和队列

可以通过整除取余运算将顺序队列假想成一个环状结构,称为循环队列.

 

子串的定位操作称为串的模式匹配.

朴素的模式匹配算法(布鲁特-福斯算法):从主串的第一个字符与模式串的第一个字符比较,若相等,则继续逐字比较,否则,从主串的第二个字符与模式串的第一个字符比较,如此直至找到或主串比较到最后一个字符.最好情况下,其平均比较次数为(m+n)/2,时间复杂度为O(m+n);最坏情况下,其平均比较次数为m*(n-m+2)/2,时间复杂度为O(n*m)

改进的模式匹配算法(KMP算法):其改进之处在于:每当匹配过程中出现比较的字符串不相等时,需要回溯主串的字符位置指针,而是利用以及得到的”部分匹配”结果,将模式串向右”滑动”尽可能远的距离,再继续进行比较.

 

数组、矩阵和广义表

数组

矩阵

特殊矩阵:相同值的元素或0元在矩阵中的分布有一定的规律,其有三角矩阵、对称矩阵和对角矩阵;

稀疏矩阵:非0元的个数远远小于0元素的个数,且非0元素的分布没有规律.

 

广义表

不能使用顺序存储结构表示.

树与二叉树的定义

二叉树的性质与存储结构

N个节点的完全二叉树的深度为(log2n)+1

任何一棵二叉树,其叶子节点数总是比度为2的节点数多1

满二叉树/完全二叉树/非完全二叉树

完全二叉树可以采用顺序存储结构,而非完全二叉树则不适宜才用顺序存储结构.

二叉树的遍历

先序/中序/后序/层序遍历.不论按那种次序遍历,其时间复杂度都是O(n),在最坏的情况下,空间复杂度为O(n).

线索二叉树

记录了遍历中的前驱和后继信息的树.

最优二叉树

哈夫曼树:带权路径长度最短的树.

构造哈夫曼树的方法是:从待构造的元素中选出两个权值最小的元素分别作为左右子树,构成一个新树,并将左右子树的权值之和再放入到待构造的元素集合中,循环直到将所有的元素都放到一颗树中,这颗树就是最优二叉树.

哈夫曼编码:

树和森林

图的定义和存储

有向图、无向图、完全图(任意两点间有边)、连通图(任意两点间有路径的无向图)、连通分量(无向图的极大连通子图)、强连通图、强连通分量(对有向图来说)、网(带权值的图)、有向树.

图的存储结构:邻接矩阵表示法/邻接链表表示法

图的遍历

深度优先搜索(Depth First Search ,DFS):当使用邻接矩阵表示时,查找所有顶点的邻接点所需的时间为O(n2);若使用邻接表作表示时,需要O(e);当以邻接链表表示时,需要O(n+e)

广度优先搜索(Breadth First Search ,BFS):其时间复杂度和DFS方法一样.

生成树及最小生成树

所有连通图的生成树是该图的极小连通子图.

权值最小的生成树为最小生成树.

最小生成树求解算法有普里姆(Prim)算法(以点找边,时间复杂度为O(n2),与边数无关,适合求边稠密的网的最小生成树)和克鲁斯卡尔(Kruskal)算法(以边找点,时间复杂度为O(eloge),与顶点数无关,适合求边稀疏的网的最小生成树.)

拓扑排序和关键路径

AOV网(Activity OnVertex network):以顶点表示活动,用有向边表示活动之间的优先关系,则称这样的有向图为以顶点表示活动的网.AOV网中不能出现环路;

拓扑排序:是将AOV网中所有顶点排成一个线性序列的过程;其方法是先将入度为0的顶点输出,并删除该顶点的所有相关边,重复这个过程直到将所有的顶点输出;若剩下的顶点都有入度,则表示AOV网中存在环路;若有向图无环时,也可以利用DFS进行逆拓扑排序;拓扑排序算法的时间复杂度为O(n+e)

AOE(ActivityOn Edge network)网:以顶点表示事件,以有向边表示活动,边上的权值表示活动的持续时间,则这种带权有向图称为用边表示活动的网;AOE网中列出了完成预定工程计划所需进行的活动、每项活动的计划完成时间、活动开始或结束的事件以及这些事件或活动间的关系;AOE图关系的是完成工程至少需要多少时间和哪些活动是影响整个工程进度的关键.

从源点到汇点的路径中,长度最长的路径称为关键路径,在关键路径上的活动称为关键活动.

最短路径

单源点最短路径:迪杰斯特拉(Dijkstra)算法;

每对顶点间的最短路径:弗洛伊德(Floyd)算法;

查找

查找的基本概念

静态查找表:只查找特定的数据元素和数据元素的各种属性;

动态查找表:还需要插入或删除查找表中的元素.

平均查找长度:平均比较的次数.

静态查找表的查找方法

顺序查找法:其平均查找长度为(n+1)/2

折半查找法:表中的元素已经有序.其平均查找长度为log2(n+1)-1;其适用于表不易变动,且又经常进行查找的情况.

分块查找法:将表分成若干块,每块的关键字不一定有序,但块之间是有序的;先使用折半查找法确定在哪块中,在用顺序查找法在块内查找;其平均查找长度为(n/s+s)/2+1,其平均查找长度既与表长度n有关还与每块中的记录数有关,且s取n的开方时,其查找效率比较好.

动态查找表

二叉排序树:左小右大,查找过程类似折半查找法;当输入元素已经有序时,二叉排序树为单支二叉树,此时查找效率与顺序查找的效率相同.

二叉排序树的插入和删除节点:

平衡二叉树:左右子树高度差不超过1

哈希表

排序

排序的基本概念

稳定排序和不稳定排序.内部排序和外部排序.

简单排序

直接插入排序:将第i个元素与已经有序的i-1个元素逐个比较以确定插入的位置;这是一种稳定的排序方法,其时间复杂度为O(n2),空间复杂度为O(1)

冒泡排序:逐个比较,逐个交换,一趟冒泡可以确定最后一个元素,其时间复杂度和空间复杂度分别为O(n2)和O(1),其也是一种稳定排序方法

简单选择排序:通过n-i次关键字之间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i个记录进行交换,当i等于n时所有记录有序排列.这是一种不稳定排序, 其时间复杂度和空间复杂度分别为O(n2)和O(1)

希尔排序

先将整个待排序序列分割成若干子序列,然后分别进行直接插入排序,待整个序列中的记录基本有序是,再对全体记录进行一次直接插入排序. 这是一种不稳定排序, 其时间复杂度和空间复杂度分别为O(n1.3)和O(1)

快速排序

将序列排序成两个独立的部分,一个部分中的元素都不大于另一个部分中的元素,然后对这两个部分继续进行快速排序,以达到整个序列有序.这是一种不稳定的排序方法,其时间复杂度和空间复杂度分别为O(nlogn)和O(logn).若初始记录序列按关键字有序或基本有序时,快速排序则退化为冒泡排序.

堆排序

堆:将一维数组看成是一个完全二叉树,则堆的定义表明,在完全二叉树中,非叶子节点的值均不小于其左右孩子节点的值,因此,其根节点为序列中最大的值.根节点值为序列中最大的值叫大根堆,为最小的值就叫小根堆.

堆排序:对一组待排序记录的关键字,首先按照堆的定义排成一个序列,从而可以输出堆顶元素,剩下的关键字再进行调整成新堆,如此反复,知道全部关键字排序成有序序列为止.

堆排序也是一种不稳定排序方法,其时间复杂度为O(nlogn)

归并排序

两路归并的核心是将一维数组中前后相邻的两个有序序列归并为一个有序序列.其时间复杂度为O(nlogn)

基数排序

基数排序的思想是按组成关键字的各个位数的值进行排序的.是一种稳定排序方法.

内部排序方法小结

若待排序的记录数目较小时,可采用插入排序和简单选择排序;

若待排序的记录按关键字基本有序,则宜采用直接插入排序或冒泡排序;

当待排序的记录数很大且关键字位数较少时,采用链式基数排序较好;

若n较大,则应采用时间复杂度为O(nlogn)的排序方法,如快速排序、堆排序或归并排序.

外部排序

外部排序就是对大型文件的排序,待排序的记录存放在外存.常用的外部排序方法是归并排序.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蜗牛_snail

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值