<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=188.162.64.3&amp;*</id>
		<title>Викиконспекты - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=188.162.64.3&amp;*"/>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/188.162.64.3"/>
		<updated>2026-05-19T17:59:59Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BF%D0%B8%D1%81%D0%BE%D0%BA_%D0%B7%D0%B0%D0%B4%D0%B0%D0%BD%D0%B8%D0%B9_%D0%BF%D0%BE_%D0%90%D0%B8%D0%A1%D0%94-year2015-%D1%81%D0%B5%D0%BC1&amp;diff=50088</id>
		<title>Список заданий по АиСД-year2015-сем1</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BF%D0%B8%D1%81%D0%BE%D0%BA_%D0%B7%D0%B0%D0%B4%D0%B0%D0%BD%D0%B8%D0%B9_%D0%BF%D0%BE_%D0%90%D0%B8%D0%A1%D0%94-year2015-%D1%81%D0%B5%D0%BC1&amp;diff=50088"/>
				<updated>2015-12-01T00:17:07Z</updated>
		
		<summary type="html">&lt;p&gt;188.162.64.3: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;wikitex&amp;gt;&lt;br /&gt;
= Алгоритмы и структуры данных, 1 семестр =&lt;br /&gt;
# Можно ли построить структуру данных, с двумя видами операций, одна из которых работает за истинное $O(2^n)$, а вторая за истинное $O(\log{n})$, и при этом амортизированное время работы обеих операций $O(1)$. Почему?&lt;br /&gt;
# Можно ли построить структуру данных, с двумя видами операций, одна из которых работает за истинное $O(\sqrt{n})$, а вторая за истинное $\Theta(\log{n})$, и при этом амортизированное время работы обеих операций $O(1)$. Почему?&lt;br /&gt;
# Пусть структура данных выполняет два типа запросов. Первый тип запроса выполняется за $O(f(s) k \log{k})$, а второй {{---}} за $O(\frac{g(s)}{k \sqrt{k}})$, причем значение $k$ можно выбрать любым натуральным числом, а $f(s)$ и $g(s)$ известны и зависят от размера структуры данных. Вам стало известно, что к структуре данных сделают $n$ запросов первого типа, и $m$ запросов второго типа. Какое $k$ нужно выбрать, чтобы среднее время работы запросов было минимальным.&lt;br /&gt;
# Проанализировать саморасширяющийся массив, если расширение происходит в $A$ раз ($1 &amp;lt; A$)&lt;br /&gt;
# Проанализировать стек на саморасширяющемся массиве, если при полном заполнении происходит увеличение в 2 раза, а при заполнении менее чем на 1/4 - сужение в 2 раза с помощью метода потеницалов. Потенциал должен зависеть только от текущего состояния стека (размера выделенного массива и числа заполненных элементов) и не должен зависеть от истории операций.&lt;br /&gt;
# Проанализировать стек на саморасширяющемся массиве, если при полном заполнении происходит увеличение в A раз, а при заполнении менее чем на B - сужение в C раз&lt;br /&gt;
# Разработать вектор с добавлением/удалением с истинной стоимостью всех операций $O(\log n)$.&lt;br /&gt;
# Разработать вектор с добавлением/удалением с истинной стоимостью всех операций $O(1)$.&lt;br /&gt;
# В массиве есть элемент, который встречается хотя бы $n/2$ раз. Требуется найти его за $O(n)$ с $O(1)$ дополнительной памяти&lt;br /&gt;
# Использования памяти без инициализации. Задан массив $a[1..n]$. Требуется поддержать две операции: $set(i, x)$ и $get(i)$. Операция $set$ должна присваивать $i$-му элементу массива значение $x$. Операция $get$ должна возвращать последнее присвоенное $i$-му элементу значение, либо 0, если присвоения не было. При этом исходно массив заполнен произвольными данными. Разрешается завести $O(1)$ дополнительных массивов (также заполненных произвольным мусором) и реализовать все операции за истинное $O(1)$.&lt;br /&gt;
# Счетчик Кнута. Рассмотрим массив $a[0..n-1]$. Будем считать, что в каждом элементе может быть число 0, 1 или 2 и массив представляет собой число $a[0]+a[1]\cdot 2+a[2]\cdot 4 + \ldots + a[n-1]\cdot2^{n-1}$. Требуется реализовать операцию добавления $2^k$ к числу, представленному в массиве за истинное $O(1)$ и $O(n)$ дополнительной памяти.&lt;br /&gt;
# Реализуйте менеджер памяти, позволяющий выделять и возвращать блоки одинакового размера за $O(1)$ времени и $O(1)$ дополнительной памяти&lt;br /&gt;
# Предложите реализацию стека, которая дополнительно позволяет выполнить операцию &amp;quot;вернуть минимум значений в стеке&amp;quot;&lt;br /&gt;
# Стек с множественным извлечением. Добавим в стек операцию multipop(k), которая снимает вершины стека k элементов. Докажите, что амортизированная стоимость операции multipop равна $O(1)$. Сформулируйте окончательное доказательство с использованием метода потенциалов.&lt;br /&gt;
# Продемонстрируйте, как просимулировать очередь на двух стеках. Амортизированная стоимость операций push и pop должна быть $O(1)$.&lt;br /&gt;
# Предложите реализацию очереди, которая дополнительно позволяет выполнить операцию &amp;quot;вернуть минимум значений в очереди&amp;quot;. Амортизированная стоимость всех операций должна быть $O(1)$.&lt;br /&gt;
# Можно ли реализовать два стека на очереди (ограничений на время выполнения операций нет)?&lt;br /&gt;
# Задан односвязный список, каждый элемент знает следующий после себя. При этом возможно, что на самом деле список зацикливается (один из элементов ссылается как на следующий на элемент, который уже встречался в списке перед ним). Требуется проверить, зацикливается ли заданный односвязный список за $O(n)$ с $O(1)$ дополнительной памяти&lt;br /&gt;
# $d$-кучей называется структура данных аналогичная двоичной куче, только у каждой вершины по $d$ детей. Двоичная куча является 2-кучей. В $d$-куче выполняется $m$ операций decreaseKey и $n$ операций extractMin. Какое оптимальное асимптотически $d$ следует выбрать?&lt;br /&gt;
# В $d$-куче выполняется $m$ операций decreaseKey и $n$ операций extractMin. Время выполнения decreaseKey - $C_1 \log n$, а extractMin - $C_2 d \log n$. Какое $d$ следует выбрать?&lt;br /&gt;
# Пусть подряд выполняется $n$ операций insert в пустую биномиальную кучу. Какое среднее время операции?&lt;br /&gt;
# Как можно модифицировать биномиальную кучу, чтобы insert выполнялось за истинное $O(1)$, а амортизированная стоимость остальных операций не поменялась?&lt;br /&gt;
# Тонкие кучи. Будем называть дерево &amp;quot;тонким&amp;quot;, если оно может быть получено из биномиального удалением у некоторых вершин ребенка максимального ранга. Тонкой кучей называется коллекция тонких деревьев. Ограничений на число деревьев одного ранга нет. Разработайте операции merge и extractMin для тонких куч. Амортизированная стоимость операции extractMin должна быть $O(\log n)$. Амортизированная стоимость операции merge должна быть $O(1)$. &lt;br /&gt;
# Разработайте операцию decreaseKey для тонкой кучи. Докажите, что амортизированное время выполнения есть $O(1)$ (используйте потенциал $2M + T$, где $M$ - число вершин, у которых удалили ребенка)&lt;br /&gt;
# Докажите, что операция decreaseKey в тонкой куче из предыдущего задания выполняется за истинные $O(\log n)$&lt;br /&gt;
# Ускорение extractMin. Докажите, что в тонкой куче можно добиться истинного $O(\log n)$ на extractMin, если обрабатывать корневой список, сливая деревья разных рангов, как при extractMin каждый раз, когда в корневом списке становится хотя бы $2\log n$ элементов.&lt;br /&gt;
# Докажите оценку $O(\log n)$ для реализации СНМ со сжатием путей, но когда второе дерево всегда подвешивается на первое (а не обязательно меньшее на большее)&lt;br /&gt;
# Докажите оценку $O(\log^* n)$ для СНМ, если вместо рангов используется число вершин в поддереве (меньшее дерево подвешивается на большее)&lt;br /&gt;
# Решите задачу: найти во взвешеном дереве минимальный по весу путь, состоящий ровно из $k$ ребер&lt;br /&gt;
# Пусть в реализации СНМ с помощью леса корневых деревьев мы при объединении двух деревьев делаем корнем случайную из двух вершин. Приведите пример, где высота дерева в результате серии объединений будет $\Omega(n)$.&lt;br /&gt;
# Пусть в реализации СНМ с помощью леса корневых деревьев мы при объединении двух деревьев делаем корнем случайную из двух вершин. Сжатие путей не проводится. Докажите или опровергните, что в среднем время работы get будет $O(\log n)$.&lt;br /&gt;
# Докажите, что если при реализации СНМ с помощью леса корневых деревьев подвешивать одно дерево на другое произвольным образом, но не проводить сжатие путей, то среднее время работы get будет $O(\log n)$.&lt;br /&gt;
# Докажите, что если при реализации СНМ с помощью леса корневых деревьев подвешивать одно дерево на другое случайным образом и проводить сжатие путей, то среднее время работы get будет $O(\log^* n)$.&lt;br /&gt;
# Для каких $a$ определен $\log^*_a x$?&lt;br /&gt;
# Докажите, что если для $a$ и $b$ определен $\log^*_a x$ и $\log^*_b x$, то $\log^*_a x = O(\log^*_b x)$.&lt;br /&gt;
# Постройте массив, в котором сортировка выбором делает максимальное число обменов&lt;br /&gt;
# Предложите алгоритм, который вычисляет число обменов, которое делает сортировка выбором, за $O(n \log n)$.&lt;br /&gt;
# Найдите минимальное число сравнений для сортировки 4 элементов&lt;br /&gt;
# Найдите минимальное число сравнений для сортировки 5 элементов&lt;br /&gt;
# Постройте массив, в котором сортировка слиянием делает максимальное число сравнений элементов&lt;br /&gt;
# Укажите способ посчитать число массивов, в которых сортировка слиянием делает максимальное число сравнений элементов, за полиномиальное время.&lt;br /&gt;
# Предложите алгоритм слияния массива, состоящего из двух последовательно расположенных отсортированных фрагментов за $O(n)$ с использованием $O(\sqrt{n})$ дополнительной памяти&lt;br /&gt;
# Предложите алгоритм слияния массива, состоящего из двух последовательно расположенных отсортированных фрагментов за $O(n)$ с использованием $O(1)$ дополнительной памяти&lt;br /&gt;
# Докажите, что любой алгоритм, проверяющий, есть ли в массиве два одинаковых элемента с использованием только сравнений элементов, работает за $\Omega(n \log n)$&lt;br /&gt;
# Укажите способ для алгоритма QSort с выбором среднего элемента в качестве элемента построить массив, на котором происходит максимальное число сравнений элементов&lt;br /&gt;
# Укажите способ для любого детерминированного алгоритма выбора разделяющего элемента построить массив, на котором алгоритм QSort работает за $\Omega(n^2)$&lt;br /&gt;
# Предложите алгоритм сортировки циклических сдвигов заданного массива с $n$ элементами, каждый из которых от 1 до $n$, за $O(n^2)$. Циклические сдвиги представлять единственным числом: номером первого элемента в исходном массиве.&lt;br /&gt;
# Предложите алгоритм сортировки циклических сдвигов заданного массива с $n$ элементами, каждый из которых от 1 до $n$, за $O(n \log n)$. Циклические сдвиги представлять единственным числом: номером первого элемента в исходном массиве. Указание: зная порядок на подстроках длины $L$ порядок на подстроках длины $2L$ можно восстановить за $O(n)$.&lt;br /&gt;
# Пусть известно, что массив длины $n$ из чисел от 1 до $n$ получен с помощью генератора случайных чисел, каждое число независимо получено с помощью равномерного распределения. Предложите модификацию алгоритма сортировки подсчетом, который сортирует данный массив за $O(n)$ используя лишь $O(\sqrt{n})$ дополнительной памяти (обе оценки должны выполняться в среднем).&lt;br /&gt;
# Задан массив, полученный приписыванием отсортированного по убыванию массива в конец отсортированному по возрастанию. Все элементы массива различны. Требуется за $O(\log n)$ найти в нем заданный элемент. &lt;br /&gt;
# Задан массив, полученный приписыванием отсортированного по убыванию массива в конец отсортированному по возрастанию и затем циклическим сдвигом получившегося массива. Все элементы массива различны. Требуется за $O(\log n)$ найти в нем заданный элемент.&lt;br /&gt;
# Пусть выполняется целочисленный двоичный поиск с начальными значениями L = 0, R = $2^k$. Предложите алгоритм определения за $O(1)$ по заданным значениям L и R, могут ли они возникнуть в процессе двоичного поиска.&lt;br /&gt;
# Пусть выполняется целочисленный двоичный поиск с начальными значениями L = 0, R = $n$. Предложите алгоритм определения за $O(\log n)$ по заданным значениям L и R, могут ли они возникнуть в процессе двоичного поиска. h&lt;br /&gt;
# Оцените число итераций, которые вещественный двоичный поиск с условием цикла &amp;quot;L != M and R != M&amp;quot; делает в худшем случае при начальной инициализации L = L0, R = R0, если числа L0 и R0 одного знака.&lt;br /&gt;
# Оцените число итераций, которые вещественный двоичный поиск с условием цикла &amp;quot;L != M and R != M&amp;quot; делает в худшем случае при начальной инициализации L = L0, R = R0, если числа L0 и R0 разных знаков, или одно из них равно 0.&lt;br /&gt;
# Предложите алгоритм с временем работы $O(n)$ для следующей задачи: задан массив из неотрицательных чисел и число $k$, определите число отрезков с суммой, не превышающей $k$. Также проанализируйте, работает ли ваш алгоритм, если массив может содержать отрицательные числа: постройте контрпример или докажите, что работает.&lt;br /&gt;
# Запросы на статическом массиве: задано число $k$ и запросы {{---}} посчитать ассоциативную необратимую функцию на отрезке длины от $k$ до $2k$. Ответ на запросы за $O(1)$ и препроцессинг за $O(n)$.&lt;br /&gt;
# Запросы: 1. set(i, x) {{---}} $a_i := x$ (x {{---}} неотрицательно), 2. get(s) {{---}} найти такое минимальное $y$, что $\sum\limits_{i=1}^y a_i \ge s$, $\sum\limits_{i=1}^{y - 1} a_i &amp;lt; s$ за $O(\log{n})$. &lt;br /&gt;
# Обработайте $q$ запросов на прибавление на отрезке, получите конечный массив длины $n$, за $O(n + q)$. &lt;br /&gt;
# Обработайте запросы за $O(\log{n})$. Первый {{---}} присвоить значение элементу, второй {{---}} задан отрезок, найти подотрезок с максимальной суммой, содержащийся в этом отрезке.&lt;br /&gt;
# Сведите задачу к запросам изменения в точке и функции на отрезке за $O(\log{n})$. Задача {{---}} отвечать на запросы: прибавление на отрезке и минимум на отрезке.&lt;br /&gt;
# Решите за $O(\log{n})$ на запрос. Поступают запросы: изменить элемент, найти на заданном отрезке элемент с минимальным индексом, больший или равный заданного значения.&lt;br /&gt;
# В дереве отрезков любой отрезок можно разбить на $O(\log n)$ непересекающихся отрезков дерева. Предложите способ выделить $O(n \log n)$ отрезков в массиве индексов 1..$n$, чтобы любой отрезок можно было разбить на $O(1)$ непересекающихся отрезков из выбранного множества&lt;br /&gt;
# Дано $n$ точек на плоскости. Требуется найти наибольшую последовательность точек, в которой при переходе к следующей точке обе координаты строго возрастают, за $O(n \log n)$.&lt;br /&gt;
# Дано $n$ прямоугольников на плоскости со сторонами, параллельными осям координат. Требуется найти точку, покрытую максимальным числом прямоугольников за $O(n \log n)$.&lt;br /&gt;
# Предложите решение задачи с помощью ДО. Задан массив $a[1..n]$. Поступают запросы: прибавить ко всем элементам с $L$ по $R$ заданное число, получить произведение на отрезке. Время работы $o(n)$ на запрос (это задача-аукцион, пишите свое среднее время работы на запрос, время предпосчета и памяти на заявке)&lt;br /&gt;
# Предложите решение задачи с помощью ДО. Задан массив $a[1..n]$. Поступают запросы: прибавить значение к элементам на отрезке, найти элемент с минимальным индексом, больший или равный заданного значения.&lt;br /&gt;
# Предложите решение задачи с помощью ДО. Задан массив $a[1..n]$. Поступают запросы: найти $k$-й по величине элемент на отрезке с $i$-го по $j$-й. Время на запрос $O(\log n)$.&lt;br /&gt;
# Предложите решение задачи с помощью ДО. Задан массив $a[1..n]$. Поступают запросы: прибавить к всем элементам с $L$ по $R$ значение, к $i$-му значению прибавляется $ki+b$, где $k$ и $b$ - параметры запроса, получить сумму на отрезке. Время на запрос $O(\log n)$.&lt;br /&gt;
# Предложите решение задачи с помощью ДО. Задан массив $a[1..n]$. Поступают запросы: прибавить к всем элементам с $L$ по $R$ значение, к $i$-му значению прибавляется $ki+b$, где $k$ и $b$ - параметры запроса, получить минимум на отрезке. Время работы $o(n)$ на запрос (это задача-аукцион, пишите свое среднее время работы на запрос, время предпосчета и памяти на заявке)&lt;br /&gt;
# Дано $n$ прямоугольников на плоскости со сторонами, параллельными осям координат. Требуется найти площадь объединения прямоугольников за $O(n \log n)$.&lt;br /&gt;
# Дано $n$ прямоугольников на плоскости со сторонами, параллельными осям координат. Требуется найти периметр объединения прямоугольников за $O(n \log n)$.&lt;br /&gt;
# Решите за $O(\sqrt{n}\log{n})$ на запрос амортизированно. Поступают запросы: развернуть отрезок и посчитать количество элементов на отрезке от $x$ до $y$.&lt;br /&gt;
# Решите предыдущую задачу за $O(\sqrt{n\log{n}})$ на запрос истинно.&lt;br /&gt;
# Решите с помощью персистентного дерева отрезков. Дано $n$ точек. Поступают запросы в online: прямоугольник со сторонами, параллельными осям координат, нужно найти $k$-ю точку по возрастанию $y$-координаты, среди лежащих внутри этого прямоугольника. Время работы: $O(\log{n})$ на запрос.&lt;br /&gt;
# Решите предыдущую задачу без персистентного дерева отрезков.&lt;br /&gt;
# Решите за $O(\log{n})$ на запрос. Задан массив $a[1..n]$. Поступают запросы: прибавить ко всем элементам на отрезке заданное число и вывести сумму сумм всех подотрезков отрезка.&lt;br /&gt;
# Решите за $O(\log{n})$ на запрос. Задан массив $a[1..n]$. Поступают запросы: прибавить ко всем элементам на отрезке заданное число, умножить все элементы на отрезке на заданное число, вывести $i$-й элемент массива.&lt;br /&gt;
# Модифицировать алгоритм Фараха-Колтона-Бендера, чтобы массив precalc занимал только $O(K \log{K})$ бит памяти для каждой маски.&lt;br /&gt;
# Дано взвешенное дерево. Научиться отвечать на запросы &amp;quot;вес пути из $u$ в $v$&amp;quot;. После предобработки за $O(n)$ ответ на запрос за $O(1)$.&lt;br /&gt;
# Дано взвешенное дерево. Научиться отвечать на запросы &amp;quot;вес пути из $u$ в $v$&amp;quot; и &amp;quot;изменить вес ребра&amp;quot;. После предобработки за $O(n)$ ответ на запрос за $O(\log{n})$.&lt;br /&gt;
# Дано взвешенное дерево. Научиться отвечать на запросы &amp;quot;вес ребра&amp;quot; и &amp;quot;прибавить ко всем ребрам на пути от $v$ до $u$ число $d$&amp;quot;. После предобработки за $O(n)$ ответ на запрос за $O(\log{n})$.&lt;br /&gt;
# Алгоритм Хьюи. Дано дерево, вершины которого раскрашены в цвета, то есть задано отображение $col: V \to \{1..k\}$. С помощью LCA найти $dc: V \to \{1..k\}$, где $dc(u)$ - число различных цветов в поддереве с корнем в вершине $u$. Время работы: $O(V)$.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/wikitex&amp;gt;&lt;/div&gt;</summary>
		<author><name>188.162.64.3</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BF%D0%B8%D1%81%D0%BE%D0%BA_%D0%B7%D0%B0%D0%B4%D0%B0%D0%BD%D0%B8%D0%B9_%D0%BF%D0%BE_%D0%90%D0%B8%D0%A1%D0%94-year2015-%D1%81%D0%B5%D0%BC1&amp;diff=50087</id>
		<title>Список заданий по АиСД-year2015-сем1</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BF%D0%B8%D1%81%D0%BE%D0%BA_%D0%B7%D0%B0%D0%B4%D0%B0%D0%BD%D0%B8%D0%B9_%D0%BF%D0%BE_%D0%90%D0%B8%D0%A1%D0%94-year2015-%D1%81%D0%B5%D0%BC1&amp;diff=50087"/>
				<updated>2015-12-01T00:14:50Z</updated>
		
		<summary type="html">&lt;p&gt;188.162.64.3: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;wikitex&amp;gt;&lt;br /&gt;
