矩阵和串
Posted sanweizuiji
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了矩阵和串相关的知识,希望对你有一定的参考价值。
1 矩阵
1.1 多维数组和一维数组的映射
1.2 特殊矩阵的压缩存储
1.2.1 对称矩阵
策略:只存储主对角线+下三角区,按行优先原则将各元素存入一维数组中
数组大小 = n ( n + 1 ) 2 数组大小=\\fracn(n+1)2 数组大小=2n(n+1)
1.2.2 三角矩阵
压缩存储策略:按行优先原则将橙色区元素存入一维数组中。并在最后一个位置存储常量c
1.2.3 三对角矩阵
1.2.4 稀疏矩阵(主要目的是减少所需存储空间)
三元组表示法
把稀疏矩阵中的非零元素单独拿出来,存储它的行列和元素值。这样的话就只需要存储我们的三元组数组就可以实现这个矩阵的基本操作,而非零元素又占少数,节约了存储空间也避免了大量无效运算。
十字链表
2 串
2.1 串、子串
串是由零个或多个字符组成的有限序列。串中字符的个数称为串的长度,含有零个元素的串叫空串。
串中(任意连续的字符组成的子序列)称为该串的子串,包含字串的串称为主串,某个字符在串中的序号称为这个字符的位置。
例 子串 ‘str’ 在主串 ‘datastructure’ 中的位置是 5
串是限定了元素为字符的(线性表)
例 若串 S=‘software’ 其子串的数目是(37)
1(空串)+8(一个字符)+7(两个字符)+6+5+4+3+2+1=37
例 空串是零个字符的串,其长度等于零。空白串是由一个或多个空格字符组成的串,其长度等于其包含的空格个数
例 组成串的数据元素只能是(单个字符)
2.2 Brute-Force
#include <stdio.h>
#include <string.h>
int BFCompare(char mainString[], char subString[])
int mainStringIndex = 0;
int subStringIndex = 0;
int temp = mainStringIndex;
while (temp < strlen(mainString) && subStringIndex < strlen(subString))
if (mainString[temp] == subString[subStringIndex])
temp++;
subStringIndex++;
else
// temp 未能成功匹配。主串指针后移一位
mainStringIndex++;
// temp 继续跟随主串指针
temp = mainStringIndex;
// 子串指针回到首位
subStringIndex = 0;
// 子串指针已经遍历完子串,说明匹配完成
if (subStringIndex >= strlen(subString))
// 与字串相同的第一个字母的下标
return mainStringIndex;
else
// 没找到子串,返回 -1
return -1;
int main(void)
char mainString[] = "012345HELLO";
char subString[] = "HELLO";
printf("子串在主串数组中的下标:%d\\n", BFCompare(mainString, subString));
return 0;
若子串长度为m,主串长度为n,则
2.1.1 最好时间复杂度
匹配成功:O(m)
匹配失败:O(n-m+1) = o(n-m)≈o(n)
长度为n的主串有n-m+1个长度为m的子串
2.1.2 最坏时间复杂度
O(nm)(匹配成功/匹配失败最多需要(n-m+1)*m次比较)
2.3 KMP
当第 j 个字符匹配失败,由前 1~j-1 个字符组成的串记为 s,则:
n e x t [ j ] = ( s 的最长相等前后缀长度 + 1 ) next[j]=(s的最长相等前后缀长度+1) next[j]=(s的最长相等前后缀长度+1)
特别地,next[1]=0
当子串和模式串不匹配时,主串指针i不回溯,模式串指针j=next[j]算法平均时间复杂度:o(n+m)
以上是关于矩阵和串的主要内容,如果未能解决你的问题,请参考以下文章