Минимизация ДКА, алгоритм Хопкрофта (сложность O(n log n)) — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
(Разбиение на блоки)
Строка 5: Строка 5:
 
Основная идея минимизации ДКА состоит в объединении состояний автомата в блоки таким образом, что любые два состояния из разных блоков неэквивалентны и любые состояния из одного блока эквивалентны. Получившиеся блоки и будут состояниями минимального автомата.
 
Основная идея минимизации ДКА состоит в объединении состояний автомата в блоки таким образом, что любые два состояния из разных блоков неэквивалентны и любые состояния из одного блока эквивалентны. Получившиеся блоки и будут состояниями минимального автомата.
  
=== Разбиение на блоки ===
+
===Псевдокод===
 +
<tex>W</tex> {{---}} очередь из сплитеров.
 +
<tex>P</tex> {{---}} множество всех блоков ДКА.
 +
  <tex>W \leftarrow \{ F, Q - F \}</tex>
 +
  <tex>P \leftarrow \{ F, Q - F \}</tex>
 +
  While <tex>W</tex> is not empty do
 +
    select and remove <tex>S</tex> from <tex>W</tex>
 +
    for all <tex>a \in \Sigma</tex> do
 +
      <tex>l_a \leftarrow \delta^{-1} (S, a)</tex>
 +
      for all <tex>R</tex> in <tex>P</tex> such that <tex>R \cap l_a \ne \emptyset</tex> and <tex>R \not \subseteq l_a </tex> do
 +
        partition <tex>R</tex> into <tex>R_1</tex> and <tex>R_2 : R_1 \leftarrow R \cap l_a </tex> and <tex>R_2 \leftarrow R - R_1</tex>
 +
        replace <tex>R</tex> in <tex>P</tex> with <tex>R_1</tex> and <tex>R_2</tex>
 +
        if <tex>R \in W</tex> then
 +
          replace <tex>R</tex> in <tex>W</tex> with <tex>R_1</tex> and <tex>R_2</tex>
 +
        else
 +
          if <tex>\mid R_1 \mid \le \mid R_2 \mid</tex> then
 +
            add <tex>R_1</tex> to <tex>W</tex>
 +
          else
 +
            add <tex>R_2</tex> to <tex>W</tex>

Версия 03:51, 6 ноября 2011

Постановка задачи

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

Алгоритм

Основная идея минимизации ДКА состоит в объединении состояний автомата в блоки таким образом, что любые два состояния из разных блоков неэквивалентны и любые состояния из одного блока эквивалентны. Получившиеся блоки и будут состояниями минимального автомата.

Псевдокод

[math]W[/math] — очередь из сплитеров. [math]P[/math] — множество всех блоков ДКА.

 [math]W \leftarrow \{ F, Q - F \}[/math]
 [math]P \leftarrow \{ F, Q - F \}[/math]
 While [math]W[/math] is not empty do 
   select and remove [math]S[/math] from [math]W[/math]
   for all [math]a \in \Sigma[/math] do
     [math]l_a \leftarrow \delta^{-1} (S, a)[/math]
     for all [math]R[/math] in [math]P[/math] such that [math]R \cap l_a \ne \emptyset[/math] and [math]R \not \subseteq l_a [/math] do
       partition [math]R[/math] into [math]R_1[/math] and [math]R_2 : R_1 \leftarrow R \cap l_a [/math] and [math]R_2 \leftarrow R - R_1[/math]
       replace [math]R[/math] in [math]P[/math] with [math]R_1[/math] and [math]R_2[/math]
       if [math]R \in W[/math] then
         replace [math]R[/math] in [math]W[/math] with [math]R_1[/math] and [math]R_2[/math]
       else
         if [math]\mid R_1 \mid \le \mid R_2 \mid[/math] then
           add [math]R_1[/math] to [math]W[/math]
         else
           add [math]R_2[/math] to [math]W[/math]