Learning Data Structure_3_串和树(1)

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

时间: 2024-10-11 21:43:00

Learning Data Structure_3_串和树(1)的相关文章

Learning Data Structure_4_树(2)和图(1)

今天杂事较多,学习时间比较分散,所以效率不是很高,看的内容也较少,总体来看,这四天把数据结构的内容看了过半,还剩图.查找和排序三章,争取接下来三天内把数据结构的内容结束掉.下面是今天的学习内容. 树(tree) 1.前序遍历算法:与二叉树的定义一样采用递归形式. 2.中序和后序遍历与前序类似用递归实现:前.中.后是指单次递归算法中访问根节点的顺序 3.已知(前+中)or(后+中)序遍历序列可以唯一确定一颗二叉树:单已知 前+后 则不能. 4.扩展二叉树:将每个结点的空孩子指针引出一个虚结点:扩展

Learning Data Structure_5_图(2)

天气越来越热,看书还得静得下心啊,今天继续图这一章,概念和算法众多,第一遍看以广度优先的形式为主,以后若要用到具体的算法再去翻"算法导论"吧.下面是学习内容和笔记. 图(graph) 1.图的存储结构 邻接矩阵:顶点数组 + 边数组(二元):无向图的边数组为对称矩阵,有向图非对称(行的元素和表顶点的出度和,列对应入度和):网图的边数组中元素由布尔型变为权值. 邻接表:顶点表(data+firstedge) + 边表(adjvex+next):有向图的边表分出边表和入边表:带权的网图,在

Learning Data Structure_7_排序

浑沦吞枣的过了一遍数据结构,今天把最后一章排序的内容结束.大概实现了一个星期看完的想法,当然不是为了求速度,这一次看主要是把各种数据结构做到心中有数,概念清晰,了解各自有哪些经典的算法和算法思路原理.以后若要用到特定的结构和算法再去算法导论中详细研读.下面是今天的学习笔记. 排序(ranking) 1.排序可看成是对线性表的操作:多个关键字排序可转化成单个关键字排序:排序的稳定和不稳定:主要讲内排序,其排序算法主要受3方面影响:时间性能,辅助空间,算法复杂性. 2.按复杂度分:简单算法(冒泡排序

Learning Data Structure_1_数据结构绪论和算法

今天回到了杭电,在戴荣学弟的帮助下暂住他的寝室,解决了基本的生活问题,可以多点时间精力开始学习阅读刘志老师给的暑假要求掌握的书籍和知识了. 首先是数据结构,手头上主要是两本教材,一本是严蔚敏等主编的<数据结构(c语言版)>,另一本是程杰编的<大话数据结构>,前者经典严谨,后者通俗有趣,应该是不错的选择.以下是简要的学习内容和笔记. 数据结构绪论 1.数据结构是一门研究非数值计算的程序设计问题中的操作对象,以及它们之间的关系和操作等相关问题的学科. 2.掌握以下概念和术语:数据.数据

Learning Data Structure_2_线性表、栈和队列

一个人在学校的日子有些寂寞,但是st说男人要耐得住寂寞,做学问也是如此吧.今天看了线性表.栈和队列的内容.以下是学习记录. 线性表(list) 1.定义:0个或多个数据元素的有限序列,元素有且只有一个直接后继和一个直接前驱:基本操作ListLength.GetElem.LocateElem.ListInsert等,并集Union的实现. 2.线性表的顺序存储结构 指用一段地址连续的存储单元依次存储数据元素(c语言中用数组实现改结构):数组长度>=线性表的长度:对于任意位置的存入或取出的所需时间相

HDU 4217 Data Structure?(线段树 or 树状数组啊)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4217 Problem Description Data structure is one of the basic skills for Computer Science students, which is a particular way of storing and organizing data in a computer so that it can be used efficiently

URAL 1989 Subpalindromes(回文串 线段树 多项式hash)

1989. Subpalindromes Time limit: 0.5 second Memory limit: 64 MB You have a string and queries of two types: replace i'th character of the string by character a; check if substring sj...sk is a palindrome. Input The first line contains a string consis

LeetCode 211. Add and Search Word - Data structure design(字典树)

题目 字典树. class WordDictionary { public: int map[100005][26]; int tag[100005]; int num; /** Initialize your data structure here. */ WordDictionary() { memset(map,0,sizeof(map)); memset(tag,0,sizeof(tag)); num=0; } /** Adds a word into the data structur

4504: K个串 主席树+优先队列

这道题因为有一个数在序列中出现多次只算一次的限制.我们可以这样搞.假设在当前题意下求给定右端点的区间最值.那么我们可以预处理出每个数前一次出现的位置pre[i] .接下来从左到右加入每一个值,就是在 pre[i] + 1 —— i 这个区间内加上 v[i] 的值,这样就可以得到以当前 i 点为右端点的各个区间的值(很明显维护一下最值就好了).接下来很明显有n个版本的线段树(如果你说一开始那个空的线段树也算一个版本的话,就有n+1个),那就要用主席树动态开点.而取第K大值的操作有点像超级钢琴,不过