Теорема Бермана — Форчуна — различия между версиями
(→См. также) |
AndrewD (обсуждение | вклад) |
||
| Строка 57: | Строка 57: | ||
'''exit''' <tex>0</tex> | '''exit''' <tex>0</tex> | ||
'''return''' <tex>memo[f(\phi)]</tex> | '''return''' <tex>memo[f(\phi)]</tex> | ||
| + | [[Файл:Berman-Fortune.png|thumb|right|Двоичное дерево, получающееся в результате рекурсивных вызовов модифицированной программы. Красным и желтым помечены узлы, в которых происходит обращение к элементу ''memo[j]''. В красных узлах условие ''(1)'' ложно, в желтых {{---}} истинно.]] | ||
Рассмотрим двоичное дерево, получающееся в результате рекурсивных вызовов данной программы. | Рассмотрим двоичное дерево, получающееся в результате рекурсивных вызовов данной программы. | ||
| − | Рассмотрим произвольный элемент <tex>memo[ | + | Рассмотрим произвольный элемент <tex>memo[j]</tex>. Найдем, сколько раз условие <tex>(1)</tex> в ходе выполнения программы является ложным при обращении к элементу <tex>memo[j]</tex>. Найдем в дереве такой узел, в котором есть обращение к <tex>memo[j]</tex>, а в его поддереве обращений к этому элементу нет, причем <tex>memo[j] = -1</tex>. До этого момента количество обращений к <tex>memo[j]</tex> не превышает глубины найденного узла, что не превосходит высоты дерева, что не превосходит некоторого полинома <tex>p'(n)</tex>. После этого момента условие <tex>(1)</tex> будет принимать истинное значение при обращении к <tex>memo[j]</tex>. Значит, в ходе выполнения программы условие <tex>(1)</tex> является ложным при обращении к <tex>memo[j]</tex> не более <tex>p'(n)</tex> раз. |
Так как всего в <tex>memo</tex> не более <tex>r(n)</tex> элементов, то суммарно за все время выполнения программы условие <tex>(1)</tex> принимает ложное значение не более <tex>p''(n) = r(n) \cdot p'(n)</tex> раз, то есть <tex>p''</tex> {{---}} полином. Отсюда следует, что присваивание <tex>(2)</tex> выполняется не более <tex>p''(n)</tex> раз, а значит в дереве не более <tex>p''(n)</tex> внутренних вершин. Значит всего в дереве не более <tex>2 \cdot p''(n) + 1</tex> вершин, то есть данная программа работает за полиномиальное время. | Так как всего в <tex>memo</tex> не более <tex>r(n)</tex> элементов, то суммарно за все время выполнения программы условие <tex>(1)</tex> принимает ложное значение не более <tex>p''(n) = r(n) \cdot p'(n)</tex> раз, то есть <tex>p''</tex> {{---}} полином. Отсюда следует, что присваивание <tex>(2)</tex> выполняется не более <tex>p''(n)</tex> раз, а значит в дереве не более <tex>p''(n)</tex> внутренних вершин. Значит всего в дереве не более <tex>2 \cdot p''(n) + 1</tex> вершин, то есть данная программа работает за полиномиальное время. | ||
Версия 19:18, 4 июня 2012
| Лемма (1): |
Язык является -полным тогда и только тогда, когда является -полным (то есть ). |
| Доказательство: |
|
Пусть — -полный. Тогда и . Рассмотрим произвольный язык . Тогда . Так как — -полный, то , следовательно (по лемме). Получили, что и . Значит . В обратную сторону доказательство аналогично. |
| Определение: |
| — булева формула . |
| Лемма (2): |
. |
| Доказательство: |
| , то есть . Кроме того, в качестве сертификата используется , на котором . Значит . Тогда по лемме (1) . |
| Определение: |
| полином . |
| Теорема (Берман, Форчун): |
. |
| Доказательство: |
|
Пусть существует . Разрешим за полином. Для начала напишем программу, разрешающую : : if return 0 if return 1 if return return Ответом будет . Так как и , то , то есть . Поэтому, если в предыдущей программе заменить все обращения к , на , то полученная программа по-прежнему будет разрешать . Оценим необходимый размер . Можно считать, что , где , а — монотонно возрастающий полином. Тогда . Так как , то , где — полином. Можно считать, что монотонно возрастает. Тогда размер (число слов длины не более в языке) можно оценить сверху: , где — полином. : if return 0 if return 1 if //(1) return //(2) if exit return Рассмотрим двоичное дерево, получающееся в результате рекурсивных вызовов данной программы. Рассмотрим произвольный элемент . Найдем, сколько раз условие в ходе выполнения программы является ложным при обращении к элементу . Найдем в дереве такой узел, в котором есть обращение к , а в его поддереве обращений к этому элементу нет, причем . До этого момента количество обращений к не превышает глубины найденного узла, что не превосходит высоты дерева, что не превосходит некоторого полинома . После этого момента условие будет принимать истинное значение при обращении к . Значит, в ходе выполнения программы условие является ложным при обращении к не более раз. Так как всего в не более элементов, то суммарно за все время выполнения программы условие принимает ложное значение не более раз, то есть — полином. Отсюда следует, что присваивание выполняется не более раз, а значит в дереве не более внутренних вершин. Значит всего в дереве не более вершин, то есть данная программа работает за полиномиальное время. Итого, данная программа разрешает за полиномиальное время. А так как , то , то есть , откуда . |