Теоремы о временной и ёмкостной иерархиях — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
Строка 6: Строка 6:
 
<!--Понятно, что <tex>DSPACE(f(n)) \subseteq DSPACE(g(n))</tex>, поскольку программа, ограниченная по памяти функцией <tex>f</tex>, проходит ограничение <tex>g</tex>.<br /> -->
 
<!--Понятно, что <tex>DSPACE(f(n)) \subseteq DSPACE(g(n))</tex>, поскольку программа, ограниченная по памяти функцией <tex>f</tex>, проходит ограничение <tex>g</tex>.<br /> -->
 
Для доказательства воспользуемся диагональным методом.
 
Для доказательства воспользуемся диагональным методом.
<ref>Суть данного метода для набора множеств <tex>\{A_x\}</tex> заключается в построении нового множества <tex>B</tex> по принципу: <tex>x \in B \Leftrightarrow x \notin A_x</tex>. В этом случае <tex>A_x \neq B</tex> для любого <tex>x</tex>. Аналогичный прием можно применять для набора функций <tex>\{f_i\}</tex> путем построения новой функции <tex>f':f'(x) \neq f_x(x)</tex>. Элементы <tex>f_x(x)</tex> иногда называют диагональными, поскольку находятся на диагонали таблицы функция аргумент.
+
<ref>Суть данного метода для набора множеств <tex>\{A_x\}</tex> заключается в построении нового множества <tex>B</tex> по принципу: <tex>x \in B \Leftrightarrow x \notin A_x</tex>. В этом случае <tex>A_x \neq B</tex> для любого <tex>x</tex>. Аналогичный прием можно применять для набора функций <tex>\{f_i\}</tex> путем построения новой функции <tex>f':f'(x) \neq f_x(x)</tex>. Элементы <tex>f_x(x)</tex> иногда называют диагональными, поскольку находятся на диагонали таблицы «функция аргумент».
<br/><tex>
+
<br/>
\begin{pmatrix}
+
{| class="wikitable" align="centre"
& 0 & 1 & \cdots \\
+
|-
f_0 & \mathbf{f_0(0)} & f_0(1) & \cdots \\
+
| ||<tex>0</tex>||<tex>1</tex>||<tex>\cdots</tex>
f_1 & f_1(0) & \mathbf{f_1(1)} & \cdots \\       
+
|-
\vdots & \vdots & \vdots & \ddots \\
+
|<tex>f_0</tex>||<tex>\mathbf{f_0(0)}</tex>||<tex>f_0(1)</tex>||<tex>\cdots</tex>
\end{pmatrix}
+
|-
</tex>
+
|<tex>f_1</tex>||<tex>f_1(0)</tex>||<tex>\mathbf{f_1(1)}</tex>||<tex>\cdots</tex>
 +
|-
 +
|<tex>\vdots</tex>||<tex>\vdots</tex>||<tex>\vdots</tex>||<tex>\ddots</tex>
 +
|-
 +
|}
 
</ref>
 
</ref>
 
<br/>
 
