数据结构之字符串

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_43238423/article/details/102654196

字符串这一章的大体框架为:

1、模式匹配算法(BF,KMP)

2、多维数组的寻址,存储表示法

3、矩阵的压缩存储

一、模式匹配算法

1、所谓的BF算法,就是逐个比较的暴力方法,时间复杂度为O(n*m),比较低效。

当待匹配串与模式串不匹配时,从头开始待匹配串向后移一位,再比较。

2、KMP

利用最长公共前后缀的特点,每次匹配失败后不需要从头开始。需要预先处理出前缀表,根据前缀表来判断匹配失败后应该从待匹配串的哪个位置开始匹配,时间复杂度O(N+M)

#include<bits/stdc++.h>
using namespace std;
int Next[1000];
int Kmp_Search(char* s, char* p)
{
	int i = 0;
	int j = 0;
	int sLen = strlen(s);
	int pLen = strlen(p);
	while (i < sLen && j < pLen)
	{
		if (j == -1 || s[i] == p[j])
		{
			i++;
			j++;
		}
		else
		{
			j = Next[j];
		}
	}
	if (j == pLen)
		return i - j;
	else
		return -1;
}
void Get_Next(char* p,int* next)
{
	int pLen = strlen(p);
	next[0] = -1;
	int k = -1;
	 int j = 0;// ABCDABD
	while (j < pLen - 1){
		if (k == -1 || p[j] == p[k]){
			++k;
			++j;
			next[j]=k;
		}
		else k = next[k];
	}
}
int main()
{
    
 
}

二、多维数组

数组无法改变自身的结构,数组是一个统一的整体,但是线性表可以。

数组是由一组类型相同的数据元素构成的有序集合每个元素受n(n1)线性关系的约束,并称该数组为 n 维数组。

数组没有插入和删除操作,所以,不用预留空间,适合采用顺序存储。

一维数组:Loc(ai)Loc(al)(il)×c

二维数组:

行优先:整行数×每行元素个数+本行中aij前面的元素个数=(i -l1)×(h2 -l2+1)+(j -l2)

列优先: LOC ( i, j ) = a + ( j *n +i ) * l

常用的映射方法有两种:

优先:先行后列,先存储行号较小的元素,行号相同者先存储列号较小的元素。

优先:先列后行,先存储列号较小的元素,列号相同者先存储行号较小的元素。

三、矩阵的压缩存储

1、对称矩阵:、

aij在一维数组中的序号
= i×(i+1)/2+ j+1
∵一维数组下标从0开始
∴aij在一维数组中的下标
k= i×(i+1)/2+ j

2、三角矩阵:

(i-1)×(n+n-i+2)/2+j-i        
i<=j
n×(n+1) /2
i>j

3、对角矩阵(带状)

k=(3*(i-1)-1)+(j-i+1)
k=2i+j-3

猜你喜欢

转载自blog.csdn.net/weixin_43238423/article/details/102654196