📜  门| GATE CS Mock 2018年|套装2 |第38章(1)

📅  最后修改于: 2023-12-03 15:42:13.487000             🧑  作者: Mango

门| GATE CS Mock 2018年|套装2 |第38章

本次 Gate CS Mock 2018年套装2中的第38章主要涵盖了以下几个方面:

  1. 贪心算法
  2. 后缀数组
  3. 字符串匹配
贪心算法

贪心算法是一种基于贪心选择性质的优化算法。贪心算法在每一步选择中都采取当前状态下最优的选择,从而希望导致全局最优解。

Gate CS Mock 2018年套装2中的第38章主要涉及了以下两个贪心算法:

  • 贪心算法实现最小生成树。
  • 贪心算法实现最优解的道路规划。
后缀数组

后缀数组是一种数据结构,用于解决字符串的多种问题,如高效的模式匹配、重复问题等。Gate CS Mock 2018年套装2中的第38章主要涵盖了如何构建后缀数组、如何使用后缀数组进行模式匹配等。

以下是构建后缀数组的C++代码样例:

#include<bits/stdc++.h>
using namespace std;
#define TEXT_INPUT_STRING "banana"
int n,g,sa[7],ra[7],tra[7],lcp[7];
char t[7],m[256];

void buildsa()
{
    int i,k;
    n=strlen(t);
    for(i=0;i<=256;i++)
    {
        ra[i]=0;
    }
    for(i=0;i<n;i++)
    {
        ra[i]=t[i];
        sa[i]=i;
    }
    for(k=1;k<=n;k*=2)
    {
        sort(sa,sa+n,[&k](const int &a,const int &b)
        {
            return ra[a+k]<ra[b+k];
        });
        tra[sa[0]]=g=0;
        for(i=1;i<n;i++)
        {
            tra[sa[i]]=(g+=ra[sa[i-1]+k]!=ra[sa[i]+k]);
        }
        for(i=0;i<n;i++)
        {
            ra[i]=tra[i];
        }
        if(ra[sa[n-1]]==n-1)
        {
            break;
        }
    }
}

int main()
{
    int i,j,k;
    strcpy(t,TEXT_INPUT_STRING);
    buildsa();
    for(i=1;i<n;i++)
    {
        cout<<"Suffix at index "<<i<<" has rank "<<ra[i]<<" and is ";
        for(j=sa[ra[i]];j<n && i<n;j++)
        {
            cout<<t[j];
        }
        cout<<"\n";
    }   
    return 0;
}

在以上代码中,buildsa()函数实现了后缀数组的构建过程。

字符串匹配

Gate CS Mock 2018年套装2中的第38章还涉及了常见的字符串匹配算法,如KMP算法、Boyer-Moore算法等。

以下是使用KMP算法进行字符串匹配的C++代码样例:

#include<bits/stdc++.h>
using namespace std;

void computeLpsArray(char* pat,int M,int* lps);

void KMPSearch(char* pat,char* txt)
{
    int M=strlen(pat);
    int N=strlen(txt);
    int lps[M];
    computeLpsArray(pat,M,lps);
    int i=0,j=0;
    while(i<N)
    {
        if(pat[j]==txt[i])
        {
            j++;
            i++;
        }
        if(j==M)
        {
            printf("Found pattern at index %d \n",i-j);
            j=lps[j-1];
        }
        else if(i<N && pat[j]!=txt[i])
        {
            if(j!=0)
            {
                j=lps[j-1];
            }
            else
            {
                i++;
            }
        }
    }
}

void computeLpsArray(char* pat,int M,int* lps)
{
    int len=0;
    lps[0]=0;
    int i=1;
    while(i<M)
    {
        if(pat[i]==pat[len])
        {
            len++;
            lps[i]=len;
            i++;
        }
        else
        {
            if(len!=0)
            {
                len=lps[len-1];
            }
            else
            {
                lps[i]=0;
                i++;
            }
        }
    }
}

int main()
{
    char txt[]="ABABDABACDABABCABAB";
    char pat[]="ABABCABAB";
    KMPSearch(pat,txt);
    return 0;
}

在以上代码中,computeLpsArray()函数实现了KMP算法中的辅助数组lps的计算,而KMPSearch()函数利用lps数组实现了字符串匹配的过程。

以上便是Gate CS Mock 2018年套装2中的第38章的简要介绍。