zl程序教程

您现在的位置是:首页 >  后端

当前栏目

算法复习笔记(二)蛮力法

算法笔记 复习
2023-09-11 14:20:00 时间

蛮力法的主要应用于遍历部分。遍历数组,遍历集合,遍历二叉树

1.下面我们主要讲解一下查找问题中的蛮力法

 虽然低效,但是对于查找集合不大的情况下是一种合理的方法

1.1 顺序查找:在数组r[1] ~r[n]查找元素k

int SeqSearch1(int r[],int n,int k)
{
    int i=n;
    while(i>0 &&r[i]!=k)
        i--;
    return i;
 }

算法分析:基本语句时判定条件,其平均执行次数为o(n);


1.2  将待查找的数放在尽头,免去每次是否判断越界

int SeqSearch1(int r[],int n,int k)
{
    int i=n;
    r[0]=k;
     while(r[i]!=k)
        i--;
    return i;
 }

虽然数量级相同,但是系数相差一半


2.串匹配问题

    BF(朴素模式匹配算法):

        核心:在不想等,则从主串s的第二个字符开始和第一个字符进行比较

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

    分析:

    设匹配成功发生在si处,则在前i-1趟不成功匹配中比较了(i-1)*m次,一共比较i*m次,前面m此都匹配成功,求其平均匹配次数,每一次的概率想等,求和,则有:

    m*(n-m+2)/2 (Ps:求解过程这里就不列出来了 有问题的欢迎留言)

    一般情况下,m<<n,因此在最坏的情况下其时间复杂度O(n*m)

  

2.2kmp算法:

    记:文本长度为N,模式串长度为M

        BF算法的时间复杂度O(N*M),空间复杂度O(1)

        KMP算法的时间复杂度O(M+n) 空间复杂度O(N)

    kmp关键的地方是求模式串的next数值:

    毕竟学了数据结构当时这里就没有卡多久,但是分析的时候坑爹的地方还是挺多的:

    求解next的定义不同就导致,next 填表不同,虽然算法的执行是没有影响的 但这却会照成阅读障碍

    我们先对j=0的next 赋予-1,模式串从0数开始,不想等

    比如:

     模式串: a  b  a  a  b c  a  b  a

     next:      -1 0  0  1  1  2  0  1  2   

具体的求解方法,请看博文https://blog.csdn.net/qq_37457202/article/details/80449164 

下一章对其进行了详细的分析,这里就不做过多的叙述了

附上代码

void Calenext(char *p,int next[])
{
    int nLen=strlen(p);
    next[0]=-1;
    int k=-1;
    int j=0;
    while(j<nLEN-1)
    {
        if(K==-1 ||P[j]==P[k])
        {
            ++k;
            ++j;
            next[j]=k;
        }
        else
        {
        k=next[k];
        }
    }
 }

3.蛮力法排序

    选择排序:时间复杂度(O(n的平方))

    起泡排序:重点。⚠️⚠️⚠️

4.组合问题中的蛮力法

QAQ临时有事 今天补上