= Алгоритмы и структуры данных, 1 семестр =&lt;br /&gt;
# Можно ли построить структуру данных, с двумя видами операций, одна из которых работает за истинное $O(2^n)$, а вторая за истинное $O(\log{n})$, и при этом амортизированное время работы обеих операций $O(1)$. Почему?&lt;br /&gt;
# Можно ли построить структуру данных, с двумя видами операций, одна из которых работает за истинное $O(\sqrt{n})$, а вторая за истинное $\Theta(\log{n})$, и при этом амортизированное время работы обеих операций $O(1)$. Почему?&lt;br /&gt;
# Пусть структура данных выполняет два типа запросов. Первый тип запроса выполняется за $O(f(s) k \log{k})$, а второй {{---}} за $O(\frac{g(s)}{k \sqrt{k}})$, причем значение $k$ можно выбрать любым натуральным числом, а $f(s)$ и $g(s)$ известны и зависят от размера структуры данных. Вам стало известно, что к структуре данных сделают $n$ запросов первого типа, и $m$ запросов второго типа. Какое $k$ нужно выбрать, чтобы среднее время работы запросов было минимальным.&lt;br /&gt;
# Проанализировать саморасширяющийся массив, если расширение происходит в $A$ раз ($1 &amp;lt; A$)&lt;br /&gt;
# Проанализировать стек на саморасширяющемся массиве, если при полном заполнении происходит увеличение в 2 раза, а при заполнении менее чем на 1/4 - сужение в 2 раза с помощью метода потеницалов. Потенциал должен зависеть только от текущего состояния стека (размера выделенного массива и числа заполненных элементов) и не должен зависеть от истории операций.&lt;br /&gt;
# Проанализировать стек на саморасширяющемся массиве, если при полном заполнении происходит увеличение в A раз, а при заполнении менее чем на B - сужение в C раз&lt;br /&gt;
# Разработать вектор с добавлением/удалением с истинной стоимостью всех операций $O(\log n)$.&lt;br /&gt;
# Разработать вектор с добавлением/удалением с истинной стоимостью всех операций $O(1)$.&lt;br /&gt;
# В массиве есть элемент, который встречается хотя бы $n/2$ раз. Требуется найти его за $O(n)$ с $O(1)$ дополнительной памяти&lt;br /&gt;
# Использования памяти без инициализации. Задан массив $a[1..n]$. Требуется поддержать две операции: $set(i, x)$ и $get(i)$. Операция $set$ должна присваивать $i$-му элементу массива значение $x$. Операция $get$ должна возвращать последнее присвоенное $i$-му элементу значение, либо 0, если присвоения не было. При этом исходно массив заполнен произвольными данными. Разрешается завести $O(1)$ дополнительных массивов (также заполненных произвольным мусором) и реализовать все операции за истинное $O(1)$.&lt;br /&gt;
# Счетчик Кнута. Рассмотрим массив $a[0..n-1]$. Будем считать, что в каждом элементе может быть число 0, 1 или 2 и массив представляет собой число $a[0]+a[1]\cdot 2+a[2]\cdot 4 + \ldots + a[n-1]\cdot2^{n-1}$. Требуется реализовать операцию добавления $2^k$ к числу, представленному в массиве за истинное $O(1)$ и $O(n)$ дополнительной памяти.&lt;br /&gt;
# Реализуйте менеджер памяти, позволяющий выделять и возвращать блоки одинакового размера за $O(1)$ времени и $O(1)$ дополнительной памяти&lt;br /&gt;
# Предложите реализацию стека, которая дополнительно позволяет выполнить операцию &amp;quot;вернуть минимум значений в стеке&amp;quot;&lt;br /&gt;
# Стек с множественным извлечением. Добавим в стек операцию multipop(k), которая снимает вершины стека k элементов. Докажите, что амортизированная стоимость операции multipop равна $O(1)$. Сформулируйте окончательное доказательство с использованием метода потенциалов.&lt;br /&gt;
# Продемонстрируйте, как просимулировать очередь на двух стеках. Амортизированная стоимость операций push и pop должна быть $O(1)$.&lt;br /&gt;
# Предложите реализацию очереди, которая дополнительно позволяет выполнить операцию &amp;quot;вернуть минимум значений в очереди&amp;quot;. Амортизированная стоимость всех операций должна быть $O(1)$.&lt;br /&gt;
# Можно ли реализовать два стека на очереди (ограничений на время выполнения операций нет)?&lt;br /&gt;
# Задан односвязный список, каждый элемент знает следующий после себя. При этом возможно, что на самом деле список зацикливается (один из элементов ссылается как на следующий на элемент, который уже встречался в списке перед ним). Требуется проверить, зацикливается ли заданный односвязный список за $O(n)$ с $O(1)$ дополнительной памяти&lt;br /&gt;
# $d$-кучей называется структура данных аналогичная двоичной куче, только у каждой вершины по $d$ детей. Двоичная куча является 2-кучей. В $d$-куче выполняется $m$ операций decreaseKey и $n$ операций extractMin. Какое оптимальное асимптотически $d$ следует выбрать?&lt;br /&gt;
# В $d$-куче выполняется $m$ операций decreaseKey и $n$ операций extractMin. Время выполнения decreaseKey - $C_1 \log n$, а extractMin - $C_2 d \log n$. Какое $d$ следует выбрать?&lt;br /&gt;
# Пусть подряд выполняется $n$ операций insert в пустую биномиальную кучу. Какое среднее время операции?&lt;br /&gt;
# Как можно модифицировать биномиальную кучу, чтобы insert выполнялось за истинное $O(1)$, а амортизированная стоимость остальных операций не поменялась?&lt;br /&gt;
# Тонкие кучи. Будем называть дерево &amp;quot;тонким&amp;quot;, если оно может быть получено из биномиального удалением у некоторых вершин ребенка максимального ранга. Тонкой кучей называется коллекция тонких деревьев. Ограничений на число деревьев одного ранга нет. Разработайте операции merge и extractMin для тонких куч. Амортизированная стоимость операции extractMin должна быть $O(\log n)$. Амортизированная стоимость операции merge должна быть $O(1)$. &lt;br /&gt;
# Разработайте операцию decreaseKey для тонкой кучи. Докажите, что амортизированное время выполнения есть $O(1)$ (используйте потенциал $2M + T$, где $M$ - число вершин, у которых удалили ребенка)&lt;br /&gt;
# Докажите, что операция decreaseKey в тонкой куче из предыдущего задания выполняется за истинные $O(\log n)$&lt;br /&gt;
# Ускорение extractMin. Докажите, что в тонкой куче можно добиться истинного $O(\log n)$ на extractMin, если обрабатывать корневой список, сливая деревья разных рангов, как при extractMin каждый раз, когда в корневом списке становится хотя бы $2\log n$ элементов.&lt;br /&gt;
# Докажите оценку $O(\log n)$ для реализации СНМ со сжатием путей, но когда второе дерево всегда подвешивается на первое (а не обязательно меньшее на большее)&lt;br /&gt;
# Докажите оценку $O(\log^* n)$ для СНМ, если вместо рангов используется число вершин в поддереве (меньшее дерево подвешивается на большее)&lt;br /&gt;
# Решите задачу: найти во взвешеном дереве минимальный по весу путь, состоящий ровно из $k$ ребер&lt;br /&gt;
# Пусть в реализации СНМ с помощью леса корневых деревьев мы при объединении двух деревьев делаем корнем случайную из двух вершин. Приведите пример, где высота дерева в результате серии объединений будет $\Omega(n)$.&lt;br /&gt;
# Пусть в реализации СНМ с помощью леса корневых деревьев мы при объединении двух деревьев делаем корнем случайную из двух вершин. Сжатие путей не проводится. Докажите или опровергните, что в среднем время работы get будет $O(\log n)$.&lt;br /&gt;
# Докажите, что если при реализации СНМ с помощью леса корневых деревьев подвешивать одно дерево на другое произвольным образом, но не проводить сжатие путей, то среднее время работы get будет $O(\log n)$.&lt;br /&gt;
# Докажите, что если при реализации СНМ с помощью леса корневых деревьев подвешивать одно дерево на другое случайным образом и проводить сжатие путей, то среднее время работы get будет $O(\log^* n)$.&lt;br /&gt;
# Для каких $a$ определен $\log^*_a x$?&lt;br /&gt;
# Докажите, что если для $a$ и $b$ определен $\log^*_a x$ и $\log^*_b x$, то $\log^*_a x = O(\log^*_b x)$.&lt;br /&gt;
# Постройте массив, в котором сортировка выбором делает максимальное число обменов&lt;br /&gt;
# Предложите алгоритм, который вычисляет число обменов, которое делает сортировка выбором, за $O(n \log n)$.&lt;br /&gt;
# Найдите минимальное число сравнений для сортировки 4 элементов&lt;br /&gt;
# Найдите минимальное число сравнений для сортировки 5 элементов&lt;br /&gt;
# Постройте массив, в котором сортировка слиянием делает максимальное число сравнений элементов&lt;br /&gt;
# Укажите способ посчитать число массивов, в которых сортировка слиянием делает максимальное число сравнений элементов, за полиномиальное время.&lt;br /&gt;
# Предложите алгоритм слияния массива, состоящего из двух последовательно расположенных отсортированных фрагментов за $O(n)$ с использованием $O(\sqrt{n})$ дополнительной памяти&lt;br /&gt;
# Предложите алгоритм слияния массива, состоящего из двух последовательно расположенных отсортированных фрагментов за $O(n)$ с использованием $O(1)$ дополнительной памяти&lt;br /&gt;
# Докажите, что любой алгоритм, проверяющий, есть ли в массиве два одинаковых элемента с использованием только сравнений элементов, работает за $\Omega(n \log n)$&lt;br /&gt;
# Укажите способ для алгоритма QSort с выбором среднего элемента в качестве элемента построить массив, на котором происходит максимальное число сравнений элементов&lt;br /&gt;
# Укажите способ для любого детерминированного алгоритма выбора разделяющего элемента построить массив, на котором алгоритм QSort работает за $\Omega(n^2)$&lt;br /&gt;
# Предложите алгоритм сортировки циклических сдвигов заданного массива с $n$ элементами, каждый из которых от 1 до $n$, за $O(n^2)$. Циклические сдвиги представлять единственным числом: номером первого элемента в исходном массиве.&lt;br /&gt;
# Предложите алгоритм сортировки циклических сдвигов заданного массива с $n$ элементами, каждый из которых от 1 до $n$, за $O(n \log n)$. Циклические сдвиги представлять единственным числом: номером первого элемента в исходном массиве. Указание: зная порядок на подстроках длины $L$ порядок на подстроках длины $2L$ можно восстановить за $O(n)$.&lt;br /&gt;
# Пусть известно, что массив длины $n$ из чисел от 1 до $n$ получен с помощью генератора случайных чисел, каждое число независимо получено с помощью равномерного распределения. Предложите модификацию алгоритма сортировки подсчетом, который сортирует данный массив за $O(n)$ используя лишь $O(\sqrt{n})$ дополнительной памяти (обе оценки должны выполняться в среднем).&lt;br /&gt;
# Задан массив, полученный приписыванием отсортированного по убыванию массива в конец отсортированному по возрастанию. Все элементы массива различны. Требуется за $O(\log n)$ найти в нем заданный элемент. &lt;br /&gt;
# Задан массив, полученный приписыванием отсортированного по убыванию массива в конец отсортированному по возрастанию и затем циклическим сдвигом получившегося массива. Все элементы массива различны. Требуется за $O(\log n)$ найти в нем заданный элемент.&lt;br /&gt;
# Пусть выполняется целочисленный двоичный поиск с начальными значениями L = 0, R = $2^k$. Предложите алгоритм определения за $O(1)$ по заданным значениям L и R, могут ли они возникнуть в процессе двоичного поиска.&lt;br /&gt;
# Пусть выполняется целочисленный двоичный поиск с начальными значениями L = 0, R = $n$. Предложите алгоритм определения за $O(\log n)$ по заданным значениям L и R, могут ли они возникнуть в процессе двоичного поиска. h&lt;br /&gt;
# Оцените число итераций, которые вещественный двоичный поиск с условием цикла &amp;quot;L != M and R != M&amp;quot; делает в худшем случае при начальной инициализации L = L0, R = R0, если числа L0 и R0 одного знака.&lt;br /&gt;
# Оцените число итераций, которые вещественный двоичный поиск с условием цикла &amp;quot;L != M and R != M&amp;quot; делает в худшем случае при начальной инициализации L = L0, R = R0, если числа L0 и R0 разных знаков, или одно из них равно 0.&lt;br /&gt;
# Предложите алгоритм с временем работы $O(n)$ для следующей задачи: задан массив из неотрицательных чисел и число $k$, определите число отрезков с суммой, не превышающей $k$. Также проанализируйте, работает ли ваш алгоритм, если массив может содержать отрицательные числа: постройте контрпример или докажите, что работает.&lt;br /&gt;
# Запросы на статическом массиве: задано число $k$ и запросы {{---}} посчитать ассоциативную необратимую функцию на отрезке длины от $k$ до $2k$. Ответ на запросы за $O(1)$ и препроцессинг за $O(n)$.&lt;br /&gt;
# Запросы: 1. set(i, x) {{---}} $a_i := x$ (x {{---}} неотрицательно), 2. get(s) {{---}} найти такое минимальное $y$, что $\sum\limits_{i=1}^y a_i \ge s$, $\sum\limits_{i=1}^{y - 1} a_i &amp;lt; s$ за $O(\log{n})$. &lt;br /&gt;
# Обработайте $q$ запросов на прибавление на отрезке, получите конечный массив длины $n$, за $O(n + q)$. &lt;br /&gt;
# Обработайте запросы за $O(\log{n})$. Первый {{---}} присвоить значение элементу, второй {{---}} задан отрезок, найти подотрезок с максимальной суммой, содержащийся в этом отрезке.&lt;br /&gt;
# Сведите задачу к запросам изменения в точке и функции на отрезке за $O(\log{n})$. Задача {{---}} отвечать на запросы: прибавление на отрезке и минимум на отрезке.&lt;br /&gt;
# Решите за $O(\log{n})$ на запрос. Поступают запросы: изменить элемент, найти на заданном отрезке элемент с минимальным индексом, больший или равный заданного значения.&lt;br /&gt;
# В дереве отрезков любой отрезок можно разбить на $O(\log n)$ непересекающихся отрезков дерева. Предложите способ выделить $O(n \log n)$ отрезков в массиве индексов 1..$n$, чтобы любой отрезок можно было разбить на $O(1)$ непересекающихся отрезков из выбранного множества&lt;br /&gt;
# Дано $n$ точек на плоскости. Требуется найти наибольшую последовательность точек, в которой при переходе к следующей точке обе координаты строго возрастают, за $O(n \log n)$.&lt;br /&gt;
# Дано $n$ прямоугольников на плоскости со сторонами, параллельными осям координат. Требуется найти точку, покрытую максимальным числом прямоугольников за $O(n \log n)$.&lt;br /&gt;
# Предложите решение задачи с помощью ДО. Задан массив $a[1..n]$. Поступают запросы: прибавить ко всем элементам с $L$ по $R$ заданное число, получить произведение на отрезке. Время работы $o(n)$ на запрос (это задача-аукцион, пишите свое среднее время работы на запрос, время предпосчета и памяти на заявке)&lt;br /&gt;
# Предложите решение задачи с помощью ДО. Задан массив $a[1..n]$. Поступают запросы: прибавить значение к элементам на отрезке, найти элемент с минимальным индексом, больший или равный заданного значения.&lt;br /&gt;
# Предложите решение задачи с помощью ДО. Задан массив $a[1..n]$. Поступают запросы: найти $k$-й по величине элемент на отрезке с $i$-го по $j$-й. Время на запрос $O(\log n)$.&lt;br /&gt;
# Предложите решение задачи с помощью ДО. Задан массив $a[1..n]$. Поступают запросы: прибавить к всем элементам с $L$ по $R$ значение, к $i$-му значению прибавляется $ki+b$, где $k$ и $b$ - параметры запроса, получить сумму на отрезке. Время на запрос $O(\log n)$.&lt;br /&gt;
# Предложите решение задачи с помощью ДО. Задан массив $a[1..n]$. Поступают запросы: прибавить к всем элементам с $L$ по $R$ значение, к $i$-му значению прибавляется $ki+b$, где $k$ и $b$ - параметры запроса, получить минимум на отрезке. Время работы $o(n)$ на запрос (это задача-аукцион, пишите свое среднее время работы на запрос, время предпосчета и памяти на заявке)&lt;br /&gt;
# Дано $n$ прямоугольников на плоскости со сторонами, параллельными осям координат. Требуется найти площадь объединения прямоугольников за $O(n \log n)$.&lt;br /&gt;
# Дано $n$ прямоугольников на плоскости со сторонами, параллельными осям координат. Требуется найти периметр объединения прямоугольников за $O(n \log n)$.&lt;br /&gt;
# Решите за $O(\sqrt{n}\log{n})$ на запрос амортизированно. Поступают запросы: развернуть отрезок и посчитать количество элементов на отрезке от $x$ до $y$.&lt;br /&gt;
# Решите предыдущую задачу за $O(\sqrt{n\log{n}})$ на запрос истинно.&lt;br /&gt;
# Решите с помощью персистентного дерева отрезков. Дано $n$ точек. Поступают запросы в online: прямоугольник со сторонами, параллельными осям координат, нужно найти $k$-ю точку по возрастанию $y$-координаты, среди лежащих внутри этого прямоугольника. Время работы: $O(\log{n})$ на запрос.&lt;br /&gt;
# Решите предыдущую задачу без персистентного дерева отрезков.&lt;br /&gt;
# Решите за $O(\log{n})$ на запрос. Задан массив $a[1..n]$. Поступают запросы: прибавить ко всем элементам на отрезке заданное число и вывести сумму сумм всех подотрезков отрезка.&lt;br /&gt;
# Решите за $O(\log{n})$ на запрос. Задан массив $a[1..n]$. Поступают запросы: прибавить ко всем элементам на отрезке заданное число, умножить все элементы на отрезке на заданное число, вывести $i$-й элемент массива.&lt;br /&gt;
# Модифицировать алгоритм Фараха-Колтона-Бендера, чтобы массив precalc занимал только $O(K \log{K})$ памяти для каждой маски.&lt;br /&gt;
# Дано взвешенное дерево. Научиться отвечать на запросы &amp;quot;вес пути из $u$ в $v$&amp;quot;. После предобработки за $O(n)$ ответ на запрос за $O(1)$.&lt;br /&gt;
# Дано взвешенное дерево. Научиться отвечать на запросы &amp;quot;вес пути из $u$ в $v$&amp;quot; и &amp;quot;изменить вес ребра&amp;quot;. После предобработки за $O(n)$ ответ на запрос за $O(\log{n})$.&lt;br /&gt;
# Дано взвешенное дерево. Научиться отвечать на запросы &amp;quot;вес ребра&amp;quot; и &amp;quot;прибавить ко всем ребрам на пути от $v$ до $u$ число $d$&amp;quot;. После предобработки за $O(n)$ ответ на запрос за $O(\log{n})$.&lt;br /&gt;
# Алгоритм Хьюи. Дано дерево, вершины которого раскрашены в цвета, то есть задано отображение $col: V \to \{1..k\}$. С помощью LCA найти $dc: V \to \{1..k\}$, где $dc(u)$ - число различных цветов в поддереве с корнем в вершине $u$. Время работы: $O(V)$.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/wikitex&amp;gt;&lt;/div&gt;</summary>
		<author><name>188.162.64.3</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%B3%D0%B5%D0%BE%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%8F&amp;diff=44705</id>
		<title>Вычислительная геометрия</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%B3%D0%B5%D0%BE%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%8F&amp;diff=44705"/>
				<updated>2015-01-18T09:20:59Z</updated>
		
		<summary type="html">&lt;p&gt;188.162.64.3: /* Аффинное пространство */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* [[Представление чисел с плавающей точкой]]&lt;br /&gt;
