Хорспул список всех экземпляров строки - PullRequest
0 голосов
/ 05 марта 2020

Я пытаюсь использовать алгоритм Хорспула, чтобы перечислить все экземпляры шаблона в строке. Моя строка очень длинная, к северу от 3 миллионов символов.

При windows мой код находит только первые ~ 230 экземпляров слова "the". На linux мой код находит первые ~ 580 экземпляров слова "the". В обоих случаях программа просто останавливается после достижения этого значения. Нет ошибки сегмента, нет прекращения, он просто глохнет. Должно быть более 2300 экземпляров слова "the"

Мой лог c выглядит следующим образом:

  1. Используйте алгоритм horspool, чтобы найти первый экземпляр шаблона в целом строка

  2. Использование алгоритма horspool для поиска следующего экземпляра шаблона (общая строка + предыдущий индекс horspool)

  3. И так до индекса поиск превышает длину строки.


#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void shifttable(char p[], int t[], int asciiSize)
{
    int i,j,m;
    m=strlen(p);
    for(i=0;i<asciiSize;i++)
        t[i]=m;
    for(j=0;j<m-1;j++)
        t[p[j]]=m-1-j;
}
int horspool(char src[],char p[], int table[])
{
    int i,j,k,m,n;
    n=strlen(src);
    m=strlen(p);
    i=m-1;
    while(i<n)
    {
        k=0;
        while((k<m)&&(p[m-1-k]==src[i-k]))
            k++;
        if(k==m)
            return(i-m+1);
        else
            i+=table[src[i]];
    }
    return -1;
}
int main()
{
    //Get pattern
    char p[100];
    printf("Enter the pattern: ");
    gets(p);
    int patternLength = strlen(p);
    printf("Length: %d\n", patternLength);

    //Get fileData
    char * src = 0;
    long length;
    FILE * fp = fopen("data_5.txt", "r");

    if (fp)
    {
        fseek (fp, 0, SEEK_END);
        length = ftell (fp);
        fseek (fp, 0, SEEK_SET);
        src = malloc(length);
        if (src)
        {
            fread (src, 1, length, fp);
        }
        fclose (fp);
    }

    //ShiftTable
    int asciiSize = 128;
    int * table = malloc(sizeof(int) * asciiSize);
    shifttable(p, table, asciiSize);
    int pos = 0;
    int count = 0;
    int numFound = 0;
    while (count < length) {
        printf("src:%d, count:%d\n", src, count);
        pos=horspool(src+count,p, table);
        if(pos>=0) {
            count = count + pos + patternLength;
            numFound++;
            printf("#:%d, Position %d\n",numFound, count+1);
        }
        else {
            break;
        }
    }

    return 0;
}
...