二维数组m的元素是4个字符组成的串_串、数组和广义表

1. 串

1.1 串的定义

ADT String{
数据对象:D={ai|ai∈CharacterSet, i=1, 2, …, n, n≧0}
数据关系:R1={|ai-1, ai∈D, i=2, …, n}
基本操作:
生成一个值等于chars的串
复制一个串
判断串是否空串
比较串的大小
返回串元素的个数
将串清空
将串合并
返回串的指定下标的元素之后指定长度的字串
在某个串中查找规定子串,并返回指定下标的字符后第一次出现的位置
在某个串中用规定字串替代不重叠的另一规定字串
在串的指定下标的字符前插入一个指定子串
在串中删除一个规定下标开始指定长度的字串
销毁串
}

1.2 串的存储结构

1.2.1 顺序存储

//----------串的定长顺序存储结构---------------

#define MAXLEN 255 //串的最大长度
typedef struct
{
char ch[MAXLEN+1]; //存储串的一维数组,从下标为1开始存储
int length; //串的当前长度
}SString;


//----------串的堆式顺序存储结构,按需分配长度----------------
typedef struct
{
char *ch; //如果是非空串,则按照串长分配存储区,否则ch为null
int length; //串的当前长度
}HString;

1.2.2 链式存储

#define CHUNKSIZE 80
typedef struct Chunk
{
char ch[CHUNKSIZE]; //提高空间利用率(一个结点多个字符)
struct Chunk *next; //最后一个结点不满用非串字符填满
}Chunk;

typedef struct
{
Chunk *head, *tail; //尾指针便于操作
int length; //串的当前长度
}LString;

1.3 模式匹配算法

1.3.1 BF算法

int Index_BF(SString S, SString T, int pos)
{//返回模式T在主串S中第pos个字符开始第一次出现的位置。若不存在,则返回值为0
//T非空,0int i=pos; int j=1; //初始化while (i<=S.length && j<=T.length) //如果两个串均没到串尾{if (S.ch[i]==T.ch[j]){++i; ++j;} //如果目前的字符匹配,则继续比较下一个字符else{i=i-j+2; j=1;} //如果失配,则将i退回到主串开始比较的下一个字符,j退回到字串的开头}if (j>T.length) return (i-T.length); //匹配成功else return 0; //匹配失败 }

1.3.2 KMP算法

  1. 设计思想
    失配时,主串指示器i不用回溯,利用已经得到的部分匹配,将模式串指示器j向右滑动尽可能远的距离后继续比较

b75a91555535782eb8be5d249d495f16.pngfe31a464a7265a77eb17d10e5978859e.png

a7f9b44760c145b8521fd2769a2038c6.png
为此定义next函数,表示模式中第j个字符失配时,在模式串中需要重新与主串中该字符进行比较的字符的位置e7b53f80ff8231c5af899179513081bc.png

故算法如下

int Index_KMP(SString S, SString T, int pos)
{ //利用模式串T的next函数求T在主串S中第pos个字符之后的位置
//其中T非空,1<=pos<=S.length
int i=pos; int j=1;
while (i<S.length && j<T.length) //两个串均未到达串尾
{
if(j==0 || S.ch[i]==T.ch[j]){++i; ++j;} //如果j为0或者目前的字符匹配,则继续比较下一个字符
else j=next[j]; //否则就将j置为next[j]
}
if (j>T.length) return (i-T.length); //匹配成功
else return 0; //匹配失败
}
  1. next函数求法
    递推求值
    由定义知,

			next[1] = 0

设next[j]=k,表明有296048ea23c3d243a84ad0a078d3db8d.png
1k满足上式,此时next[j+1]的值有以下两种情况
(1)pk=pj,则有df057b3cec42aa013f113e47eacd15a8.png

			next[j+1]=k+1=next[j]+1

(2)pk≠pj
此时用把求next值的问题看成模式匹配的问题,模式串既是主串又是模式串
求next[j+1],第j+1个字符与主串失配,假设此时将k=next[j]及其前面的字符串滑过来与主串匹配,由于pk≠pj,此时第k个字母与主串失配,因此我们应当在它前面寻找k’=next[k]继续与主串匹配,以此类推,直到某个字符匹配成功或p[k+1]=1

		next[j+1]=next[k]+1

算法如下:

void get_next(SString T, int next[])
{//求模式串T的next函数值并存入数组next
int i=1;next[1]=0;int j=0;
while (i<T.length)
{
if(j==0||T.ch[i]==T.ch[j]){++i; ++j; next[i]=j;} //如果j是0(开头)或者第i个字符等于第j个字符,则next[i+1]=j+1
else j=next[j]; //如果不等于,j回溯到next[j]
}
}

但是,例如串"aaaab"与"aaabaaaab",第4个字母失配,但是还要将j=3,2,1依次与i=4比较,但由于j=1,2,3,4的字符都相等且i=4字符与j=4字符不等,因此可以直接比较i=5和j=1。
由此可见,当next[j]=k,而tj=tk时,不必比较,可以直接比较tj和tnext[k],以此类推
算法如下:

void get_nextval(SString T, int nextval[])
{//求模式串中next函数的修正值并存入数组nextval
int i=1;nextval[1]=0;int j=0;
while (i<T.length)
{
if(j==0||T.ch[i]==T.ch[j]){
++i;++j;
if(T.ch[i]!=T.ch[j]) nextval[i]=j;
else nextval[i]=nextval[j]; //如果第i个字符与第j个字符相等,j回溯到nextval[j]
}
else j=nextval[j];
}
}

2. 数组

2.1 定义

ADT Array{
数据对象:ji = 0, …, bi-1, i=1,2,…,n
D = {aj₁j₂…jn | n>0 称为数组的维数,bi是第i维的长度}
ji是数组元素第i维下标,aj₁j₂…jn∈ElemSet}
数据关系:R = {R1, R2, …, Rn}
Ri = {}}
0<=jk<=bk-1, 1<=k<=n 且k≠i
0<=ji<=bi-2
aj₁…ji…jn, aj₁…ji+1…jn∈D, i = 2, …, n}
基本操作:
构造数组
销毁数组
赋值指定的元素
返回指定的元素值
}