* [[Предикат &amp;quot;левый поворот&amp;quot;]]&lt;br /&gt;
* [[Интервальная арифметика]]&lt;br /&gt;
* [[Adaptive precision arithmetic]]&lt;br /&gt;
* [[Алгоритм Бентли-Оттмана]]&lt;br /&gt;
* [[Конфигурация]]&lt;br /&gt;
* [[Трапецоидная карта]]&lt;br /&gt;
* [[Алгоритм Киркпатрика детализации триангуляции]]&lt;br /&gt;
* [[Пересечение окружностей]]&lt;br /&gt;
* [[Упрощение полигональной цепи]]&lt;br /&gt;
* [[Ортогональный поиск]]&lt;br /&gt;
* [[Триангуляция полигонов (ушная + монотонная)]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
* [[Список тем]]&lt;br /&gt;
* [[Список тем (year 2012)]]&lt;br /&gt;
* [[Обсуждение:Вычислительная геометрия#Сдача конспектов | Сдача конспектов]]&lt;br /&gt;
* [[Обсуждение:Вычислительная геометрия#Презентации | Сдача презентаций]]&lt;br /&gt;
* [[Обсуждение:Вычислительная геометрия#Условия и чекеры | Условия и чекеры]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
* [[CMake_Tutorial|Туториал по cmake]]&lt;br /&gt;
* [[Тестирование с использованием Google Test]]&lt;br /&gt;
== Базовые алгоритмы и структуры данных ==&lt;br /&gt;
* [[Квадродеревья | Квадродерево, сжатое квадродерево]]&lt;br /&gt;
* [[ Skip quadtree: определение, время работы | Skip quadtree: определение, время работы, запрос точек в прямоугольнике ]]&lt;br /&gt;
* [[ К-d деревья и перечисление точек в произвольном прямоугольнике (статика) | К-d деревья и перечисление точек в произвольном прямоугольнике (статика) ]]&lt;br /&gt;
* [[ Перечисление точек в произвольном прямоугольнике за n * log ^(d - 1) n (range tree) | Перечисление точек в произвольном прямоугольнике за n * log ^(d - 1) n (range tree) ]]&lt;br /&gt;
* [[ Дерево интервалов (interval tree) и пересечение точки с множеством интервалов | Дерево интервалов (interval tree) и пересечение точки с множеством интервалов ]]&lt;br /&gt;
* [[ Пересечение прямоугольника с множеством прямоугольников (PST) | Пересечение прямоугольника с множеством прямоугольников (PST) ]]&lt;br /&gt;
&lt;br /&gt;
== Аффинное пространство ==&lt;br /&gt;
* [[ Пересечение отрезков и поворот: определение, свойства, вычисление | Пересечение отрезков и поворот: определение, свойства, вычисление ]]&lt;br /&gt;
* [[ Принадлежность точки выпуклому и невыпуклому многоугольникам | Принадлежность точки выпуклому и невыпуклому многоугольникам ]]&lt;br /&gt;
* [[ Пересечение прямоугольника с множеством непересекающихся отрезков (segment tree) | Пересечение прямоугольника с множеством непересекающихся отрезков (segment tree) ]]&lt;br /&gt;
* [[ Статические выпуклые оболочки: Джарвис, Грэхем, Эндрю, Чен, QuickHull | Статические выпуклые оболочки: Джарвис, Грэхем, Эндрю, Чен, QuickHull ]]&lt;br /&gt;
* [[ Динамическая выпуклая оболочка (достаточно log^2 на добавление/удаление) | Динамическая выпуклая оболочка (достаточно log^2 на добавление/удаление) ]]&lt;br /&gt;
* [[ Выпуклая оболочка в n-мерном пространстве | Выпуклая оболочка в n-мерном пространстве ]]&lt;br /&gt;
* [[ Триангуляция полигонов (ушная + монотонная)#Ушной метод | Триангуляция многоугольника за n^2]]&lt;br /&gt;
* [[ Триангуляция полигонов (ушная + монотонная) | Триангуляция многоугольника заметающей прямой ]]&lt;br /&gt;
* [[ Пересечение полуплоскостей, связь с выпуклыми оболочками | Пересечение полуплоскостей, связь с выпуклыми оболочками ]]&lt;br /&gt;
* [[ Пересечение множества отрезков | Пересечение множества отрезков ]]&lt;br /&gt;
* [[ Snap rounding | Snap rounding ]]&lt;br /&gt;
* [[ ППЛГ и РСДС (PSLG и DCEL): определение, построение РСДС множества прямых | ППЛГ и РСДС (PSLG и DCEL): определение, построение РСДС множества прямых ]]&lt;br /&gt;
* [[ Пересечение многоугольников (PSLG overlaying) | Пересечение многоугольников (PSLG overlaying) ]]&lt;br /&gt;
* [[ Локализация в ППЛГ методом полос (персистентные деревья) | Локализация в ППЛГ методом полос (персистентные деревья) ]]&lt;br /&gt;
* [[ Алгоритм Киркпатрика детализации триангуляции | Локализация в ППЛГ. Алгоритм Киркпатрика ]]&lt;br /&gt;
* [[ Трапецоидная карта | Трапецоидная карта ]]&lt;br /&gt;
* [[ Пересечение отрезков на сфере | Пересечение отрезков на сфере ]]&lt;br /&gt;
* [[BSP-дерево]]&lt;br /&gt;
&lt;br /&gt;
== Скалярное произведение и мера ==&lt;br /&gt;
* [[ Диаметр множества точек (вращающиеся калиперы) | Диаметр множества точек (вращающиеся калиперы) ]]&lt;br /&gt;
* [[ Сумма Минковского (определение, вычисление) | Сумма Минковского (определение, вычисление) ]]&lt;br /&gt;
* [[ Минимальная охватывающая окружность множества точек | Минимальная охватывающая окружность множества точек ]]&lt;br /&gt;
* [[ Visibility graph и motion planning | Visibility graph и motion planning ]]&lt;br /&gt;
* [[ Триангуляция Делоне | Триангуляция Делоне ]]&lt;br /&gt;
* [[ Диаграмма Вороного | Диаграмма Вороного ]]&lt;br /&gt;
* [[Motorcycle graph]]&lt;br /&gt;
* [[Straight skeleton]]&lt;br /&gt;
&lt;br /&gt;
== Добавьте в нужное место ==&lt;br /&gt;
* [[Алгоритм Балабана]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Вычислительная геометрия]]&lt;/div&gt;</summary>
		<author><name>188.162.64.3</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D0%BE_%D0%9D%D0%9A%D0%90_%D1%8D%D0%BA%D0%B2%D0%B8%D0%B2%D0%B0%D0%BB%D0%B5%D0%BD%D1%82%D0%BD%D0%BE%D0%B3%D0%BE_%D0%94%D0%9A%D0%90,_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%A2%D0%BE%D0%BC%D0%BF%D1%81%D0%BE%D0%BD%D0%B0&amp;diff=43473</id>
		<title>Построение по НКА эквивалентного ДКА, алгоритм Томпсона</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D0%BE_%D0%9D%D0%9A%D0%90_%D1%8D%D0%BA%D0%B2%D0%B8%D0%B2%D0%B0%D0%BB%D0%B5%D0%BD%D1%82%D0%BD%D0%BE%D0%B3%D0%BE_%D0%94%D0%9A%D0%90,_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%A2%D0%BE%D0%BC%D0%BF%D1%81%D0%BE%D0%BD%D0%B0&amp;diff=43473"/>
				<updated>2015-01-06T09:36:18Z</updated>
		
		<summary type="html">&lt;p&gt;188.162.64.3: /* Алгоритм */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Описание ==&lt;br /&gt;
Алгоритм Томпсона строит по [[Недетерминированные конечные автоматы|НКА]] эквивалентный [[Детерминированные конечные автоматы|ДКА]] следующим образом:&lt;br /&gt;
* Начало.&lt;br /&gt;
* '''Шаг 1.''' Помещаем в очередь &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; множество, состоящее только из стартовой вершины.&lt;br /&gt;
* '''Шаг 2.''' Затем, пока очередь не пуста выполняем следующие действия:&lt;br /&gt;
** Достаем из очереди множество, назовем его &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt;&lt;br /&gt;
** Для всех &amp;lt;tex&amp;gt;c \in \Sigma&amp;lt;/tex&amp;gt; посмотрим в какое состояние ведет переход по символу &amp;lt;tex&amp;gt;c&amp;lt;/tex&amp;gt; из каждого состояния в &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt;. Полученное множество состояний положим в очередь &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; только если оно не лежало там раньше. Каждое такое множество в итоговом ДКА будет отдельной вершиной, в которую будут вести переходы по соответствующим символам.&lt;br /&gt;
** Если в множестве &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt; хотя бы одна из вершин была терминальной в НКА, то соответствующая данному множеству вершина в ДКА также будет терминальной.&lt;br /&gt;
* Конец.&lt;br /&gt;
&lt;br /&gt;
== Построение эквивалентного ДКА по НКА ==&lt;br /&gt;
&lt;br /&gt;
Пусть нам дан произвольный НКА: &amp;lt;tex&amp;gt;\langle \Sigma , Q, s \in Q, T \subset Q, \delta : Q \times \Sigma \to 2^Q \rangle&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Построим по нему следующий ДКА: &amp;lt;tex&amp;gt;\langle \Sigma , Q_d, s_d \in Q_d, T_d \subset Q_d, \delta_d : Q_d \times \Sigma \to Q_d \rangle&amp;lt;/tex&amp;gt;, где:&lt;br /&gt;
# &amp;lt;tex&amp;gt;Q_d = \{q_d \mid q_d \subset 2^Q \}&amp;lt;/tex&amp;gt;,&lt;br /&gt;
# &amp;lt;tex&amp;gt;s_d = \{s\}&amp;lt;/tex&amp;gt;,&lt;br /&gt;
# &amp;lt;tex&amp;gt;T_d = \{q \in Q_d \mid \exists p \in T : p \in q\}&amp;lt;/tex&amp;gt;,&lt;br /&gt;
# &amp;lt;tex&amp;gt;\delta_d(q, c) = \{ \delta(a, c) \mid a \in q \}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Доказательство эквивалентности===&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Построенный ДКА эквивалентен данному НКА.&lt;br /&gt;
|proof=&lt;br /&gt;
#Докажем, что любое слово, которое принимает НКА, будет принято построенным ДКА. Заметим, что &amp;lt;tex&amp;gt;\forall q \in q_d, \forall c \in \Sigma, \forall p \in \delta(q, c): p \in \delta_d(q_d, c)&amp;lt;/tex&amp;gt;. Рассмотрим слово &amp;lt;tex&amp;gt;w=w_1 \dots w_m&amp;lt;/tex&amp;gt;, которое принимает автомат НКА: &amp;lt;tex&amp;gt;\langle s, w_1w_2 \dots w_m \rangle \vdash \langle u_1, w_2 \dots w_m \rangle \vdash \langle u_m, \varepsilon \rangle, u_m \in T&amp;lt;/tex&amp;gt;. Проверим, что построенный ДКА тоже принимает это слово. Заметим, что &amp;lt;tex&amp;gt;s \in s_d&amp;lt;/tex&amp;gt;, а, значит, исходя из нашего наблюдения, мы получаем, что &amp;lt;tex&amp;gt;u_1 \in {u_d}_1&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;{u_d}_1 = \delta_d(s, w_1)&amp;lt;/tex&amp;gt;. Далее, несложно заметить, что &amp;lt;tex&amp;gt;\forall i \leqslant m : u_i \in {u_d}_i&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;\langle s_d, w_1w_2 \dots w_m \rangle \vdash \langle {u_d}_1, w_2 \dots w_m \rangle \vdash \langle {u_d}_i, w_{i + 1} \dots w_m\rangle&amp;lt;/tex&amp;gt;. Таким образом, &amp;lt;tex&amp;gt;u_m \in {u_d}_m&amp;lt;/tex&amp;gt;, а из определения терминальных состояний в построенном ДКА мы получаем, что &amp;lt;tex&amp;gt;{u_d}_m \in T_d&amp;lt;/tex&amp;gt;, то есть наш ДКА тоже принимает cлово &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt;.&lt;br /&gt;
#Докажем, что любое слово, которое принимает построенный ДКА, принимает и НКА. Сначала сделаем наблюдение, что если &amp;lt;tex&amp;gt;q_d=\{q\}&amp;lt;/tex&amp;gt;, и мы из него достигли по строке &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; какого-то состояния &amp;lt;tex&amp;gt;p_d&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;\forall p \in p_d&amp;lt;/tex&amp;gt; существует путь из &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt; в НКА по строке &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt;. Рассмотрим слово &amp;lt;tex&amp;gt;w=w_1 \dots w_m&amp;lt;/tex&amp;gt;, которое принимает автомат ДКА: &amp;lt;tex&amp;gt;\langle s_d, w_1w_2 \dots w_m \rangle \vdash \langle {u_d}_1, w_2 \dots w_m \rangle \vdash \langle {u_d}_m, \varepsilon \rangle, {u_d}_m \in T_d&amp;lt;/tex&amp;gt;. Проверим, что НКА тоже принимает это слово. Так как &amp;lt;tex&amp;gt;s_d = \{s\}&amp;lt;/tex&amp;gt;, и мы из &amp;lt;tex&amp;gt;s_d&amp;lt;/tex&amp;gt; достигли &amp;lt;tex&amp;gt;{u_d}_m \in T_d&amp;lt;/tex&amp;gt;, возьмём любое терминальное состояние &amp;lt;tex&amp;gt;u_m \in {u_d}_m&amp;lt;/tex&amp;gt;. По нашему наблюдению в НКА есть путь из &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;u_m&amp;lt;/tex&amp;gt; по строке &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt;, а, значит, НКА принимает это слово. &lt;br /&gt;
Таким образом, множества слов, допускаемых ДКА и НКА, совпадают, то есть они эквивалентны.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Алгоритм Томпсона ==&lt;br /&gt;
Данный алгоритм преобразовывает НКА в эквивалентный ДКА. Будем использовать вышеуказанный способ построения с одним дополнением {{---}} не будем учитывать состояния недостижимые из стартового.&lt;br /&gt;
Поэтому в алгоритме используется обход в ширину.&lt;br /&gt;
&lt;br /&gt;
===Алгоритм===&lt;br /&gt;
* &amp;lt;tex&amp;gt;\mathtt{P}&amp;lt;/tex&amp;gt; {{---}} очередь состояний, соответствующих множествам, состоящих из состояний НКА. &lt;br /&gt;
* &amp;lt;tex&amp;gt;\mathtt{Q_d}&amp;lt;/tex&amp;gt; {{---}} массив множеств, соответствующих состояниям ДКА.&lt;br /&gt;
* &amp;lt;tex&amp;gt;\mathtt{s}&amp;lt;/tex&amp;gt; {{---}} стартовое состояние НКА.&lt;br /&gt;
 '''Automaton''' getDFAbyNFA(&amp;lt;tex&amp;gt;\langle \Sigma, Q, s, T, \delta \rangle&amp;lt;/tex&amp;gt; : '''Automaton'''):&lt;br /&gt;
    &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt;.push(&amp;lt;tex&amp;gt;\{s\}&amp;lt;/tex&amp;gt;)&lt;br /&gt;
    &amp;lt;tex&amp;gt;Q_d&amp;lt;/tex&amp;gt; = &amp;lt;tex&amp;gt;\varnothing&amp;lt;/tex&amp;gt;&lt;br /&gt;
    '''while''' &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; \neq &amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\varnothing &amp;lt;/tex&amp;gt;&lt;br /&gt;
       &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt;.pop(&amp;lt;tex&amp;gt;p_d&amp;lt;/tex&amp;gt;)&lt;br /&gt;
       '''for''' &amp;lt;tex&amp;gt;c \in \Sigma&amp;lt;/tex&amp;gt;&lt;br /&gt;
          &amp;lt;tex&amp;gt;q_d&amp;lt;/tex&amp;gt; = &amp;lt;tex&amp;gt;\varnothing&amp;lt;/tex&amp;gt;&lt;br /&gt;
          '''for''' &amp;lt;tex&amp;gt;p \in p_d&amp;lt;/tex&amp;gt;&lt;br /&gt;
             &amp;lt;tex&amp;gt;q_d&amp;lt;/tex&amp;gt; = &amp;lt;tex&amp;gt;q_d \cup \{ \delta(p, c) \}&amp;lt;/tex&amp;gt;&lt;br /&gt;
             &amp;lt;tex&amp;gt;\delta_d(p_d, q_d)&amp;lt;/tex&amp;gt; = &amp;lt;tex&amp;gt;c&amp;lt;/tex&amp;gt;&lt;br /&gt;
          '''if''' &amp;lt;tex&amp;gt;q_d \notin Q_d&amp;lt;/tex&amp;gt;&lt;br /&gt;
             &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt;.push(&amp;lt;tex&amp;gt;q_d&amp;lt;/tex&amp;gt;)&lt;br /&gt;
             &amp;lt;tex&amp;gt;Q_d&amp;lt;/tex&amp;gt;.add(&amp;lt;tex&amp;gt;q_d&amp;lt;/tex&amp;gt;)           &lt;br /&gt;
    &amp;lt;tex&amp;gt;T_d&amp;lt;/tex&amp;gt; = &amp;lt;tex&amp;gt;\{q_d \in Q_d \mid \exists p \in T : p \in q_d\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
    '''return''' &amp;lt;tex&amp;gt;\langle \Sigma, Q_d, \{s\}, T_d, \delta_d \rangle&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Асимптотика===&lt;br /&gt;
Так как количество подмножеств множества состояний НКА не более, чем &amp;lt;tex&amp;gt;2^n&amp;lt;/tex&amp;gt;, а каждое подмножество мы обрабатываем ровно один раз за время &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;, получаем верхнюю оценку времени работы алгоритма {{---}} &amp;lt;tex&amp;gt;O(n \cdot 2^n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Пример===&lt;br /&gt;
Пусть нам дан [[Недетерминированные конечные автоматы|недетерминированный конечный автомат]]: &lt;br /&gt;
&lt;br /&gt;
[[Файл:DKA.png|250px]]&lt;br /&gt;
&lt;br /&gt;
По нашему заданию эквивалентного ДКА мы получаем: &lt;br /&gt;
&lt;br /&gt;
[[Файл:NKA_definition.png|250px]]&lt;br /&gt;
&lt;br /&gt;
#Помещаем в очередь множество из одной стартовой вершины — &amp;lt;tex&amp;gt;\{1\}&amp;lt;/tex&amp;gt;: &amp;lt;tex&amp;gt;Q = \{\{1\}\}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
#Достаём из очереди множество &amp;lt;tex&amp;gt;\{1\}&amp;lt;/tex&amp;gt;: &amp;lt;tex&amp;gt;Q = \{\}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
#&amp;lt;tex&amp;gt;q_d(\{1\}, a) = \{1, 2\}&amp;lt;/tex&amp;gt;, кладём множество &amp;lt;tex&amp;gt;\{1, 2\}&amp;lt;/tex&amp;gt; в очередь: &amp;lt;tex&amp;gt;Q = \{\{1, 2\}\}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
#&amp;lt;tex&amp;gt;q_d(\{1\}, b) = \{1\}&amp;lt;/tex&amp;gt;, нам не надо класть множество &amp;lt;tex&amp;gt;\{1\}&amp;lt;/tex&amp;gt; в очередь, так как оно уже там было.&lt;br /&gt;
#Достаём из очереди множество &amp;lt;tex&amp;gt;\{1, 2\}&amp;lt;/tex&amp;gt;: &amp;lt;tex&amp;gt;Q = \{\}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
#&amp;lt;tex&amp;gt;q_d(\{1, 2\}, a) = \{1, 2\}&amp;lt;/tex&amp;gt;, нам не надо класть множество &amp;lt;tex&amp;gt;\{1, 2\}&amp;lt;/tex&amp;gt; в очередь, так как оно уже там было.&lt;br /&gt;
#&amp;lt;tex&amp;gt;q_d(\{1, 2\}, b) = \{1, 2\}&amp;lt;/tex&amp;gt;, нам не надо класть множество &amp;lt;tex&amp;gt;\{1, 2\}&amp;lt;/tex&amp;gt; в очередь, так как оно уже там было.&lt;br /&gt;
#Помечаем все терминальные вершины, в данном случае — &amp;lt;tex&amp;gt;\{1, 2\}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В итоге получаем ДКА, эквивалентный исходному: &lt;br /&gt;
&lt;br /&gt;
[[Файл:NKA_algorithm.png|250px]].&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
&lt;br /&gt;
* [[Регулярные языки: два определения и их эквивалентность]]&lt;br /&gt;
* [[Минимизация ДКА, алгоритм за O(n^2) с построением пар различимых состояний]]&lt;br /&gt;
* [[Теорема Клини (совпадение классов автоматных и регулярных языков)]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* ''Серебряков В.А.'' Теория и реализация языков программирования. М.: МЗ-Пресс, 2003 (1-е изд.) и 2006 (2-е изд) — С. 294. — ISBN 5-94073-094-9&lt;br /&gt;
&lt;br /&gt;
[[Категория: Теория формальных языков]]&lt;br /&gt;
[[Категория: Автоматы и регулярные языки]]&lt;/div&gt;</summary>
		<author><name>188.162.64.3</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D0%BE_%D0%9D%D0%9A%D0%90_%D1%8D%D0%BA%D0%B2%D0%B8%D0%B2%D0%B0%D0%BB%D0%B5%D0%BD%D1%82%D0%BD%D0%BE%D0%B3%D0%BE_%D0%94%D0%9A%D0%90,_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%A2%D0%BE%D0%BC%D0%BF%D1%81%D0%BE%D0%BD%D0%B0&amp;diff=43472</id>
		<title>Построение по НКА эквивалентного ДКА, алгоритм Томпсона</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D0%BE_%D0%9D%D0%9A%D0%90_%D1%8D%D0%BA%D0%B2%D0%B8%D0%B2%D0%B0%D0%BB%D0%B5%D0%BD%D1%82%D0%BD%D0%BE%D0%B3%D0%BE_%D0%94%D0%9A%D0%90,_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%A2%D0%BE%D0%BC%D0%BF%D1%81%D0%BE%D0%BD%D0%B0&amp;diff=43472"/>
				<updated>2015-01-06T09:35:06Z</updated>
		
		<summary type="html">&lt;p&gt;188.162.64.3: /* Алгоритм */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Описание ==&lt;br /&gt;
Алгоритм Томпсона строит по [[Недетерминированные конечные автоматы|НКА]] эквивалентный [[Детерминированные конечные автоматы|ДКА]] следующим образом:&lt;br /&gt;
* Начало.&lt;br /&gt;
* '''Шаг 1.''' Помещаем в очередь &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; множество, состоящее только из стартовой вершины.&lt;br /&gt;
* '''Шаг 2.''' Затем, пока очередь не пуста выполняем следующие действия:&lt;br /&gt;
** Достаем из очереди множество, назовем его &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt;&lt;br /&gt;
** Для всех &amp;lt;tex&amp;gt;c \in \Sigma&amp;lt;/tex&amp;gt; посмотрим в какое состояние ведет переход по символу &amp;lt;tex&amp;gt;c&amp;lt;/tex&amp;gt; из каждого состояния в &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt;. Полученное множество состояний положим в очередь &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; только если оно не лежало там раньше. Каждое такое множество в итоговом ДКА будет отдельной вершиной, в которую будут вести переходы по соответствующим символам.&lt;br /&gt;
** Если в множестве &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt; хотя бы одна из вершин была терминальной в НКА, то соответствующая данному множеству вершина в ДКА также будет терминальной.&lt;br /&gt;
* Конец.&lt;br /&gt;
&lt;br /&gt;
== Построение эквивалентного ДКА по НКА ==&lt;br /&gt;
&lt;br /&gt;
Пусть нам дан произвольный НКА: &amp;lt;tex&amp;gt;\langle \Sigma , Q, s \in Q, T \subset Q, \delta : Q \times \Sigma \to 2^Q \rangle&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Построим по нему следующий ДКА: &amp;lt;tex&amp;gt;\langle \Sigma , Q_d, s_d \in Q_d, T_d \subset Q_d, \delta_d : Q_d \times \Sigma \to Q_d \rangle&amp;lt;/tex&amp;gt;, где:&lt;br /&gt;
# &amp;lt;tex&amp;gt;Q_d = \{q_d \mid q_d \subset 2^Q \}&amp;lt;/tex&amp;gt;,&lt;br /&gt;
# &amp;lt;tex&amp;gt;s_d = \{s\}&amp;lt;/tex&amp;gt;,&lt;br /&gt;
# &amp;lt;tex&amp;gt;T_d = \{q \in Q_d \mid \exists p \in T : p \in q\}&amp;lt;/tex&amp;gt;,&lt;br /&gt;
# &amp;lt;tex&amp;gt;\delta_d(q, c) = \{ \delta(a, c) \mid a \in q \}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Доказательство эквивалентности===&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Построенный ДКА эквивалентен данному НКА.&lt;br /&gt;
|proof=&lt;br /&gt;
#Докажем, что любое слово, которое принимает НКА, будет принято построенным ДКА. Заметим, что &amp;lt;tex&amp;gt;\forall q \in q_d, \forall c \in \Sigma, \forall p \in \delta(q, c): p \in \delta_d(q_d, c)&amp;lt;/tex&amp;gt;. Рассмотрим слово &amp;lt;tex&amp;gt;w=w_1 \dots w_m&amp;lt;/tex&amp;gt;, которое принимает автомат НКА: &amp;lt;tex&amp;gt;\langle s, w_1w_2 \dots w_m \rangle \vdash \langle u_1, w_2 \dots w_m \rangle \vdash \langle u_m, \varepsilon \rangle, u_m \in T&amp;lt;/tex&amp;gt;. Проверим, что построенный ДКА тоже принимает это слово. Заметим, что &amp;lt;tex&amp;gt;s \in s_d&amp;lt;/tex&amp;gt;, а, значит, исходя из нашего наблюдения, мы получаем, что &amp;lt;tex&amp;gt;u_1 \in {u_d}_1&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;{u_d}_1 = \delta_d(s, w_1)&amp;lt;/tex&amp;gt;. Далее, несложно заметить, что &amp;lt;tex&amp;gt;\forall i \leqslant m : u_i \in {u_d}_i&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;\langle s_d, w_1w_2 \dots w_m \rangle \vdash \langle {u_d}_1, w_2 \dots w_m \rangle \vdash \langle {u_d}_i, w_{i + 1} \dots w_m\rangle&amp;lt;/tex&amp;gt;. Таким образом, &amp;lt;tex&amp;gt;u_m \in {u_d}_m&amp;lt;/tex&amp;gt;, а из определения терминальных состояний в построенном ДКА мы получаем, что &amp;lt;tex&amp;gt;{u_d}_m \in T_d&amp;lt;/tex&amp;gt;, то есть наш ДКА тоже принимает cлово &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt;.&lt;br /&gt;
#Докажем, что любое слово, которое принимает построенный ДКА, принимает и НКА. Сначала сделаем наблюдение, что если &amp;lt;tex&amp;gt;q_d=\{q\}&amp;lt;/tex&amp;gt;, и мы из него достигли по строке &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; какого-то состояния &amp;lt;tex&amp;gt;p_d&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;\forall p \in p_d&amp;lt;/tex&amp;gt; существует путь из &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt; в НКА по строке &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt;. Рассмотрим слово &amp;lt;tex&amp;gt;w=w_1 \dots w_m&amp;lt;/tex&amp;gt;, которое принимает автомат ДКА: &amp;lt;tex&amp;gt;\langle s_d, w_1w_2 \dots w_m \rangle \vdash \langle {u_d}_1, w_2 \dots w_m \rangle \vdash \langle {u_d}_m, \varepsilon \rangle, {u_d}_m \in T_d&amp;lt;/tex&amp;gt;. Проверим, что НКА тоже принимает это слово. Так как &amp;lt;tex&amp;gt;s_d = \{s\}&amp;lt;/tex&amp;gt;, и мы из &amp;lt;tex&amp;gt;s_d&amp;lt;/tex&amp;gt; достигли &amp;lt;tex&amp;gt;{u_d}_m \in T_d&amp;lt;/tex&amp;gt;, возьмём любое терминальное состояние &amp;lt;tex&amp;gt;u_m \in {u_d}_m&amp;lt;/tex&amp;gt;. По нашему наблюдению в НКА есть путь из &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;u_m&amp;lt;/tex&amp;gt; по строке &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt;, а, значит, НКА принимает это слово. &lt;br /&gt;
Таким образом, множества слов, допускаемых ДКА и НКА, совпадают, то есть они эквивалентны.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Алгоритм Томпсона ==&lt;br /&gt;
Данный алгоритм преобразовывает НКА в эквивалентный ДКА. Будем использовать вышеуказанный способ построения с одним дополнением {{---}} не будем учитывать состояния недостижимые из стартового.&lt;br /&gt;
Поэтому в алгоритме используется обход в ширину.&lt;br /&gt;
&lt;br /&gt;
===Алгоритм===&lt;br /&gt;
* &amp;lt;tex&amp;gt;\mathtt{P}&amp;lt;/tex&amp;gt; {{---}} очередь состояний, соответствующих множествам, состоящих из состояний НКА. &lt;br /&gt;
* &amp;lt;tex&amp;gt;\mathtt{Q_d}&amp;lt;/tex&amp;gt; {{---}} массив множеств, соответствующих состояниям ДКА.&lt;br /&gt;
* &amp;lt;tex&amp;gt;\mathtt{s}&amp;lt;/tex&amp;gt; {{---}} стартовое состояние НКА.&lt;br /&gt;
 '''Automaton''' getDFAbyNFA(&amp;lt;tex&amp;gt;\langle \Sigma, Q, s, T, \delta \rangle&amp;lt;/tex&amp;gt; : '''Automaton'''):&lt;br /&gt;
    &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt;.push(&amp;lt;tex&amp;gt;\{s\}&amp;lt;/tex&amp;gt;)&lt;br /&gt;
    &amp;lt;tex&amp;gt;Q_d&amp;lt;/tex&amp;gt; = &amp;lt;tex&amp;gt;\varnothing&amp;lt;/tex&amp;gt;&lt;br /&gt;
    '''while''' &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; \neq &amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\varnothing &amp;lt;/tex&amp;gt;&lt;br /&gt;
       &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt;.pop(&amp;lt;tex&amp;gt;p_d&amp;lt;/tex&amp;gt;)&lt;br /&gt;
       '''for''' &amp;lt;tex&amp;gt;c \in \Sigma&amp;lt;/tex&amp;gt;&lt;br /&gt;
          &amp;lt;tex&amp;gt;q_d&amp;lt;/tex&amp;gt; = &amp;lt;tex&amp;gt;\varnothing&amp;lt;/tex&amp;gt;&lt;br /&gt;
          '''for''' &amp;lt;tex&amp;gt;p \in p_d&amp;lt;/tex&amp;gt;&lt;br /&gt;
             &amp;lt;tex&amp;gt;q_d&amp;lt;/tex&amp;gt; = &amp;lt;tex&amp;gt;q_d \cup \{ \delta(p, c) \}&amp;lt;/tex&amp;gt;&lt;br /&gt;
             &amp;lt;tex&amp;gt;\delta_d(p_d, q_d)&amp;lt;/tex&amp;gt; = &amp;lt;tex&amp;gt;c&amp;lt;/tex&amp;gt;&lt;br /&gt;
          '''if''' &amp;lt;tex&amp;gt;q_d \notin Q_d&amp;lt;/tex&amp;gt;&lt;br /&gt;
             &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt;.push(&amp;lt;tex&amp;gt;q_d&amp;lt;/tex&amp;gt;)&lt;br /&gt;
             &amp;lt;tex&amp;gt;Q_d&amp;lt;/tex&amp;gt;.add(&amp;lt;tex&amp;gt;q_d&amp;lt;/tex&amp;gt;)           &lt;br /&gt;
    &amp;lt;tex&amp;gt;T_d&amp;lt;/tex&amp;gt; = &amp;lt;tex&amp;gt;\{q \in Q_d \mid \exists p \in T : p \in q\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
    '''return''' &amp;lt;tex&amp;gt;\langle \Sigma, Q_d, \{s\}, T_d, \delta_d \rangle&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Асимптотика===&lt;br /&gt;
Так как количество подмножеств множества состояний НКА не более, чем &amp;lt;tex&amp;gt;2^n&amp;lt;/tex&amp;gt;, а каждое подмножество мы обрабатываем ровно один раз за время &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;, получаем верхнюю оценку времени работы алгоритма {{---}} &amp;lt;tex&amp;gt;O(n \cdot 2^n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Пример===&lt;br /&gt;
Пусть нам дан [[Недетерминированные конечные автоматы|недетерминированный конечный автомат]]: &lt;br /&gt;
&lt;br /&gt;
[[Файл:DKA.png|250px]]&lt;br /&gt;
&lt;br /&gt;
По нашему заданию эквивалентного ДКА мы получаем: &lt;br /&gt;
&lt;br /&gt;
[[Файл:NKA_definition.png|250px]]&lt;br /&gt;
&lt;br /&gt;
#Помещаем в очередь множество из одной стартовой вершины — &amp;lt;tex&amp;gt;\{1\}&amp;lt;/tex&amp;gt;: &amp;lt;tex&amp;gt;Q = \{\{1\}\}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
#Достаём из очереди множество &amp;lt;tex&amp;gt;\{1\}&amp;lt;/tex&amp;gt;: &amp;lt;tex&amp;gt;Q = \{\}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
#&amp;lt;tex&amp;gt;q_d(\{1\}, a) = \{1, 2\}&amp;lt;/tex&amp;gt;, кладём множество &amp;lt;tex&amp;gt;\{1, 2\}&amp;lt;/tex&amp;gt; в очередь: &amp;lt;tex&amp;gt;Q = \{\{1, 2\}\}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
#&amp;lt;tex&amp;gt;q_d(\{1\}, b) = \{1\}&amp;lt;/tex&amp;gt;, нам не надо класть множество &amp;lt;tex&amp;gt;\{1\}&amp;lt;/tex&amp;gt; в очередь, так как оно уже там было.&lt;br /&gt;
#Достаём из очереди множество &amp;lt;tex&amp;gt;\{1, 2\}&amp;lt;/tex&amp;gt;: &amp;lt;tex&amp;gt;Q = \{\}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
#&amp;lt;tex&amp;gt;q_d(\{1, 2\}, a) = \{1, 2\}&amp;lt;/tex&amp;gt;, нам не надо класть множество &amp;lt;tex&amp;gt;\{1, 2\}&amp;lt;/tex&amp;gt; в очередь, так как оно уже там было.&lt;br /&gt;
#&amp;lt;tex&amp;gt;q_d(\{1, 2\}, b) = \{1, 2\}&amp;lt;/tex&amp;gt;, нам не надо класть множество &amp;lt;tex&amp;gt;\{1, 2\}&amp;lt;/tex&amp;gt; в очередь, так как оно уже там было.&lt;br /&gt;
#Помечаем все терминальные вершины, в данном случае — &amp;lt;tex&amp;gt;\{1, 2\}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В итоге получаем ДКА, эквивалентный исходному: &lt;br /&gt;
&lt;br /&gt;
[[Файл:NKA_algorithm.png|250px]].&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
&lt;br /&gt;
* [[Регулярные языки: два определения и их эквивалентность]]&lt;br /&gt;
* [[Минимизация ДКА, алгоритм за O(n^2) с построением пар различимых состояний]]&lt;br /&gt;
* [[Теорема Клини (совпадение классов автоматных и регулярных языков)]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* ''Серебряков В.А.'' Теория и реализация языков программирования. М.: МЗ-Пресс, 2003 (1-е изд.) и 2006 (2-е изд) — С. 294. — ISBN 5-94073-094-9&lt;br /&gt;
&lt;br /&gt;
[[Категория: Теория формальных языков]]&lt;br /&gt;
[[Категория: Автоматы и регулярные языки]]&lt;/div&gt;</summary>
		<author><name>188.162.64.3</name></author>	</entry>

	</feed>