码迷,mamicode.com
首页 > 其他好文 > 详细

Learning Data Structure_3_串和树(1)

时间:2014-07-09 08:16:21      阅读:198      评论:0      收藏:0      [点我收藏+]

标签:图书馆   二进制   大循环   线性表   选修课   

    今天找兼职继续碰壁中,吃过中饭接着蹲图书馆看数据结构,呵呵,被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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!