第九章 矩阵和串

1.矩阵和串的定义

  (1)矩阵的定义: 数组是由n个相同类型的数据元素构成的有限序列,每个数据元素称为一个数据元素。矩阵是二维数组,可视为其元素也是定长线性表的线性表。

  (2)串的定义:串是由零个或多个字符组成的有限序列。一般记为S=‘a1 a2 a3 ...an’(n>=0)

2.特殊矩阵的压缩存储、稀疏矩阵的三元组表示法

  (1)压缩存储:指为多个值相同的元素只分配一个存储空间,对零元素不分配存储空间。其目的是为了节省存储空间。

    对称矩阵只存储对角线和上三角或下三角的元素。

    三对角矩阵,横向记录在一维数组,下标 = 2i + j - 3     

  (2)三元组表示:(行标,列标,元素值)

3.串的模式匹配

  (1)Brute-Force算法:

 1 int Index(SString S, SString T){
 2     int i=1, j=1;
 3     while(i<=S.length && j<=T.length){
 4         if(S.ch[i] == T.ch[j]){
 5             ++i;
 6             ++j;
 7         }else{
 8             i = i-j+2;
 9             j = 1;
10         }
11     }
12     if(j>T.length){
13         return i-T.length;
14     }else{
15         return 0;
16     }
17 } 

    时间复杂度为:O(mn)

  (2)KMP算法:

    步骤: (1)求最长相等前后缀

        (2)移动位数 = 已匹配的字符数 - 对应的部分匹配值

void get_next(String T, int next[]){
	int i=1, j=0;			//i代表T的指针,从头移到尾,不存在折返。j代表最大公共前缀的长度。 
	next[1] = j;
	while(i<T.length){
		      // j如果等于 0那么就代表着已经回溯到了next[0],那就意味着,next[j+1]的最长公共前缀一定是0的;
              // 如果是T->elem[i] == T->elem[j],那么及时满足这个条件Pk = Pj,那么有next[j+1] = j+1; 
		if(j==0 || T.ch[i] == T.ch[j]){
			++i;++j;
			next[i] = j;			//若Pi = Pj, 则next[j+1] = next[j]+1 
		}else{
			j = next[j];
		}
	}
} 

int Index_KMP(SString S, SString T, int next[]){
	int i=1, j=1;
	while(i<=S.length && j<=T.length){
		if(j==0 || S.ch[i]==T.ch[j]){
			++i;
			++j;					//继续比较后继字符 
		}else{
			j = next[j];			//模式串向右移动 
		}
	}
	if(j>T.length){
		return i-T.length;			//匹配成功 
	}else{
		return 0;
	} 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

空梦♡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值