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 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 记录数据结构的学习006 -> 正文阅读

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

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

特殊矩阵的压缩存储

普通矩阵,可用一个二维数组存储 Array[M][N]

特殊矩阵:对称矩阵、三角矩阵、三对角矩阵、稀疏矩阵

对称矩阵的压缩空间:

对称矩阵:Aij=Aji

故可以只存储? 主对角线+下三角区?

可以按照行优先存储方式存储一个对称矩阵:

{A11,A21,A22,A31,A32,A33,A41,A42,A43,... ...,An1,An2,... ...,An n-1 Ann}

数组的长度为(1+2+3+4+5+6+...+n)

可以使用映射函数

Array[ i*(i-1)/2+j-1 ] 即为Aij号元素(要注意数组从0开始)

三角矩阵:除了三角区和对角线,其余为相同元素

思路和对称矩阵一致,只需存储 三角区+主对角线 ,再用一个位置存储其余相同元素的值即可

三对角矩阵:又称带状矩阵,当 | i - j | > 0 时,Aij = 0 ,即只有中间三条对角线有数据,其余为0

除了第一行与最后一行,其余行均有三个元素,即Ai i-1,Ai i,Ai i+1,思路也是利用行优先原则,存储每一行的非0元素

稀疏矩阵:非0元素远少于为0元素个数

压缩存储策略1:

使用顺序存储,存一个三元组 < 行,列,数值 >? ,只存非0元素

压缩存储策略2:

链式存储——十字链表法

?每个元素存放 < 行,列,数值 > 数值,同时存放两个指针:行指针和列指针,行指针用于指向同一行下一个元素的位置,列指针用于指向同一列下一个元素的位置,同时初始化时建立行列头指针,用于指向该行或者该列的首个非0元素。

串的定义:即字符串,有0或多个字符组成的有限序列,数据对象受限的线性表(字符集)

子串:串中任意连续的字符子序列

主串:即整个串

字符在主串的位置:字符在串中的序号

子串在主串的位置:子串的第一个字符在主串的位置

StrAssign(&T, chars ); 把chars赋值给串T

StrCopy(&T,S);由串S复制得到串T

StrEmpty(T);判断串空

StrLength(T);求串长

ClearString(&T);清空串(空间仍在)

DestroyString(&T);销毁串(空间还给系统)

Concat(&T, S1, S2);串连接,由S1和S2连接得到串T

SubString(&Sub, T, pos, len);求子串。用Sub返回串T中第pos个字符起长度为len的子串

Index(T, Sub);如果主串T存在与Sub相同的子串,返回第一次出现的位置,否则返回0

StrCompara(S, T);比较两个字符串的大小,按照a<b<c...<z挨个字符比较;若S>T,返回值>0;若S<T,返回值<0;若S=T,返回值=0

ASCII码:A-65, Z-90? ?a-97,z-122

字符集:英文ASCII字符集,中英文Unicode字符集,同一字符集可以有多种编码方案,例如有UTF-8,UTF-16方法等。

乱码即编码规则使用错误,导致解码出错。

串的存储结构:

顺序存储:

即数据为char的顺序表

链式存储:即数据域为char的链表

子串在主串中定位操作:(Index函数)模式匹配

int Index(SString S, SString T){
	int i=1, n=StrLength(S), m=StrLength(T);
	SString sub;//用于暂存子串
	while(i<=n-m+1){
		SubString(sub, S, i, m);
		if(SubCompara(Sub, T)!=0)
			i++;
		else
			return i;//返回子串在主串中的位置
	}
	return 0;//S中不存在与T相等的子串
}

朴素模式匹配算法:(简单模式匹配算法)

即比对每一个和子串长度相等的主串中的子串

int Index(SString S, SString T){
	int k=1;
	int i=k, j=1;
	while(i<=S.length && j<=T.length){
		if(S.ch[i]==T.ch[j]){
			++i;
			++j;
		}//继续比较后续字符
		else{
			k++;//检查下一个子串
			i=k;
			j=1;
		}
	}
	if(j>T.length)
		return k;
	else
		return 0;
}

m为子串长,n为主串长:

匹配成功的最好时间复杂度:O(m)? ? ??匹配成功的最坏时间复杂度:O(nm)

匹配失败的最好时间复杂度:O(n)? ? ? ?匹配失败的最坏时间复杂度:O(nm)

KMP算法(优化朴素模式匹配算法):

引入next数组,长度为模式长度一致,用于存放匹配信息

int Index_KMP(SString S, SString T, int next[]){
	int i=1, j=1;
	while(i<=S.length&&j<=T.length){
		if(j==0||S.ch[i]==T.ch[j]){
			++i;
			++j;//继续比较后继字符
		}
		else
			j=next[j];//模式串向右移动
	}
	if(j>T.length)
		return i-T.length;//匹配成功
	else
		return 0;
}

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-08-10 13:41:03  更:2021-08-10 13:44:07 
 
开发: 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 3:43:14-

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