今天找兼职继续碰壁中,吃过中饭接着蹲图书馆看数据结构,呵呵,被KMP算法虐了一下午,恨啊,当初上数据结构选修课的时候怎么没好好听呢。下面是今天的学习笔记。
串(string)
1.定义:是由0个或多个字符组成的有限序列,即字符串。
2.串的比较通过字符的编码大小来实现,有ASCII码(7位和8位二进制)、Unicode码(16位);字符串的相等。
3.串不是线性表,因为串针对的是字符集,注重子串的查找替换等,线性表针对单个元素的操作。
4.串也分顺序存储结构和链式存储结构
5.朴素的模式匹配算法:对主串作大循环,主串的每个字符开头对子串作子串长T的小循环,直到匹配成功或全部遍历。时间复杂度O((n-m+1)*m)
6.KMP模式匹配算法
原理:利用已经完成的匹配结果,省去后续重复的匹配操作。时间复杂度O(n+m)
重难点:next[j]的求解、利用next[]数组实现Index操作
next[j]:前j-1个匹配,主串第i个与模式第j个不匹配时,模式串需将第next[j]个字符与主串第i个相比较(i不动)。
Void get_next(String T, int *next)
{
Int i, j;
i=1 , j=0;
next[1]=0;
while (i < T[0])
{
if(j==0 || T[i] == T[j])
{
i++;
j++;
next[i] = j;
}
else j = next [j];
}
}
7. 改进的KMP算法
对next[]的改进:在计算出next[]的同时,若a位字符与它next所指向的b字符相等,则该a位的nextval就指向b位的nextval,否则a位的nextval就等于a位的next值。
树(tree)
1.定义:是n个结点的有限集;有且仅有一个根节点;子树互不相交。
2.结点分类:度(结点拥有子树的个数)为0的为叶结点(终端结点);树的度是各结点度的最大值
3.森林:m>=0棵互不相交的树的集合。
4.树的存储结构:双亲表示法;孩子表示法;孩子兄弟表示法。都可以根据算法的需要增加特定的指针域来实现上述3种表示法中的功能。
5.二叉树:所以结点的度<=2 ;左右子树是有顺序的
6.特殊的二叉树
斜树:所有结点均只有左(右)子树——线性表就是一种斜树,是树的特例。
满二叉树:所有分支结点都有左右子树,且所有叶子都在最后一层上。
完全二叉树:按层序编号不会出现空挡的二叉树。
7.二叉树的性质
第i层最多有2^(i-1)个结点;
深度为k的二叉树最多有 (2^k)-1 个结点;
任意二叉树满足: 叶结点树 = 度为2的结点数 + 1 ;
完全二叉树的结点为n, 则其深度为 (log2 n)向上取整 + 1;
完全二叉树结点i的双亲是 i/2 向上取整;左孩子是2i。
8.二叉树的存储结构
完全二叉树可以用简单的顺序结构来表示;一般的二叉树需用而二叉链表来表示:lchild+data+rchild,若有需要可再添加指向双亲的指针,即三叉链表。
9.二叉树的遍历:每个结点都被访问且仅访问一次
前序遍历:根,左子树,右子树
中序遍历:左子树,根,右子树
后序遍历:先叶子后结点(依次从左子树到右子树),再根结点
Learning Data Structure_3_串和树(1),布布扣,bubuko.com
Learning Data Structure_3_串和树(1)
原文地址:http://songhk0209.blog.51cto.com/9130385/1436052