Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
algorithms.doc
Скачиваний:
37
Добавлен:
06.12.2018
Размер:
10 Мб
Скачать
☆
    1. Конечные автоматы

Начнем с примера тривиального конечного автомата.

Пусть у нас имеется некоторая кучка камней. В каждый момент состояние кучки q отражается числом, равным количеству камней в кучке. В начальный момент в кучке находилось q0 камней. Последовательно подаются запросы на добавление или удаление камня из кучки. Нас интересует момент, когда в кучке камней не останется или, что, то же самое, когда кучка придет к состоянию q=0.

Запросы на добавление/удаление камней можно проинтерпретировать как последовательность элементов ai из алфавита , состоящего всего из двух чисел: 1 и –1.

При появлении элемента ai состояние кучки изменяется, причем новое состояние можно вычислить как функцию от исходного состояния qi-1 и пришедшего элемента ai : qi-1 = ( qi , ai)=qi + ai. Функцию нам будет удобнее задавать таблицей

состояние\входные символы

-1

1

0

0

1

1

0

2

2

1

3

3

2

3

Заметим, что данная табличная функция описывает кучку, состоящую не более чем из трех камней. Попытки занесения лишних камней, также как и попытка изъятия камня из пустующей кучки, игнорируются.

Осталось добавить, что выделенное состояние q=0, с точки зрения конечных автоматов, называется принимающим. Пример можно считать завершенным.

Сведя вместе все выделенные понятия из данного примера, можно дать строгое определение конечного автомата.

Конечным автоматом называется объект, состоящий из пяти множеств:

Q – конечное множество состояний;

A Q – подмножество принимающих состояний;

q0 Q – начальное состояние;

 – конечный входной алфавит;

: Q A Q – функция перехода.

Функция перехода, обычно, задается таблицей, поэтому считается, что вычисление одного значения функции требует времени O(1).

Отметим, что алгоритмы, основанные на конечных автоматах, принципиально не вкладывается в схему алгоритмов, основанных на сравнениях, т.к. значение табличной функции не может быть вычислено в рамках алгоритмов, основанных на сравнениях, за время O(1).

    1. Отступление на тему языка с. Работа со строками

В языке С есть очень удобная библиотека для работы со строками. Большинство функций библиотеки, безусловно, следует выучить и активно ими пользоваться. Описания функций содержатся в файле string.h. Подробное описание функций следует прочитать в документации по языку С. Здесь мы кратко приведем описание нескольких функций, которые будем использовать в дальнейшем при объяснении алгоритмов, чтобы не вводить новых понятий.

int strlen(const char *);//длина строки

char * strcpy(char *, const char *);//копирование второй строки в первую

char * strcat(char *, const char *);//подклеивание второй строки к первой

char * strstr(char *, const char *);//поиск второй строки в первой

int strcmp(const char *, const char *);//лексикографич.сравнение строк

int strncmp(const char *, const char *,int n);//лекс.сравн. первых n байт строк

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]