Top.Mail.Ru
Ответы
Аватар пользователя
6мес
Аватар пользователя
Аватар пользователя
Аватар пользователя
Программирование
+3

Составить блок схему для алгоритма Апостолико-Крочемора

Выполняю лабораторную работу по этому алгоритму, в интернете информации почти не нашёл, в списках литературы ее крайне мало. Прошу помочь, без всяких подколов и прочего

По дате
По рейтингу
Аватар пользователя
Новичок
6мес

Понимаю вашу ситуацию. Алгоритм Апостолико-Крочемора действительно не самый распространенный, и найти информацию о нем может быть сложно. Давайте попробуем составить блок-схему для этого алгоритма. Вот основные шаги:

1. Начало

2. Ввод данных:
- Ввод текста T
- Ввод образца P

3. Предварительная обработка:
- Вычисление массива смещений для образца P
- Вычисление массива совпадений для образца P

4. Инициализация переменных:
- i = 0 (позиция в тексте T)
- j = 0 (позиция в образце P)

5. Основной цикл поиска:
Пока i + длина(P) <= длина(T):
5.1. Сравнение символов:
Если T[i+j] = P[j]:
- j = j + 1
- Если j = длина(P):
- Найдено совпадение, вывести позицию i
- i = i + 1
- j = 0
Иначе:
- Если j = 0:
i = i + 1
- Иначе:
i = i + max(j - массив_совпадений[j-1], 1)
j = массив_смещений[j-1]

6. Конец

Блок-схема будет выглядеть примерно так:

```
[Начало]
|
v
[Ввод T и P]
|
v
[Вычисление массивов смещений и совпадений]
|
v
[Инициализация i=0, j=0]
|
v
[Основной цикл поиска]
| /\
да |
┌--------┐
| | нет
v |
[Сравнение T[i+j] и P[j]]
| /\
да |
| нет
v |
[Обработка совпадения] [Обработка несовпадения]
| |
| ┌-----------------┘
| |
v v
[Обновление i и j]
|
|
└─> [Проверка условия цикла]
|
v
[Конец]
```

Это базовая блок-схема алгоритма Апостолико-Крочемора. Возможно, вам потребуется добавить дополнительные детали или уточнения в зависимости от конкретных требований вашей лабораторной работы.

Помните, что важно понимать каждый шаг алгоритма. Если у вас возникнут вопросы по конкретным частям алгоритма, не стесняйтесь спрашивать для дальнейшего уточнения.

Аватар пользователя
Просветленный
6мес

а путём обычного перебора не пойдёт

123456789101112131415161718192021222324252627282930313233343536
 #include <windows.h> 
#include <string> 
#include <iostream> 
#include <string.h> 
#include <iomanip> 
#include <vector> 
 
using namespace std; 
 
int main(int argc, char **argv) 
{ 
    system("chcp 1251 > nul");  // Руссификация сообщений 
    setlocale(LC_ALL, "Russian"); 
 
    string s= "012345056056789"; 
    string ss= "567"; 
    string s0= "Подстрока не найдена"; 
    size_t i=0; size_t i1=0; size_t is= s.length(); size_t iss= ss.length(); 
 
    size_t flag= 0; 
    do 
    { 
        if(ss[i1]==s[i]) { cout << s[i1] << " = " << s[i] << endl; i++; i1++; flag++; } 
        else { cout << ss[i1] << " != " << s[i] << endl; i1=0; i++; flag=0; } 
    }while ( (i<(is-iss+1)) || (flag!=iss) ); 
 
    cout << "Флаг=" << flag << "\ti= " << i << endl; 
 
    if(flag!=0) { s0=s.substr(i-iss,iss); } 
        cout << s0 << endl; 
 
    cout << endl << "Хелло Ворлд" << endl; 
    system("pause");    // system("pause > nul"); 
    return 0; 
} 
 
Аватар пользователя
Мастер
6мес

Алгоритм Апостолико-Крочемора (Apostolico-Crochemore) — это алгоритм поиска подстроки в строке, основанный на предобработке шаблона для эффективного поиска. Вот как можно представить блок-схему для его реализации.
Основные этапы алгоритма:

Предобработка шаблона:
Создание массива префиксов (Z-функции).
Построение массива сдвигов.

Поиск подстроки:
Сравнение символов строки с шаблоном.
Использование предвычисленных сдвигов для оптимизации.

Упрощённое описание блок-схемы:

Начало.
Ввод строки T (текста) и шаблона P.
Предобработка шаблона:
Построить Z-функцию для шаблона P.
Вычислить массив сдвигов.
Инициализация позиции i = 0 для текста.
Пока i <= N - M (где N — длина текста, M — длина шаблона):
Сравнить символы T и P начиная с i.
Если совпадение найдено, вывести позицию.
Переместить i на значение из массива сдвигов.
Конец.

Для создания диаграммы можно использовать следующую структуру:

Начало.
Блок "Ввод текста и шаблона".
Блок "Построение Z-функции".
Блок "Создание массива сдвигов".
Блок цикла i <= N - M:
Внутри: "Сравнение символов".
Проверка совпадения.
Обновление позиции i.
Конец.