串和数组.

本文介绍了串的基本概念,包括空串和子串,并详细阐述了BF算法与KMP算法在串的模式匹配中的应用。同时,讨论了数组,特别是二维数组的定义和存储方式,以及对称矩阵、三角矩阵和对角矩阵等特殊矩阵的压缩存储方法。通过对这些基础知识的探讨,加深了对字符串处理和数组操作的理解。
摘要由CSDN通过智能技术生成

目录

基本知识

串的模式匹配算法

BF算法

KMP算法

数组

基本知识

二维数组 

矩阵

对称矩阵

三角矩阵

对角矩阵

基本知识

1.串是一种特殊的线性表,其特殊性体现在是一个字符(重点)。
        串值也可以用链表来存储,由于串的元素数据是一个字符,只有8位二进制数,因此用链表存储时通常一个结点中存放的不是一个字符,而是一个子串

2.当串的长度为0时,该串称为“空串”
        注意:当串一个或多个空格组成时,则称为“空格串”,其长度为空格的数量。

3.由串中任意个连续字符组成的子序列称为该串的子串,包含子串的串相应的称为主串。
       
①空串是任意串的子串;
        ②任意串是其本身的子串;
        ③一个串中有n个元素,则有2^n-1种子串,有2^n-2种真子串。

例:a="BEI" ,b="JING" ,c="BEIJING" ,d="BEI JING" 四个串
子串:a和b都是c和d的子串
串长:【 3,4,7,8 】   a、b和c的串长为字符数量,d串中的空格同样作为元素计算长度
两串相等的判断:要求两个串对应位置的字符相等且串长相等。c和d不相等
两串比较:从第一个字符开始按照ASCII表进行对比,按ASCII值比较大小。

串的模式匹配算法

子串的定位运算通常称为串的模式匹配串匹配

BF算法

BF算法设计思想:
        将主串的第pos个字符和模式串的第一个字符比较;
        若相等则逐个匹配后续字符,若不等则主串进入第pos+1个字符,模式串返回第一个字符重新比较;
        直到主串中一个连续的子串与模式串完全相等,并返回两串匹配的第一个字符在主串中的序号;
        若直到主串比较完毕依然没有符合的子串则匹配失败。

int Index_BF(SString &S,SString &T,int pos) 
{
	int i,j;
	i=pos;
	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;
		}
	}
	if(j>T.length)
		return i-T.length;
	else
		return 0;
}

KMP算法

KMP算法是在BF算法的思想上升级改造,最大的突破就是极大的减少了算法的时间复杂度
KMP算法设计思想:
        将主串的第pos个字符和模式串的第一个字符比较;
        若相等则逐个匹配后续字符,若不等则主串指针不回溯,模式串返回第一个字符重新比较;
        直到主串中一个连续的子串与模式串完全相等,并返回两串匹配的第一个字符在主串中的序号;
        若直到主串比较完毕依然没有符合的子串则匹配失败。

int Index_KMP(SString &S,SString &T,int pos) 
{
	int i,j;
	i=pos;
	j=1;
	while(i<=S.length && j<=T.length)
	{
		if(j==0 || S.ch[i]==T.ch[j]){
			++i;
			++j;
		}else{
			j=1;
		}
	}
	if(j>T.length)
		return i-T.length;
	else
		return 0;
}

数组

基本知识

由类型相同的数据元素构成的有序集合,每个元素称为数组元素,每个元素受n个线性关系的约束,每个元素在n个线性关系中的序号i1,i2,i3…,in称为该元素的下标,可以通过下标访问该数据元素。(因为数组中每个元素处于n个关系中,故称该数组为n维数组)
由于对数组一般不进行插入或删除操作,所以使用顺序存储结构表示数组比较合适。
数组的顺序表示和实现用一组连续的存储单元存放数组的数据元素。

二维数组 

在C语言中,一个二维数组类型可以定义为其分量类型为一维数组类型的一维数组。
即            typedef        ElemType        Array2[m][n];
等价于      
                typedef        ElemType        Array1[n];
                typedef        Array1             Array2[m];

二维数组的定义:

 二维数组是数据元素为线性表的线性表。

数组的顺序表示和实现—二维