2.2 数组的顺序存储

位置下标:LOC(i,j)=LOC(0,0)+(n*i+j)L(可推广至n维)

2.3 特殊矩阵的压缩

  1. 对称矩阵(aij = aji)
    以sa[a(a+1)/2]存储下三角,则对于下标k有de0cebc5c3942c844e61db192acc6965.png

  2. 三角矩阵(只有半边有元素,剩下半边元素值相等)aaee6e69803fb1c981b4c129d350a185.png

  3. 其它矩阵
    (1)对角矩阵:找规律,压缩
    (2)稀疏矩阵:三元组表(行下标,列下标,值)

3. 广义表

3.1 定义

  1. 一些结论
    (1)元素可以是原子或者子表
    (2)可以为其它广义表共享,可以共享其它广义表
    (3)广义表是一个递归的表

  2. 重要运算
    (1)取表头:取出非空广义表的第一个元素,可以是单原子或者子表
    (2)取表尾:取出除了第一个元素之外,其余元素构成的表

3.2 存储结构

表结点由标志域(1表示表结点,0表示原子结点),表头结点,表尾结点组成,原子由标志域和和值组成11fb1076d1e1e21e23be1f40b4b16a30.png
(a,(b,c,d))结构图示如下5e6227ea9b62608e5be4307a8e5a19e3.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/541959.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

流媒体测试笔记记录之————阿里云监控、OBS、FFmpeg拉流和推流变化比较记录...

OBS设置视频&#xff08;512kbps&#xff09;和音频&#xff08;128kbps&#xff09;比特率 阿里云监控结果&#xff1a; 使用FFmpeg拉流到Nginx 服务器测试比特率 第二次测试&#xff0c;修改视频和音频比特率 OBS设置 阿里云监控 Nginx 比特率变化 FFMPEG 拉流截图

python方差分析模型的预测结果怎么看_statsmodels中方差分析表结果解析

引言通常我们在对多个变量进行统计分析的时候&#xff0c;结果的汇总和整理需要耗费大量的时间和精力&#xff0c;稍有不慎还有可能出现错误。因此在对多个变量统计分析的时候&#xff0c;使用自动化的脚本对结果进行整理和汇总就十分的方便了。这里笔者使用Python当中的statsm…

mysql 刷新二进制日志_使用binlog日志恢复MySQL数据库删除数据的方法

binlog日志简介:binlog 就是binarylog&#xff0c;二进制日志文件&#xff0c;这个文件记录了MySQL所有的DDL和DML(除了数据查询语句)语句&#xff0c;以事件形式记录&#xff0c;还包含语句所执行的消耗的时间。binlog日志包括两类文件&#xff1a;1)二进制日志索引文件(文件名…

执行git push出现Everything up-to-date

在github上git clone一个项目&#xff0c;在里面创建一个目录&#xff0c;然后git push的时候&#xff0c;出现报错"Everything up-to-date" 原因&#xff1a;1&#xff09;没有git add .2&#xff09;没有git commit -m "提交信息"如果上面两个步骤都成功…

Unity3D Adam Demo的学习与研究

1.简述 这篇文章是对Adam各种相关资料了解后进行一些精简的内容。如果你想仔细研究某个技术请跳转至unity相关页面。 Adam官方页面: https://unity3d.com/cn/pages/adam 搬运视频以及资源包网盘下载: http://pan.baidu.com/s/1jH6NF86 Adam这个demo由8个人的团队耗时6个月(part…

python安卓自动化实现方法_uiautomator +python 实现安卓UI自动化

