% !TeX spellcheck = cs_CZ
% !TeX root = ../BP_Prokopič_Martin_2021.tex

V~této kapitole definujeme pojmy z~oboru formálních jazyků a~vyhledávání v~textu, které budeme používat ve zbytku práce. Zde uvedené definice a~algoritmy přebíráme z~\cite{melichar05}.

\section{Řetězec}

\begin{definition}
	\emph{Abeceda} (značíme $\Sigma$) je konečná neprázdná množina symbolů.
\end{definition}

\begin{definition}
	\emph{Řetězec} (někdy také \emph{slovo}) je konečná sekvence symbolů abecedy.
\end{definition}

\begin{definition}
	\emph{Délka řetězce} $\str{u}$ (značíme $\abs{\str{u}}$) je nezáporné celé číslo udávající počet symbolů řetězce.
\end{definition}

\begin{definition}
	\emph{Prázdný řetězec} (značíme $\epsilon$) je prázdná sekvence symbolů. Délka prázdného řetězce $\abs{\epsilon} = 0$.
\end{definition}

\begin{annotation}
	$i$-tý symbol řetězce $\str{u}$ značíme $\str{u}[i]$. Platí $\str{u} = \str{u}[1]\str{u}[2]\dots \str{u}[n]$ ($n = \abs{\str{u}}$).
\end{annotation}

\begin{annotation}
	Množinu všech řetězců nad abecedou $\Sigma$ značíme $\Sigma^*$, bez prázdného řetězce $\Sigma^+$. Platí $\Sigma^* = \Sigma^+ \cup \set{\epsilon}$.
\end{annotation}

\begin{definition}
	\emph{Zřetězení} $\str{w} = \str{u}\str{v}$ řetězců $\str{u}$ a~$\str{v}$ vznikne postupným zapsáním symbolů řetězce $\str{v}$ na konec řetězce $\str{u}$. Pokud $n = \abs{\str{u}}$ a~$m = \abs{\str{v}}$, tak $\str{w} = \str{u}[1]\dots \str{u}[n]\str{v}[1]\dots \str{v}[m]$. Platí, že $\abs{\str{w}} = n + m$.
\end{definition}

\begin{definition}[Opačný řetězec]
	Buď $\str{u} \in \Sigma^*$ řetězec nad abecedou $\Sigma$. Opačný řetězec $\str{u}^R \in \Sigma^*$ je zřetězení symbolů $\str{u}$ pozpátku, tzn. $\str{u}^R = \str{u}[n]\dots\str{u}[1]$, kde $n = \abs{\str{u}}$ je délka řetězce $\str{u}$.
\end{definition}

\begin{definition}[Podřetězec]
	Buďte $\str{u}, \str{v} \in \Sigma^*$ řetězce nad abecedou $\Sigma$. Řetězec $\str{u}$ je \emph{podřetězcem} (někdy také \emph{faktorem}) řetězce $\str{v}$ právě tehdy, když $\exists \str{w}, \str{x} \in \Sigma^*$ takové, že $\str{v} = \str{wux}$.
\end{definition}

\begin{annotation}
	Podřetězec řetězce $\str{u}$ tvořený souvislou sekvencí symbolů $\str{u}[i]$ až $\str{u}[j]$ ($0 \leq i \leq j \leq \abs{\str{u}}$) značíme $\str{u}[i\dotdot j]$. Platí, že $\str{u}[i\dotdot j] = \str{u}[i]\str{u}[i+1]\dots \str{u}[j]$.
\end{annotation}

\begin{definition}[Prefix]
	Buďte $\str{u}, \str{v} \in \Sigma^*$ řetězce nad abecedou $\Sigma$. Řetězec $\str{u}$ je \emph{prefixem} $\str{v}$ právě tehdy, když $\exists \str{w} \in \Sigma^*$ takový, že $\str{v} = \str{uw}$. Prefix $\str{u}$ je \emph{vlastní}, jestliže $\str{u} \neq \str{v}$.
\end{definition}

\begin{definition}[Sufix]
	Buďte $\str{u}, \str{v} \in \Sigma^*$ řetězce nad abecedou $\Sigma$. Řetězec $\str{u}$ je \emph{sufixem} $\str{v}$ právě tehdy, když $\exists \str{w} \in \Sigma^*$ takový, že $\str{v} = \str{wu}$. Sufix $\str{u}$ je \emph{vlastní}, jestliže $\str{u} \neq \str{v}$.
\end{definition}

\begin{definition}
	\emph{Hranice} řetězce $\str{u}$ je libovolný \emph{vlastní} prefix $\str{u}$, který je zároveň jeho sufix. Nejdelší hranici řetězce $\str{u}$ označujeme $\Border(\str{u})$.
\end{definition}

