IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 记录数据结构的学习007 -> 正文阅读

[数据结构与算法]记录数据结构的学习007

(此文为王道数据结构学习笔记,只供个人后续复习使用,若有错误,还望指出我改正,谢谢)

KMP:

next数组的计算方式:

引入前缀后缀概念:

前缀:串中包含第一个字符但不包含最后一个字符的串 即 1—n 号元素(1<n<m,m为串长)

后缀:串中包含最后一个字符但不包含第一个字符的串 即 n—m?号元素(1<n<m,m为串长)

公共前后缀:元素完全相等的两个前后缀

当模式串指针 j 移动到模式串上 p 号元素时发现到不匹配时,看到 j 之前的部分模式串,找到这部分模式串的最大公共前后缀串S,串S的长度为 n ,则新的 j 应指向 n + 1 号位模式串,记录该 p 号元素的 next 数组值为 n+1 ,按照这种方法,即可求得next数组。

于是 next 的计算方法为:p 号元素的 next 值等于其之前元素的公共前后缀长度加一。

next [ 0?] =0;next [ 1?] =1;例如

序号123456789
模式串abaabbbab
next [ j ]?011223112

使用kmp算法后,主串的扫描指针 i 无需回溯,只需要模式串指针 j 进行回溯,按照next数组回溯。当 j = 0 时,代表需要将模式串直接向后滑动,故应当让 i 也加一。

next数组计算算法实现

void get_next(SString T,int next[]){
	int i=1,j=0;
	next[1]=0;
	while(i<T.length){
		if(j==0||T.ch[i]==T.ch[j]){
			++i;
			++j;
			next[i]=j;
		}
		else
			j=next[j];
	}
}

KMP算法存在的问题:(nextval数组)

当发现元素不匹配时,利用next数组,可让 j 跳至next数组告知的位置,但如果此时,即将跳转到的那个位置的元素,和当前元素相等(则当前元素一定也不和主串指针 i 指向的元素匹配),则这个跳转多此一举。所有可以计算 nextval 数组,让两个相同元素且存在跳转关系的 nextval 值相等,都等于第一个出现时的 nextval 值即可,可以省略跳完又跳的浪费行动。例如

序号j123456
模式串GOOGLE
next011121
nextval011021

则引入计算nextval数组的算法:先计算next数组,然后再根据next数组开始遍历,若发现某个元素与跳转后的元素相等,则将其next值修改成该元素的next值,完成遍历后,next数组更新成为了nextval数组。

nextval数组计算算法实现:

void get_nextval(SString T,int next[]){
	int i=1,j=0;
	next[1]=0;
	while(i<T.length){
		if(j==0||T.ch[i]==T.ch[j]){
			++i;
			++j;
			next[i]=j;
		}
		else
			j=next[j];
	}
	//前半部分和next一样,先算出next数组
	for(int k=2;k<=T.length;k++){
		if(T.ch[next[j]]==T.ch[j])
			nextval[j]=nextval[next[j]];//如果跳转的元素相等,改变nextval
		else
			nextval[j]=next[j];//否则,nextval等于原next值
}

逻辑结构:

一个根结点有几个边,连着分支结点。

空树:无结点;非空树:有且仅有一个根结点(也可以有其他结点)子树:分支产生的树

根结点没有前驱有后继,分支结点有前驱后继,叶子结点无后继有前驱;每个结点至多有一个前驱

术语:

结点之间关系:

祖先结点:向上回溯到根结点的每一个结点都为祖先结点

子孙结点:自己的分支及分支的分支所连着的结点都为子孙结点

双亲结点:父结点。自己的前驱

兄弟结点:同一个父结点下的结点

堂兄弟结点:同一层的结点(即它们的父结点为兄弟结点或堂兄弟结点)

结点的层次(深度):从根结点开始一层一层往下数

结点的高度:从最下层的叶子节点开始一层一层往上数

树的高度(深度):一共有多少层

结点的度:该结点一共有几个分支(孩子)

树的度:各节点度的最大值

有序树:子树从左到右有顺序

无序树:子树从左到右无顺序

森林:多个不相交的树组成

树的性质:

结点数等于总度数+1(根结点)

树的度为m:有且至少有一个结点度为m,不能没有结点

?m 叉树:每个结点的度最多为m,可以没有结点

度为m的树,第 i 层最多有?m^{i-1}?个结点。

高度为 h 的 m 叉树,最多有m^{0}+m^{1}+m^{2}+...+m^{h-1}=\frac{m^{h}-1}{m-1}个结点

高度为 h 的 m 叉树,最少有 h 个结点

高度为 h 的度为 m 的树,最少有 h+m+1 个结点(即前全是只有一个分支,最后有m个叶子)

具有 n 个结点的 m 叉树,最小高度为【LOGm(n(m-1)+1)】向上取整

?

二叉树

每个结点最多两个孩子,

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-08-11 12:40:50  更:2021-08-11 12:44:08 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/21 5:57:17-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码