<br/>
Рассмотрим функцию <tex>h(n)=\sqrt{f(n)g(n)}</tex> и язык <tex>L=\{x\bigm|x(x)\Bigr|_{S\leq h(|x|)}\neq 1\}</tex>, где запись <tex>S\leq h(|x|)</tex> означает, что программа запускается с лимитом памяти <tex>h(|x|)</tex>. Иначе говоря, <tex>L</tex> — это язык программ, которые не допускают собственный код, используя не более <tex>h(|x|)</tex> памяти. Докажем, что <tex>L\in DSPACE(g(n))\setminus DSPACE(f(n))</tex>.<br/><br/>
+
Рассмотрим функцию <tex>h(n)=\sqrt{f(n)g(n)}</tex> и язык <tex>L=\{x\bigm|x(x)\Bigr|_{S\leq h(|x|)}\neq 1\}</tex>, где запись <tex>S\leq h(|x|)</tex> означает, что программа запускается с лимитом памяти <tex>h(|x|)</tex>. Иначе говоря, <tex>L</tex> — это язык программ, которые не допускают собственный код, используя не более <tex>h(|x|)</tex> памяти.<br/>
Так как <tex>h(n)=o(g(n))</tex>, то понятно, что <tex>L \in DSPACE(g(n))</tex>. Действительно, для проверки принадлежности программы <tex>x</tex> языку достаточно запустить её с лимитом памяти <tex>h(|x|)</tex> и проверить, что результат не равен 1. Тогда вся проверка будет выполнена с использованием не более <tex>g(|x|)</tex> памяти в силу накладываемых ограничений.<ref>Вообще говоря, для корректного запуска с лимитом по памяти на функцию <tex>h</tex> дополнительно накладывается условие конструируемости по памяти, т. е. возможность вычислить значение функции по <tex>x</tex>, используя не более <tex>h(x)</tex> памяти, однако часто это условие опускается.</ref><br /><br/>
+
Докажем, что <tex>L\in DSPACE(g(n))\setminus DSPACE(f(n))</tex>.<br/>
Предположим теперь, что <tex>L \in DSPACE(f(n))</tex>. Тогда существует программа <tex>p</tex>, распознающая язык <tex>L</tex> и использующая не более <tex>c \cdot f(n)</tex> памяти. Так как <tex>f(n)=o(h(n))</tex>, то <tex>\exists n_0: \forall n>n_0 \Rightarrow c\cdot f(n)<h(n)</tex>. Будем считать, что <tex>|p|>n_0</tex> (иначе добавим в программу пустые строки, искусственно увеличив её длину), тогда при вызове <tex>p(p)</tex> потребуется не более <tex>h(|p|)</tex> памяти. Выясним, принадлежит ли <tex>p</tex> языку <tex>L</tex>. Допустим, что <tex>p\in L</tex>, тогда <tex>p(p)=1</tex>, значит, <tex>p\notin L</tex> по определению языка <tex>L</tex>. Пусть теперь <tex>p\notin L</tex>. Но тогда <tex>p(p) \ne 1</tex>, следовательно, <tex>p\in L</tex>.
+
* <tex>L \in DSPACE(g(n))</tex>. Действительно, для проверки принадлежности программы <tex>x</tex> языку достаточно запустить её с лимитом памяти <tex>h(|x|)</tex> и проверить, что результат не равен 1. Тогда вся проверка будет выполнена с использованием не более <tex>g(|x|)</tex> памяти в силу накладываемых ограничений.<ref>Вообще говоря, для корректного запуска с лимитом по памяти на функцию <tex>h</tex> дополнительно накладывается условие конструируемости по памяти, то есть возможность вычислить значение функции по <tex>x</tex>, используя не более <tex>h(x)</tex> памяти, однако часто это условие опускается.</ref><br />
 +
* <tex>L \notin DSPACE(f(n))</tex>. Пусть это не так, тогда существует программа <tex>p</tex>, распознающая язык <tex>L</tex> и использующая не более <tex>c \cdot f(n)</tex> памяти. Так как <tex>f(n)=o(h(n))</tex>, то <tex>\exists n_0: \forall n>n_0 \Rightarrow c\cdot f(n)<h(n)</tex>. Будем считать, что <tex>|p|>n_0</tex> (иначе добавим в программу пустые строки, искусственно увеличив её длину), тогда при вызове <tex>p(p)</tex> потребуется не более <tex>h(|p|)</tex> памяти. Выясним, принадлежит ли <tex>p</tex> языку <tex>L</tex>. Допустим, что <tex>p\in L</tex>, тогда <tex>p(p)=1</tex>, значит, <tex>p\notin L</tex> по определению языка <tex>L</tex>. Пусть теперь <tex>p\notin L</tex>. Но тогда <tex>p(p) \ne 1</tex>, следовательно, <tex>p\in L</tex>.
 
Таким образом, язык <tex>L</tex> не может быть из <tex>DSPACE(f(n))</tex>, следовательно, язык из <tex>DSPACE(g(n))\setminus DSPACE(f(n))</tex> найден.}}
 
