
第4章 字符串、数组和特殊矩阵
发布日期:2021-05-09 05:36:55
浏览次数:10
分类:博客文章
本文共 3304 字,大约阅读时间需要 11 分钟。
第4章 字符串、数组和特殊矩阵
目录
数据结构与算法_师大完整教程目录(更有python、go、pytorch、tensorflow、爬虫、人工智能教学等着你):
一、字符串
1.1 字符串的基本概念
- 字符串:由 \(0\) 个或多个字符构成的有限序列,元素类型为字符型的特殊线性表
1.2 字符串类的定义
- 略
1.3 字符串的存储及其实现
- 顺序存储字符串:顺序串
- 链式存储字符串:链式串
1.3.1 顺序串
顺序串常用操作:
- 顺序串的插入算法
- 顺序串的删除算法
- 顺序串的连接运算算法
- 求顺序串子串的算法
1.3.1.1 顺序串的存储结构
#define MAXSIZE 100typedef struct{ char str[MAXSIZE]; int length;} seqstring;
1.3.2 链式串
链式串的常用操作:
- 链式串的创建算法
- 链式串的插入算法
- 链式串的删除算法
- 链式串的连接算法
- 求链式串子串的算法
1.3.2.1 链式串的存储结构
typedef struct node{ char data; struct node *next; // 用于存放字符串中的每个字符} linkstrnode; // 用于指向本字符的下一个字符对应的结点的指针typedef linkstrnode * linkstring;
二、字符串的模式匹配
2.1 朴素的模式匹配算法
- 注:暴力求解,逐个匹对,时间复杂度 \(O(nm)\),\(n\) 是正文的长度,\(m\) 是模式串的长度
2.2 模式匹配算法(KMP算法)
- 算法步骤(大概率不考)
- 图kmp模式匹配流程:
2.2.1 next数组求解
\(next\) 数组求解步骤:
- 第 \(1\) 位:\(-1\)
- 第 \(2\) 位:\(0\)
- 第 \(n\) 位:比较前 \(n-1\) 位,得出最长前后缀长度为 \(k\),填 \(k\)
三、数组 (大纲未规定)
3.1 数组和数组元素
- 略
3.2 数组类的定义
- 略
3.3 数组的顺序存储及实现
- 略
四、特殊矩阵
- 特殊矩阵:对称矩阵、三角矩阵、带状矩阵、稀疏矩阵
4.1 对称矩阵的压缩存储
- 对称矩阵元素位置的计算(\(L\) 为每个元素占用存储空间的长度):
\[address(a_{ij}) =\begin{cases} & address(a_{00}) + [\frac{i*(i+1)}{2}+j]*L \qquad \text{当i>=j时}\\& address(a_{00}) + [\frac{j*(j+1)}{2}+i]*L \qquad \text{当i<j时}\end{cases}\]
4.2 三角矩阵的压缩存储
4.2.1 下三角矩阵
- 下三角矩阵元素位置的计算(\(L\) 为每个元素占用存储空间的长度):
\[address(a_{ij}) = address(a_{00}) + [\frac{i*(i+1)}{2}+j]*L \qquad \text{当i>=j时}\\\]
4.2.2 上三角矩阵
- 上三角矩阵元素位置的计算(\(L\) 为每个元素占用存储空间的长度):
\[\begin{aligned}address(a_{ij}) &= address(a_{00}) + [(n+(n-1)+(n-2)+\cdots+(n-(i-1)))+j-i]*L \\&= address(a_{00}) + [i*n-\frac{(i-1)*i}{2}+j-i]*L \qquad \text{当i<=j时} \end{aligned}\]
- 注:\((n+(n-1)+(n-2)+\cdots+(n-(i-1)))\) 表示 \(a_{ij}\) 前面的 \(i\) 行所有元素占用的空间;\(j-i\) 表示 \(a_{ij}\) 所在行的 \(a_{ij}\) 前面的元素所占用的空间
4.3 带状矩阵的压缩存储
- 带状矩阵:除第 \(1\) 行和最后一行外,每行都分配 \(2b+1\) 个元素的空间。但是把带状区域的所有元素存储于 \(((2b+1)*n-2b)*L\) 个存储单元中
- 带状矩阵元素位置的计算(\(L\) 为每个元素占用存储空间的长度):
\[\begin{aligned}address(a_{ij}) &= address(a_{00}) + ((i*(2b+1)-b)+(j-(i-b)))*L \\&= address(a_{00}) + (i*(2b+1)+j-i)*L \qquad \text{当|i-j|<=b时} \end{aligned}\]
- 注:\((i*(2b+1)-b)\) 表示 \(a_{ij}\) 前面的 \(i\) 行所有元素占用的空间;\((j-(i-b)))\) 表示 \(a_{ij}\) 所在行的 \(a_{ij}\) 前面的元素所占用的空间
五、稀疏矩阵
5.1 稀疏矩阵类的定义
- 略
5.2 稀疏矩阵的顺序存储及其实现
稀疏矩阵的顺序存储方法:三元组表示法、带辅助行向量的二元组表示法、伪地址表示法
三元组表示法:\((i,j,value)\),其中 \(i\) 表示行,\(j\) 表示列,\(value\) 表示值
注:三元组矩阵中第一行一般体现稀疏矩阵的行数、列数和所含非零元素的总个数
稀疏矩阵顺序存储常用操作:
- 产生稀疏矩阵的三元组表示
- 稀疏矩阵三元组表示下转置运算的实现
5.2.1 稀疏矩阵顺序存储(三元组)存储结构
typedef struct { int data[100][100]; // 存放稀疏矩阵的二维数组 int m, n; // 分别存放稀疏矩阵的行数和列数} matrix;typedef int spmatrix[100][3]; // 存放三元组
5.3 稀疏矩阵的链式存储及实现(大概率不考)
稀疏矩阵的链式存储方法:十字链表表示法、带行指针向量的单链表表示法、行_列表示法
非零元素结点的结构中有 \(5\) 个域:行域(\(row\))、列域(\(col\))、数据的值域(\(val\))、指向同一列下一个非零元素的指针域(\(down\))、指向同一行下一个非零元素的指针域(\(right\))
表头结点的结构中有 \(5\) 个域:行域(\(row\))默认为 \(0\)、列域(\(col\))默认为 \(0\)、指向下一个表头的指针域(\(next\))、指向同一列下一个非零元素的指针域(\(down\))、指向同一行下一个非零元素的指针域(\(right\))
稀疏矩阵的链式存储常用操作:
- 创建稀疏矩阵的十字链表表示
- 稀疏矩阵十字链表的查找算法
稀疏矩阵的十字链表存储方法如下图所示:
图稀疏矩阵的十字链表表示法:
5.3.1 稀疏矩阵链式存储(十字链法)存储结构
typedef struct matrixnode { int row, col; struct matrixnode *right, *down; union { int val; struct matrixnode *next; } tag;} matrixnode;typedef matrixnode *spmatrix;typedef spmatrix headspmatrix[100]; // 指针数组,每个元素指向一个表头结点
六、算法设计题
- 略
七、错题集
- 稀疏矩阵常用的压缩存储方法有三元组顺序存储和十字链表两种
- 设有一个 \(10×10\) 的对称矩阵 \(A\) 采用压缩方式进行存储,存储时以按行优先的顺序存储其下三角阵,假设其起始元素\(a_{00}\) 的地址为 \(1\),每个数据元素占 \(2\) 个字节,则 \(a_{65}\) 的地址为 \(53\)(元素 \(a_{00}\) 的地址为 \(1\),不是 \(2\))
发表评论
最新留言
网站不错 人气很旺了 加油
[***.192.178.218]2025年04月20日 03时49分02秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
javascript 用函数语句和表达式定义函数的区别
2021-05-09
也来玩玩 javascript对象深拷贝,浅拷贝
2021-05-09
Kubernetes实战总结 - 动态存储管理StorageClass
2021-05-09
【三思笔记】 全面学习Oracle分区表及分区索引
2021-05-09
wcf webHttpBinding Post 大数据量提交 ios c#客户端
2021-05-09
[LeetCode题解]141. 环形链表 | 快慢指针
2021-05-09
MySQL错误日志(Error Log)
2021-05-09
MySQL二进制文件(binlog)
2021-05-09
Redis性能篇(二)CPU核和NUMA架构的影响
2021-05-09
C基础 带你手写 redis ae 事件驱动模型
2021-05-09
C基础 工程中常用的排序
2021-05-09
6.Android-五大布局
2021-05-09
第3阶段——内核启动分析之start_kernel初始化函数(5)
2021-05-09
12.Linux之输入子系统分析(详解)
2021-05-09
19.QT-事件发送函数sendEvent()、postEvent()
2021-05-09
源码解析之 Mybatis 对 Integer 参数做了什么手脚?
2021-05-09
oracle使用DBMS_RANDOM包生成随机数据
2021-05-09
[转]收集Oracle UNDO诊断信息脚本
2021-05-09
【QML 快速入门】属性(Properties)
2021-05-09