summaryrefslogtreecommitdiff
path: root/lab2/report/tmp/algo.tex
blob: fb8b5d87bed0fc375ef1c85c9212c1056cb9fbf6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
\subsection{Построение эквивалентного замыкания}

\textit{Вход}: Матрица бинарного отношения $A = (a_{ij})$ размерности $n \times
n$.

\textit{Выход}: Матрица бинарного отношения $A' = (a'_{ij})$ с построенным на
нем эквивалентным замыканием.

\begin{enumerate}
  \item
    Построить рефлексивное замыкание на бинарном отношении с матрицей $A =
    (a_{ij})$ с помощью соответствующего алгоритма, описанного в лабораторной
    работе №1. Полученную матрицу бинарного отношения обозначить как $A_1 =
    (a_{ij})$.
  \item
    Построить симметричное замыкание на бинарном отношении с матрицей $A_1 =
    (a_{ij})$ с помощью соответствующего алгоритма, описанного в лабораторной
    работе №1. Полученную матрицу бинарного отношения обозначить как $A_2 =
    (a_{ij})$.
  \item
    Построить транзитивное замыкание на бинарном отношении с матрицей $A_2 =
    (a_{ij})$ с помощью соответствующего алгоритма, описанного в лабораторной
    работе №1. Полученную матрицу бинарного отношения обозначить как $A' =
    (a'_{ij})$.
  \item
    Согласно пункту 4 леммы 1 о замыканиях бинарных отношений, построенное
    замыкание на данном бинарном отношении, определяемым матрицей, является
    эквивалентным. Далее вернуть полученную матрицу $A' = (a'_{ij})$.
\end{enumerate}

Трудоёмкость алгоритма "--- $O(n^4)$.


\subsection{Построение системы представителей фактор-множества}

\textit{Вход}: Матрица бинарного отношения $A = (a_{ij})$ размерности $n \times
n$.

\textit{Выход}: Система представителей $T$ фактор-множества $A/\varepsilon$
бинарного отношения $\varepsilon$ на множестве $A$.

\begin{enumerate}
  \item
    Получить фактор-множество $A/\varepsilon$ бинарного отношения $\varepsilon$
    для множества $A$. Для этого нужно получить классы эквивалентности
    $\varepsilon(a)$, которые являются срезами по элементам множества $A$.
    Срезом по каждому элементу $a \in A$ является совокупность таких элементов
    множества $A$, значения которых в строке матрицы, определяющей связи между
    элементом $a$ и другими элементами множества $A$, равны единице. Для этого
    проверим элементы $a_{ij}$ матрицы $A$, и если $a_{ij} = 1$, где $0 \leq i,
    j \leq n - 1$, то добавить значение $j$ в список, определяющий срез по
    элементу $i$. В результате полученная совокупность всех таких срезов,
    являющихся классами эквивалентности $\{[a]: a \in A\}$, будет определять
    фактор-множество $A/\varepsilon$ бинарного отношения $A$.
  \item
    Отсортировать фактор-множество по возрастанию количества элементов в классах
    эквивалентности.
  \item
    Проходясь по каждому элементу $a$ каждого класса эквивалентности $[a]$
    проверять: если элемент $a$ класса эквивалентности не находится в системе
    представителей - добавить элемент в систему представителей как представителя
    класса эквивалентности $[a]$, иначе - пропустить элемент.
  \item
    Вернуть полученную систему представителей.
\end{enumerate}

Трудоёмкость алгоритма "--- $O(n^2)$.


\subsection{Вычисление минимального элемента множества}

\textit{Вход}: Матрица бинарного отношения $A = (a_{ij})$ размерности $n \times
n$.

\textit{Выход}: Список минимальных элементов $L$ упорядоченного множества $(A,
\leq)$.

\begin{enumerate}
  \item
    Определяем пустой список $L$.
  \item
    Пройти по элементам $a_{ij}$ матрицы $A$ (где $0 \leq i, j \leq n - 1$), и
    для каждой строки определять переменную $f$, которая будет изначально равна
    \textbf{True}. Если $a_{ji} \neq 0$ и $i \neq j$, то переменная $f$
    становится равной \textbf{False} (это означает, что $i$-ый элемент множества
    не является минимальным). Если после прохождения по значениям $i$-ой строки
    матрицы значение $f$ осталось равным \textbf{True}, то $i$-ый элемент
    множества является минимальным, и его надо добавить в список $L$.
  \item
    Вернуть список минимальных элементов $L$ упорядоченного множества $(A,
    \leq)$.
\end{enumerate}

Трудоёмкость алгоритма "--- $O(n^2)$.


\subsection{Вычисление максимального элемента множества}

\textit{Вход}: Матрица бинарного отношения $A = (a_{ij})$ размерности $n \times n$.

\textit{Выход}: Список максимальных элементов $L$ упорядоченного множества $(A, \leq)$.

\begin{enumerate}
  \item
    Определяем пустой список $L$.
  \item
    Пройти по элементам $a_{ij}$ матрицы $A$ (где $0 \leq i, j \leq n - 1$), и
    для каждой строки определять переменную $f$, которая будет изначально равна
    \textbf{True}. Если $a_{ij} \neq 0$ и $i \neq j$, то переменная $f$
    становится равной \textbf{False} (это означает, что $i$-ый элемент множества
    не является максимальным). Если после прохождения по значениям $i$-ой строки
    матрицы значение $f$ осталось равным \textbf{True}, то $i$-ый элемент
    множества является максимальным, и его надо добавить в список $L$.
  \item
    Вернуть список максимальных элементов $L$ упорядоченного множества $(A,
    \leq)$.
\end{enumerate}

Трудоёмкость алгоритма "--- $O(n^2)$.


\subsection{Вычисление наименьшего элемента множества}

\textit{Вход}: Матрица бинарного отношения $A = (a_{ij})$ размерности $n \times
n$.

\textit{Выход}: Наименьший элемент $a_{min}$ упорядоченного множества $(A,
\leq)$ или <<Ничего>>.

\begin{enumerate}
  \item
    Получить список $L$ минимальных элементов упорядоченного множества $(A,
    \leq)$ с помощью алгоритма 3.3.
  \item
    Руководствуясь \textbf{Леммой 2}, если длина $L$ не равна $1$, вернуть
    <<Ничего>>, иначе - вернуть единственный элемент $a_{min} = l \in L$,
    являющийся наименьшим элементом множества $A$.
\end{enumerate}

Трудоёмкость алгоритма "--- $O(n^2)$.


\subsection{Вычисление наибольшего элемента множества}

\textit{Вход}: Матрица бинарного отношения $A = (a_{ij})$ размерности $n \times n$.

\textit{Выход}: Наибольший элемент $a_{max}$ упорядоченного множества $(A, \leq)$ или ''Ничего''.

\begin{enumerate}
  \item
    Получить список $L$ максимальных элементов упорядоченного множества $(A,
    \leq)$ с помощью алгоритма 3.4.
  \item
    Руководствуясь \textbf{Леммой 2}, если длина $L$ не равна $1$, вернуть
    ''Ничего'', иначе - вернуть единственный элемент $a_{max} = l \in L$,
    являющийся наибольшим элементом множества $A$.
\end{enumerate}
    
Трудоёмкость алгоритма "--- $O(n^2)$.


\subsection{Построение диаграммы Хассе}

\textit{Вход}: Матрица бинарного отношения порядка $A = (a_{ij})$ размерности $n
\times n$.

\textit{Выход}: Список $H$ длиной $n$, характеризующий диаграмму Хассе: каждый
элемент в списке представляет собой три значения: элемент $a \in A$, значение
его уровня $l$ на диаграмме, список $V$ элементов множества $A$, находящихся на
уровне $l + 1$ и связанных с элементом $a$.

\begin{enumerate}
  \item
    Учитывая, что матрице $A = (a_{ij})$ соответствует множество $\overline{A}$
    определяется список $L$, в котором будут храниться значения уровня $l$ для
    каждого элемента $a \in \overline{A}$.  Изначально присвоить всем элементам
    $l \in L$ уровень $1$. Также определить счетчик уровней $p = 0$ и сдвиг по
    элементам множества как $b = 0$.
  \item
    Получить список $L_{min}$ минимальных элементов множества $\overline{A}$ с
    помощью алгоритма 3.3, отправив ему на вход матрицу бинарного отношения
    порядка $A = (a_{ij})$ (при этом не учитывая первые $b$ элементов
    множества). Увеличить значение $p$ на $1$.
  \item
    Если список $L_{min}$ пуст, перейти к шагу $5$. Иначе перейти к шагу $4$.
  \item
    Для каждого элемента $a$ в $L_{min}$ соответствующее ему значение списка $l
    \in L$ сделать равным $p$. Прибавить к сдвигу $b$ значение, равное
    количеству элементов списка $L_{min}$. После этого перейти к шагу $2$.
  \item
    Определить пустой список $V$. Проходясь по элементам списка $L$, где $0 \leq
    k \leq n - 1$, определять для каждого значения $l_k$ пустой список $v_k$
    связанных с элементом $g_k$ элементов множества $G$. Определяя такой список,
    далее брать срез $S$ по атрибутам для конкретного объекта $g_k$ (это
    осуществляется следующим образом: необходимо предварительно транспонировать
    матрицу $B = A^T = (a_{ij})^T = b_{ij}$, затем проверить элементы $b_{ij}$
    матрицы $B$, и если $b_{ij} = 1$, то добавить значение атрибута $m_j$ в
    список, определяющий срез по объекту $g_i$. В результате получить список
    срезов $S_G = \{s_i = [g]: g \in G\}$, откуда необходимо взять срез для
    объекта $g_k$), и затем пройтись по каждому элементу $s_p$ в этом срезе:
    если уровень $l \in L$ очередного элемента в срезе равен $l_p + 1$, то
    добавить элемент $s_p$ в список $v_k$. После этого отсортировать список
    $v_k$ и добавить его в $V$.
  \item
    Создать список $H$ и поместить в него в качестве элемента $h_i \in H$ тройку
    значений: $a_i \in A$, $l_i \in L$, $v_i \in V$, где $0 \leq i \leq n - 1$.
    После этого вернуть список $H$.