常用的映射方法有两种: 
        按行优先:先行后列,先存储行号较小的元素,行号相同者先存储列号较小的元素。  
        按列优先:先列后行,先存储列号较小的元素,列号相同者先存储行号较小的元素。
重点:(二维数组a[m][n],每个元素占b个长度,首地址a[0][0]为c,则第a[i][j]个元素的地址为length)
计算:
1. 按行优先       length=c+i*n*b+j*m*b
2. 按列优先       length=c+i*m*b+j*n*b

矩阵

矩阵用二维数组表示是很好的方法,若值相同的元素或者零元素在矩阵中的分布有一定规律,则称此类矩阵为特殊矩阵。特殊矩阵主要包括对称矩阵、三角矩阵和对角矩阵。

对称矩阵

若n阶矩阵A中的元满足条件:aij=aji(1<=i,j<=n) 则称为n阶对称矩阵。
假设以一维数组sa[n(n+1)/2]作为n阶对称矩阵A的存储结构,则sa[k]和矩阵元aij之间存在一一对应的关系:

对于任意给定的一组下标(i,j),均可在 sa 中找到矩阵元 aij;反之,对所有的k =0,1,2,…,(n +1)*n/2-1,都能确定 sa[k]中的元在矩阵中的位置(i,j)。由此,称sa[n*(n1)/2]为n阶对称矩阵 A 的压缩存储。

三角矩阵

以对角线划分,三角矩阵分为上三角矩阵和下三角矩阵。
上三角矩阵是指矩阵下三角中的元均为常数的n阶矩阵,下三角矩阵与之相反。

                         下三角矩阵                                        上三角矩阵

sa[k]和矩阵元aij之间的关系:(一般研究有元素的位置信息)
(1)下三角矩阵
当矩阵中的第一个元素a11在存储空间中的位置k=0时,元素aij的存储空间
                        k = (i-1)*i/2+j-1
(2)上三角矩阵
当矩阵中的第一个元素a11在存储空间中的位置k=0时,元素aij的存储空间
                        k = (i-1)(2*n-i+2)/2+(j-i)     //n为矩阵阶数

对角矩阵

对角矩阵所有的非零元都集中在以对角线为中心的带状区域中,即除了对角线上和直接在对角线上、下方若干条与对角线平行的线上的元之外,所有其他的元皆为零 。对这种矩阵,也可按某个原则(或以行为主,或以线的顺序)将其压缩存储到一维数组上。

如图非零元素均在对角线上,但零也可以在主对角线上

对角矩阵也是对称矩阵

以上这些特殊矩阵中,非零元的分布都有明显的规律,从而可以将其压缩存储到一维数组中,并找到每个非零元在一维数组中的对应关系

JavaScript中有许多用于字符数组处理的方法。下面是一些常用的方法: 字符方法: 1. `length`:返回字符的长度。 2. `charAt(index)`:返回指定位置的字符。 3. `charCodeAt(index)`:返回指定位置字符的Unicode值。 4. `toLowerCase()`:将字符转换为小写。 5. `toUpperCase()`:将字符转换为大写。 6. `trim()`:去除字符两端的空格。 7. `slice(start, end)`:提取字符的一部分,包括起始索引但不包括结束索引。 8. `split(separator)`:将字符按指定分隔符分割为数组数组方法: 1. `length`:返回数组的长度。 2. `concat(arr)`:将数组与其他数组或值连接在一起,返回一个新数组。 3. `join(separator)`:将数组的所有元素转换为字符,通过指定的分隔符连接起来。 4. `pop()`:移除并返回数组中的最后一个元素。 5. `push(item1, item2, ...)`:向数组末尾添加一个或多个元素,并返回新数组的长度。 6. `shift()`:移除并返回数组中的第一个元素。 7. `unshift(item1, item2, ...)`:向数组开头添加一个或多个元素,并返回新数组的长度。 8. `slice(start, end)`:提取数组的一部分,包括起始索引但不包括结束索引。 9. `splice(start, count, item1, item2, ...)`:从指定位置开始修改数组,删除/替换/添加元素。 这只是一部分常用的方法,JavaScript还有很多其他处理字符数组的方法。你可以查阅相关文档来了解更多细节。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值