简单实例注&#xff1a;安卓6.0以上的手机不会自动安装app-uiautomator.apk和app-uiautomator-test.apk&#xff0c;需要手动安装&#xff0c;否则报错ioerror RPC server not starteduiautomator pythonHTMLTestRunner 安卓UI自动化实现#coding:utf-8from uiautomator importD…

2_C语言中的数据类型 (四)整数与无符号数

1.1 sizeof关键字 sizeof是c语言关键字&#xff0c;功能是求指定数据类型在内存中的大小&#xff0c;单位&#xff1a;字节 sizeof与size_t类型 1.1 int类型 1.1.1 int常量&#xff0c;变量 int就是32位的一个二进制整数&#xff0c;在内存当中占据4个字节…

Spring实战——通过Java代码装配bean

上篇说的是无需半行xml配置完成bean的自动化注入。这篇仍然不要任何xml配置&#xff0c;通过Java代码也能达到同样的效果。 这么说&#xff0c;是要把上篇的料拿出来再煮一遍&#xff1f; 当然不是&#xff0c;上篇我们几乎都在用注解的方式如ComponentScan Component等就完成了…

java.io和util的区别_Java NIO与IO的区别和比较

Java NIO与IO的区别和比较导读J2SE1.4以上版本中发布了全新的I/O类库。本文将通过一些实例来简单介绍NIO库提供的一些新特性&#xff1a;非阻塞I/O&#xff0c;字符转换&#xff0c;缓冲以及通道。一. 介绍NIONIO包(java.nio.*)引入了四个关键的抽象数据类型&#xff0c;它们共…

区块链+税务的思考

2016年&#xff0c;区块链技术火了&#xff01;各大金融公司、互联网巨头都竞相参加到区块链技术的研究中。我们公司的业务是税务的信息化领域&#xff0c;也希望通过区块链技术的应用&#xff0c;来提升为财税领域的服务。 区块链技术优缺点总结 下图是对区块链技术的一些特点…

如何使用JavaScript删除CSS属性?

In this article, well see how we can remove a CSS property from a certain element using JavaScript? We can remove only those properties that we assign ourselves and the pre-default ones cannot be removed by this method. 在本文中&#xff0c;我们将看到如何使…

【喜报】JEEWX荣获“2016 年度码云新增热门开源软件排行榜”第一名!

为什么80%的码农都做不了架构师&#xff1f;>>> 2016 年度码云新增项目排行榜 TOP 50 正式出炉&#xff01;根据 2016 年在码云上新增开源项目的 Watch、Star、Fork 数量以及其他角度的统计&#xff0c;JEEWX捷微管家荣获“2016 年度码云新增热门开源软件排行榜”第…

java 二叉树特点_疯狂java笔记之树和二叉树

树的概述树是一种非常常用的数据结构&#xff0c;树与前面介绍的线性表&#xff0c;栈&#xff0c;队列等线性结构不同&#xff0c;树是一种非线性结构1.树的定义和基本术语计算机世界里的树&#xff0c;是从自然界中实际的树抽象而来的&#xff0c;它指的是N个有父子关系的节点…

tomcat +apache 配置集群

2019独角兽企业重金招聘Python工程师标准>>> APACHE2.2.25TOMCAT6.0.37配置负载均衡 目标: 使用 apache 和 tomcat 配置一个可以应用的 web 网站&#xff0c;要达到以下要求&#xff1a; 1. Apache 做为 HttpServer &#xff0c;后面连接多个 tomcat 应用实例&…

java双缓存机制_详解JVM类加载机制及类缓存问题的处理方法

前言大家应该都知道&#xff0c;当一个Java项目启动的时候&#xff0c;JVM会找到main方法&#xff0c;根据对象之间的调用来对class文件和所引用的jar包中的class文件进行加载(其步骤分为加载、验证、准备、解析、初始化、使用和卸载)&#xff0c;方法区中开辟内存来存储类的运…

什么是mvc?

什么是MVCMVC 是一种设计模式&#xff0c;它将应用划分为3 个部分&#xff1a;数据&#xff08;模型&#xff09;、展现层&#xff08;视图&#xff09;和用户交互层&#xff08;控制器&#xff09;。换句话说&#xff0c;一个事件的发生是这样的过程&#xff1a;1&#xff0e;…

mysql的安装和基本命令_MySQL安装以及简单命令用法

MYSQL:关系型数据库存储引擎:负责将逻辑层的概念转化为物理层机制&#xff0c;在物理层完成物理机制。支持事务&#xff1a;transaction必须满足的条件&#xff1a;ACID(一致性,持久性,原子性,隔离性)锁&#xff1a;并发访问随机访问&#xff1a;数据在磁盘上是随机存储的安装&…

docker集群运行在calico网络上

2019独角兽企业重金招聘Python工程师标准>>> ##网络及版本信息 docker1 centos7 192.168.75.200 docker2 centos7 192.168.75.201 物理网络 192.168.75.1/24 Docker version 1.10.3, build 3999ccb-unsupported &#xff0c;安装过程略 # calicoctl version Version…