Таким образом, язык <tex>L</tex> не может быть из <tex>DSPACE(f(n))</tex>, следовательно, язык из <tex>DSPACE(g(n))\setminus DSPACE(f(n))</tex> найден.}}
  
Строка 26: Строка 31:
 
|id=time
 
|id=time
 
|statement=Пусть даны две функции <tex>f</tex> и <tex>g</tex> такие, <span title="Здесь Sim(n) — время симуляции n шагов одной машины Тьюринга на другой машине" style="border-bottom: 1px dotted; cursor: help;">что</span> <tex>\lim \limits_{n\rightarrow\infty} \frac{Sim(f(n))}{g(n)}=0</tex>, тогда <tex>DTIME(f(n)) \neq DTIME(g(n))</tex>.  
 
|statement=Пусть даны две функции <tex>f</tex> и <tex>g</tex> такие, <span title="Здесь Sim(n) — время симуляции n шагов одной машины Тьюринга на другой машине" style="border-bottom: 1px dotted; cursor: help;">что</span> <tex>\lim \limits_{n\rightarrow\infty} \frac{Sim(f(n))}{g(n)}=0</tex>, тогда <tex>DTIME(f(n)) \neq DTIME(g(n))</tex>.  
|proof=Доказательство аналогично доказательству [[Теоремы о временной и емкостной иерархиях#space|теоремы о емкостной иерархии]].
+
|proof=Доказательство аналогично доказательству [[Теоремы о временной и емкостной иерархиях#space|теоремы о емкостной иерархии]]. При этом в отличии от памяти, время работы машины Тьюринга меньше, чем время ее симуляции на другой машине, из-за чего на соотношение <tex>f</tex> и <tex>g</tex> поставлено более сильное условие.
 +
Положим <tex>h(n)=Sim^{-1}(\frac{f(n)g(n)}{Sim(f(n))}), L=\{x\bigm|x(x)\Bigr|_{T\leq h(|x|)}\neq 1\}</tex>. Заметим, что <tex>Sim(h(n))=o(g(n))</tex> и <tex>f(n)=o(h(n))</tex>. Тогда:
 +
* <tex>L \in DTIME(g(n))</tex>, поскольку запуск с ограничением <tex>T \leq h(|x|)</tex> осуществляется за <tex>O(g(n))</tex> времени;
 +
* <tex>L \notin DTIME(f(n))</tex> (доказывается аналогично соответствующему пункту предыдущей теоремы).
 
}}
 
}}
  
=== Замечания ===
+
=== Примечания ===
 
<references />
 
<references />
  
 
[[Категория:Теория сложности]]
 
[[Категория:Теория сложности]]

Версия 23:30, 4 июня 2012

Теорема (о емкостной иерархии):
Пусть даны две функции [math]f[/math] и [math]g[/math] такие, что [math]\lim \limits_{n\rightarrow\infty} \frac{f(n)}{g(n)}=0[/math], тогда [math]DSPACE(f(n)) \neq DSPACE(g(n))[/math].
Доказательство:
[math]\triangleright[/math]

