一:线性表
1.定义:线性表是由n个元素的有限序列,通常记为(a1,a2,...,an).
特点:存在唯一的表头和表尾。
除了表头外,表中的每一个元素均只有唯一的直接前驱。
除了表尾外,表中的每一个元素均只有唯一的直接后驱。
2.存储结构:顺序存储、链式存储
(1)顺序存储:使用一组地址连续的存储单元依次存储线性表中的数据元素,从而使得逻辑关系相邻的两个元素在物理位置也相邻。
优点:可以随机存取表中的元素
缺点:插入和删除操作需要移动大量的元素。
在线性表的顺序存储结构中,第i个元素的ai的存储位置为:local(ai)=loc(a1)+(i-1)*L
其中loc(a1)是表中第一个元素的存储位置,L是表中每个元素所占空间的大小。
(2)链式存储:链式存储是指用节点来存储数据元素,节点的空间可以是连续的,也可以是不连续的,因此存储数据元素的同时必须存储元素之间的逻辑关系。
节点空间只有在需要的时候才申请,无需事先分配。
优点:插入和删除操作不需要移动元素,操作方便。
缺点:增加了存储空间开销,不能随机访问任一节点。
其他几种链表结构:(1)双向链表:每个节点包含两个指针,指明直接前驱和直接后继元素,可在两个方向上遍历链表。
(2)循环链表:表尾节点的指针指向表中的第一个节点,可在任何位置上开始遍历整个链表。
(3)静态链表:借助数组来描述线性表的链式存储结构。
二.栈
栈是只能通过一端来实现数据存储和检索的一种线性表。
栈进行插入和删除操作的一端称为栈顶,另一端称为栈底。
栈的修改是按照先进后出的原则进行的,又称为先进后出的线性表。
栈的存储结构有顺序存储和链式存储。
栈的顺序存储是指用一组地址连续的存储单元依次存储自栈顶到栈底的数据元素,同时附设指针top指示栈顶元素的位置。
用链表作为存储结构的栈也叫链栈。由于栈中元素的插入和删除仅在栈顶一端进行,因此不必设置头结点,链表的头指针就是栈顶指针。
三.队列
队列是一种先进先出的线性表,它只允许在表的一端插入元素,而在表的另一端删除元素。
在队列中,允许插入元素的一端叫队尾,允许删除元素的一端称为队头。
队列的顺序存储结构是利用一组地址连续的存储单元存放队列中的元素,由于队列中元素的插入和删除限定在队列的两端进行,因此设置队头指针和队尾指针,分别指示当前的队首元素和队尾元素。
用链表表示的队列简称为链队列。
为了便于操作,给链队列添加一个头结点,并令头指针指向头结点。队列为空的判定条件是:头指针和尾指针的值相同,且均指向头结点。
四.串
串是仅由字符构成的有限序列,是取值范围受限的线性表。一般记为S='a1 s2...an',其中s是串名,a1a2.。。an是串值。
串的基本概念:空串:长度为零的串,空串不包括任何字符。
空格串:由一个或多个空格组成的串。
子串:由串中任意长度的连续字符构成的序列。含有子串的串称为主串。子串在主串中的位置指子串首次出现 时,该子串的第一个字符在主串中的位置。空串是任意串的子串。主串:abcbcc 子串:cb
串相等:指两个串长度相等且对应位置上的字符也相等。
串比较:两个串比较大小时以字符的ASCII码值作为依据。比较操作从两个串的第一个字符开始进行,字符的ASCII码值大者所在的串为大,若其中一个串先结束,则以串长较大者为大。
串的存储结构:每个字符串的最后要增加个串结束标志\0
(1)顺序存储使用一组地址连续的存储单元来存储串值得字符序列
(2)当用链表存储串中的字符时,每个节点中可以存储一个字符,也可以存储多个字符,要考虑存储密度问题
五.KMP算法
KMP算法是一种改进的字符串匹配算法
关键在于利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的,具体实现就是实现一个next()函数,函数本身包含了模式串的局部匹配信息。
部分匹配值??比较麻烦百度下吧
==================================================
一.树
树是n(n>=0)个节点的有限集合,n=0时称为空树,在任一非空树中:(1)有且仅有一个称为根的节点
(2)其余的节点可分为m(m>=0)个互不相交的子集T1, T2...,Tm,其中每个子集本身又是一棵树,并称其为根节点的子树。
1.树的基本慨念
双亲和孩子
兄弟:具有相同双亲的节点互为兄弟
节点的度:一个节点的子树的个数记为该节点的度。
树的度:树中各节点的度的最大值
叶子节点:也称为终端节点,指度为零的节点。
内部节点:度不为零的节点称为分支节点或非终端节点,除根节点之外,分支节点也称为内部节点。
节点的层次:根为第一层,根的孩子为第二层,以此类推
树的高度:一棵树的最大层次数记为数的高度(或深度)
有序(无序)数:若将树中的节点的各子树看成是从左到右具有次序的,即不能交换,则称该树为有序树,否则称为无序树。
森林:是m(m>=0)棵互不相交的树的集合
2.树的存储结构
标准存储结构:节点的数据、指向子节点的指针
带逆存储结构:节点的数据、指向子节点的指针、指向其父节点的指针
3.树的遍历
遍历是指对树中所有节点信息的访问,即依次对树中每个节点访问一次且仅访问一次。
前序(根)遍历、后序(根)遍历、层次遍历
树的遍历是没有中序遍历的;中序遍历特指的是二叉树。
二.二叉树
二叉树是n(n>=0)个节点的有限集合,它或者是空树(n=0),或者是由一个根节点及两棵互不相交的、分别称为左子树和右子树的二叉树所组成。
二叉树与树的区别:
二叉树的节点的最大度为2,而树不限制节点的度。
二叉树的节点的子树要区分左子树和右子树。
1.二叉树的性质:(1)二叉树第i层上的节点数目最多为(2^i-1)(i>=1)
(2)深度为k的二叉树至多有(2^k)-1个节点(k>=1)
(3)在任意一颗二叉树中,若终端节点数为n0,度为2的节点数为n2,则n0=n2+1
(4)具有n个节点的完全二叉树的深度为(log以2为底的n)+1;(取下限整数)
......
2.二叉树的存储结构
(1)顺序存储结构
对完全二叉树既简单又节省空间,而对于一般二叉树则不适用
(2)链式存储结构
由于二叉树中节点包含有数据元素、左子树根、右子树根及双亲等信息,因此可以用三叉链表或二叉链表来存储二叉树。链表的头指针指向二叉树的根节点。
(3)二叉树的遍历(前、中、后)!必需掌握
三.二叉排序树
又称为二叉查找树,定义:或者是一棵空树,或者是具有下列性质的二叉树:
(1)若左子树不空,则左子树上所有节点的值均小于它的根节点的值
(2)若右子树不空,则右子树上所有节点的值均大于或等于它的根节点的值
(3)左、右子树也分别为二叉排序树;
四.平衡二叉树
又被称为AVL树,具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
五.最优二叉树
给定n个权值作为n的叶子节点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树。哈夫曼树是带权路径长度最短的树,权值较大的节点离根较近。
==========================================================
一.图
图G是由两个集合V和E构成的二元组,记作G=(V,E),其中V是图中顶点的非空有限集合,E是图中边的有限集合。
有向图:图G中的每条边都是有方向的,顶点间的关系用<vi,vj>表示;
无向图:图G中每条边都是无方向的;顶点间的关系用(vi,vj)表示;
完全图:图G任意两个顶点都有一条边相连接;
有向完全图:n个顶点的有向图有n(n-1)条边。
无向完全图:n个顶点的无向图有n(n-1)/2条边。
二.图的存储结构
图的存储结构有:邻接矩阵、邻接表、十字链表、邻接多重表
===========================================================
一、排序
将一组杂乱无章的数据按一定的规律次序排列起来
排序的目的是便于查找
排序算法的好坏如何衡量?
时间效率(排序速度,即排序所花费的全部比较次数)
空间效率(站内存辅助空间的大小)
稳定性(若两个记录A和B的关键字值相等,但排序后A、B的先后次序保持不变,则称这种排序算法是稳定的)
排序方法:插入排序(直接插入排序、希尔排序)、选择排序(直接选择排序、堆排序)、交换排序、归并排序
1)插入排序
1.直接插入排序:时间效率:因为在最坏的情况下,所有元素的比较次数综合为(0+1+...n-1)->O(n^2),故时间复杂度为O(n^2)
空间效率:仅占用1个缓冲单元O(1)
算法的稳定性:稳定
2.希尔排序是一种不稳定的排序方法,初始序列的不同会影响算法的效率
2)选择排序
每一次从待排序的数据元素中选出最小的一个元素,存放在已排序列的后面,直到全部待排序的数据元素排完
优点:实现简单
缺点:每趟只能确定一个元素,表长为n时需要n-1趟
前提:顺序存储结构
3.直接选择排序
在所有记录中选出最小的记录,把它与第一个记录交换,然后在剩余的记录内选出最小的记录与第二个交换...依次类推
4.堆排序
==================================================================
编译原理:
3.程序语言的控制结构