%\begin{definition}
%	\emph{Pole hranic (border array)} $\beta[1\dotdot n]$ řetězce $\str{u}[1\dotdot n]$ je vektor délek nejdelších hranic všech prefixů $\str{u}$:
%	\begin{equation*}
%		\beta[i] = \abs{\Border(u[1\dotdot i])}\ \forall i~\in \set{1, \dots, n}.
%	\end{equation*}
%\end{definition}

%\vfill\pagebreak

\section{Konečný automat}\label{sec:automaton}

\begin{definition}
	\emph{Deterministický konečný automat (zkráceně \acrshort{dfa})} je pětice $M = (Q,\Sigma,\delta,q_0,F)$, jejíž prvky mají následující významy:
	\vspace{-6pt}\begin{table}[H]
		\begin{tabularx}{\textwidth}{cX}
			$Q$ & konečná množina stavů,\\
			$\Sigma$ & konečná vstupní abeceda,\\
			$\delta$ & zobrazení $Q \times \Sigma \rightarrow Q$ (\emph{přechodová funkce}),\\
			$q_0 \in Q$ & počáteční stav,\\
			$F \subseteq Q$ & množina koncových stavů.\\
		\end{tabularx}
	\end{table}
\end{definition}

\begin{definition}[Přechod \acrshort{dfa}]
	Buď $M = (Q,\Sigma,\delta,q_0,F)$ deterministický konečný automat. Relaci $\vdash_M \subseteq (Q \times \Sigma^*) \times (Q \times \Sigma^*)$ nazveme přechod automatu $M$. Platí, že $(q_1, a\str{u}) \vdash_M (q_2, \str{u}) \iff \delta(q_1, a) = q_2$, kde $a \in \Sigma, \str{u} \in \Sigma^*$.
\end{definition}

\begin{definition}
	\emph{Nedeterministický konečný automat (zkráceně \acrshort{nfa})} je pětice $M = (Q,\Sigma,\delta,q_0,F)$, jejíž prvky mají následující významy:
	\vspace{-6pt}\begin{table}[H]
		\begin{tabularx}{\textwidth}{cX}
			$Q$ & konečná množina stavů,\\
			$\Sigma$ & konečná vstupní abeceda,\\
			$\delta$ & zobrazení z~$Q \times \Sigma$ do množiny všech podmnožin $Q$ (\emph{přechodová funkce}),\\
			$q_0 \in Q$ & počáteční stav,\\
			$F \subseteq Q$ & množina koncových stavů.\\
		\end{tabularx}
	\end{table}
\end{definition}

\begin{definition}[Přechod \acrshort{nfa}]
	Buď $M = (Q,\Sigma,\delta,q_0,F)$ nedeterministický konečný automat. Relaci $\vdash_M \subseteq (Q \times \Sigma^*) \times (Q \times \Sigma^*)$ nazveme přechod automatu $M$. Platí, že $(q_1, a\str{u}) \vdash_M (q_2, \str{u}) \iff \delta(q_1, a) = q_2$, kde $a \in \Sigma, \str{u} \in \Sigma^*$.
\end{definition}

\begin{definition}
	Konečný automat $M$ přijímá řetězec $\str{u}$ právě tehdy, když existuje posloupnost přechodů $(q_0, \str{u}[1\dotdot n]) \vdash_M (q_1, \str{u}[2\dotdot n]) \vdash_M\,\dots\,\vdash_M (q_n, \epsilon)$, kde $n = \abs{\str{u}}$ a~$q_n \in F$.
\end{definition}

\begin{annotation}
	Množinu (jazyk) všech řetězců přijímaných konečným automatem $M$ značíme $L(M)$.
\end{annotation}

\begin{definition}[Ekvivalence konečných automatů]
	Konečné automaty $M_1$ a~$M_2$ si jsou ekvivalentní právě tehdy, když $L(M_1) = L(M_2)$.
\end{definition}

\acrshort{nfa} i~\acrshort{dfa} dokáží vyjádřit ekvivalentní množinu jazyků. Proces převodu \acrshort{nfa} na ekvivalentní \acrshort{dfa} nazýváme \emph{determinizace} a~lze ji provést např. pomocí podmnožinové konstrukce, viz algoritmus \ref{algo:powerset}.

\begin{algorithm}
	\AlgoName{Powerset-Construction}{$(M = (Q, \Sigma, \delta, q_0, F))$}
	$Q' = \set{\set{q_0}}$\tcp*{po vložení jsou všechny prvky $Q'$ neoznačené}
	\While{\emph{existuje neoznačený} $q' \in Q'$}{
		\ForEach{$a \in \Sigma$}{
			$\delta'(q', a) \leftarrow \bigcup_{p \in q'}\delta(p, a)$\;
			$Q' \leftarrow Q' \cup \delta'(q', a)$\;
		}
		nastav $q'$ jako označený\;
	}
	$q'_0 = \set{q_0}$\;
	$F' = \set{q' : q' \in Q' \land q' \cap F \ne \emptyset}$\;
	\Return{$(Q', \Sigma, \delta', q'_0, F')$}\;
	\caption{Determinizace NFA pomocí podmnožinové konstrukce}\label{algo:powerset}
