Форум программистов, компьютерный форум CyberForum.ru

Реализация алгоритма Бойера — Мура на - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 24, средняя оценка - 5.00
zmei89
31 / 6 / 1
Регистрация: 10.09.2010
Сообщений: 821
10.06.2012, 20:59     Реализация алгоритма Бойера — Мура на #1
Помогите пожалуйста сделать по заданию
• Входные данные – текстовый файл.
• Выходные данные – текстовый файл, содержащий найденные слова с указанием позиции во входном файле (номер строки, позиция в строке, количество вхождений слова в файле).

Вариант задания
А1 А2
3 9


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include <string.h>
#include <limits.h>
#include <stdio.h>
#include <conio.h>
 
/* Вход: needle+nlen - что искать
 *   offset - позиция конца суффикса; suffixlen - его длина
 * Выход: 1, если есть совпадение суффикса (и нет совпадения более длинного суффикса)
 */
static int suffix_match(const  char *needle, size_t nlen, size_t offset, size_t suffixlen)
{
    if (offset > suffixlen)
        return needle[offset - suffixlen - 1] != needle[nlen - suffixlen - 1] &&
            memcmp(needle + nlen - suffixlen, needle + offset - suffixlen, suffixlen) == 0;
    else
        return memcmp(needle + nlen - offset, needle, offset) == 0;
}
 
static size_t max(size_t a, size_t b)
{
    return a > b ? a : b; 
}
 
/* Вход: haystack - где искать, needle - что искать.
 *   hlen - длина haystack, nlen - длина needle
 * Выход: указатель на первое вхождение needle в haystack, либо NULL
 */
 const char* memmem_boyermoore
    (const  char* haystack, const size_t hlen,
     const  char* needle,  const size_t nlen)
{ 
    size_t *skip = new size_t[nlen];          /* Таблица суффиксов */
    size_t occ[UCHAR_MAX + 1]; /* Таблица стоп-символов */
 
    if(nlen > hlen || nlen <= 0 || !haystack || !needle) 
        return NULL;
 
    /* ПОСТРОЕНИЕ ТАБЛИЦЫ СТОП-СИМВОЛОВ */
 
    /* Заполняем -1 (в Си нумерация символов с 0!!) */
    for(size_t a=0; a<UCHAR_MAX+1; ++a)
        occ[a] = -1;
 
    /* В таблицу occ записывается последнее вхождение в needle  */
    /* (исключая последний символ) */
    for(size_t a = 0; a < nlen - 1; ++a) 
        occ[needle[a]] = a;
 
    /* ПОСТРОЕНИЕ ТАБЛИЦЫ СУФФИКСОВ */  
    /* Упрощённый вариант. Можно реализовать быстрее. */
    for(size_t a = 0; a < nlen; ++a)
    {
        size_t offs = nlen;
        while(offs && !suffix_match(needle, nlen, offs, a))
            --offs;
        skip[nlen - a - 1] = nlen - offs;
    }
 
    /* ПОИСК */
    for(size_t hpos = 0; hpos <= hlen - nlen; )
    {
        size_t npos = nlen - 1;
        /* Сверка needle и haystack с конца */
        while(needle[npos] == haystack[npos + hpos])
        {
            if(npos == 0) 
                return haystack + hpos;
 
            --npos;
        }
        /* Не совпало! */
        hpos += max(skip[npos], npos - occ[haystack[npos + hpos]]);
        /*          ^^^         ^^^^                               */
        /*        суффикс     стоп-символ                          */
    }
    return NULL;
}
 
void main()
{
    const  char *str1 = "Easylab.net.ua - free labs on C++";
    const  char *str2 = "labs";
    const char *str3;
    str3 = memmem_boyermoore(str1,strlen(str1),str2,strlen(str2));
    printf(str3);
    _getch();
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.06.2012, 20:59     Реализация алгоритма Бойера — Мура на
Посмотрите здесь:

Реализация алгоритма C++
C++ Алгоритм Бойера-Мура
C++ Ошибка в функции поиска подстроки в строке. Алгоритм Бойера-Мура-Хорспула.
C++ Очень прошу разъяснить код алгоритма Бойера-Мура
C++ Поиск подстроки в строке(алгоритм Бойера-Мура)
C++ Реализация алгоритма
Алгоритм Бойера и Мура C++
C++ Алгоритм Бойера-Мура поиска подстроки в строке (Js -> C++)

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 02:09. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru