You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: tex/LinearAlgebra.tex
+18Lines changed: 18 additions & 0 deletions
Original file line number
Diff line number
Diff line change
@@ -411,6 +411,24 @@ \section{Матрицы и вектора}
411
411
$$
412
412
\end{example}
413
413
414
+
415
+
\begin{definition}[Прямая сумма матриц]
416
+
Пусть даны матрицы $M_{n_1\times m_1}$ и $N_{n_2\times m_2}$. Тогда \emph{прямой суммой} этих матриц называется матрица $L_{n_1+n_2 \times m_1+m_2}$ вида
417
+
$$
418
+
L =
419
+
\left[
420
+
\begin{matrix}
421
+
M & 0\\
422
+
0 & N
423
+
\end{matrix}
424
+
\right]
425
+
$$
426
+
427
+
Где 0 обозначает нулевой блок. Прямая сумма обозначается $L = M \bigoplus N$.
Copy file name to clipboardExpand all lines: tex/RPQ.tex
+192Lines changed: 192 additions & 0 deletions
Original file line number
Diff line number
Diff line change
@@ -12,6 +12,198 @@ \section{Достижимость с несколькими источникам
12
12
13
13
Достижимость от нескольких стартовых вершин через обход в ширину, основанный на линейной алгебре~\cite{9286186}.
14
14
15
+
В классической версии обхода в ширину, основанного на линейной алгебре, используется вектор, куда записывается фронт обхода графа. Так, один раз перемножая этот вектор на матрицу смежности графа, можно совершать один шаг в обходе графа. Покажем на примере, как данный метод может быть использован, когда мы накладываем формальные ограничения на путь в графе.
Для синхронизации обхода составим блочно---диагональную матрицу как прямую сумму матриц $R_{0\_A}$, $G_{0\_A}$ и $R_{0\_B}$, $G_{0\_B}$ соответственно.
Допустим, что стартовыми вершинами в графе будут выбраны вершины 0 и 3.
109
+
Теперь создадим вектор $v = $\fbox{1 1 1} \fbox{1 0 0 1}, где в первой части стоят три единицы, соответствующие каждому состоянию автомата, в котором мы можем находиться. Во второй части содержится фронт обхода графа, на данном шаге это стартовые вершины.
110
+
111
+
Получим новый фронт.
112
+
\begin{alignat*}{7}
113
+
& \begin{matrix}
114
+
\fbox{1 1 1} \fbox{1 0 0 1}
115
+
\end{matrix} && \begin{pmatrix}
116
+
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
117
+
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
118
+
0 & 1 & 0 & 0 & 0 & 0 & 0 \\
119
+
0 & 0 & 0 & 0 & 1 & 0 & 0 \\
120
+
0 & 0 & 0 & 0 & 0 & 1 & 0 \\
121
+
0 & 0 & 0 & 1 & 0 & 0 & 0 \\
122
+
0 & 0 & 0 & 0 & 0 & 0 & 0
123
+
\end{pmatrix} &&= \begin{matrix}
124
+
\fbox{0 1 0} \fbox{0 1 0 0}
125
+
\end{matrix}
126
+
\end{alignat*}
127
+
128
+
\begin{alignat*}{7}
129
+
& \begin{matrix}
130
+
\fbox{1 1 1} \fbox{1 0 0 1}
131
+
\end{matrix} && \begin{pmatrix}
132
+
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
133
+
1 & 0 & 0 & 0 & 0 & 0 & 0 \\
134
+
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
135
+
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
136
+
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
137
+
0 & 0 & 0 & 0 & 0 & 0 & 1 \\
138
+
0 & 0 & 0 & 0 & 0 & 1 & 0
139
+
\end{pmatrix} &&= \begin{matrix}
140
+
\fbox{1 0 0} \fbox{0 0 1 0}
141
+
\end{matrix}
142
+
\end{alignat*}
143
+
144
+
Тем самым, \fbox{0 1 0} \fbox{0 1 0 0} + \fbox{1 0 0} \fbox{0 0 1 0} = \fbox{1 1 0} \fbox{0 1 1 0}. То есть в наш фронт \fbox{0 1 1 0} попали вершины 1 и 2.
145
+
Однако вершина 1 лишняя, так как на первом шаге мы должны были пройти только по ребрам с меткой $b$. Это произошло, потому что в векторе $v$ не хранится информация о текущем состоянии в автомате.
146
+
147
+
Для этого в разработанном алгоритме предлагается расклеить $v$ в матрицу из трех векторов.
148
+
\begin{alignat*}{7}
149
+
& &&M &&=\begin{matrix}
150
+
\fbox{1 0 0} \fbox{1 0 0 1} \\
151
+
\fbox{0 1 0} \fbox{1 0 0 1} \\
152
+
\fbox{0 0 1} \fbox{1 0 0 1}
153
+
\end{matrix}
154
+
\end{alignat*}
155
+
156
+
И совершать обход следующим образом.
157
+
\begin{alignat*}{7}
158
+
& \begin{matrix}
159
+
\fbox{1 0 0} \fbox{1 0 0 1} \\
160
+
\fbox{0 1 0} \fbox{1 0 0 1} \\
161
+
\fbox{0 0 1} \fbox{1 0 0 1}
162
+
\end{matrix} && \begin{pmatrix}
163
+
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
164
+
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
165
+
0 & 1 & 0 & 0 & 0 & 0 & 0 \\
166
+
0 & 0 & 0 & 0 & 1 & 0 & 0 \\
167
+
0 & 0 & 0 & 0 & 0 & 1 & 0 \\
168
+
0 & 0 & 0 & 1 & 0 & 0 & 1 \\
169
+
0 & 0 & 0 & 0 & 0 & 1 & 0
170
+
\end{pmatrix} &&= \begin{matrix}
171
+
\fbox{0 0 0} \fbox{0 1 0 0} \\
172
+
\fbox{0 0 0} \fbox{0 1 0 0} \\
173
+
\fbox{0 1 0} \fbox{0 1 0 0}
174
+
\end{matrix}
175
+
\end{alignat*}
176
+
177
+
\begin{alignat*}{7}
178
+
& \begin{matrix}
179
+
\fbox{1 0 0} \fbox{1 0 0 1} \\
180
+
\fbox{0 1 0} \fbox{1 0 0 1} \\
181
+
\fbox{0 0 1} \fbox{1 0 0 1}
182
+
\end{matrix} && \begin{pmatrix}
183
+
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
184
+
1 & 0 & 0 & 0 & 0 & 0 & 0 \\
185
+
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
186
+
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
187
+
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
188
+
0 & 0 & 0 & 0 & 0 & 0 & 1 \\
189
+
0 & 0 & 0 & 0 & 0 & 1 & 0
190
+
\end{pmatrix} &&= \begin{matrix}
191
+
\fbox{0 0 0} \fbox{0 0 1 0} \\
192
+
\fbox{1 0 0} \fbox{0 0 1 0} \\
193
+
\fbox{0 0 0} \fbox{0 0 1 0}
194
+
\end{matrix}
195
+
\end{alignat*}
196
+
\end{example}
197
+
198
+
Видно, что к вершине 2 можно прийти из нулевого состояния автомата \fbox{1 0 0} \fbox{0 0 1 0}, а к вершине 1 из первого \fbox{0 1 0} \fbox{0 1 0 0}.
199
+
200
+
Теперь левая часть матрицы $M$ неизменяема, так как каждая её строчка содержит информацию о том, из какого состояния автомата достигаются вершины фронта.
201
+
Правая часть матрицы $M$ содержит этот фронт.e
202
+
203
+
204
+
Перейдем к формальному описанию алгоритма.
205
+
206
+
15
207
Алгоритм принимает на вход граф $\mathcal{G}$, детерминированный конечный автомат $\mathcal{R}$, описывающий регулярную грамматику, и множество начальных вершин $V_{src}$ графа.
16
208
17
209
Граф $\mathcal{G}$ и автомат $\mathcal{R}$ можно представить в виде булевых матриц смежности. Так, в виде словаря для каждой метки графа заводится булева матрица смежности, на месте $(i, j)$ ячейки которой стоит 1, если $i$ и $j$ вершины графа соединены ребром данной метки. Такая же операция проводится для автомата грамматики $\mathcal{R}$.
0 commit comments