\end{enumerate}

Трудоёмкость алгоритма "--- $O(n^3 + n^2) = O(n^3)$.


\subsection{Построение системы замыканий}

\textit{Вход}: Контекст $K = (G, M, \rho)$ с множеством объектов $G$, множеством
атрибутов $M$ и отношением $\rho \subset G \times M$, заданного матрицей $A =
(a_{ij})$ размерности $n \times k$ (где $n$ - количество объектов, $k$ -
количество атрибутов).

\textit{Выход}: Система замыканий $Z_{f_G}$ на множестве $G$.

\begin{enumerate}
  \item
    Определить список $Z_{f_G}$ и положить туда $G$.
  \item
    Получить срезы по атрибутам $m \in M$ с помощью способа, описанного в
    алгоритме 3.2: необходимо предварительно транспонировать матрицу $B = A^T =
    (a_{ij})^T = b_{ij}$, затем проверить элементы $b_{ij}$ матрицы $B$, и если
    $b_{ij} = 1$, где $0 \leq i \leq k - 1$ и $0 \leq j \leq n - 1$, то добавить
    значение объекта $g_j$ в список, определяющий срез по атрибуту $m_i$. В
    результате получить список срезов $S_G = \{s_i = [g]: g \in G\}$, размер
    которого будет $k$.
  \item
    Для каждого атрибута $m_i \in M$: определить список $T$, в который поместить
    $s_i \in S_G$. Далее для каждого замыкания $z_j$ из системы замыканий
    $Z_{f_G}$: получить пересечение множеств $s_i$ и $z_j$ и обозначить его как
    $X = s_i \cap z_j$. Если $X$ не содержится в списке $T$: добавить $X$ в
    список $T$ (всё это осуществляется при $0 \leq i \leq k - 1$). Если $T
    \notin Z_{f_G}$, то положить $T$ в $Z_{f_G}$.
  \item
    Вернуть систему замыканий $Z_{f_G}$ на множестве $G$.
\end{enumerate}

Трудоёмкость алгоритма "--- $O(n^2 + n \cdot k)$.


\subsection{Построение решетки концептов}

\textit{Вход}: Контекст $K = (G, M, \rho)$ с множеством объектов $G$, множеством
атрибутов $M$ и отношением $\rho \subset G \times M$, заданного матрицей $A =
(a_{ij})$ размерности $n \times k$ (где $n$ - количество объектов, $k$ -
количество атрибутов).

\textit{Выход}: Решетка концептов $(C(K), \leq)$.

\begin{enumerate}
  \item
    Построить систему замыканий $Z_{f_G}$ с помощью алгоритма 3.8, отправив ему на
    вход контекст $K = (G, M, \rho)$.
  \item
    Определить пустой список $(C(K), \leq)$.
  \item
    Построить список $P$ следующим образом: если $z_i = \emptyset$, то $P = M$,
    иначе - получить среды по объектам $G$ с помощью способа, описанного в
    алгоритме 3.2: проверить элементы $a_{rt}$ матрицы $A$, и если $a_{rt} = 1$,
    где $0 \leq t \leq k - 1$ и $0 \leq r \leq n - 1$, то добавить значение
    $m_t$ в список, определяющий срез по объекту $g_r$. В результате получить
    список срезов $S_M = \{s_i = [m]: m \in M\}$, размер которого будет $n$.
    Определить пустой список $Y$. Далее для каждого объекта в замыкании $z_i$:
    добавить срез $s_i$, соответствующий конкретному объекту, в список $Y$.
    После этого осуществить пересечение всех срезов $s$, находящихся в списке
    $Y$, и поместить результат пересечения в список $P$. После построения $P$
    добавить пару значений $z_i$ и $P$ в качестве элемента в список $(C(K),
    \leq)$.
  \item
    Проделать шаг 3 для всех элементов $Z_{f_G}$. После этого вернуть
    построенную решетку концептов $(C(K), \leq)$.
\end{enumerate}

Трудоёмкость алгоритма "--- $O(n^2 + n \cdot k + n^3) = O(n \cdot k + n^3)$.