Мастер-теорема — различия между версиями
Timur (обсуждение | вклад) |
Timur (обсуждение | вклад) |
||
Строка 27: | Строка 27: | ||
* Если <tex>c < \log_b a</tex>, то <tex>T(n) = \Theta\left( n^{\log_b a} \right)</tex> | * Если <tex>c < \log_b a</tex>, то <tex>T(n) = \Theta\left( n^{\log_b a} \right)</tex> | ||
− | |proof= Давайте рассмотрим дерево рекурсии. Всего в нем будет <tex>\log_b n</tex> уровней. На каждом таком уровне, количество подзадач будет умножаться на <tex>a</tex>, так на уровне <tex>i</tex> будет <tex>a^i</tex> подзадач. Также известно, что каждая подзадача на уровне <tex>i</tex> размера <tex>\dfrac{n}{b^i}</tex>. Подзадача размера <tex>\dfrac{n}{b^i}</tex> требует <tex>(\dfrac{n}{b^i}) ^ c</tex> дополнительных затрат, поэтому общее количество совершенных операций на уровне <tex>i</tex> : | + | |proof= Давайте рассмотрим дерево рекурсии. Всего в нем будет <tex>\log_b n</tex> уровней. На каждом таком уровне, количество подзадач будет умножаться на <tex>a</tex>, так на уровне <tex>i</tex> будет <tex>a^i</tex> подзадач. Также известно, что каждая подзадача на уровне <tex>i</tex> размера <tex>\dfrac{n}{b^i}</tex>. Подзадача размера <tex>\dfrac{n}{b^i}</tex> требует <tex>\left(\dfrac{n}{b^i}\right) ^ c</tex> дополнительных затрат, поэтому общее количество совершенных операций на уровне <tex>i</tex> : |
− | <tex>a^i(\dfrac{n}{b^i})^c = n^c(\dfrac{a^i}{b^{ic}}) = n^c(\dfrac{a}{b^c})^i</tex> | + | <tex>a^i\left(\dfrac{n}{b^i}\right)^c = n^c\left(\dfrac{a^i}{b^{ic}}\right) = n^c\left(\dfrac{a}{b^c}\right)^i</tex> |
− | Заметим, что количество операций увеличивается, уменьшается и остается константой, если <tex>(\dfrac{a}{b^c})^i</tex> увеличивается, уменьшается или остается константой соответственно. | + | Заметим, что количество операций увеличивается, уменьшается и остается константой, если <tex>\left(\dfrac{a}{b^c}\right)^i</tex> увеличивается, уменьшается или остается константой соответственно. |
− | Поэтому мы должны разобрать три случая, когда <tex>(\dfrac{a}{b^c})^i</tex> больше <tex>1</tex>, равен <math>1</math> или меньше <math>1</math>. | + | Поэтому мы должны разобрать три случая, когда <tex>\left(\dfrac{a}{b^c}\right)^i</tex> больше <tex>1</tex>, равен <math>1</math> или меньше <math>1</math>. |
− | Рассмотрим <tex dpi = "140">(\dfrac{a}{b^c})^i = 1</tex> <tex dpi = "140">\Leftrightarrow a = b^c\Leftrightarrow\ log_b a = c \log_b b\Leftrightarrow\log_b a = c</tex>. | + | Рассмотрим <tex dpi = "140">\left(\dfrac{a}{b^c}\right)^i = 1</tex> <tex dpi = "140">\Leftrightarrow a = b^c\Leftrightarrow\ log_b a = c \log_b b\Leftrightarrow\log_b a = c</tex>. |
Распишем всю работу в течение рекурсивного спуска: | Распишем всю работу в течение рекурсивного спуска: | ||
− | <tex dpi = "130"> d\cdot \displaystyle\sum_{i=1}^{\log_b n}n^c(\frac{a}{b^c})^i = n^c\cdot d \cdot\displaystyle\sum_{i=1}^{\log_b n}(\frac{a}{b^c})^i</tex> | + | <tex dpi = "130"> d\cdot \displaystyle\sum_{i=1}^{\log_b n}n^c\left(\frac{a}{b^c}\right)^i = n^c\cdot d \cdot\displaystyle\sum_{i=1}^{\log_b n}\left(\frac{a}{b^c}\right)^i</tex> |
Откуда получаем: | Откуда получаем: | ||
− | 1. <tex>\log_b a < c </tex> <tex>\Rightarrow</tex> <tex>T(n) = \Theta\left( n^{c} \right)</tex> (т.к. <tex dpi = "130"> (\dfrac{a}{b^c})^i</tex> убывающая геометрическая прогрессия) | + | 1. <tex>\log_b a < c </tex> <tex>\Rightarrow</tex> <tex>T(n) = \Theta\left( n^{c} \right)</tex> (т.к. <tex dpi = "130"> \left(\dfrac{a}{b^c}\right)^i</tex> убывающая геометрическая прогрессия) |
− | 2. <tex>\log_b a = c </tex> <tex>\Rightarrow</tex> <tex dpi = " | + | 2. <tex>\log_b a = c </tex> <tex>\Rightarrow</tex> <tex dpi = "130"> T(n) = \displaystyle\sum_{i=1}^{\log_b n}n^c\cdot\left(\frac{a}{b^c}\right)^i = </tex> <tex dpi = "130> n^c\cdot\displaystyle\sum_{i=1}^{\log_b n}\left(\frac{a}{b^c}\right)^i = n^c\cdot\displaystyle\sum_{i=1}^{\log_b n}1^i = n^c + n^c\log_b n = \Theta\left( n^{c} \log n \right) </tex> |
− | 3. <tex>\log_b a > c </tex> <tex>\Rightarrow</tex> <tex dpi = "125"> T(n) = \displaystyle\sum_{i=1}^{\log_b n}n^c\cdot(\frac{a}{b^c})^i = n^c\cdot\displaystyle\sum_{i=1}^{\log_b n}(\ | + | 3. <tex>\log_b a > c </tex> <tex>\Rightarrow</tex> <tex dpi = "125"> T(n) = \displaystyle\sum_{i=1}^{\log_b n}n^c\cdot\left(\frac{a}{b^c}\right)^i = n^c\cdot\displaystyle\sum_{i=1}^{\log_b n}\left(\dfrac{a}{b^c}\right)^i = n^c\cdot\left(\dfrac{a}{b^c}\right)^{log_b n}</tex>, но <tex dpi = "130"> n^c\cdot\left(\dfrac{a}{b^c}\right)^{log_b n} </tex> <tex dpi = "130"> = </tex> <tex dpi = "130"> n^c\cdot\left(\dfrac{a^{log_b n} }{(b^c)^{log_b n}}\right) </tex> <tex dpi = "130"> = </tex> <tex dpi = "130"> n^c\cdot\left(\dfrac{n^{log_b a}}{n^c}\right)</tex> <tex dpi = "150"> = </tex> <tex dpi = "150"> \Theta\left( n^{\log_b a} \right) </tex> |
}} | }} | ||
Строка 54: | Строка 54: | ||
<tex> t(x) = \begin{cases} | <tex> t(x) = \begin{cases} | ||
− | 3 \; t\!\left(\ | + | 3 \; t\!\left(\dfrac{x}{2}\right) + x^{2} , & x \ge 2\\ |
− | 5x , & 1 | + | 5x , & 1 \le x < 2 |
\end{cases} | \end{cases} | ||
</tex> | </tex> | ||
− | Заметим, чтобы узнать <tex>t(7)</tex> , мы должны знать <tex>t(\dfrac{7}{2})</tex>, чтобы узнать <tex>t(\dfrac{7}{2})</tex>, мы должны узнать <tex>t(\dfrac{7}{4})</tex>, <tex>1 < \dfrac{7}{4} < 2</tex>, тогда <tex>t(\dfrac{7}{4}) = \dfrac{35}{4}</tex> , <tex>t(\dfrac{7}{2}) = 3\cdot\dfrac{35}{4} + \dfrac{49}{4}</tex>, тогда <tex>t(7) = 3t(\dfrac{7}{2}) + 7^2 = \dfrac{329}{2}</tex> | + | Заметим, чтобы узнать <tex>t(7)</tex> , мы должны знать <tex>t\left(\dfrac{7}{2}\right)</tex>, чтобы узнать <tex>t\left(\dfrac{7}{2}\right)</tex>, мы должны узнать <tex>t\left(\dfrac{7}{4}\right)</tex>, <tex>1 < \dfrac{7}{4} < 2</tex>, тогда <tex>t\left(\dfrac{7}{4}\right) = \dfrac{35}{4}</tex> , <tex>t\left(\dfrac{7}{2}\right) = 3\cdot\dfrac{35}{4} + \dfrac{49}{4}</tex>, тогда <tex>t(7) = 3t\left(\dfrac{7}{2}\right) + 7^2 = \dfrac{329}{2}</tex> |
==== Пример 2 ==== | ==== Пример 2 ==== | ||
Строка 67: | Строка 67: | ||
<tex> T(n) = \begin{cases} | <tex> T(n) = \begin{cases} | ||
− | 2 \; T\!\left(\ | + | 2 \; T\!\left(\dfrac{n}{3}\right) + f(n) , & n > 1\\ |
d , & n = 1 | d , & n = 1 | ||
\end{cases} | \end{cases} | ||
Строка 74: | Строка 74: | ||
<tex>f(n) = n\sqrt {n + 1} < n\sqrt{n + n} < n\sqrt{2n} = O(n^{3/2}) </tex> | <tex>f(n) = n\sqrt {n + 1} < n\sqrt{n + n} < n\sqrt{2n} = O(n^{3/2}) </tex> | ||
− | Данное соотношение подходит под первый случай <tex>(a = 2, b = 3, c = \dfrac{3}{2})</tex>, поэтому его асимптотика совпадает с асимптотикой <tex>f(n)</tex> | + | Данное соотношение подходит под первый случай <tex>\left(a = 2, b = 3, c = \dfrac{3}{2}\right)</tex>, поэтому его асимптотика совпадает с асимптотикой <tex>f(n)</tex> (следуя из определения <tex> \Theta </tex> и <tex> O </tex>). |
=== Недопустимые соотношения === | === Недопустимые соотношения === | ||
Рассмотрим пару ошибочно-составленных соотношений: | Рассмотрим пару ошибочно-составленных соотношений: | ||
− | *<tex dpi = "130">T(n) = 2^nT\left (\ | + | *<tex dpi = "130">T(n) = 2^nT\left (\dfrac{n}{2}\right )+n^n</tex> |
*:<tex>a</tex> не является константой; количество подзадач может меняться | *:<tex>a</tex> не является константой; количество подзадач может меняться | ||
− | *<tex dpi = "130">T(n) = 2T\left (\ | + | *<tex dpi = "130">T(n) = 2T\left (\dfrac{n}{2}\right )+\frac{n}{\log n}</tex> |
*:не удовлетворяет условию <tex> \dfrac{n}{\log n} </tex> не равно <tex> n^c </tex> | *:не удовлетворяет условию <tex> \dfrac{n}{\log n} </tex> не равно <tex> n^c </tex> | ||
− | *<tex dpi = "130">T(n) = 0.5T\left (\ | + | *<tex dpi = "130">T(n) = 0.5T\left (\dfrac{n}{2}\right )+n</tex> |
*:<tex>a</tex> < 1 не может быть меньше одной подзадачи | *:<tex>a</tex> < 1 не может быть меньше одной подзадачи | ||
− | *<tex dpi = "130">T(n) = 64T\left (\ | + | *<tex dpi = "130">T(n) = 64T\left (\dfrac{n}{8}\right )-n^2\log n</tex> |
*:<tex>f(n)</tex> не положительна | *:<tex>f(n)</tex> не положительна | ||
=== Приложение к известным алгоритмам === | === Приложение к известным алгоритмам === | ||
Строка 114: | Строка 114: | ||
* [https://math.dartmouth.edu/archive/m19w03/public_html/Section5-2.pdf Dartmouth university — The master theorem] | * [https://math.dartmouth.edu/archive/m19w03/public_html/Section5-2.pdf Dartmouth university — The master theorem] | ||
*''Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К.'' Алгоритмы: построение и анализ, 2-е издание.стр. 110 М.: Издательский дом "Вильямс", 2005. ISBN 5-8459-0857-4 | *''Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К.'' Алгоритмы: построение и анализ, 2-е издание.стр. 110 М.: Издательский дом "Вильямс", 2005. ISBN 5-8459-0857-4 | ||
+ | |||
+ | == См.также == | ||
+ | * [[Амортизационный анализ]] | ||
== Примечание == | == Примечание == | ||
<references /> | <references /> | ||
− | |||
− | |||
[[Категория:Дискретная математика и алгоритмы]] | [[Категория:Дискретная математика и алгоритмы]] | ||
[[Категория:Амортизационный анализ]] | [[Категория:Амортизационный анализ]] |
Версия 21:54, 8 мая 2015
Мастер теорема (англ. Master theorem) позволяет найти асимптотическое решение рекуррентных соотношений, которые могут возникнуть в анализе асимптотики многих алгоритмов. Однако не все рекуррентные соотношения могут быть решены через мастер теорему, ее обобщения включаются в метод Акра-Бацци[1].
Содержание
Формулировка и доказательство мастер-теоремы
Теорема (Об асимптотическом решении рекуррентного соотношения): |
В анализе асимптотики алгоритма получено соотношение такого вида:
,где — число большее , — число большее , — число и — .Тогда решение данной рекурренты зависит от соотношения между так:
|
Доказательство: |
Давайте рассмотрим дерево рекурсии. Всего в нем будет уровней. На каждом таком уровне, количество подзадач будет умножаться на , так на уровне будет подзадач. Также известно, что каждая подзадача на уровне размера . Подзадача размера требует дополнительных затрат, поэтому общее количество совершенных операций на уровне : Заметим, что количество операций увеличивается, уменьшается и остается константой, если увеличивается, уменьшается или остается константой соответственно. Поэтому мы должны разобрать три случая, когда больше , равен или меньше . Рассмотрим . Распишем всю работу в течение рекурсивного спуска: Откуда получаем:1. (т.к. убывающая геометрическая прогрессия)2. 3. , но |
Пусть при решении поставленной задачи, существует алгоритм, который разбивает ее на
подзадач,при этом — размер общей задачи, — размер каждой подзадачи, — стоимость работы, проделанной рекурсивными вызовами, который включает в себя стоимость деления проблемы и стоимость слияния решения подзадач и — начальная стоимость для данной задачи(при ).Тогда мастер-теорема позволяет найти асимптотическое решение рекурренты, возникшей в результате анализа асимптотики данной задачи.Примеры
Примеры задач
Пример 1
Пусть задано такое рекуррентное соотношение:
Рассчитать для
.
Заметим, чтобы узнать
, мы должны знать , чтобы узнать , мы должны узнать , , тогда , , тогдаПример 2
Задано такое соотношение:
Данное соотношение подходит под первый случай
, поэтому его асимптотика совпадает с асимптотикой (следуя из определения и ).Недопустимые соотношения
Рассмотрим пару ошибочно-составленных соотношений:
- не является константой; количество подзадач может меняться
- не удовлетворяет условию не равно
- < 1 не может быть меньше одной подзадачи
- не положительна
Приложение к известным алгоритмам
Алгоритм | Рекуррентное соотношение | Время работы | Комментарий |
---|---|---|---|
Целочисленный двоичный поиск | По мастер-теореме | , где||
Обход бинарного дерева | По мастер-теореме | , где||
Сортировка слиянием | По мастер-теореме | , где
Источники информации
- Википедия — Мастер-теорема
- Dartmouth university — The master theorem
- Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К. Алгоритмы: построение и анализ, 2-е издание.стр. 110 М.: Издательский дом "Вильямс", 2005. ISBN 5-8459-0857-4