
- •Введение
- •1. Функциональные модели дискретных устройств
- •1.1. Автоматы
- •1.2. Классификация автоматов
- •1.3. Способы задания конечных автоматов
- •1.4. Система формул переходов
- •1.5. Граф-схема алгоритма
- •1.6. Переход от сфп к гса
- •1.7. Переход от гса к автомату
- •1.7.1. Переход от гса к автомату Мура
- •1.7.2. Переход от гса к автомату Мили
- •1.8. Задачи
- •2. Минимизация автоматов
- •2.1. Минимизация полных автоматов
- •2.1.1. Неотличимость состояний
- •Алгоритм поиска неотличимых состояний автомата
- •2.1.2. Приведенная форма автомата
- •2.1.3. Построение классов неотличимости: алгоритм Мура
- •Свойства разбиения
- •Алгоритм Мура построения классов неотличимости
- •2.1.4. Построение классов неотличимости: алгоритм Хопкрофта
- •Алгоритм Хопкрофта
- •2.2. Минимизация частичных автоматов
- •2.2.1. Совместимость состояний
- •Алгоритм построения множеств совместимости
- •2.2.2. Сохраняемое правильное покрытие
- •Алгоритм построения кратчайшего сохраняемого правильного покрытия
- •2.2.3. Метод последовательных сокращений
- •Алгоритм последовательных сокращений
- •2.3. Задачи
Алгоритм Хопкрофта
Начало. Задан автомат
и некоторое начальное разбиение
.
Требуется найти разбиение множества
на классы неотличимости.
Шаг 1. Для каждого входного символа
строим список
,
куда включаем все блоки разбиения
,
для которых
.
Удаляем из списка блок, для которого
множество
имеет максимальную мощность. Полагаем
.
Шаг 2. Если все списки
пусты, идем на конец. Иначе выбираем
пару
,
где
– любой входной символ,
– множество минимальной мощности для
всех блоков из
.
Удаляем
из
.
Шаг 3. Выбираем очередной блок
и проводим его разбиение по паре
.
Блок
делится на два блока:
и
по следующему правилу: в
помещаем состояния из
,
которые по символу
переходят в блок
,
в
– остальные состояния из
:
Шаг 4. Если
не разделился, добавляем его в разбиение
.
Иначе добавляем в разбиение
блоки
и
и модифицируем все списки
:
если блок
, то удаляем его из и добавляем в блоки и ;
если блок
, то добавляем в блок или , а именно тот, для которого обратная функция переходов имеет меньшую мощность, но не является пустым множеством.
Если не все блоки просмотрены, идем на шаг 3.
Шаг 5. Если
,
полагаем
.
Идем на шаг 2.
Конец. Искомое разбиение
.
Пример. Рассмотрим автомат из предыдущих примеров.
|
|
|
|
y |
|
|
|
|
X\Q |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
|
7 |
7 |
8 |
8 |
7 |
5 |
1 |
3 |
|
6 |
2 |
6 |
2 |
4 |
1 |
8 |
8 |
|
1 |
1 |
3 |
3 |
3 |
1 |
3 |
1 |
|
|
|
|
j |
|
|
|
|
X\Q |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
|
0 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
|
1 |
1 |
1 |
1 |
1 |
1 |
0 |
0 |
|
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
Для него уже получена обратная функция переходов
|
|
|
|
|
|
|
|
|
X\Q |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
|
7 |
|
8 |
|
6 |
|
1,2,5 |
3,4 |
|
6 |
2,4 |
|
5 |
|
1,3 |
|
7,8 |
|
1,2,6,8 |
|
3,4,5,7 |
|
|
|
|
|
Шаг 1. Разбиение построим, как в алгоритме Мура
.
Обратная функция переходов для этих блоков
|
|
|
X\ |
|
|
|
6,7,8 |
1,2,3,4,5 |
|
1,2,3,4,5,6 |
7,8 |
|
1,2,3,4,5,6,7,8 |
|
Списки имеют вид:
Шаг 2. Выбираем пару
,
где
,
удаляем
из
.
Списки принимают вид
Шаг 3. Выбираем блок
и разбиваем его по паре
:
Шаг 4. Добавляем в разбиение
блоки
и
и модифицируем все списки. Находим
обратную функцию переходов для блоков
и
|
|
|
X\ |
|
|
|
6,7,8 |
|
|
2,4,5,6 |
1,3 |
|
1,2,3,4,5,6,7,8 |
|
Поскольку
не содержится ни в одном списке, то
добавляем в список
блок
,
т.к.
,
и не меняем остальные списки, поскольку
.
Имеем
Не все блоки просмотрены, идем на шаг 3.
Шаг 3. Выбираем блок
и разбиваем его по паре
:
Шаг 4. Блок не разбился, добавляем в
разбиение
блок
.
Все блоки разбиения
просмотрены.
Шаг 5. Разбиение
,
далее рассматриваем это разбиение
.
Перепишем в новых обозначениях списки
Получим обратную функцию переходов
|
|
|
|
X\ |
|
|
|
|
6,7,8 |
|
1,2,3,4,5 |
|
2,4,5,6 |
1,3 |
7,8 |
|
1,2,3,4,5,6,7,8 |
|
|
Идем на шаг 2.
Шаг 2. Выбираем пару
,
где
,
удаляем
из
.
Списки принимают вид
Шаг 3. Выбираем блок
и разбиваем его по паре
:
Шаг 4. Добавляем в разбиение
блоки
и
и модифицируем все списки. Находим
обратную функцию переходов для блоков
и
|
|
|
X\ |
|
|
|
7,8 |
6 |
|
6 |
2,4,5 |
|
1,2,3,4,5,6,7,8 |
|
Новые списки принимают вид
Не все блоки просмотрены, идем на шаг 3.
Шаг 3. Блок
состоит из одного символа, поэтому
дальше не разбивается. Выбираем блок
,
разбиваем его по паре
:
Шаг 4. Добавляем в разбиение блоки и . Все блоки просмотрены.
Шаг 5. Разбиение
,
далее рассматриваем это разбиение
.
Перепишем в новых обозначениях списки
Получим обратную функцию переходов
|
|
|
|
|
X\ |
|
|
|
|
|
7,8 |
6 |
|
1,2,3,4,5 |
|
6 |
2,4,5 |
1,3 |
7,8 |
|
1,2,3,4,5,6,7,8 |
|
|
|
Нетрудно убедиться, что никакие пары больше не порождают новых разбиений. Предоставляем это читателю.
Полученное разбиение совпадает с разбиением на классы неотличимости из предыдущих подразделов.