Изменения

Перейти к: навигация, поиск
Альтернативная реализация
<tex>\mathtt{P} \leftarrow \{ F, \ Q \setminus F \}</tex>
'''for''' <tex>c \in \Sigma</tex>
'''insert''' <tex>\langle F,\ c \rangle</tex>, <tex>\langle Q \setminus F,\ c \rangle</tex> '''into''' <tex> \mathtt{Queue}</tex>
'''while''' <tex>\mathtt{Queue} \ne \varnothing</tex>
<tex>\langle C,\ a \rangle</tex> <tex>\leftarrow</tex> pop '''pop from''' <tex>\mathtt{Queue}</tex>
<tex>\mathtt{Involved} = \{\}</tex>
'''for''' <tex>q \in C</tex> '''and''' <tex>r \in \mathtt{Inv}[q][a]</tex>
'''if''' <tex>\mathtt{Involved}[i] == \varnothing</tex>
<tex>\mathtt{Involved}[i] = \{\}</tex>
'''add''' <tex>r</tex> '''to''' <tex>\mathtt{Involved}[i]</tex>
'''for''' <tex> i \in \mathtt{Involved}</tex> <font color=darkgreen>//Перебираем ключи <tex>\mathtt{Involved}</tex></font>
'''if''' <tex>|\mathtt{Involved}[i]| < |\mathtt{P}[i]|</tex>
<tex>j = |\mathtt{P}|</tex> <font color=darkgreen>//Запишем в <tex>j</tex> индекс нового класса</font>
'''for''' <tex>r</tex> '''in''' <tex>\mathtt{Involved}[i]</tex>
'''remove''' <tex>r</tex> '''from''' <tex>\mathtt{P}[i]</tex> '''add''' <tex>r</tex> '''to''' <tex>\mathtt{P}[j]</tex>
'''if''' <tex>|\mathtt{P}[j]| > |\mathtt{P}[i]|</tex> <font color=darkgreen>//Парный класс должен быть меньшего размера</font>
<tex>\mathtt{swap}(\mathtt{P}[i],\ \mathtt{P}[j])</tex> <font color=darkgreen>//swap за <tex>\mathtt{O(1) }</tex> - просто переставить указатели</font>
'''for''' <tex>r \in \mathtt{P}[j]</tex> <font color=darkgreen>//Обновляем номера классов для вершин, у которых они изменились</font>
<tex>\mathtt{Class}[r] = j</tex>
'''for''' <tex>c \in \Sigma</tex>
'''push''' <tex>\langle j, c \rangle</tex> '''into''' <tex>\mathtt{Queue}</tex>
'''return''' <tex>\mathtt{P}</tex>
Анонимный участник

Навигация