Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Логическое проектирование дискретных устройств...doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
6.49 Mб
Скачать

Алгоритм Хопкрофта

Начало. Задан автомат и некоторое начальное разбиение . Требуется найти разбиение множества на классы неотличимости.

Шаг 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

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

Полученное разбиение совпадает с разбиением на классы неотличимости из предыдущих подразделов.