|
36 | 36 | Пусть $\mathcal{G} = (V, E)$ --- входной граф и $G = (N,\Sigma,P)$ --- входная грамматика. Тогда алгоритм может быть сформулирован, как представлено в листинге~\ref{alg:graphParse}. |
37 | 37 |
|
38 | 38 | \begin{algorithm}[H] |
39 | | -\begin{algorithmic}[1] |
40 | | -\caption{Context-free recognizer for graphs} |
41 | | -\label{alg:graphParse} |
42 | | -\Function{contextFreePathQuerying}{$\mathcal{G}$, G} |
43 | | - |
44 | | - \State{$n \gets$ количество узлов в $\mathcal{G}$} |
45 | | - \State{$E \gets$ направленные ребра в $\mathcal{G}$} |
46 | | - \State{$P \gets$ набор продукций из $G$} |
47 | | - \State{$T \gets$ матрица $n \times n$, в которой каждый элемент $\varnothing$} |
48 | | - \ForAll{$(i,x,j) \in E$} |
49 | | - \Comment{Инициализация матрицы} |
50 | | - \State{$T_{i,j} \gets T_{i,j} \cup \{A~|~(A \rightarrow x) \in P \}$} |
51 | | - \EndFor |
52 | | - \ForAll{$i \in 0\ldots n-1$} |
53 | | - \Comment{Добавление петель для нетерминалов, порождающих пустую строку} |
54 | | - \State{$T_{i,i} \gets T_{i,i} \cup \{ A \in N \mid A \to \varepsilon \}$} |
55 | | - \EndFor |
56 | | - \While{матрица $T$ меняется} |
57 | | - |
58 | | - \State{$T \gets T \cup (T \times T)$} |
59 | | - \Comment{Вычисление транзитивного замыкания} |
60 | | - \EndWhile |
61 | | -\State \Return $T$ |
62 | | -\EndFunction |
63 | | -\end{algorithmic} |
| 39 | +%TODO!!! |
| 40 | +%\begin{algorithmic}[1] |
| 41 | +%\caption{Context-free recognizer for graphs} |
| 42 | +%\label{alg:graphParse} |
| 43 | +%\Function{contextFreePathQuerying}{$\mathcal{G}$, G} |
| 44 | + |
| 45 | +% \State{$n \gets$ количество узлов в $\mathcal{G}$} |
| 46 | +% \State{$E \gets$ направленные ребра в $\mathcal{G}$} |
| 47 | +% \State{$P \gets$ набор продукций из $G$} |
| 48 | +% \State{$T \gets$ матрица $n \times n$, в которой каждый элемент $\varnothing$} |
| 49 | +% \ForAll{$(i,x,j) \in E$} |
| 50 | +% \Comment{Инициализация матрицы} |
| 51 | +% \State{$T_{i,j} \gets T_{i,j} \cup \{A~|~(A \rightarrow x) \in P \}$} |
| 52 | +% \EndFor |
| 53 | +% \ForAll{$i \in 0\ldots n-1$} |
| 54 | +% \Comment{Добавление петель для нетерминалов, порождающих пустую строку} |
| 55 | +% \State{$T_{i,i} \gets T_{i,i} \cup \{ A \in N \mid A \to \varepsilon \}$} |
| 56 | +% \EndFor |
| 57 | +% \While{матрица $T$ меняется} |
| 58 | + |
| 59 | +% \State{$T \gets T \cup (T \times T)$} |
| 60 | +% \Comment{Вычисление транзитивного замыкания} |
| 61 | +% \EndWhile |
| 62 | +%\State \Return $T$ |
| 63 | +%\EndFunction |
| 64 | +%\end{algorithmic} |
64 | 65 | \end{algorithm} |
65 | 66 |
|
66 | 67 |
|
|
194 | 195 | % Матричный алгоритм для конъюнктивных грамматик отличается от алгоритма~\ref{alg:graphParse} для контекстно-свободных грамматик только операцией умножения матриц, в остальном алгоритм остается без изменений. Определим операцию умножения матриц. |
195 | 196 | % \begin{definition} |
196 | 197 | % Пусть $M_1$ и $M_2$ матрицы размера $n$. Определим операцию $\circ$ следующим образом: |
197 | | -% \[M_1 \circ M_2 = M_3,\] |
198 | | -% \[M_3 [i,j] = \{A \mid \exists (A \rightarrow B_1 C_1 \& \ldots \& B_m C_m) \in P, (B_k , C_k) \in d[i,j] \forall k = 1,\ldots,m\}\], |
| 198 | +% \[M_1 \circ M_2 = M_3,\] |
| 199 | +% \[M_3 [i,j] = \{A \mid \exists (A \rightarrow B_1 C_1 \& \ldots \& B_m C_m) \in P, (B_k , C_k) \in d[i,j] \forall k = 1,\ldots,m\}\], |
199 | 200 | % где \[d[i,j] = \bigcup_{k = 1}^{n} M_1 [i,k] \times M_2 [k,j].\] |
200 | 201 | % \end{definition} |
201 | 202 |
|
@@ -274,31 +275,32 @@ \section{Особенности реализации} |
274 | 275 |
|
275 | 276 | \begin{algorithm} |
276 | 277 | \floatname{algorithm}{Listing} |
277 | | -\begin{algorithmic}[1] |
278 | | -\caption{Context-free path querying algorithm. Boolean matrix version} |
279 | | -\label{lst:cfpq_mtx_bool} |
280 | | -\Function{evalCFPQ}{$D=(V,E), G=(N,\Sigma,P)$} |
281 | | - \State{$n \gets$ |V|} |
282 | | - \State{$T \gets \{T^{A_i} \mid A_i \in N, T^{A_i}$ is a matrix $n \times n$, $T^{A_i}_{k,l} \gets$ \texttt{false}\} } |
283 | | - \ForAll{$(i,x,j) \in E$, $A_k \mid A_k \to x \in P$} |
284 | | - %\Comment{Matrices initialization} |
285 | | - %\For{$A_k \mid A_k \to x \in P$} |
286 | | - {$T^{A_k}_{i,j} \gets \texttt{true}$} |
287 | | - %\EndFor |
288 | | - \EndFor |
289 | | - \For{$A_k \mid A_k \to \varepsilon \in P$} |
290 | | - {$T^{A_k}_{i,i} \gets \texttt{true}$} |
291 | | - \EndFor |
292 | | - |
293 | | - \While{any matrix in $T$ is changing} |
294 | | - %\Comment{Transitive closure calculation} |
295 | | - \For{$A_i \to A_j A_k \in P$} |
296 | | - { $T^{A_i} \gets T^{A_i} + (T^{A_j} \times T^{A_k})$ } |
297 | | - \EndFor |
298 | | - \EndWhile |
299 | | -\State \Return $T$ |
300 | | -\EndFunction |
301 | | -\end{algorithmic} |
| 278 | +% TODO!!! |
| 279 | +%\begin{algorithmic}[1] |
| 280 | +%\caption{Context-free path querying algorithm. Boolean matrix version} |
| 281 | +%\label{lst:cfpq_mtx_bool} |
| 282 | +%\Function{evalCFPQ}{$D=(V,E), G=(N,\Sigma,P)$} |
| 283 | +% \State{$n \gets$ |V|} |
| 284 | +% \State{$T \gets \{T^{A_i} \mid A_i \in N, T^{A_i}$ is a matrix $n \times n$, $T^{A_i}_{k,l} \gets$ \texttt{false}\} } |
| 285 | +% \ForAll{$(i,x,j) \in E$, $A_k \mid A_k \to x \in P$} |
| 286 | +% %\Comment{Matrices initialization} |
| 287 | +% %\For{$A_k \mid A_k \to x \in P$} |
| 288 | +% {$T^{A_k}_{i,j} \gets \texttt{true}$} |
| 289 | +% %\EndFor |
| 290 | +% \EndFor |
| 291 | +% \For{$A_k \mid A_k \to \varepsilon \in P$} |
| 292 | +% {$T^{A_k}_{i,i} \gets \texttt{true}$} |
| 293 | +% \EndFor |
| 294 | + |
| 295 | +% \While{any matrix in $T$ is changing} |
| 296 | +% %\Comment{Transitive closure calculation} |
| 297 | +% \For{$A_i \to A_j A_k \in P$} |
| 298 | +% { $T^{A_i} \gets T^{A_i} + (T^{A_j} \times T^{A_k})$ } |
| 299 | +% \EndFor |
| 300 | +% \EndWhile |
| 301 | +%\State \Return $T$ |
| 302 | +%\EndFunction |
| 303 | +%\end{algorithmic} |
302 | 304 | \end{algorithm} |
303 | 305 |
|
304 | 306 | С другой стороны, для запросов, выразимых в терминах грамматик с небольшим количеством нетерминалов, практически может быть выгодно представлять множества нетерминалов в ячейке матрицы в виде битового вектора следующим образом. |
|
0 commit comments