\documentclass[spec, och, labwork]{SCWorks}
\usepackage{preamble}

\begin{document}
\include{titlepage.tex}

\section*{Описание работы алгоритма}

Пусть даны множество $S$ и разбиение $\pi$ множества $S$ на непересекающиеся
блоки $\{ B_1, B_2, \ldots, B_p \}$. Кроме того, дана функция $f: S \to S$.
Задача состоит в том, чтобы найти грубейшее (с наименьшим количеством блоков)
разбиение $\pi' = \{ E_1, E_2, \ldots, E_q \}$ множества $S$, что
\begin{enumerate}
    \item
        $\pi'$ "--- подразбиение разбиения $\pi$ (т. е. каждое множество
        является подмножеством некоторого блока $B_j$);
    \item
        если $a$ и $b$ принадлежат $E_i$, то $f(a)$ и $f(b)$ принадлежат $E_j$
        для некоторого $j$.
\end{enumerate}

Очевидное решение состоит в повторном утончении блоков исходного разбиения
следующим способом. Пусть $B_i$ "--- какой-нибудь блок. Рассмотрим $f(a)$ для
каждого $a$ из $B_i$. Разобьём $B_i$ так, чтобы два элемента $a$ и $b$ попадали
в один блок тогда и только тогда, когда $f(a)$ и $f(b)$ оба принадлежат
некоторому блоку $B_j$. Процесс повторяется до тех пор, пока уже нельзя будет
проводить дальнейшие утончения. 

Этот метод даёт алгоритм сложности $O(n^2)$, поскольку каждое утончение занимает
время $O(n)$, а всего может быть $O(n)$ утончений.

\subsection*{Реализация на языке Python}

\inputminted[fontsize=\small, breaklines=true, style=bw, linenos]{c}{../../partition.py}

\end{document}
