Skip to content

Разделы по линейной алгебре и графам #11

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 19 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
10809cf
Графы и линейная алгебра. В процессе.
gsvgit Jul 16, 2021
66d7b09
Ещё немного про связь графов и линейной алгебры.
gsvgit Jul 16, 2021
6153233
Поправлены опечатки во введении.
gsvgit Jul 19, 2021
4f94829
Поправлены опечатки в разделе про линейную алгебру.
gsvgit Jul 19, 2021
ad23aac
Немного правок в теории графов.
gsvgit Jul 20, 2021
74894ef
Ещё пачка опечаток
gsvgit Jul 20, 2021
f8b6e6e
Merge branch 'typos' into LinAl
gsvgit Jul 20, 2021
38207a5
Пачка опечаток в теории графов.
gsvgit Jul 20, 2021
83ddbf9
Чуть более аккуратное определение матрицы смежности. Унификация приме…
gsvgit Jul 20, 2021
cffadd0
Задача поиска путей. В процессе.
gsvgit Jul 20, 2021
4de3655
Больше правок в разделе про связь графов и линейной алгебры.
gsvgit Jul 22, 2021
4c6aa94
Немного правок в линейной алгебре и теории графов.
gsvgit Jul 23, 2021
f2ac468
Алгоритм Флойда-Уоршелла. Раздел про линейку и графы удалён. Его надо…
gsvgit Jul 26, 2021
19e8881
Первая версия раздела про графы, относительно согласованная с основны…
gsvgit Jul 26, 2021
03c6146
Немного улучшений в общх понятиях теории ргафов.
gsvgit Jul 26, 2021
6a429ce
Style and typos fixed
kajigor Jul 30, 2021
4c487e4
All chapters
kajigor Jul 30, 2021
06e8622
Typos and small edits for chapters 5 and 6
kajigor Aug 2, 2021
401d817
Small edits to 3 and 4 chapters
kajigor Aug 2, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 11 additions & 14 deletions tex/CYK_for_CFPQ.tex
Original file line number Diff line number Diff line change
Expand Up @@ -6,33 +6,31 @@ \chapter{CYK для вычисления КС запросов}\label{chpt:CFPQ_

\section{Алгоритм CYK}\label{sect:lin_CYK}

Алгоритм CYK (Cocke-Younger-Kasami) --- один из классических алгоритмов синтаксического анализа. Его асимптотическая сложность в худшем случае --- $O(n^3 * |N|)$, где $n$ --- длина входной строки, а $N$ --- количество нетерминалов во входной граммтике~\cite{Hopcroft+Ullman/79/Introduction}.
Алгоритм CYK (Cocke-Younger-Kasami) --- один из классических алгоритмов синтаксического анализа. Его асимптотическая сложность в худшем случае --- $O(n^3 * |N|)$, где $n$ --- длина входной строки, а $N$ --- количество нетерминалов во входной грамматике~\cite{Hopcroft+Ullman/79/Introduction}.

Для его применения необходимо, чтобы подаваемая на вход грамматика находилась в Нормальной Форме Хомского (НФХ)~\ref{section:CNF}. Других ограничений нет и, следовательно,данный алгоритм применим для работы с произвольными контекстно-своболными языками.
Для его применения необходимо, чтобы подаваемая на вход грамматика находилась в Нормальной Форме Хомского (НФХ)~\ref{section:CNF}. Других ограничений нет и, следовательно, данный алгоритм применим для работы с произвольными контекстно-своболными языками.

В основе алгоритма лежит принцип динамического программирования. Используются два соображения:

\begin{enumerate}
\item Для правила вида $A \to a$ очевидно, что из $A$ выводится $\omega$ (с применением этого правила) тогда и только тогда, когда $a = \omega$:

\item Из нетерминала $A$ выводится цепочка $\omega$ при помощи правила $A \to a$ тогда и только тогда, когда $a= \omega$:
\[
A \derives \omega \iff \omega = a
\]

\item Для правила вида $A \to B C$ понятно, что из $A$ выводится $\omega$ (с применением этого правила) тогда и только тогда, когда существуют две цепочки $\omega_1$ и $\omega_2$ такие, что $\omega_1$ выводима из $B$, $\omega_2$ выводима из $C$ и при этом $\omega = \omega_1 \omega_2$:

\item Из нетерминала $A$ выводится цепочка $\omega$ при помощи правила $A \to B C$ тогда и только тогда, когда существуют две цепочки $\omega_1$ и $\omega_2$ такие, что $\omega_1$ выводима из $B$, $\omega_2$ выводима из $C$ и при этом $\omega = \omega_1 \omega_2$:
\[
A \derives[] B C \derives \omega \iff \exists \omega_1, \omega_2 : \omega = \omega_1 \omega_2, B \derives \omega_1, C \derives \omega_2
\]

Или в терминах позиций в строке:

Переформулируем эти утверждения в терминах позиций в строке:
\[
A \derives[] B C \derives \omega \iff \exists k \in [1 \dots |\omega|] : B \derives \omega[1 \dots k], C \derives \omega[k+1 \dots |\omega|]
\]
\end{enumerate}

В процессе работы алгоритма заполняется булева трехмерная матрица $M$ размера $n \times n \times |N|$ таким образом, что $$M[i, j, A] = true \iff A \derives \omega[i \dots j]$$.
В процессе работы алгоритма заполняется булева трехмерная матрица $M$ размера $n \times n \times |N|$ таким образом, что
\[M[i, j, A] = true \iff A \derives \omega[i \dots j]\].

Первым шагом инициализируем матрицу, заполнив значения $M[i, i, A]$:

Expand All @@ -43,7 +41,6 @@ \section{Алгоритм CYK}\label{sect:lin_CYK}

Далее используем динамику: на шаге $m > 1$ предполагаем, что ячейки матрицы $M[i', j', A]$ заполнены для всех нетерминалов $A$ и пар $i', j': j' - i' < m$.
Тогда можно заполнить ячейки матрицы $M[i, j, A] \text{, где } j - i = m$ следующим образом:

\[ M[i, j, A] = \bigvee_{A \to B C}^{}{\bigvee_{k=i}^{j-1}{M[i, k, B] \wedge M[k, j, C]}} \]

По итогу работы алгоритма значение в ячейке $M[0, |\omega|, S]$, где $S$ --- стартовый нетерминал грамматики, отвечает на вопрос о выводимости цепочки $\omega$ в грамматике.
Expand Down Expand Up @@ -239,7 +236,7 @@ \section{Алгоритм для графов на основе CYK}
\begin{itemize}
\item Как и раньше, с помощью продукций вида \[A \to a \text{, где } A \in N, a \in \Sigma\]
заменяем терминалы на ребрах входного графа на множества нетерминалов, из которых они выводятся.
\item Добавляем в каждую вершину петлю, помеченную множеством нетерминалов для которых в данной граммтике есть правила вида $$A \to \varepsilon\text{, где } A \in N.$$
\item Добавляем в каждую вершину петлю, помеченную множеством нетерминалов для которых в данной грамматике есть правила вида $$A \to \varepsilon\text{, где } A \in N.$$
\end{itemize}

Затем используем матрицу смежности получившегося графа (обозначим ее $M$) в качестве начального значения. Дальнейший ход алгоритма можно описать псевдокодом, представленным в листинге~\ref{alg:graphParseCYK}.
Expand Down Expand Up @@ -271,7 +268,7 @@ \section{Алгоритм для графов на основе CYK}
\end{algorithmic}
\end{algorithm}

После завершения алгоритма, если в некоторой ячейке результируюшей матрицы с номером $(i, j)$ находятся стартовый нетерминал, то это означает, что существует путь из вершины $i$ в вершину $j$, удовлетворяющий данной грамматике. Таким образом, полученная матрица является ответом для задачи достижимости для заданных графа и граммтики.
После завершения алгоритма, если в некоторой ячейке результируюшей матрицы с номером $(i, j)$ находятся стартовый нетерминал, то это означает, что существует путь из вершины $i$ в вершину $j$, удовлетворяющий данной грамматике. Таким образом, полученная матрица является ответом для задачи достижимости для заданных графа и грамматики.

\begin{example}
\label{CYK_algorithm_ex}
Expand Down Expand Up @@ -474,12 +471,12 @@ \section{Алгоритм для графов на основе CYK}
m = r = \{(A,0,1),(A,1,2),(A,2,0),(B,2,3),(B,3,2)\}
$$

\textbf{Итерации внешнего цикла.} Будем считеть, что $r$ и $m$ --- упорядоченные списки и $pick$ возврпщает его голову, оставляя хвост.
\textbf{Итерации внешнего цикла.} Будем считеть, что $r$ и $m$ --- упорядоченные списки и $pick$ возвращает его голову, оставляя хвост.
Новые элементы добавляются в конец.
\begin{enumerate}
\item Обрабатываем $(A,0,1)$.
Ни один из вложенных циклов не найдёт новых путей, так как для рассматриваемого ребра есть только две возможности достроить путь: $2 \xrightarrow{A} 0 \xrightarrow{A} 1$ и $0 \xrightarrow{A} 1 \xrightarrow{A} 2$
и ни одна из соответствующих строк не выводтся в заданной граммтике.
и ни одна из соответствующих строк не выводтся в заданной грамматике.
\item Перед началом итерации
$$
m = \{(A,1,2),(A,2,0),(B,2,3),(B,3,2)\},
Expand Down
Loading