二维数组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 拉流截图

Java RandomAccessFile readChar()方法及示例

RandomAccessFile类readChar()方法 (RandomAccessFile Class readChar() method) readChar() method is available in java.io package. readChar()方法在java.io包中可用。 readChar() method is used to read a character value from this file and it can read character up…

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

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

Java PipedOutputStream connect()方法与示例

PipedOutputStream类的connect()方法 (PipedOutputStream Class connect() method) connect() method is available in java.io package. connect()方法在java.io包中可用。 connect() method is used to cause this PipedOutputStream to be connected to the given PipedInpu…

[转载] 中国象棋软件-引擎实现(一)概述

2005年6月我系第二批科技小组的项目正式确定为实现一款中国象棋对弈软件。基本功能包括人机对战、网络对战。我负责开发人机对战的引擎部分&#xff0c;也就是让计算机下棋。经过了暑假整整两个月的学习与实践&#xff0c;我终于初步完成了程序&#xff0c;虽然电脑的下棋水平实…

Java FilePermission getActions()方法与示例

FilePermission类的getActions()方法 (FilePermission Class getActions() method) getActions() method is available in java.io package. getActions()方法在java.io包中可用。 getActions() method is used to check whether this FilePermission and the given object are…

字符与编码(编码转换)

作为一名程序员&#xff0c;肯定有被乱码困扰的时候&#xff0c;真到了百思不得其解的时候&#xff0c;就会觉得&#xff1a;英文程序员真幸福。但其实只要明白编码之间的转换规律&#xff0c;其实乱码还是很好解决的。我们都知道字符串在保存和传输的时候需要先经过编码成二进…

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

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

Java FileInputStream available()方法与示例

FileInputStream类的available()方法 (FileInputStream Class available() method) available() method is available in java.io package. available()方法在java.io包中可用。 available() method is used to return the number of bytes left that can be read from this Fi…

mysql 输出参数 sql语句_MySQL: 详细的sql语句

1添1.1【插入单行】insert [into] (列名) values (列值)例&#xff1a;insert into Strdents (姓名,性别,出生日期) values (开心朋朋,男,1980/6/15)1.2【将现有表数据添加到一个已有表】insert into (列名) select from 例&#xff1a;insert into tongxunlu (姓名,地址,电子邮…

执行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 "提交信息"如果上面两个步骤都成功…

Java File类boolean delete()方法(带示例)

文件类布尔型delete() (File Class boolean delete()) This method is available in package java.io.File.delete(). 软件包java.io.File.delete()中提供了此方法。 This method is used to delete file or directory by using delete() method and this method is accessible…

Unity3D Adam Demo的学习与研究

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

Java File类boolean isFile()方法(带示例)

File类boolean isFile() (File Class boolean isFile()) This method is available in package java.io.File.isFile(). 软件包java.io.File.isFile()中提供了此方法。 This method is used to check whether the file is specified by filepath is a file or not. 此方法用于检…

要加油!

现实中我容易佩服一个人。 一个顽强的女人&#xff0c;一个艰苦奋斗的男人..... 但是在网络的世界里&#xff0c;我没有佩服过几个&#xff0c;但是不得不说的就是冰河。同样的年龄人家做的事情和我们做的事情差距是多么的大&#xff0c;真的想想心里都是天壤之别。 比一比才知…

Java DataOutputStream writeInt()方法及示例

DataOutputStream类writeInt()方法 (DataOutputStream Class writeInt() method) writeInt() method is available in java.io package. writeInt()方法在java.io包中可用。 writeInt() method is used to write the given integer value to the basic DataOutputStream as 4 b…

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…

ES6特性之:Spread操作符

Spread操作符(...)&#xff0c;也称作展开操作符&#xff0c;作用是将可迭代的(Iterable)对象进行展开。 比如有2个数组&#xff0c;我们要将其中一个数组中所有元素插入到另一个数组中&#xff0c;通过Spread操作符&#xff0c;就可以这样进行&#xff1a; var fruits ["…

Java类class isMemberClass()方法及示例

类的类isMemberClass()方法 (Class class isMemberClass() method) isMemberClass() method is available in java.lang package. isMemberClass()方法在java.lang包中可用。 isMemberClass() method is used to check whether the underlying class is a member class or not.…

velocity自定义函数_velocity基本语法和总结

一&#xff1a;基本语法&#xff1a;1、#set(#a "a")$a ##输出语句时直接写变量的名称即可2、判断语句&#xff1a;#if($a "a") ##判断语句没有括号&#xff0c;也是直接输出$a3、数组&#xff1a;#set($arry [0..10])$foreach($i in $arry)$i ##换行#e…