|
|
Строка 2: |
Строка 2: |
| {{Определение | | {{Определение |
| |definition = | | |definition = |
− | <tex>D</tex> — множество языков, <tex>\widetilde{D}</tex> — класс функций, соответствующих языкам из <tex>D</tex>. | + | <tex>D</tex> — класс языков, удовлетворяющих некоторым ограничениям; <tex>\widetilde{D}</tex> — класс вычислимых функций, удовлетворяющих тем же ограничениям. |
− | '''Язык <tex>L_1</tex> сводится к языку <tex>L_2</tex> относительно <tex>\widetilde{D}</tex> (<tex>L_1 \leq_{\widetilde{D}} L_2</tex>)''', если существует такая функция <tex>f(x)</tex> из <tex>\widetilde{D}</tex>, что <tex>x</tex> принадлежит <tex>L_1</tex> тогда и только тогда, когда <tex>f(x)</tex> принадлежит <tex>L_2</tex>:<br> | + | '''Язык <tex>L_1</tex> сводится к языку <tex>L_2</tex> относительно <tex>\widetilde{D}</tex> (<tex>L_1 \leq_{\widetilde{D}} L_2</tex>)''', если существует такая функция <tex>f</tex> из <tex>\widetilde{D}</tex>, что <tex>x</tex> принадлежит <tex>L_1</tex> тогда и только тогда, когда <tex>f(x)</tex> принадлежит <tex>L_2</tex>:<br> |
| <tex> (L_1 \leq_{\widetilde{D}} L_2) \overset{\underset{\mathrm{def}}{}}{\iff} ( \exists f \in \widetilde{D} : x \in L_1 \Leftrightarrow f(x) \in L_2 ) </tex>. | | <tex> (L_1 \leq_{\widetilde{D}} L_2) \overset{\underset{\mathrm{def}}{}}{\iff} ( \exists f \in \widetilde{D} : x \in L_1 \Leftrightarrow f(x) \in L_2 ) </tex>. |
| }} | | }} |
Строка 10: |
Строка 10: |
| Сведение относительно <tex>\widetilde{P}</tex> называется '''сведением по Карпу'''. | | Сведение относительно <tex>\widetilde{P}</tex> называется '''сведением по Карпу'''. |
| }} | | }} |
− | | + | '''Замечание.''' Часто используется именно сведение по Карпу, поэтому слова «относительно сведения по Карпу» и индекс у символа сведения обычно опускают. |
− | '''Замечание.''' Часто используется именно сведение по Карпу, поэтому слова «относительно сведения по Карпу» и индекс у символа сведения обычно опускаются. Например, [[Примеры NP-полных языков. Теорема Кука | NP-полные языки]]. | |
| | | |
| == Банальный пример сведения по Карпу == | | == Банальный пример сведения по Карпу == |
Версия 12:10, 9 мая 2012
Определения
Определение: |
[math]D[/math] — класс языков, удовлетворяющих некоторым ограничениям; [math]\widetilde{D}[/math] — класс вычислимых функций, удовлетворяющих тем же ограничениям.
Язык [math]L_1[/math] сводится к языку [math]L_2[/math] относительно [math]\widetilde{D}[/math] ([math]L_1 \leq_{\widetilde{D}} L_2[/math]), если существует такая функция [math]f[/math] из [math]\widetilde{D}[/math], что [math]x[/math] принадлежит [math]L_1[/math] тогда и только тогда, когда [math]f(x)[/math] принадлежит [math]L_2[/math]:
[math] (L_1 \leq_{\widetilde{D}} L_2) \overset{\underset{\mathrm{def}}{}}{\iff} ( \exists f \in \widetilde{D} : x \in L_1 \Leftrightarrow f(x) \in L_2 ) [/math]. |
Определение: |
Сведение относительно [math]\widetilde{P}[/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]\triangleright[/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] по определению. |
[math]\triangleleft[/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](L_1 \leq_{\widetilde{D}} L_2) \Leftrightarrow (\overline {L_1} \leq_{\widetilde{D}} \overline {L_2})[/math] |
Доказательство: |
[math]\triangleright[/math] |
По определению сведения существует такая функция [math]f[/math] из класса [math]\widetilde{D}[/math], что [math]x \in L_1 \Leftrightarrow f(x) \in L_2[/math]. Для того, чтобы свести [math]\overline{L_1}[/math] к [math]\overline{L_2}[/math] будем использовать ту же функцию [math]f[/math].
В самом деле: [math]( x \in L_1 \Leftrightarrow f(x) \in L_2 ) \iff ( \overline{x \in L_1} \Leftrightarrow \overline{f(x) \in L_2} ) [/math] [math]\iff ( x \in \overline{L_1} \Leftrightarrow f(x) \in \overline{L_2} ) \iff (\overline {L_1} \leq_{\widetilde{D}} \overline {L_2})[/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]L[/math] относительно [math]\widetilde{D}[/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]. |