Для доказательства воспользуемся диагональным методом. [1]
Рассмотрим функцию [math]h(n)=\sqrt{f(n)g(n)}[/math] и язык [math]L=\{x\bigm|x(x)\Bigr|_{S\leq h(|x|)}\neq 1\}[/math], где запись [math]S\leq h(|x|)[/math] означает, что программа запускается с лимитом памяти [math]h(|x|)[/math]. Иначе говоря, [math]L[/math] — это язык программ, которые не допускают собственный код, используя не более [math]h(|x|)[/math] памяти.
Докажем, что [math]L\in DSPACE(g(n))\setminus DSPACE(f(n))[/math].

  • [math]L \in DSPACE(g(n))[/math]. Действительно, для проверки принадлежности программы [math]x[/math] языку достаточно запустить её с лимитом памяти [math]h(|x|)[/math] и проверить, что результат не равен 1. Тогда вся проверка будет выполнена с использованием не более [math]g(|x|)[/math] памяти в силу накладываемых ограничений.[2]
  • [math]L \notin DSPACE(f(n))[/math]. Пусть это не так, тогда существует программа [math]p[/math], распознающая язык [math]L[/math] и использующая не более [math]c \cdot f(n)[/math] памяти. Так как [math]f(n)=o(h(n))[/math], то [math]\exists n_0: \forall n\gt n_0 \Rightarrow c\cdot f(n)\lt h(n)[/math]. Будем считать, что [math]|p|\gt n_0[/math] (иначе добавим в программу пустые строки, искусственно увеличив её длину), тогда при вызове [math]p(p)[/math] потребуется не более [math]h(|p|)[/math] памяти. Выясним, принадлежит ли [math]p[/math] языку [math]L[/math]. Допустим, что [math]p\in L[/math], тогда [math]p(p)=1[/math], значит, [math]p\notin L[/math] по определению языка [math]L[/math]. Пусть теперь [math]p\notin L[/math]. Но тогда [math]p(p) \ne 1[/math], следовательно, [math]p\in L[/math].
Таким образом, язык [math]L[/math] не может быть из [math]DSPACE(f(n))[/math], следовательно, язык из [math]DSPACE(g(n))\setminus DSPACE(f(n))[/math] найден.
[math]\triangleleft[/math]
Теорема (о временной иерархии):
Пусть даны две функции [math]f[/math] и [math]g[/math] такие, что [math]\lim \limits_{n\rightarrow\infty} \frac{Sim(f(n))}{g(n)}=0[/math], тогда [math]DTIME(f(n)) \neq DTIME(g(n))[/math].
Доказательство:
[math]\triangleright[/math]

Доказательство аналогично доказательству теоремы о емкостной иерархии. При этом в отличии от памяти, время работы машины Тьюринга меньше, чем время ее симуляции на другой машине, из-за чего на соотношение [math]f[/math] и [math]g[/math] поставлено более сильное условие. Положим [math]h(n)=Sim^{-1}(\frac{f(n)g(n)}{Sim(f(n))}), L=\{x\bigm|x(x)\Bigr|_{T\leq h(|x|)}\neq 1\}[/math]. Заметим, что [math]Sim(h(n))=o(g(n))[/math] и [math]f(n)=o(h(n))[/math]. Тогда:

  • [math]L \in DTIME(g(n))[/math], поскольку запуск с ограничением [math]T \leq h(|x|)[/math] осуществляется за [math]O(g(n))[/math] времени;
  • [math]L \notin DTIME(f(n))[/math] (доказывается аналогично соответствующему пункту предыдущей теоремы).
[math]\triangleleft[/math]

Примечания

  1. Суть данного метода для набора множеств [math]\{A_x\}[/math] заключается в построении нового множества [math]B[/math] по принципу: [math]x \in B \Leftrightarrow x \notin A_x[/math]. В этом случае [math]A_x \neq B[/math] для любого [math]x[/math]. Аналогичный прием можно применять для набора функций [math]\{f_i\}[/math] путем построения новой функции [math]f':f'(x) \neq f_x(x)[/math]. Элементы [math]f_x(x)[/math] иногда называют диагональными, поскольку находятся на диагонали таблицы «функция — аргумент».
    [math]0[/math] [math]1[/math] [math]\cdots[/math]
    [math]f_0[/math] [math]\mathbf{f_0(0)}[/math] [math]f_0(1)[/math] [math]\cdots[/math]
    [math]f_1[/math] [math]f_1(0)[/math] [math]\mathbf{f_1(1)}[/math] [math]\cdots[/math]
    [math]\vdots[/math] [math]\vdots[/math] [math]\vdots[/math] [math]\ddots[/math]
  2. Вообще говоря, для корректного запуска с лимитом по памяти на функцию [math]h[/math] дополнительно накладывается условие конструируемости по памяти, то есть возможность вычислить значение функции по [math]x[/math], используя не более [math]h(x)[/math] памяти, однако часто это условие опускается.