\end{algorithm}

\begin{definition}
	\emph{Nedeterministický faktorový automat} pro řetězec $\str{u}$ je NFA přijímající právě množinu všech podřetězců $\str{u}$.
\end{definition}

Všechny stavy nedeterministického faktorového automatu jsou koncové. Algoritmus \ref{algo:facaconstr} ukazuje jeden z~možných postupů jeho konstrukce. 

\begin{algorithm}
	\AlgoName{Factor-NFA}{$(\str{s} \in \Sigma^*)$}
	$Q \leftarrow \set{0, \dots, \abs{\str{s}}}$\;
	\For{$i = 1$ \KwTo $\abs{\str{s}}-1$}{
		$\delta(i, \str{s}[i+1]) \leftarrow \set{i+1}$\tcp*{přechody mezi stavy $\ge 1$}
	}
	\For{$i = 1$ \KwTo $\abs{\str{s}}$}{
		$\delta(0, \str{s}[i]) \leftarrow \delta(0, \str{s}[i]) \cup \set{i}$\tcp*{přechody z~počátečního stavu}
	}
	\Return{$(Q,\Sigma,\delta,0,Q)$}\;
	\caption{Konstrukce nedeterministického faktorového automatu pro zadaný řetězec}\label{algo:facaconstr}
\end{algorithm}

\begin{definition}
	\emph{Páteř faktorového automatu} $M$ pro řetězec $\str{u}$ je nejdelší posloupnost stavů a~přechodů vedoucí z~počátečního stavu do stavu, ze kterého již nevedou další přechody.
\end{definition}

\vfill\pagebreak

\begin{example}
	Nedeterministický faktorový automat pro řetězec $\texttt{aabba}$ zkonstruovaný pomocí algoritmu \ref{algo:facaconstr} jsme znázornili na obrázku \ref{fig:facaex}. Automat jsme poté determinizovali pomocí algoritmu \ref{algo:powerset} a~výsledek uvádíme v~obrázku \ref{fig:dfacaex}.
\end{example}

\begin{figure}[H]
	\centering
	\begin{tikzpicture}[
	shorten >=1pt,node distance=1.75cm,on grid,auto,
	state/.style={circle,draw,minimum size=0.85cm}]
	
	\node[state,accepting,initial] (1) {0};
	\node[state,accepting] (2) [right of=1] {1};
	\node[state,accepting] (3) [right of=2] {2};
	\node[state,accepting] (4) [right of=3] {3};
	\node[state,accepting] (5) [right of=4]{4};
	\node[state,accepting] (6) [right of=5] {5};
	\path[->]
	(1) edge node [align=center] {\texttt{a}}(2)
	(1) edge [bend right=45] node [align=center] {\texttt{a}}(3)
	(1) edge [bend right=45] node [align=center] {\texttt{b}}(4)
	(1) edge [bend right=45] node [align=center] {\texttt{b}}(5)
	(1) edge [bend right=45] node [align=center] {\texttt{a}}(6)
	(2) edge node [align=center] {\texttt{a}}(3)
	(3) edge node [align=center] {\texttt{b}}(4)
	(4) edge node [align=center] {\texttt{b}}(5)
	(5) edge node [align=center] {\texttt{a}}(6)
	;
	\end{tikzpicture}
	\caption{Nedeterministický faktorový automat pro řetězec $\texttt{aabba}$}\label{fig:facaex}
\end{figure}

\begin{figure}[H]
	\centering
	\begin{tikzpicture}[
	shorten >=1pt,node distance=1.75cm,on grid,auto,
	state/.style={circle,draw,minimum size=1.05cm,inner sep=2pt}]
	
	\node[state,accepting,initial] (2) [right of=1] {$\set{0}$};
	\node[state,accepting] (3) [right of=2]{$\set{1, 2, 5}$};
	\node[state,accepting] (4) [right of=3]{$\set{2}$};
	\node[state,accepting] (5) [right of=4] {$\set{3}$};
	\node[state,accepting] (6) [below of=5]{$\set{3, 4}$};
	\node[state,accepting] (7) [right of=5] {$\set{4}$};
	\node[state,accepting] (8) [right of=7] {$\set{5}$};
	\path[->]
	(2) edge node [align=center] {\texttt{a}}(3)
	(2) edge [bend right=20] node [align=center] {\texttt{b}}(6)
	(3) edge node [align=center] {\texttt{a}}(4)
	(3) edge [bend right=45] node [align=center] {\texttt{b}}(5)
	(4) edge node [align=center] {\texttt{b}}(5)
	(5) edge node [align=center] {\texttt{b}}(7)
	(6) edge node [align=center] {\texttt{b}}(7)
	(6) edge [bend right=20] node [align=center] {\texttt{a}}(8)
	(7) edge node [align=center] {\texttt{a}}(8)
	;
	\end{tikzpicture}
	\caption{Výsledek determinizace nedeterministického faktorového automatu pro řetězec $\texttt{aabba}$ pomocí algoritmu \ref{algo:powerset} (stav $\emptyset$ jsme vynechali)}\label{fig:dfacaex}
