Black-box Complexity. Примеры нереалистичных оценок Black-box Complexity — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
Строка 123: Строка 123:
 
== Задача о разбиении ==
 
== Задача о разбиении ==
 
{{Задача
 
{{Задача
|definition=Задача о разбиении (<tex>Partition</tex> problem) ставится следующим образом. Дано мультимножество <tex>\mathcal{I}</tex> положительных целых чисел (весов). Возможно ли разбить его на два непересекающихся множества <tex>\mathcal{I}=\mathcal{I}_0 \cup \mathcal{I}_1</tex> таким образом, что <tex>\Sigma_{w \in \mathcal{I}_0} w = \Sigma_{w \in \mathcal{I}_1} w</tex>?
+
|definition=Задача о разбиении<ref>[http://en.wikipedia.org/wiki/Partition_problem Partition problem]</ref> (<tex>Partition</tex> problem) ставится следующим образом. Дано мультимножество <tex>\mathcal{I}</tex> положительных целых чисел (весов). Возможно ли разбить его на два непересекающихся множества <tex>\mathcal{I}=\mathcal{I}_0 \cup \mathcal{I}_1</tex> таким образом, что <tex>\Sigma_{w \in \mathcal{I}_0} w = \Sigma_{w \in \mathcal{I}_1} w</tex>?
 
}}
 
}}
  

Версия 20:57, 18 июня 2012

Эта статья находится в разработке!

Введение в Black-box complexity

Целью теории сложности является определение вычислительной трудности алгоритмов. Классическая теория сложности предполагает, что алгоритму полностью известна структура решаемой задачи. В случае эволюционных алгоритмов, алгоритм обладает информацией только о качестве (значении fitness-функции) получаемого им решения. По этой причине утверждения классической теории сложности мало применимы для эволюционных алгоритмов.

Black-box Complexity[1] — попытка построить теорию сложности для эволюционных алгоритмов. Вкратце, black-box сложность алгоритма — количество вычислений fitness-функции, необходимое для получения решения. Такое определение позволяет получить не реалистично низкие оценки black-box сложности, например, полиномиальную сложность для [math]\mathrm{NP}[/math]-полной задачи поиска максимальной клики [2].

По этой причине были введены ограничения на исследуемые алгоритмы. Требуется, чтобы для получения новых кандидатов на решение использовались только несмещенные (позиция элемента в битовой строке и его значение не влияют на выбор битов для изменения) вариативные операторы. Так же введено понятие арности[math]k[/math]-арный несмещенный black-box алгоритм использует только те операторы, которые принимают не более чем [math]k[/math] аргументов. Для некоторых классов задач такой подход к опеределению black-box сложности позволяет получить более реалистичные оценки сложности. Операторы с арностью [math]1[/math] называют мутационными. В данной статье показано, что даже для алгоритмов, использующих только мутационные операторы можно получить не реалистично маленькую оценку black-box сложности.

Неограниченная и несмещенная Black-box модели

Обозначения

  • [math]\mathbb{N}[/math] — положительные целые числа;
  • [math]\forall k \in \mathbb{N}[/math]:
[math][k] := \{1, \ldots , k\}[/math];
  • [math][0..k] := [k] \cup \{0\}[/math];
  • для битовой строки [math]x = x_1 \cdots x_n \in \{0, 1\}^n[/math]:
[math]\overline{x}[/math] — побитовое дополнение строки [math]x[/math];
  • [math]\bigoplus[/math] — побитовое исключающее или;
  • для любого множества [math]S[/math]:
[math]2^S[/math] — множество всех подмножеств множества [math]S[/math]
  • для [math]n \in \mathbb{N}[/math]:
[math]S_n[/math] — множество всех перестановок [math][n][/math];
  • для [math]\sigma \in S_n[/math] и [math]x \in \{0,1\}^n[/math]:
[math]\sigma(x) := x_{\sigma(1)} \cdots x_{\sigma(n)}[/math];
  • под [math]log[/math] понимается натуральный логарифм.

Неограниченная Black-box модель

Рассматривается класс алгоритмов оптимизации, которые получают информацию о решаемой задаче через вычисление fitness-функции возможных решений. Заданная fitness-функция вычисляется ораклом, или дается как black-box. Алгоритм может запросить у оракла значение функции для любого решения, однако более никакой информации о решении получить не может.

В качестве fitness-функции берется псевдо-булевая функция [math]F:\{0,1\}^n \rightarrow \mathbb{R}[/math].

Согласно концепции black-box, алгоритм может включать следующие действия:

  • выбор вероятностного распределения над [math]\{0,1\}^n[/math];
  • выбор кандидата [math]x \in \{0,1\}^n[/math] cогласно выбранному распределению;
  • запрос значения fitness-функции выбранного кандидата у оракла.

Схема неограниченного black-box алгоритма:

Инициализация: выбрать [math]x^{(0)}[/math] согласно некоторому вероятностному распределению [math]p^{(0)}[/math] над [math]\{0,1\}^n[/math]. Запросить [math]f(x^{(0)})[/math].
Оптимизация: for [math]t = 1, 2, 3, \ldots [/math] until условие остановки do
  Исходя из [math]((x^{(0)}, f(x^{(0)}), \ldots, (x^{(t-1)}, f(x^{(t-1)}))[/math], выбрать вероятностное распределение [math]p^{(t)}[/math] над [math]\{0,1\}^n[/math].
  Выбрать [math]x^{(t)}[/math] согласно [math]p^{(t)}[/math] и запросить [math]f(x^{(t)})[/math].

В качестве времени работы black-box алгоритма берется количество запросов к ораклу сделанное до первого запроса с оптимальным решением.

Пусть [math]\mathcal{F}[/math] — класс псевдо-булевых функций. Сложностью алгоритма [math]A[/math] над [math]\mathcal{F}[/math] называется максимальное предположительное время работы [math]A[/math] на функции [math]f \in \mathcal{F}[/math] (в худшем случае). Сложностью [math]\mathcal{F}[/math] относительно класса алгоритмов [math]\mathcal{A}[/math] называется минимальная сложность среди всех [math]A \in \mathcal{A}[/math] над [math]\mathcal{F}[/math]. Неограниченной black-box сложностью [math]\mathcal{F}[/math] называется сложность [math]\mathcal{F}[/math] относительно класса неограниченных black-box алгоритмов.

Несмещенная Black-box модель

Класс неограниченных black-box алгоритмов слишком мощный. Например для любого функционального класса [math]\mathcal{F} = \{f\}[/math] неограниченная black-box сложность равна единице — алгоритм, который просто запрашивает оптимальное решение первым же шагом, удовлетворяет этому условию.

Чтобы избежать этих недостатков была введена более строгая модель. В ней алгоритмы могут генерировать новые решения используя только несмещенные вариативные операторы.


Определение:
[math]\forall k \in \mathbb{N}, k[/math]-арным несмещенным распределением [math](D(\cdot|y^{(1)},\ldots,y^{(k)}))_{y^{(1)},\ldots,y^{(k)} \in \{0,1\}^n}[/math] называется семейство вероятностных распределений над [math]\{0,1\}^n[/math] таких, что для любых [math]y^{(1)},\ldots,y^{(k)} \in \{0,1\}^n[/math] выполняются следующие условия:
  • [math]\forall x, z \in \{0,1\}^n[/math]:
[math]D(x|y^{(1)},\ldots,y^{(k)}) = D(x \bigoplus z|y^{(1)} \bigoplus z,\ldots,y^{(k)} \bigoplus z)[/math];
  • [math]\forall x \in \{0,1\}^n \forall \sigma \in S_n[/math]:
[math]D(x|y^{(1)},\ldots,y^{(k)}) = D(\sigma(x)|\sigma(y^{(1)}),\ldots,\sigma(y^{(k)}))[/math].


Первое условие называется [math]\bigoplus[/math]-инвариантностью, второе — перестановочной инвариантностью. Оператор, выбранный из [math]k[/math]-арного несмещенного распределения называется [math]k[/math]-арным несмещенным вариативным оператором.

Схема [math]k[/math]-арного несмещенного black-box алгоритма:

Инициализация: выбрать [math]x^{(0)}[/math] равновероятно из [math]\{0,1\}^n[/math]. Запросить [math]f(x^{(0)})[/math].
Оптимизация: for [math]t = 1, 2, 3, \ldots [/math] until условие остановки do
  Исходя из [math](f(x^{(0)}), \ldots, f(x^{(t-1)}))[/math], выбрать [math]k[/math] индексов [math]i_1, \ldots, i_k \in [0..t-1][/math] и [math]k[/math]-арное несмещенное распределение [math]D(\cdot|x^{(i_1)},\ldots,x^{(i_k)})[/math].
  Выбрать [math]x^{(t)}[/math] согласно [math]D(\cdot|x^{(i_1)},\ldots,x^{(i_k)})[/math] и запросить [math]f(x^{(t)})[/math].
Лемма:
Предположим, что для задачи [math]P[/math] существует black-box алгоритм [math]A[/math], который с константной вероятностью успеха решает [math]P[/math] за [math]s[/math] итераций. Тогда black-box сложность [math]P[/math] не больше [math]O(s)[/math].
Доказательство:
[math]\triangleright[/math]
Доказательство приведено в работе [1].
[math]\triangleleft[/math]

Jump функции

Определение:
[math]\forall k \lt n/2[/math] функция [math]Jump_k[/math] определяется как
[math]Jump_k(x) = \left\{ \begin{array}{ccc} n, & if & |x|_1=n; \\ |x|_1, & if & k \lt |x|_1 \lt n-k; \\ 0, & & otherwise, \end{array}\right.[/math]
[math]\forall x \in \{0,1\}^n.[/math]


Будет показано, что для любого константного [math]k[/math] можно с высокой вероятностью решить проблему [math]OneMax[/math] за малое количество black-box обращений к [math]Jump_k[/math]. С помощью этого можно показать, что для любого константного [math]k[/math] несмещенная black-box сложность для функции [math]Jump_k[/math] удивительно мала.

Лемма:
[math]\forall k,c[/math] существует унарная несмещенная процедура [math]s[/math], использующая [math]c+1[/math] запросов к [math]Jump_k[/math] такая, что для всех битовых строк [math]x[/math], [math]s(x) = OneMax(x)[/math] с вероятностью [math]1 - O(n^{-c})[/math].
Доказательство:
[math]\triangleright[/math]

Используется унарный несмещенный вариативный оператор [math]flip_k[/math], который равновероятно выбирает строку из [math]k[/math]-окрестности для аргумента (битовую строку, которая отличается в [math]k[/math] позициях). Затем будет использована процедура [math]s[/math], которая использует [math]Jump_k[/math] для аппроксимации [math]OneMax[/math] как показано ниже. Процедура выбирает [math]c[/math] битовых строк в [math]k[/math]-окрестности [math]x[/math]. Если [math]|x|_1 \geq n-k[/math], то правдоподобно, что хотя бы раз только единицы из [math]x[/math] будут заменены, что приведет к тому, что [math]Jump_k = |x|_1 - k[/math]. Так как больше никакая строка из выборки не будет иметь более низкое [math]Jump_k[/math] значение, то добавление [math]k[/math] к минимальному ненулевому значению [math]Jump_k[/math] других строк из выборки приведет к нужному результату. Случай, когда [math]|x|_1 \leq k[/math], аналогичен.

Понятно, что процедура верна при всех [math]x[/math], таких, что [math]k \lt |x|_1 \lt n-k[/math]. Остальные два случая симметричны, поэтому пусть [math]|x|_1 \geq n-k[/math]. Очевидно, что результат процедуры корректен тогда и только тогда, когда хотя бы в одной из [math]c[/math] строк были заменены только единицы. Вычислим вероятность [math]p[/math] этого события. Мы выбираем [math]k[/math] бит для замены итеративно, поэтому после [math]i[/math] итераций имеется как минимум [math]n-k-i[/math] позиций с единицей из [math]n-i[/math] позиций, которые можно выбирать. Это приводит к границе на вероятность выбора единиц:

[math](\frac{n-k}{n})\cdot(\frac{n-k-1}{n-1})\cdots(\frac{n-k-(k-1)}{n-(k-1)}) = \Pi_{i=0}^{k-1}(1 - \frac{k}{n-i}) \geq (1 - \frac{k}{n-k})^k \geq (1 - \frac{k^2}{n-k}),[/math]

используя неравенство Бернулли. Таким образом имеем:

[math]p \geq 1 - (\frac{k^2}{n-k})^c[/math].

Процедура [math]s[/math]:

if [math]Jump_k(x) \neq 0[/math] then output [math]Jump_k(x)[/math];
[math]M \leftarrow \{Jump_k(flip_k(x)) | i \in [c]\}[/math];
if [math]max(M) \lt  n/2[/math] then [math]m \leftarrow max(M) - k[/math];
else [math]m \leftarrow min(M \backslash \{0\}) + k[/math];
output [math]m[/math];
[math]\triangleleft[/math]

Теперь, используя предыдущую лемму, можно найти несмещенную black-box сложность для функции [math]Jump_k[/math] при константном [math]k[/math].

Теорема:
Для константы [math]k[/math] несмещенная black-box сложность [math]Jump_k[/math]:
  • [math]O(n \log(n))[/math] для унарных вариативных операторов;
  • [math]O(n / \log(m))[/math] для [math]m[/math]-арных вариативных операторов при [math]2 \leq m \leq n[/math];
  • [math]O(n / \log(n))[/math] для *-арных вариативных операторов.
Доказательство:
[math]\triangleright[/math]
Доказательство приведено в работе [1].
[math]\triangleleft[/math]

Процедуре из леммы для работы необходимо знание параметра [math]k[/math]. Процедуру можно модифицировать таким образом, что она будет работать без этого знания. Как только процедура впервые выберет случайную битовую строку с [math]Jump_k=0[/math] она определит [math]k[/math], затем продолжит работу как было описано раньше. Параметр [math]k[/math] определяется с помощью выбора достаточно большого количества случайных строк в [math]i[/math]-окрестности от строки с [math]Jump_k=0[/math], начиная с [math]i=1[/math] и продолжая до тех пор, пока [math]Jump_k[/math] не станет отличным от нуля. Эта строка будет иметь максимальное значение [math]Jump_k=n-k-1[/math]. Из этого значения и [math]n[/math] процедура может вычислить [math]k[/math].

Задача о разбиении

Задача:
Задача о разбиении[3] ([math]Partition[/math] problem) ставится следующим образом. Дано мультимножество [math]\mathcal{I}[/math] положительных целых чисел (весов). Возможно ли разбить его на два непересекающихся множества [math]\mathcal{I}=\mathcal{I}_0 \cup \mathcal{I}_1[/math] таким образом, что [math]\Sigma_{w \in \mathcal{I}_0} w = \Sigma_{w \in \mathcal{I}_1} w[/math]?


Оптимизационная версия задачи ставит вопрос о минимизации функции [math]|\Sigma_{w \in \mathcal{I}_0} w - \Sigma_{w \in \mathcal{I}_1} w|[/math].

Задача [math]Partition[/math] является [math]\mathrm{NP}[/math]-трудной. Предположительно [math]\mathrm{P} \neq \mathrm{NP}[/math] и не существует полиномиального алгоритма решения этой задачи.

Лемма:
Задача [math]Partition[/math] остается [math]\mathrm{NP}[/math]-трудной, когда [math]\forall v, w \in \mathcal{I}: v \neq w[/math].

Далее [math]Partition_{\neq}[/math] — подкласс задачи [math]Partition[/math] с взятыми различными весами.

Предлагаются две различные fitness-функции и показывается, что в обоих случаях может быть достигнута полиномиальная несмещенная black-box сложность. Показывается, что унарная несмещенная black-box сложность для задачи [math]Partition_{\neq}[/math] равна [math]O(n \log(n))[/math].

Знаковая fitness-функция

Полагаем [math]\mathcal{F}_{\mathcal{I}} := \{(\mathcal{I}_0, \mathcal{I}_1) \in 2^{\mathcal{I}} \times 2^{\mathcal{I}} | \mathcal{I}_0 \dot{\cup} \mathcal{I}_1 = \mathcal{I}\}[/math] — множество всех возможных решений для [math]\mathcal{I}[/math]. Определим знаковую fitness-функцию как:

[math]f_{\mathcal{I}}^{*}: \mathcal{F} \rightarrow \mathbb{Z}, (\mathcal{I}_0, \mathcal{I}_1) \mapsto \Sigma_{w \in \mathcal{I}_0} w - \Sigma_{w \in \mathcal{I}_1} w[/math].

Цель заключается в минимизации [math]|f_{\mathcal{I}}^{*}|[/math].

Зафиксируем нумерацию элементов [math]\mathcal{I}[/math]: [math]\sigma: \mathcal{I} \rightarrow [n][/math]. Для любой битовой строки [math]x \in \{0,1\}^n[/math] определим [math]\mathcal{I}_0(x) := \{w \in \mathcal{I} | x_{\sigma{w}} = 0\}[/math] и [math]\mathcal{I}_1(x) := \{w \in \mathcal{I} | x_{\sigma{w}} = 1\}[/math]. Тогда fitness-функция выглядит так:

[math]f_{\mathcal{I}}: \{0,1\}^n \rightarrow \mathbb{Z}, x \mapsto \Sigma_{i \in [n], x_i=0} \sigma^{-1}(i) - \Sigma_{i \in [n], x_i=1} \sigma^{-1}(i)[/math].
Теорема:
Унарная несмещенная black-box сложность задачи [math]Partition_{\neq}[/math] относительно fitness-функции [math]f_{\mathcal{I}}[/math] равна [math]O(n \log(n))[/math], где [math]n := |\mathcal{I}|[/math].
Доказательство:
[math]\triangleright[/math]

Для доказательства будет построен алгоритм с применением двух вариативных операторов:

  • [math]uniform()[/math] — выбирает случайную битовую строку [math]x \in \{0,1\}^n[/math];
  • [math]RLS(\cdot)[/math] — случайно меняет элемент в одной из позиций входной строки.

Для краткости положим [math]f := f_{\mathcal{I}}[/math].

Следующий алгоритм служит доказательством теоремы:

 1 Инициализация
 2 [math]x^{(0)} \leftarrow uniform()[/math]. Запрос [math]f(x^{(0)})[/math];
 3 [math]t \leftarrow 0, \mathcal{I}_0', \mathcal{I}_1', \mathcal{W}_0 = \varnothing[/math];
 4 Определение весов
 5 while [math]|\mathcal{W}_t| \lt  n[/math] do
 6   [math]t \leftarrow t + 1[/math];
 7   [math]x^{(t)} \leftarrow RLS(x^{(0)})[/math]. Запрос [math]f(x^{(t)})[/math];
 8   [math]\mathcal{W}_t \leftarrow \mathcal{W}_{t-1} \cup \{|f(x^{(0)}) - f(x^{(t)})|/2\}[/math];
 9   if [math]f(x^{(0)}) \gt  f(x^{(t)})[/math] then
10     [math]\mathcal{I}_0' \leftarrow \mathcal{I}_0' \cup {|f(x^{(0)}) - f(x^{(t)})|/2}[/math];
11   else [math]\mathcal{I}_1' \leftarrow \mathcal{I}_1' \cup {|f(x^{(0)}) - f(x^{(t)})|/2}[/math];
12 Оптимизация
13 В оффлайне вычисляем оптимальное решение [math](\mathcal{O}_0, \mathcal{O}_1)[/math] и множество [math]\mathcal{M} \leftarrow \{w \in \mathcal{O}_0 | w \notin \mathcal{I}_0'\} \cup \{w \in \mathcal{O}_1 | w \notin \mathcal{I}_1'\}[/math] — множество элементов, которые надо переместить.
14 [math]z \leftarrow x^{(0)}[/math];
15 while [math]|\mathcal{M}| \gt  0[/math] do
16   [math]y \leftarrow RLS(z)[/math]. Запрос [math]f(y)[/math];
17   if [math]w := |f(y)-f(z)|/2 \in \mathcal{M}[/math] then
18     [math]z \leftarrow y[/math], [math]\mathcal{M} \leftarrow \mathcal{M} \backslash \{w\}[/math];
За [math](1+o(1))n \log(n)[/math] итераций будут определены веса всех элементов [math]\mathcal{I}[/math]. Зная веса, можно в оффлайне перебором найти оптимальное решение задачи, после чего надо это решение восстановить с помощью вариативного [math]1[/math]-арного оператора. Для этого было найдено множество [math]\mathcal{M}[/math] — множество элементов, которые необходимо переместить для получения оптимального решения. В итоге получается, что несмещенная black-box сложность задачи [math]Partition_{\neq}[/math] относительно заданной fitness-функции равна [math]O(n \log(n))[/math]. Полное доказательство приведено в работе [1].
[math]\triangleleft[/math]

Беззнаковая fitness-функция

Кому-то может не понравиться, что при доказательстве предыдущей теоремы происходила минимизация не самой функции [math]f_{\mathcal{I}}[/math], а только ее абсолютной величины. Однако можно достичь той же асимптотики и для беззнаковой fitness-функции. Сложность заключается в том, что теперь нельзя просто определить вес перемещенного элемента. Этот факт выражается в более сложной процедуре для определения весов элементов.

Теорема:
Унарная несмещенная black-box сложность задачи [math]Partition_{\neq}[/math] относительно fitness-функции [math]|f_{\mathcal{I}}|[/math] равна [math]O(n \log(n))[/math]. Где [math]n := |\mathcal{I}|[/math].
Доказательство:
[math]\triangleright[/math]

Для краткости положим:

  • [math]f := |f_{\mathcal{I}}|[/math];
  • [math]S_0(x) = \Sigma_{w \in \mathcal{I}_0(x)} w[/math];
  • [math]S_1(x) = \Sigma_{w \in \mathcal{I}_1(x)} w[/math];
  • [math]\mathcal{I}_{max(x)}[/math] — множество элементов, принадлежащих корзине с большим весом. Например [math]\mathcal{I}_{max(x)} = \mathcal{I}_0[/math] если [math]S_0(x) \geq S_1(x)[/math];
  • [math]w_{max} = \max \mathcal{I}[/math] — элемент с максимальным весом.

Общая идея алгоритма состоит в следующем:

  • сгенерировать строку, такую, что все элементы находятся в одной корзине (с большой вероятностью это можно сделать за [math]4n \log(n)[/math] запросов);
  • за [math]2n \log(n)[/math] шагов с помощью [math]RLS(\cdot)[/math] опеределить веса всех элементов (с большой вероятностью);
  • за [math]3n \log(n)[/math] шагов восстановить решение (с большой вероятностью).

Следующий алгоритм является доказательством теоремы:

 1 Инициализация
 2 [math]x^{(1,0)} \leftarrow uniform()[/math]. Запрос [math]f(x^{(1,0)})[/math];
 3 Перемещение всех элементов в одну корзину
 4 for [math]t = 1[/math] to [math]2n \log(n)[/math] do
 5   [math]x^{(1,t)} \leftarrow RLS(x^{(1,0)})[/math]. Запрос [math]f(x^{(1,t)})[/math];
 6 Пусть [math]l \in \arg \max_{0 \leq t \leq 2n \log(n)} f(x^{(1,t)})[/math];
 7 [math]x \leftarrow x^{(1,l)}[/math];
 8 for [math]t = 2n \log(n) + 1[/math] to [math]4n \log(n)[/math] do
 9   [math]y \leftarrow RLS(x)[/math]. Запрос [math]f(y)[/math];
10   if [math]f(y) \gt  f(x)[/math] then [math]x \leftarrow y[/math];
11 Определение весов всех элементов
12 for [math]t = 1[/math] to [math]2n \log(n)[/math] do
13   [math]x^{(2,t)} \leftarrow RLS(x)[/math]. Запрос [math]f(x^{(2,t)})[/math];
14 Оптимизация
15 Вычислить в оффлайне перебором оптимальное решение [math](\mathcal{O}_0, \mathcal{O}_1)[/math], такое что [math]w_{max} \in \mathcal{O}_1[/math]. [math]\mathcal{M} \leftarrow \mathcal{O}_1[/math];
16 for [math]t = 1[/math] to [math]2n \log(n)[/math] do
17   [math]x^{(3,t)} \leftarrow RLS(x)[/math]. Запрос [math]f(x^{(3,t)})[/math];
18   if [math]f(x) \gt  2w_{max}[/math] and [math]f(x^{(3,t)}) \lt  f(x)[/math] then
19     вычислить [math]w := (f(x) - f(x^{(3,t)})) / 2[/math];
20     if [math]w \neq w_{max}[/math] and [math]w \in \mathcal{M}[/math] then
21       [math]x \leftarrow x^{(3,t)}; \mathcal{M} \leftarrow \mathcal{M} \backslash w[/math];
22 for [math]t = 1[/math] to [math]n \log(n)[/math] do
23   [math]x^{(4,t)} \leftarrow RLS(x)[/math]. Запрос [math]f(x^{(4,t)})[/math];
Можно показать, что приведенный алгоритм с большой вероятностью за [math]O(n \log(n))[/math] запросов находит оптимальное решение. Полное доказательство приведено в работе [1].
[math]\triangleleft[/math]

Ссылки