Алгоритм Бржозовского — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
(Псевдокод)
(Псевдокод)
Строка 26: Строка 26:
  
 
==Псевдокод==
 
==Псевдокод==
# Обращение КА
+
* Обращение КА
  
def fa_rev(fa):
+
    def fa_rev(fa):
    rfa = [list(fa[Q]), list(fa[A]), [], list(fa[F]), list(fa[S])]
+
        rfa = [list(fa[Q]), list(fa[A]), [], list(fa[F]), list(fa[S])]
    rfa[T] = [[[] for i in range(0, len(fa[A]))] for j in range(0, len(fa[Q]))]
+
        rfa[T] = [[[] for i in range(0, len(fa[A]))] for j in range(0, len(fa[Q]))]
    for t1 in range(0, len(fa[Q])):
+
        for t1 in range(0, len(fa[Q])):
        for a in range(0, len(fa[A])):
+
            for a in range(0, len(fa[A])):
            for t2 in fa[T][t1][a]:
+
                for t2 in fa[T][t1][a]:
                rfa[T][t2][a].append(t1)
+
                    rfa[T][t2][a].append(t1)
    return rfa
+
        return rfa
  
# Детерминизация КА
+
* Детерминизация КА
  
def fa_det(fa):
+
    def fa_det(fa):
    def reachable(q, l):
+
        def reachable(q, l):
        t = []
+
            t = []
        for a in range(0, len(fa[A])):
+
            for a in range(0, len(fa[A])):
            ts = set()
+
                ts = set()
            for i in q[l]:
+
                for i in q[l]:
                # объединение множеств (достижимых из l) состояний для символа a
+
                    # объединение множеств (достижимых из l) состояний для символа a
                ts |= set(fa[T][i][a])
+
                    ts |= set(fa[T][i][a])
            if not ts:
+
                if not ts:
                t.append([])
+
                    t.append([])
                continue
+
                    continue
            try:
+
                try:
                i = q.index(ts)
+
                    i = q.index(ts)
            except ValueError:
+
                except ValueError:
                i = len(q)
+
                    i = len(q)
                q.append(ts)
+
                    q.append(ts)
            t.append([i])
+
                t.append([i])
        return t
+
            return t
    dfa = [[], list(fa[A]), [], [0], []]
+
        dfa = [[], list(fa[A]), [], [0], []]
    q = [set(fa[S])]
+
        q = [set(fa[S])]
    while len(dfa[T]) < len(q):
+
        while len(dfa[T]) < len(q):
        dfa[T].append(reachable(q, len(dfa[T])))
+
            dfa[T].append(reachable(q, len(dfa[T])))
    dfa[Q] = range(0, len(q))
+
        dfa[Q] = range(0, len(q))
    dfa[F] = [q.index(i) for i in q if set(fa[F]) & i]
+
        dfa[F] = [q.index(i) for i in q if set(fa[F]) & i]
    return dfa
+
        return dfa
  
# Алгоритм Бржозовского
+
* Алгоритм Бржозовского
  
def fa_min(fa):
+
    def fa_min(fa):
    return fa_det(fa_rev(fa_det(fa_rev(fa))))
+
        return fa_det(fa_rev(fa_det(fa_rev(fa))))
  
 
== См. также ==
 
== См. также ==

Версия 05:59, 18 ноября 2014

Эта статья находится в разработке!
Задача:
Пусть дан автомат [math]\mathcal{A}[/math]. Требуется построить автомат [math]\mathcal{A}_{min}[/math] с наименьшим количеством состояний, распознающий тот же язык, что и [math]\mathcal{A}[/math].


Алгоритм

Описание

Алгоритм минимизации конечных автоматов Бржозовского (Janusz A. (John) Brzozowski) выделяется, по крайней мере, следующими качествами:

Обладая обычными процедурами обращения [math]rev[/math] и детерминизации [math]det[/math] конечного автомата, мы, с помощью идеи Бржозовского, можем немедленно приступить к минимизации заданного автомата. Для этого надо дважды провести его через обе вышеуказанные процедуры:

[math]mFA = det(rev(det(rev(FA))))[/math], где

  • [math]FA[/math] это исходный КА,
  • [math]rev[/math] это процедура обращения КА,
  • [math]det[/math] это процедура детерминизации КА,
  • [math]mFA[/math] это минимизированный КА.

Корректность

Пример работы

Псевдокод

  • Обращение КА
   def fa_rev(fa):
       rfa = [list(fa[Q]), list(fa[A]), [], list(fa[F]), list(fa[S])]
       rfa[T] = [[[] for i in range(0, len(fa[A]))] for j in range(0, len(fa[Q]))]
       for t1 in range(0, len(fa[Q])):
           for a in range(0, len(fa[A])):
               for t2 in fa[T][t1][a]:
                   rfa[T][t2][a].append(t1)
       return rfa
  • Детерминизация КА
   def fa_det(fa):
       def reachable(q, l):
           t = []
           for a in range(0, len(fa[A])):
               ts = set()
               for i in q[l]:
                   # объединение множеств (достижимых из l) состояний для символа a
                   ts |= set(fa[T][i][a])
               if not ts:
                   t.append([])
                   continue
               try:
                   i = q.index(ts)
               except ValueError:
                   i = len(q)
                   q.append(ts)
               t.append([i])
           return t
       dfa = [[], list(fa[A]), [], [0], []]
       q = [set(fa[S])]
       while len(dfa[T]) < len(q):
           dfa[T].append(reachable(q, len(dfa[T])))
       dfa[Q] = range(0, len(q))
       dfa[F] = [q.index(i) for i in q if set(fa[F]) & i]
       return dfa
  • Алгоритм Бржозовского
   def fa_min(fa):
       return fa_det(fa_rev(fa_det(fa_rev(fa))))

См. также

Литература