Sat Average
-
Upload
stas-fomin -
Category
Documents
-
view
315 -
download
2
Transcript of Sat Average
![Page 1: Sat Average](https://reader034.fdocuments.us/reader034/viewer/2022052123/558de59e1a28ab07438b4710/html5/thumbnails/1.jpg)
Полиномиальный в среднем алгоритм для «SAT»
Н.Н. Кузюрин С.А. Фомин
10 октября 2008 г.
Алгоритм динамическогопрограммирования для задачи «SAT»(«Выполнимость»). Полиномиальностьалгоритма «в среднем».
1 / 33
![Page 2: Sat Average](https://reader034.fdocuments.us/reader034/viewer/2022052123/558de59e1a28ab07438b4710/html5/thumbnails/2.jpg)
Полиномиальность в среднемОпределение
«Полиномиальный в среднем (точно)»Алгоритм A называется полиномиальным в среднем, если среднеевремя его работы ограничено полиномом от длины входа, т.е.существует константа c > 0, такая, что En TA = O(nc).
УпражнениеПриведите пример функции TA (времени работы некоторогоалгоритма A) и распределения исходных данных Pn(I ), для которыхTA является полиномиальной в среднем (En TA = O(nc)), а T 2
A — нет.
Определение
«Полиномиальный в среднем»Алгоритм называется полиномиальным в среднем, если существуетконстанта ε > 0, такая, что En T ε = O(n), где T — время работыалгоритма. 2 / 33
![Page 3: Sat Average](https://reader034.fdocuments.us/reader034/viewer/2022052123/558de59e1a28ab07438b4710/html5/thumbnails/3.jpg)
Полиномиальность в среднемОпределение
«Полиномиальный в среднем (точно)»Алгоритм A называется полиномиальным в среднем, если среднеевремя его работы ограничено полиномом от длины входа, т.е.существует константа c > 0, такая, что En TA = O(nc).
УпражнениеПриведите пример функции TA (времени работы некоторогоалгоритма A) и распределения исходных данных Pn(I ), для которыхTA является полиномиальной в среднем (En TA = O(nc)), а T 2
A — нет.
Определение
«Полиномиальный в среднем»Алгоритм называется полиномиальным в среднем, если существуетконстанта ε > 0, такая, что En T ε = O(n), где T — время работыалгоритма. 3 / 33
![Page 4: Sat Average](https://reader034.fdocuments.us/reader034/viewer/2022052123/558de59e1a28ab07438b4710/html5/thumbnails/4.jpg)
Полиномиальность в среднемОпределение
«Полиномиальный в среднем (точно)»Алгоритм A называется полиномиальным в среднем, если среднеевремя его работы ограничено полиномом от длины входа, т.е.существует константа c > 0, такая, что En TA = O(nc).
УпражнениеПриведите пример функции TA (времени работы некоторогоалгоритма A) и распределения исходных данных Pn(I ), для которыхTA является полиномиальной в среднем (En TA = O(nc)), а T 2
A — нет.
Определение
«Полиномиальный в среднем»Алгоритм называется полиномиальным в среднем, если существуетконстанта ε > 0, такая, что En T ε = O(n), где T — время работыалгоритма. 4 / 33
![Page 5: Sat Average](https://reader034.fdocuments.us/reader034/viewer/2022052123/558de59e1a28ab07438b4710/html5/thumbnails/5.jpg)
Задача «SAT» («Выполнимость»)Задача
«Выполнимость/SAT»a. Дано булевское выражение, являющеесяконьюнктивной нормальной формой (КНФ):
CNF =m∧
i=1
Ci , (1)
где Ci — элементарные дизъюнкции вида
xσ1j1∨ . . . ∨ xσk
jk, (2)
1 ≤ k ≤ n, σj ∈ {0, 1}, x1 = x и x0 = (¬x).Существует ли (булевский) набор переменных xj , обращающий этуформу в 1 (т.е. в «Истину»)?
aВ англоязычной литературе — Satisfiability или просто SAT.
5 / 33
![Page 6: Sat Average](https://reader034.fdocuments.us/reader034/viewer/2022052123/558de59e1a28ab07438b4710/html5/thumbnails/6.jpg)
Как решать?
1 Перебор всех входных наборов x = {x1, . . . , xn}, пока CNF (x) = 0.⇒ В худшем случае (CNF невыполнима) надо перебрать 2n
наборов x .2 Подсчитать количество невыполнимых наборов — |X0|,
X0 = {x : CNF (x) = 0}. Если |X0| = 2n ⇔ CNF — невыполнима.
Как подсчитать |X0|, более эффективно, нежели перебором x?
6 / 33
![Page 7: Sat Average](https://reader034.fdocuments.us/reader034/viewer/2022052123/558de59e1a28ab07438b4710/html5/thumbnails/7.jpg)
Как решать?
1 Перебор всех входных наборов x = {x1, . . . , xn}, пока CNF (x) = 0.⇒ В худшем случае (CNF невыполнима) надо перебрать 2n
наборов x .2 Подсчитать количество невыполнимых наборов — |X0|,
X0 = {x : CNF (x) = 0}. Если |X0| = 2n ⇔ CNF — невыполнима.
Как подсчитать |X0|, более эффективно, нежели перебором x?
7 / 33
![Page 8: Sat Average](https://reader034.fdocuments.us/reader034/viewer/2022052123/558de59e1a28ab07438b4710/html5/thumbnails/8.jpg)
Как решать?
1 Перебор всех входных наборов x = {x1, . . . , xn}, пока CNF (x) = 0.⇒ В худшем случае (CNF невыполнима) надо перебрать 2n
наборов x .2 Подсчитать количество невыполнимых наборов — |X0|,
X0 = {x : CNF (x) = 0}. Если |X0| = 2n ⇔ CNF — невыполнима.
Как подсчитать |X0|, более эффективно, нежели перебором x?
8 / 33
![Page 9: Sat Average](https://reader034.fdocuments.us/reader034/viewer/2022052123/558de59e1a28ab07438b4710/html5/thumbnails/9.jpg)
Формула включений-исключений
CNF (x) = 0 ⇒ одна или несколько скобок-дизъюнкций Cj(x) = 0.Для подсчета мощности объединения пересекающихся множествприменяется комбинаторная формула включений-исключений
∣∣∣∣∣n⋃
i=1
Ai
∣∣∣∣∣ =n∑
i=1
|Ai | −∑
i ,j : i<j
|Ai ∩ Aj |+
+∑
i ,j ,k : i<j<k
|Ai ∩ Aj ∩ Ak | − · · · · · · (−1)n−1 |A1 ∩ · · · ∩ An| .
В нашем случае Ai обозначает множество наборов, для которых i-яскобка Ci равна нулю, поэтому
|X0| = | ∪mi=1 Ai |.
9 / 33
![Page 10: Sat Average](https://reader034.fdocuments.us/reader034/viewer/2022052123/558de59e1a28ab07438b4710/html5/thumbnails/10.jpg)
Скобки, литералы, покрытие
Определение
Литерал — каждое вхождение переменной xi (или ее отрицания)в скобку. Например, для (x1 ∨ x2) ∧ (x1 ∨ x3) литералами будутx1, x2, x1, x3.
Рассмотрим некоторое подмножество из k скобок S = {Cj1 , . . . ,Cjk}.LitS — литералы S , все литералы lit = {xi , xi}, входящие в S .
CovS — покрытие S , все переменные xi , входящие в S .
10 / 33
![Page 11: Sat Average](https://reader034.fdocuments.us/reader034/viewer/2022052123/558de59e1a28ab07438b4710/html5/thumbnails/11.jpg)
Зависимые и независимые множества скобок.CNF (x) = 0 ⇒ одна или несколько скобок-дизъюнкций Cj(x) = 0.Рассмотрим некоторое подмножество из k скобок S = {Cj1 , . . . ,Cjk}.Когда все скобки в S будут равны нулю?⇒ ZS(x) = 1, где
ZS(x) =k∧
i=1
Cji =k∧
i=1
∨lit∈Cji
lit =k∧
i=1
∧lit∈Cji
lit =∧
lit∈LitS
lit
Т.е. ZS(x) = 1 ⇔ ∀lit ∈ S lit(x) = 0.Множество S может быть:
зависимое — ∃i : литералы xi ∈ S и xi ∈ S ⇒ ZS ≡ 0.|x : ZS(x) = 1| = 0.
независимое — @i : xi ∈ S и xi ∈ S . Следовательно, ZS(x) = 1 ⇒∀xi ∈ CovS значение определено.|x : ZS(x) = 1| = 2n−|CovS | = 2n−|LitS |.
11 / 33
![Page 12: Sat Average](https://reader034.fdocuments.us/reader034/viewer/2022052123/558de59e1a28ab07438b4710/html5/thumbnails/12.jpg)
Зависимые и независимые множества скобок.CNF (x) = 0 ⇒ одна или несколько скобок-дизъюнкций Cj(x) = 0.Рассмотрим некоторое подмножество из k скобок S = {Cj1 , . . . ,Cjk}.Когда все скобки в S будут равны нулю?⇒ ZS(x) = 1, где
ZS(x) =k∧
i=1
Cji =k∧
i=1
∨lit∈Cji
lit =k∧
i=1
∧lit∈Cji
lit =∧
lit∈LitS
lit
Т.е. ZS(x) = 1 ⇔ ∀lit ∈ S lit(x) = 0.Множество S может быть:
зависимое — ∃i : литералы xi ∈ S и xi ∈ S ⇒ ZS ≡ 0.|x : ZS(x) = 1| = 0.
независимое — @i : xi ∈ S и xi ∈ S . Следовательно, ZS(x) = 1 ⇒∀xi ∈ CovS значение определено.|x : ZS(x) = 1| = 2n−|CovS | = 2n−|LitS |.
12 / 33
![Page 13: Sat Average](https://reader034.fdocuments.us/reader034/viewer/2022052123/558de59e1a28ab07438b4710/html5/thumbnails/13.jpg)
Зависимые и независимые множества скобок.CNF (x) = 0 ⇒ одна или несколько скобок-дизъюнкций Cj(x) = 0.Рассмотрим некоторое подмножество из k скобок S = {Cj1 , . . . ,Cjk}.Когда все скобки в S будут равны нулю?⇒ ZS(x) = 1, где
ZS(x) =k∧
i=1
Cji =k∧
i=1
∨lit∈Cji
lit =k∧
i=1
∧lit∈Cji
lit =∧
lit∈LitS
lit
Т.е. ZS(x) = 1 ⇔ ∀lit ∈ S lit(x) = 0.Множество S может быть:
зависимое — ∃i : литералы xi ∈ S и xi ∈ S ⇒ ZS ≡ 0.|x : ZS(x) = 1| = 0.
независимое — @i : xi ∈ S и xi ∈ S . Следовательно, ZS(x) = 1 ⇒∀xi ∈ CovS значение определено.|x : ZS(x) = 1| = 2n−|CovS | = 2n−|LitS |.
13 / 33
![Page 14: Sat Average](https://reader034.fdocuments.us/reader034/viewer/2022052123/558de59e1a28ab07438b4710/html5/thumbnails/14.jpg)
Зависимые и независимые множества скобок.CNF (x) = 0 ⇒ одна или несколько скобок-дизъюнкций Cj(x) = 0.Рассмотрим некоторое подмножество из k скобок S = {Cj1 , . . . ,Cjk}.Когда все скобки в S будут равны нулю?⇒ ZS(x) = 1, где
ZS(x) =k∧
i=1
Cji =k∧
i=1
∨lit∈Cji
lit =k∧
i=1
∧lit∈Cji
lit =∧
lit∈LitS
lit
Т.е. ZS(x) = 1 ⇔ ∀lit ∈ S lit(x) = 0.Множество S может быть:
зависимое — ∃i : литералы xi ∈ S и xi ∈ S ⇒ ZS ≡ 0.|x : ZS(x) = 1| = 0.
независимое — @i : xi ∈ S и xi ∈ S . Следовательно, ZS(x) = 1 ⇒∀xi ∈ CovS значение определено.|x : ZS(x) = 1| = 2n−|CovS | = 2n−|LitS |.
14 / 33
![Page 15: Sat Average](https://reader034.fdocuments.us/reader034/viewer/2022052123/558de59e1a28ab07438b4710/html5/thumbnails/15.jpg)
Зависимые и независимые множества скобок.CNF (x) = 0 ⇒ одна или несколько скобок-дизъюнкций Cj(x) = 0.Рассмотрим некоторое подмножество из k скобок S = {Cj1 , . . . ,Cjk}.Когда все скобки в S будут равны нулю?⇒ ZS(x) = 1, где
ZS(x) =k∧
i=1
Cji =k∧
i=1
∨lit∈Cji
lit =k∧
i=1
∧lit∈Cji
lit =∧
lit∈LitS
lit
Т.е. ZS(x) = 1 ⇔ ∀lit ∈ S lit(x) = 0.Множество S может быть:
зависимое — ∃i : литералы xi ∈ S и xi ∈ S ⇒ ZS ≡ 0.|x : ZS(x) = 1| = 0.
независимое — @i : xi ∈ S и xi ∈ S . Следовательно, ZS(x) = 1 ⇒∀xi ∈ CovS значение определено.|x : ZS(x) = 1| = 2n−|CovS | = 2n−|LitS |.
15 / 33
![Page 16: Sat Average](https://reader034.fdocuments.us/reader034/viewer/2022052123/558de59e1a28ab07438b4710/html5/thumbnails/16.jpg)
Подсчет «нулевых» наборов
CNF (x) = 0 ⇒ ∃ независимое S , ⇒ построим все независимые S ,и для них посчитаем число «обнуляющих» наборов 2n−|LitS |.Как суммировать?
ЛеммаЛюбое подмножество независимого множества — независимо.
16 / 33
![Page 17: Sat Average](https://reader034.fdocuments.us/reader034/viewer/2022052123/558de59e1a28ab07438b4710/html5/thumbnails/17.jpg)
Подсчет «нулевых» наборов
CNF (x) = 0 ⇒ ∃ независимое S , ⇒ построим все независимые S ,и для них посчитаем число «обнуляющих» наборов 2n−|LitS |.Как суммировать?
ЛеммаЛюбое подмножество независимого множества — независимо.
17 / 33
![Page 18: Sat Average](https://reader034.fdocuments.us/reader034/viewer/2022052123/558de59e1a28ab07438b4710/html5/thumbnails/18.jpg)
Подсчет «нулевых» наборов
CNF (x) = 0 ⇒ ∃ независимое S , ⇒ построим все независимые S ,и для них посчитаем число «обнуляющих» наборов 2n−|LitS |.Как суммировать?
ЛеммаЛюбое подмножество независимого множества — независимо.
18 / 33
![Page 19: Sat Average](https://reader034.fdocuments.us/reader034/viewer/2022052123/558de59e1a28ab07438b4710/html5/thumbnails/19.jpg)
Далее удобно разбить все независимые множества на «k-слои» Nk :независимые множества с k скобками, и организовать суммированиевключений-исключений по этим слоям:
|X0| =m∑
k=1
(−1)k−1 ·∑S∈Nk
2n−|LitS |.
19 / 33
![Page 20: Sat Average](https://reader034.fdocuments.us/reader034/viewer/2022052123/558de59e1a28ab07438b4710/html5/thumbnails/20.jpg)
Формула «включений/исключений»
x : Z{C1} = 1
x : Z{C2} = 1
x : Z{C3} = 1
C1,C2
C1,C2,C3
C2,C3
C1,C3
Формула «включений/исключений»:
|X0| = Σmk=1ΣS∈Nk
(−1)k · 2n−|LitS |.
20 / 33
![Page 21: Sat Average](https://reader034.fdocuments.us/reader034/viewer/2022052123/558de59e1a28ab07438b4710/html5/thumbnails/21.jpg)
Построение независимых множеств
Nk+1 строится из Nk
for all Cj ∈ {C1, . . . ,Cm} dofor all S ∈ Nk do
LitS ′ ← LitSfor all lit ∈ Cj do
if lit /∈ LitS ′ thenLitS ′ ← LitS ′ ∪ lit
elseотбрасываем зависимое Cj + S .
end ifend for
end forend for
21 / 33
![Page 22: Sat Average](https://reader034.fdocuments.us/reader034/viewer/2022052123/558de59e1a28ab07438b4710/html5/thumbnails/22.jpg)
def SatDynP (CNF) :
size← 0 # счетчик выполняющих КНФ наборовn← CNF.numberOfVariables () # число переменных в КНФT ← {CNF.getEmptySetOfBraces () : CNF.getEmptySetOfLiterals ()}for (k, dummy) ∈ enumerate (CNF) : # цикл по слоям
S ← {} # новый слой независимых множествfor j ,C ∈ enumerate (CNF) : # цикл по скобкам
for t ∈ T : # цикл по независимым множествамif j 6∈ t : # если скобки в множестве нет
s ← t + j # добавляем её к множествуif s 6∈ S : # в слое S нет такого множества?
lit← copy (T [t]) # наследуем литералы из t
for x ∈ C : # для каждого литерала в C
ok← −x 6∈ lit # x совместен с другими?if ¬ok : breaklit.add (x)
if ok ∧ len (lit) > len (T [t]) :
S [s]← lit # да, s —независимоеsize← size + 2 ** (n − len (lit)) ∗ (−1) ** k
T ← S
return size 22 / 33
![Page 23: Sat Average](https://reader034.fdocuments.us/reader034/viewer/2022052123/558de59e1a28ab07438b4710/html5/thumbnails/23.jpg)
CNF = (x2 ∨ x3 ∨ x1) ∧ (x3 ∨ x2) ∧ (x1 ∨ x3) ∧ (x1 ∨ x2 ∨ x4)
k size T
0 0 {}: {}1 12 {C0}: {x2, x3, x1}, {C3}: {x1, x2, x4}, {C1}: {x3, x2}, {C2}: {x1, x3}2 11 {C2, C3}: {x1, x2, x4, x3}3 11
end 1111 < 24 → КНФ выполнима.
CNF = (x3 ∨ x2) ∧ (x1 ∨ x3) ∧ (x3 ∨ x1) ∧ (x2 ∨ x3)
k size T
0 0 {}: {}1 8 {C0}: {x3, x2}, {C3}: {x2, x3}, {C1}: {x1, x3}, {C2}: {x3, x1}2 83 8
end 88 = 23 → КНФ невыполнима.
23 / 33
![Page 24: Sat Average](https://reader034.fdocuments.us/reader034/viewer/2022052123/558de59e1a28ab07438b4710/html5/thumbnails/24.jpg)
ЛеммаСложность алгоритма в наихудшем случае — O(m2n ·maxk |Nk |).
УпражнениеКакие входные данные для этого алгоритма заставят его работатьэкспоненциально долго?
УпражнениеНа каких входных данных время работы этого алгоритма будет O(m)?
ТеоремаПусть для каждой скобки вероятность появления каждой из nпеременных (или ее отрицания) равна p, причем
np2 ≥ ln m.
Тогда алгоритм является полиномиальным в среднем.
24 / 33
![Page 25: Sat Average](https://reader034.fdocuments.us/reader034/viewer/2022052123/558de59e1a28ab07438b4710/html5/thumbnails/25.jpg)
ЛеммаСложность алгоритма в наихудшем случае — O(m2n ·maxk |Nk |).
УпражнениеКакие входные данные для этого алгоритма заставят его работатьэкспоненциально долго?
УпражнениеНа каких входных данных время работы этого алгоритма будет O(m)?
ТеоремаПусть для каждой скобки вероятность появления каждой из nпеременных (или ее отрицания) равна p, причем
np2 ≥ ln m.
Тогда алгоритм является полиномиальным в среднем.
25 / 33
![Page 26: Sat Average](https://reader034.fdocuments.us/reader034/viewer/2022052123/558de59e1a28ab07438b4710/html5/thumbnails/26.jpg)
ЛеммаСложность алгоритма в наихудшем случае — O(m2n ·maxk |Nk |).
УпражнениеКакие входные данные для этого алгоритма заставят его работатьэкспоненциально долго?
УпражнениеНа каких входных данных время работы этого алгоритма будет O(m)?
ТеоремаПусть для каждой скобки вероятность появления каждой из nпеременных (или ее отрицания) равна p, причем
np2 ≥ ln m.
Тогда алгоритм является полиномиальным в среднем.
26 / 33
![Page 27: Sat Average](https://reader034.fdocuments.us/reader034/viewer/2022052123/558de59e1a28ab07438b4710/html5/thumbnails/27.jpg)
ЛеммаСложность алгоритма в наихудшем случае — O(m2n ·maxk |Nk |).
УпражнениеКакие входные данные для этого алгоритма заставят его работатьэкспоненциально долго?
УпражнениеНа каких входных данных время работы этого алгоритма будет O(m)?
ТеоремаПусть для каждой скобки вероятность появления каждой из nпеременных (или ее отрицания) равна p, причем
np2 ≥ ln m.
Тогда алгоритм является полиномиальным в среднем.
27 / 33
![Page 28: Sat Average](https://reader034.fdocuments.us/reader034/viewer/2022052123/558de59e1a28ab07438b4710/html5/thumbnails/28.jpg)
ДоказательствоSk — некоторое множество скобок, |Sk | = k ;
pi (Sk) — P[в Sk нет одновременно xi и ¬xi ];P(Sk) — P[Sk — независимое].
pi (Sk) = (1− p)k + (1− p)k − (1− p)2k = (1− p)k(2− (1− p)k) ≤≤ (1− p)k(1 + kp) ≤ (1− p)k(1 + p)k = (1− p2)k .
P(Sk) =n∏
i=1
pi (Sk) ≤ (1− p2)kn.
E |Nk | ≤m∑
k=1
(m
k
)P(Sk) ≤
m∑k=1
(m
k
)(1− p2)kn ≤
≤m∑
k=1
mk exp{−np2k} ≤m∑
k=1
exp{k(ln m − np2)} ≤m∑
k=1
1 ≤ m.
28 / 33
![Page 29: Sat Average](https://reader034.fdocuments.us/reader034/viewer/2022052123/558de59e1a28ab07438b4710/html5/thumbnails/29.jpg)
ДоказательствоSk — некоторое множество скобок, |Sk | = k ;
pi (Sk) — P[в Sk нет одновременно xi и ¬xi ];P(Sk) — P[Sk — независимое].
pi (Sk) = (1− p)k + (1− p)k − (1− p)2k = (1− p)k(2− (1− p)k) ≤≤ (1− p)k(1 + kp) ≤ (1− p)k(1 + p)k = (1− p2)k .
P(Sk) =n∏
i=1
pi (Sk) ≤ (1− p2)kn.
E |Nk | ≤m∑
k=1
(m
k
)P(Sk) ≤
m∑k=1
(m
k
)(1− p2)kn ≤
≤m∑
k=1
mk exp{−np2k} ≤m∑
k=1
exp{k(ln m − np2)} ≤m∑
k=1
1 ≤ m.
29 / 33
![Page 30: Sat Average](https://reader034.fdocuments.us/reader034/viewer/2022052123/558de59e1a28ab07438b4710/html5/thumbnails/30.jpg)
ДоказательствоSk — некоторое множество скобок, |Sk | = k ;
pi (Sk) — P[в Sk нет одновременно xi и ¬xi ];P(Sk) — P[Sk — независимое].
pi (Sk) = (1− p)k + (1− p)k − (1− p)2k = (1− p)k(2− (1− p)k) ≤≤ (1− p)k(1 + kp) ≤ (1− p)k(1 + p)k = (1− p2)k .
P(Sk) =n∏
i=1
pi (Sk) ≤ (1− p2)kn.
E |Nk | ≤m∑
k=1
(m
k
)P(Sk) ≤
m∑k=1
(m
k
)(1− p2)kn ≤
≤m∑
k=1
mk exp{−np2k} ≤m∑
k=1
exp{k(ln m − np2)} ≤m∑
k=1
1 ≤ m.
30 / 33
![Page 31: Sat Average](https://reader034.fdocuments.us/reader034/viewer/2022052123/558de59e1a28ab07438b4710/html5/thumbnails/31.jpg)
ДоказательствоSk — некоторое множество скобок, |Sk | = k ;
pi (Sk) — P[в Sk нет одновременно xi и ¬xi ];P(Sk) — P[Sk — независимое].
pi (Sk) = (1− p)k + (1− p)k − (1− p)2k = (1− p)k(2− (1− p)k) ≤≤ (1− p)k(1 + kp) ≤ (1− p)k(1 + p)k = (1− p2)k .
P(Sk) =n∏
i=1
pi (Sk) ≤ (1− p2)kn.
E |Nk | ≤m∑
k=1
(m
k
)P(Sk) ≤
m∑k=1
(m
k
)(1− p2)kn ≤
≤m∑
k=1
mk exp{−np2k} ≤m∑
k=1
exp{k(ln m − np2)} ≤m∑
k=1
1 ≤ m.
31 / 33
![Page 32: Sat Average](https://reader034.fdocuments.us/reader034/viewer/2022052123/558de59e1a28ab07438b4710/html5/thumbnails/32.jpg)
�Карта памяти� лекции
32 / 33