Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

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

NickS Ученик (96), открыт 2 дня назад
Выполняю лабораторную работу по этому алгоритму, в интернете информации почти не нашёл, в списках литературы ее крайне мало. Прошу помочь, без всяких подколов и прочего
3 ответа
Drew Мастер (1339) 2 дня назад
Алгоритм Апостолико-Крочемора (Apostolico-Crochemore) — это алгоритм поиска подстроки в строке, основанный на предобработке шаблона для эффективного поиска. Вот как можно представить блок-схему для его реализации.
Основные этапы алгоритма:

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

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

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

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

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

Начало.
Блок "Ввод текста и шаблона".
Блок "Построение Z-функции".
Блок "Создание массива сдвигов".
Блок цикла i <= N - M:
Внутри: "Сравнение символов".
Проверка совпадения.
Обновление позиции i.
Конец.
NickSУченик (96) 2 дня назад
Ты спромптил в нейронке, данный ответ является не совсем точным
Никита Сав, если это в универе тебе задали, я бы на твоем месте перешел бы в другой вуз, где нагрузка поменьше. На собесах никто тебя об этом никогда не будет спрашивать, в отличие от огромного опыта, который сейчас невозможно набрать не наврав. Да и вообще стоит ли работа на дядю того... Просто учись там где легче всего корочку на айти получить и изучай что-то для фриланса, пили свой бизнес, будешь намного успешнее, чем все кто работают на дядю и изучают кучу ненужной информации.
Chat Gpt Гуру (2900) 1 день назад
Понимаю вашу ситуацию. Алгоритм Апостолико-Крочемора действительно не самый распространенный, и найти информацию о нем может быть сложно. Давайте попробуем составить блок-схему для этого алгоритма. Вот основные шаги:

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
[Конец]
```

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

Помните, что важно понимать каждый шаг алгоритма. Если у вас возникнут вопросы по конкретным частям алгоритма, не стесняйтесь спрашивать для дальнейшего уточнения.
NickSУченик (96) 1 день назад
Неплохо, пользуешься нейронкой куда лучше меня. Думаю, ответа лучше не отправят
Батаев Дмитрий Просветленный (23081) 22 часа назад
а путём обычного перебора не пойдёт
 #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;
}
Батаев ДмитрийПросветленный (23081) 22 часа назад
кое-что убрать лишнее и совсем будет хорошо, а товарищи академики усложнили донельзя простой алгоритм
Батаев ДмитрийПросветленный (23081) 22 часа назад
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]) { i1++; flag++; }
else { i1=0; flag=0; }
i++;
}while ( (i<(is-iss+1)) || (flag!=iss) );
if(flag!=0) { s0=s.substr(i-iss,iss); }
cout << s0 << endl;
Похожие вопросы