|
|
Строка 40: |
Строка 40: |
| | | |
| '''Замечание.''' Часто используется сведение по Карпу, поэтому слова «относительно сведения по Карпу» обычно опускаются. Например, [[Примеры NP-полных языков. Теорема Кука | NP-полные языки]]. | | '''Замечание.''' Часто используется сведение по Карпу, поэтому слова «относительно сведения по Карпу» обычно опускаются. Например, [[Примеры NP-полных языков. Теорема Кука | NP-полные языки]]. |
| + | |
| + | {{Лемма |
| + | |statement=<tex>(L_1 \leq_{f} L_2) \Rightarrow (\overline {L_1} \leq_{f} \overline {L_2})</tex> |
| + | |proof=Здесь пруф, ога. |
| + | }} |
Версия 15:28, 27 апреля 2012
Эта статья находится в разработке!
Определение: |
Язык [math]L_1[/math] сводится по Карпу к языку [math]L_2[/math] ([math]L_1 \leq L_2[/math]), если существует такая функция [math]f(x)[/math], вычислимая за полиномиальное от длины входа время, что [math]x[/math] принадлежит [math]L_1[/math] тогда и только тогда, когда [math]f(x)[/math] принадлежит [math]L_2[/math]:
[math] (L_1 \leq L_2) \overset{\underset{\mathrm{def}}{}}{\Leftrightarrow} ( \exists f \in P : x \in L_1 \Leftrightarrow f(x) \in L_2 ) [/math]. |
Банальный пример сведения по Карпу
Зададим следующие языки:
- [math]IND[/math] — множество пар вида [math] \langle G, k \rangle [/math], где [math]G[/math] — граф, а [math]k[/math] — число, таких, что в [math]G[/math] есть независимое множество размера [math]k[/math].
- [math]CLIQUE[/math] — множество пар вида [math] \langle G, k \rangle [/math], где [math]G[/math] — граф, а [math]k[/math] — число, такое, что в [math]G[/math] есть клика размера [math]k[/math].
Докажем, что [math]IND \leq CLIQUE[/math].
Рассмотрим функцию [math]f( \langle G, k \rangle ) = \langle \overline{G}, k \rangle[/math], где [math]\overline{G}[/math] — дополнение графа [math]G[/math]. [math]f[/math] вычислима за линейное время от длины входа, если граф представлен в видел матрицы смежности.
- ([math]x \in L_1 \Rightarrow f(x) \in L_2[/math]) Заметим, что, если в [math]G[/math] было независимое множество размера [math]k[/math], то в [math]\overline{G}[/math] будет клика такого же размера (вершины, которые были в независимом множестве, в [math]\overline{G}[/math] попарно соединены рёбрами и образуют клику).
- ([math]x \in L_1 \Leftarrow f(x) \in L_2[/math]) Обратно, если в [math]\overline{G}[/math] есть клика размера [math]k[/math], то в исходном графе было независимое множество размера [math]k[/math].
Таким образом, [math]IND \leq CLIQUE[/math] по определению.
Замечание. Многие другие примеры сведения по Карпу могут быть найдены в статье про примеры NP-полных языков.
Теорема (о транзитивности): |
Сведение по Карпу транзитивно, то есть: [math] ( L_1 \leq L_2, L_2 \leq L_3 ) \Rightarrow L_1 \leq L_3 [/math]. |
Доказательство: |
[math]\triangleright[/math] |
Пусть [math]f[/math] и [math]g[/math] — функции из определения сведения для [math] L_1 \leq L_2 [/math] и [math] L_2 \leq L_3 [/math] соответственно. Из определения следует: [math]x \in L_1 \Leftrightarrow f(x) \in L_2 \Leftrightarrow g(f(x)) \in L_3[/math].
Проверим, что [math]g(f(x))[/math] вычислима за полиномиальное время от [math]|x|[/math]. В самом деле, сначала нужно вычислить [math]f(x)[/math], на это необходимо не более, чем [math]p_1(|x|)[/math] времени ([math]p_1[/math] — полином). Более того, длина входа [math]g[/math] в [math]g(f(x))[/math] не превышает того же [math]p_1(|x|)[/math], так как за единицу времени может быть выведен максимум один символ. Значит, вычисление [math]g[/math] на [math]f(x)[/math] займёт времени не более, чем [math]p_2(|f(x)|)[/math] ([math]p_2[/math] — тоже полином), что, по выше сказанному, не превосходит [math]p_2(p_1(|x|))[/math].
В итоге получаем, что итоговое время работы [math]g(f(x))[/math] не более, чем [math]p_2(p_1(|x|)) + p_1(|x|)[/math], что является полиномом от [math]|x|[/math]. |
[math]\triangleleft[/math] |
Определение: |
[math]C[/math] — сложностный класс, [math]\widetilde{D}[/math] — сведение. Язык [math]L[/math] называется [math]C[/math]-трудным относительно сведения [math]\widetilde{D}[/math] ([math]C[/math]-hard), если любой язык [math]M[/math] из [math]C[/math] сводится по [math]\widetilde{D}[/math] к [math]L[/math]:
[math] (L [/math] — [math]C[/math]-hard [math]) \overset{\underset{\mathrm{def}}{}}{\Leftrightarrow} ( \forall M \in C \Rightarrow M \leq_{f} L, f \in \widetilde{D} ) [/math]. |
Определение: |
[math]C[/math] — сложностный класс, [math]\widetilde{D}[/math] — сведение. Язык [math]L[/math] называется [math]C[/math]-полным относительно сведения [math]\widetilde{D}[/math] ([math]C[/math]-complete), если [math]L[/math] является [math]C[/math]-трудным относительно сведения [math]\widetilde{D}[/math] и сам лежит в [math]C[/math]. |
Замечание. Часто используется сведение по Карпу, поэтому слова «относительно сведения по Карпу» обычно опускаются. Например, NP-полные языки.
Лемма: |
[math](L_1 \leq_{f} L_2) \Rightarrow (\overline {L_1} \leq_{f} \overline {L_2})[/math] |
Доказательство: |
[math]\triangleright[/math] |
Здесь пруф, ога. |
[math]\triangleleft[/math] |