\end{figure}


\vfill\pagebreak

\section{Sufixové pole}\label{sec:sa}

Sufixové pole bylo poprvé představeno jako méně paměťově náročná alternativa k~sufixovým stromům U. Manberem a~G. Myersem v~článku \cite{manber90}. Jedná se o~principiálně jednoduchou datovou strukturu používanou k~urychlení (nejen) vyhledávání v~řetězcích.

\begin{definition}[Lexikografické pořadí]
	Buďte $\str{u}[1\dotdot n], \str{v}[1\dotdot m] \in \Sigma^*$ řetězce délek $n$ a~$m$. Předpokládáme, že symboly abecedy $\Sigma$ jsou mezi sebou porovnatelné. Řetězec $\str{u} < \str{v}$ právě tehdy, když platí jedna z~následujících podmínek:
	\begin{itemize}
		\item $n < m$ a~$\str{u}[1\dotdot n] = \str{v}[1\dotdot n]$, nebo
		\item $\str{u}[1\dotdot i-1] = \str{v}[1\dotdot i-1]$ a~$\str{u}[i] < \str{v}[i]$ pro nějaké $i \in \set{1, \dots, \min(n, m)}$.
	\end{itemize}
\end{definition}

\begin{definition}\label{def:sa}
	Buď $\str{u} \in \Sigma^*$ řetězec délky $n = |\str{u}|$. Sufixové pole $I[1\dotdot n]$ reprezentuje lexikograficky seřazený seznam všech sufixů $\str{u}$. Pro každé $i \in \{1, \dots, n\}$ platí, že $\str{u}[I[i]\dotdot n]$ je $i$-tý lexikograficky nejmenší sufix řetězce $\str{u}$.
\end{definition}

\begin{example}
	Chceme konstruovat sufixové pole řetězce $\textbf{u} = \mathtt{mississippi}$ délky $n = 11$. Nejprve pro každé $i \in \{1, \dots, n\}$ vypíšeme sufix $\str{u}[i\dotdot n]$. Poté tyto sufixy lexikograficky seřadíme. Výsledné pole je tvořeno pozicemi začátků sufixů v~původním řetězci, v~tomto případě $(11, 8, 5, 2, 1, 10, 9, 7, 4, 6, 3)$.
\end{example}

\begin{lrbox}{\boxa}
	\begin{tabular}{rl}
		\multicolumn{1}{c}{$i$} & \multicolumn{1}{c}{$\str{u}[i\dotdot n]$}\\
		\hline
		1 & \texttt{mississippi}\\
		2 & \texttt{ississippi}\\
		3 & \texttt{ssissippi}\\
		4 & \texttt{sissippi}\\
		5 & \texttt{issippi}\\
		6 & \texttt{ssippi}\\
		7 & \texttt{sippi}\\
		8 & \texttt{ippi}\\
		9 & \texttt{ppi}\\
		10 & \texttt{pi}\\
		11 & \texttt{i}\\
	\end{tabular}
\end{lrbox}

\begin{lrbox}{\boxb}
	\begin{tabular}{rl}
		\multicolumn{1}{c}{$i$} & \multicolumn{1}{c}{$\str{u}[i\dotdot n]$}\\
		\hline
		11 & \texttt{i}\\
		8 & \texttt{ippi}\\
		5 & \texttt{issippi}\\
		2 & \texttt{ississippi}\\
		1 & \texttt{mississippi}\\
		10 & \texttt{pi}\\
		9 & \texttt{ppi}\\
		7 & \texttt{sippi}\\
		4 & \texttt{sissippi}\\
		6 & \texttt{ssippi}\\
		3 & \texttt{ssissippi}\\
	\end{tabular}
\end{lrbox}

\begin{table}[h]
	\centering
	\subfloat[][]{\usebox{\boxa}}
	\qquad
	\subfloat[][]{\usebox{\boxb}}
	\caption{Proces konstrukce sufixového pole řetězce \texttt{mississippi}}\label{tab:saconstruction}
\end{table}