字符串和多维数组学习笔记(21.10.20)

Posted 未定_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字符串和多维数组学习笔记(21.10.20)相关的知识,希望对你有一定的参考价值。

简单的就不写了,以下只总结重点内容。


字符串

一、模式匹配

1.定义:给定主串S="s1s2…sn"和T=“t1t2…tm”,在主串S中寻找T的过程称为模式匹配,T称为模式。如果匹配成功,返回T在S中的位置,否则返回0。
2.方法:BF算法和KMP算法。

BF算法

从主串S的第0个字符开始和T的第0个字符进行比较,若相等,继续比较两者后续字符;否则,主串S下一个字符和T第0个字符比较。
若T中的字符全部比较完毕,匹配成功,S的字符全部比较完,匹配失败。
过程如下:

int BF(char S[],char T[])
{
    int start=0;
    int i=0,j=0;
    while((S[i]!='\\0')&&(T[j]!='\\0'))
    {
        if(S[i]==T[j])
        {
            i++;
            j++;
        }
        else
        {
            start++;
            i=start;
            j=0;
        }
    }
    if(T[i]=='\\0')
        return start+1;
    else return 0;
}

BF算法匹配不成功时存在大量回溯,时间性能低。

KMP算法

对BF算法改进,主串不进行回溯,T向右滑动到新比较起点k。
k怎么找?举个例子:假设主串当前位置为i,子串为j。
S:a b a b c a b c a c b a b
T:a b a b b
T的最后一个b与S中的c不匹配,此时i=4,j=4,T需要向右滑动到比较的新起点。发现k与T串有关。从T中不匹配的位置向前看,abab,很容易看出把T移动到第二个a的位置下,即:
S:a b a b c a b c a c b a b
T:_ _ a b a b b (努力对齐)
找规律:abab,标个序号(0)(1)(2)(3),发现(0)!=(3)即a!=b,(0)(1)=(2)(3)即ab=ab,(0)(1)(2)!=(1)(2)(3)即aba!=bab,所以有两个元素可以不用重新匹配了,又因为j的下标从0开始,所以k=2,j改成k也就是T的第3个字母与S的i位置的字母比较。
用next[j]表示这个k如下:

void Next_(char t[],int next[])
{
    int j=1,k;
    next[0]=-1;
    while(t[j]!='\\0')
    {
        k=next[j-1];
        while(k!=-1&&t[k]!=t[j-1])//这里的循环怎么理解,看下图
            k=next[k];
        next[j]=++k;
        j++;
    }
}
void KMP(char *s,char *p,int *next)
{
    int i=0,j=0,k;
    while(s[i]!='\\0'&&t[i]!='\\0')
    {
        if(j==-1||s[i]==t[j])
        {
            i++;
            j++;
        }
        else j=next[j];
    }
    if(t[j]=='\\0')
        return i-j;
    else return 0;
}


最后放个例子:

多维数组

一、矩阵的压缩存储

对称矩阵的压缩存储

三角矩阵的压缩存储

对角矩阵的压缩存储

二、稀疏矩阵的压缩存储

三元组顺序表


十字链表

以上是关于字符串和多维数组学习笔记(21.10.20)的主要内容,如果未能解决你的问题,请参考以下文章

[原创]java WEB学习笔记59:Struts2学习之路---OGNL,值栈,读取对象栈中的对象的属性,读取 Context Map 里的对象的属性,调用字段和方法,数组,list,map(代码片

php学习笔记-多维数组

Java学习笔记之八java二维数组及其多维数组的内存应用拓展延伸

pytorch学习笔记1-创建tensor(张量,多维数组)

PHP 学习笔记:高级教程:多维数组,日期,文件打开/读取,创建/写入,上传

数据结构(C++)笔记:04.字符串与多维数组