Skip to content

Commit 8259136

Browse files
committed
Потерянные правки по RPQ
1 parent 3ca2cff commit 8259136

File tree

1 file changed

+231
-56
lines changed

1 file changed

+231
-56
lines changed

tex/RPQ.tex

Lines changed: 231 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -128,25 +128,235 @@ \section{Достижимость с несколькими источникам
128128
1 & 0 & 0 & 0 & 0 & 0 & 0 \\
129129
0 & 0 & 1 & 0 & 0 & 0 & 0 \\
130130
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
131+
\hline
132+
0 & 0 & 0 & 0 & 0 & 0 & 1 \\
133+
0 & 0 & 0 & 0 & 0 & 1 & 0 \\
134+
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
135+
0 & 0 & 0 & 1 & 0 & 0 & 0
136+
\end{array}\right)
137+
\end{alignat*}
138+
139+
Пусть мы решаем частный случай задачи достижимости с несколькими стартовыми вершинами (multiple--source)
140+
--- достижимость с одной стартовой вершиной (single--source).
141+
142+
Пусть единственной начальной вершиной в графе будет вершина $0$.
143+
144+
Теперь создадим вектор $v = $ $\fbox{1 0 0} \fbox{1 0 0 0}$, где в первой части стоит единица на месте начального состояния $0$ в автомате.
145+
Во второй части содержится фронт обхода графа, на первом шаге это всегда множество стартовых вершин. В данном случае единица стоит на месте
146+
единственной стартовой вершины --- $0$.
147+
148+
Совершим один шаг в обходе графа и получим новый фронт обхода графа.
149+
\begin{alignat*}{7}
150+
a:\,\,
151+
& \begin{matrix}
152+
\fbox{1 0 0} \fbox{1 0 0 0}
153+
\end{matrix} &&
154+
\times
155+
\left(\begin{array}{c c c | c c c c}
156+
0 & 1 & 0 & 0 & 0 & 0 & 0 \\
157+
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
158+
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
159+
\hline
160+
0 & 0 & 0 & 0 & 1 & 0 & 0 \\
161+
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
162+
0 & 0 & 0 & 1 & 0 & 0 & 0 \\
163+
0 & 0 & 0 & 0 & 0 & 0 & 0
164+
\end{array}\right)
165+
&&= \begin{matrix}
166+
\fbox{0 1 0} \fbox{0 1 0 0}
167+
\end{matrix}
168+
\end{alignat*}
169+
170+
\begin{alignat*}{7}
171+
b:\,\,
172+
& \begin{matrix}
173+
\fbox{1 0 0} \fbox{1 0 0 0}
174+
\end{matrix} &&
175+
\times
176+
\left(\begin{array}{c c c | c c c c}
177+
1 & 0 & 0 & 0 & 0 & 0 & 0 \\
178+
0 & 0 & 1 & 0 & 0 & 0 & 0 \\
179+
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
180+
\hline
181+
0 & 0 & 0 & 0 & 0 & 0 & 1 \\
182+
0 & 0 & 0 & 0 & 0 & 1 & 0 \\
183+
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
184+
0 & 0 & 0 & 1 & 0 & 0 & 0
185+
\end{array}\right)
186+
&&= \begin{matrix}
187+
\fbox{1 0 0} \fbox{0 0 0 1}
188+
\end{matrix}
189+
\end{alignat*}
190+
191+
Сложим два полученных вектора, чтобы получить новый фронт обхода графа: $\fbox{0 1 0} \fbox{0 1 0 0}$ + $\fbox{1 0 0} \fbox{0 0 0 1} = \fbox{1 1 0} \fbox{0 1 0 1}$.
192+
193+
То есть в наш фронт \fbox{0 1 0 1} попали вершины 1 и 3 соотвественно. А именно, мы совершили следующие переходы в графе и автомате.
194+
195+
\begin{alignat*}{7}
196+
\begin{tikzpicture}[node distance=2cm,shorten >=1pt,on grid,auto]
197+
\node[state, red] (q_0) {$1$};
198+
\node[state] (q_1) [above=of q_0] {$2$};
199+
\node[state] (q_2) [right=of $(q_0)!0.5!(q_1)$] {$0$};
200+
\node[state, red] (q_3) [right=of q_2] {$3$};
201+
\path[->, red]
202+
(q_2) edge node[pos=0.7] {a} (q_0)
203+
(q_2) edge[bend left] node[above] {b} (q_3);
204+
\path[->]
205+
(q_0) edge node {b} (q_1)
206+
(q_1) edge node[pos=0.3] {a} (q_2)
207+
(q_3) edge[bend left] node {b} (q_2);
208+
\end{tikzpicture}
209+
&\hspace{20px}
210+
\begin{tikzpicture}[shorten >=1pt,on grid,auto]
211+
\node[state, draw=none] (q_3) at (0,0) {$$}; % empty node for alignment
212+
\node[state, initial, red] (q_0) at (0,1) {$0$};
213+
\node[state, red] (q_1) at (2,1) {$1$};
214+
\node[state, accepting] (q_2) at (4,1) {$2$};
215+
\path[->, red]
216+
(q_0) edge node {$a$} (q_1);
217+
\path[->]
218+
(q_1) edge node {$b$} (q_2);
219+
\draw (q_0) edge[loop above, red] node {$b$} (q_0);
220+
\end{tikzpicture}
221+
\end{alignat*}
222+
223+
Совершим еще один шаг алгоритма. Теперь вектор $v$, на который мы умножаем матрицы, имеет следующий вид $\fbox{1 1 0} \fbox{0 1 0 1}$.
224+
225+
\begin{alignat*}{7}
226+
a:\,\,
227+
& \begin{matrix}
228+
\fbox{1 1 0} \fbox{0 1 0 1}
229+
\end{matrix} &&
230+
\times
231+
\left(\begin{array}{c c c | c c c c}
232+
0 & 1 & 0 & 0 & 0 & 0 & 0 \\
233+
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
234+
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
235+
\hline
236+
0 & 0 & 0 & 0 & 1 & 0 & 0 \\
237+
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
238+
0 & 0 & 0 & 1 & 0 & 0 & 0 \\
239+
0 & 0 & 0 & 0 & 0 & 0 & 0
240+
\end{array}\right)
241+
&&= \begin{matrix}
242+
\fbox{0 1 0} \fbox{0 0 0 0}
243+
\end{matrix}
244+
\end{alignat*}
245+
246+
\begin{alignat*}{7}
247+
b:\,\,
248+
& \begin{matrix}
249+
\fbox{1 1 0} \fbox{0 1 0 1}
250+
\end{matrix} &&
251+
\times
252+
\left(\begin{array}{c c c | c c c c}
253+
1 & 0 & 0 & 0 & 0 & 0 & 0 \\
131254
0 & 0 & 1 & 0 & 0 & 0 & 0 \\
132255
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
256+
\hline
257+
0 & 0 & 0 & 0 & 0 & 0 & 1 \\
258+
0 & 0 & 0 & 0 & 0 & 1 & 0 \\
259+
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
260+
0 & 0 & 0 & 1 & 0 & 0 & 0
261+
\end{array}\right)
262+
&&= \begin{matrix}
263+
\fbox{1 0 1} \fbox{1 0 1 0}
264+
\end{matrix}
265+
\end{alignat*}
266+
267+
$\fbox{0 1 0} \fbox{0 0 0 0}$ + $\fbox{1 0 1} \fbox{1 0 1 0} = \fbox{1 1 1} \fbox{1 0 1 0}$.
268+
То есть в наш фронт \fbox{1 0 1 0} попали вершины 0 и 2 соотвественно. Мы совершили следующие переходы в графе и автомате.
269+
270+
\begin{alignat*}{7}
271+
\begin{tikzpicture}[node distance=2cm,shorten >=1pt,on grid,auto]
272+
\node[state, gray] (q_0) {$1$};
273+
\node[state, teal] (q_1) [above=of q_0] {$2$};
274+
\node[state, teal] (q_2) [right=of $(q_0)!0.5!(q_1)$] {$0$};
275+
\node[state, gray] (q_3) [right=of q_2] {$3$};
276+
\path[->, gray]
277+
(q_2) edge node[pos=0.7] {a} (q_0)
278+
(q_2) edge[bend left] node[above] {b} (q_3);
279+
\path[->, red]
280+
(q_0) edge node {b} (q_1)
281+
(q_3) edge[bend left] node {b} (q_2);
282+
\path[->]
283+
(q_1) edge node[pos=0.3] {a} (q_2);
284+
\end{tikzpicture}
285+
&\hspace{20px}
286+
\begin{tikzpicture}[shorten >=1pt,on grid,auto]
287+
\node[state, draw=none] (q_3) at (0,0) {$$}; % empty node for alignment
288+
\node[state, initial, red] (q_0) at (0,1) {$0$};
289+
\node[state, gray] (q_1) at (2,1) {$1$};
290+
\node[state, accepting, teal] (q_2) at (4,1) {$2$};
291+
\path[->, gray]
292+
(q_0) edge node {$a$} (q_1);
293+
\path[->, red]
294+
(q_1) edge node {$b$} (q_2);
295+
\draw (q_0) edge[loop above, red] node {$b$} (q_0);
296+
\end{tikzpicture}
297+
\end{alignat*}
298+
299+
При этом, можно заметить, что мы достигли конечной вершины в автомате. Последний элемент левой части результирующего
300+
вектора $\fbox{1 1 \textcolor{red}{1}} \fbox{1 0 1 0}$ отвечает за состояние 2, которое является конечным. А значит, обход необходимо остановить, и текущие вершины фронта
301+
обхода графа записать в ответ.
302+
303+
Таким образом, вершины графа 0 и 2 являются ответом. Однако вершина 0 --- лишняя. Регулярное выражение $b^*ab$ не подразумевает, что
304+
вершина 0 в графе может быть достигнута. Она могла бы быть достигнута по пустой строке в случае, если бы регулярное выражение имело вид $b^*$ или
305+
по строке $aba$ в случае, если бы регулярное выражение имело вид $b^*aba$.
306+
307+
Это произошло, потому что в векторе $v$ должна кодироваться информация о паре --- вершине графа и состоянии автомата.
308+
Достигнув вершины 0, мы оказались в конечном состоянии автомата, которое было получено с помощью другой вершины --- вершины 2.
309+
310+
Эту проблему можно решить, закодировав информацию о каждой такой паре в несколько векторов $v$, и ограничив левую
311+
часть вектора $v$ таким образом, чтобы в ней всегда была лишь одна единица.
312+
313+
Тогда мы получим, что вектор $v$ вида $\fbox{1 0 0} \fbox{1 0 1 0}$ будет хранить информацию о парах (0, 0) и (0, 2),
314+
где первый элемент пары --- состояние автомата, а второй --- вершина графа.
315+
316+
Аналогично, вектор $v$ вида $\fbox{0 1 0} \fbox{0 1 1 0}$ кодирует информацию о парах (1, 1) и (1, 2).
317+
Вектор $v$ вида $\fbox{0 0 1} \fbox{0 0 1 1}$ кодирует информацию о парах (2, 2) и (2, 3).
318+
319+
Таким образом, мы будем понимать, в каком состоянии автомата мы находимся для каждой из вершин фронта обхода графа.
320+
321+
Рассмотрим, как это применяется в разработанном алгоритме, который представлен далее.
322+
323+
Предлагается ``расклеить'' $v$ в матрицу $M$, состоящую из трех векторов, добавив два вектора $\fbox{0 1 0} \fbox{0 0 0 0}$ и $\fbox{0 0 1} \fbox{0 0 0 0}$.
324+
Во второй части этих векторов стоят нули, так как \fbox{0 1 0} и \fbox{0 0 1} кодируют состояния автомата 1 и 2, которые не являются начальными.
325+
326+
\begin{alignat*}{7}
327+
& &&M &&=\begin{matrix}
328+
\fbox{1 0 0} \fbox{1 0 0 0} \\
329+
\fbox{0 1 0} \fbox{0 0 0 0} \\
330+
\fbox{0 0 1} \fbox{0 0 0 0}
331+
\end{matrix}
332+
\end{alignat*}
333+
334+
И совершать обход тем же самым образом, но сохранив с помощью матрицы $M$ дополнительную информацию о парах (состояние, вершина).
335+
336+
\begin{alignat*}{7}
337+
a:\,\,
338+
& \begin{matrix}
339+
\fbox{1 0 0} \fbox{1 0 0 0} \\
340+
\fbox{0 1 0} \fbox{0 0 0 0} \\
341+
\fbox{0 0 1} \fbox{0 0 0 0}
342+
\end{matrix} &&
343+
\times
344+
\left(\begin{array}{c c c | c c c c}
345+
0 & 1 & 0 & 0 & 0 & 0 & 0 \\
346+
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
347+
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
348+
\hline
133349
0 & 0 & 0 & 0 & 1 & 0 & 0 \\
134350
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
135351
0 & 0 & 0 & 1 & 0 & 0 & 0 \\
136352
0 & 0 & 0 & 0 & 0 & 0 & 0
137-
\end{pmatrix} \ \ \ \ &&D_{0\_B} &&= \begin{pmatrix}
138-
0 & 1 & 0 & 0 & 0 & 0 & 0 \\
139-
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
140-
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
141-
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
142-
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
143-
0 & 0 & 0 & 0 & 0 & 0 & 1 \\
144-
0 & 0 & 0 & 0 & 0 & 1 & 0
145-
\end{pmatrix}
146-
\end{alignat*}
147-
148-
Допустим, что стартовыми вершинами в графе будут выбраны вершины 0 и 3.
149-
Теперь создадим вектор $v = $ \fbox{1 1 1} \fbox{1 0 0 1}, где в первой части стоят три единицы, соответствующие каждому состоянию автомата, в котором мы можем находиться. Во второй части содержится фронт обхода графа, на данном шаге это стартовые вершины.
353+
\end{array}\right)
354+
&&= \begin{matrix}
355+
\fbox{0 1 0} \fbox{0 1 0 0} \\
356+
\fbox{0 0 0} \fbox{0 0 0 0} \\
357+
\fbox{0 0 0} \fbox{0 0 0 0}
358+
\end{matrix}
359+
\end{alignat*}
150360
151361
\begin{alignat*}{7}
152362
b:\,\,
@@ -182,47 +392,13 @@ \section{Достижимость с несколькими источникам
182392
183393
В нашем примере матрица $M$ для следующего шага обхода выглядит следующим образом.
184394
185-
И совершать обход следующим образом.
186-
\begin{alignat*}{7}
187-
& \begin{matrix}
188-
\fbox{1 0 0} \fbox{1 0 0 1} \\
189-
\fbox{0 1 0} \fbox{1 0 0 1} \\
190-
\fbox{0 0 1} \fbox{1 0 0 1}
191-
\end{matrix} && \begin{pmatrix}
192-
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
193-
0 & 0 & 1 & 0 & 0 & 0 & 0 \\
194-
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
195-
0 & 0 & 0 & 0 & 1 & 0 & 0 \\
196-
0 & 0 & 0 & 0 & 0 & 1 & 0 \\
197-
0 & 0 & 0 & 1 & 0 & 0 & 0 \\
198-
0 & 0 & 0 & 0 & 0 & 0 & 0
199-
\end{pmatrix} &&= \begin{matrix}
200-
\fbox{0 0 0} \fbox{0 1 0 0} \\
201-
\fbox{0 0 0} \fbox{0 1 0 0} \\
202-
\fbox{0 1 0} \fbox{0 1 0 0}
203-
\end{matrix}
204-
\end{alignat*}
205-
206-
\begin{alignat*}{7}
207-
& \begin{matrix}
208-
\fbox{1 0 0} \fbox{1 0 0 1} \\
209-
\fbox{0 1 0} \fbox{1 0 0 1} \\
210-
\fbox{0 0 1} \fbox{1 0 0 1}
211-
\end{matrix} && \begin{pmatrix}
212-
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
213-
1 & 0 & 0 & 0 & 0 & 0 & 0 \\
214-
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
215-
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
216-
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
217-
0 & 0 & 0 & 0 & 0 & 0 & 1 \\
218-
0 & 0 & 0 & 0 & 0 & 1 & 0
219-
\end{pmatrix} &&= \begin{matrix}
220-
\fbox{0 0 0} \fbox{0 0 1 0} \\
221-
\fbox{1 0 0} \fbox{0 0 1 0} \\
222-
\fbox{0 0 0} \fbox{0 0 1 0}
223-
\end{matrix}
224-
\end{alignat*}
225-
\end{example}
395+
\begin{alignat*}{7}
396+
& &&M &&=\begin{matrix}
397+
\fbox{1 0 0} \fbox{0 0 0 1} \\
398+
\fbox{0 1 0} \fbox{0 1 0 0} \\
399+
\fbox{0 0 1} \fbox{0 0 0 0}
400+
\end{matrix}
401+
\end{alignat*}
226402
227403
Видно, что во фронт обхода графа попали вершины 1 и 3. В вершину 1 мы попали в состоянии 1, в вершину 3 --- в состоянии 0.
228404
@@ -490,5 +666,4 @@ \subsection{Модификации алгоритма}
490666
491667
В листинге~\ref{BFSRPQ2} представлен модифицированный алгоритм. Основное его отличие заключается в том, что для каждой достижимой вершины находится конкретная исходная вершина, из которой начинался обход.
492668
493-
Таким образом, алгоритмы~\ref{BFSRPQ1}~и~\ref{BFSRPQ2} решают сформулированные в пункте \ref{sec:3.3} задачи достижимости.
494-
669+
Таким образом, алгоритмы~\ref{BFSRPQ1}~и~\ref{BFSRPQ2} решают сформулированные в пункте \ref{sec:3.3} задачи достижимости.

0 commit comments

Comments
 (0)