продолжаем поиск. Те же рассуждения верны, если r положить равным 3, тогда метод называется методом тернарного поиска, так как точки c = a + (1 — r)(b — a), d = a + r(b — a) делят отрезок [а, b] на три равные части. Поскольку отрезок, на котором вычисляется минимум, каждый раз сужается в 1.5 раза, до тех пор, пока длина не меньше eps, то асимптотическая сложность тернарного поиска с точностью eps составляет log1 5 b-:. В случае целочисленного аргумента точки c и d выбираются приближенно, а критерием остановки алгоритма является условие b — а < 3, так как в этом случае выбрать c и d нельзя.
2. Двумерный тернарный поиск
Можно обобщить метод тернарного поиска на случай унимодальной функции f (x,y) от двух аргументов x Е [a, b], y Е [c, d], т. е. такой, которая является унимодальной от одного аргумента, если зафиксировать другой. Тогда будем проводить тернарный поиск по x, а именно делим отрезок [a, b] на три части точками m, n, пока длина отрезка не меньше eps, вычисляем при помощи двух тернарных поисков минимумы по y для f (m, y), для f (n, y), сравниваем между собой найденные значения и переопределяем соответствующим образом a и b. Асимптотическая сложность данного алгоритма будет составлять
logl-5 e—s logl-5 e—s *
3. Постановка задачи
Рассмотрим задачу с Регионального этапа Всероссийской олимпиады школьников 2015-2016 «Гармоничная последовательность» [1].
Условие задачи таково.
Цикл лекций в университете Флатландии посвящен изучению последовательностей.
Профессор называет последовательность целых чисел ах, а2,..., ап гармоничной, если каждое число, кроме ах и ап, равно сумме соседних: а2 = ах + аз,аз = а2 + а4,..., ап-х = ап-2 + ап. Например, последовательность [1, 2,1, -1] является гармоничной, поскольку 2 = 1 + 1, и 1 = 2 + (-1).
Рассмотрим последовательности равной длины: А = [ах, а2,... , ап] и В = [Ьх, Ь2,... , Ьп]. Расстоянием между этими последовательностями будем называть величину ^(А, В) = |ах — Ьх| + |а2 — Ь2| + • • • + |ап — Ьп|. Например, ^([1, 2,1, —1], [1, 2, 0, 0]) = |1 — 1| + |2 — 2| + |1 — 0| + | — 1 — 0| = = 0 + 0 + 1 + 1 = 2.
В конце лекции профессор написал на доске последовательность из n целых чисел B = [bi, b2,... , bn] и попросил студентов в качестве домашнего задания найти гармоничную последовательность A = [а1,а2, • • •, an], такую, что d(A, B) минимально. Чтобы облегчить себе проверку, профессор просит написать в качестве ответа только искомое минимальное расстояние d(A, B).
Требуется написать программу, которая по заданной последовательности B определяет, на каком минимальном расстоянии от последовательности B найдется гармоничная последовательность A.
Входные данные. Первая строка входного файла содержит целое число n — количество элементов в последовательности (3 ^ n ^ 300000).
Вторая строка содержит n целых чисел b1,b2,... bn, (—109 ^ bi ^ ^ 109).
Выходные данные. Выходной файл должен содержать одно целое число: минимальное возможное расстояние от последовательности во входном файле до гармоничной последовательности. Время работы программы не должно превышать 1 секунду.
4. Решение задачи
Заметим, что для того, чтобы программа удовлетворяла временным ограничениям, количество операций не должно превосходить 109. Обозначим первые два числа гармоничной последовательности как x и у. Тогда сама последовательность будет иметь вид x, у, (у — x), —x, -у, (x — у), x, у, • • •. Расстояние d(A, B) является функцией от x, у:
d(A, B) = f (x, у) = max{|x — bi|, |у — b21, |у — x — Ьз|, • • • }•
Функция f (x, у) будет выпуклой как максимум семейства выпуклых функций и, следовательно, будет унимодальной.
Пусть все числа в исходной последовательности по модулю не превосходят A. Тогда существует правильный ответ, в котором одно из чисел x и у не превосходит по модулю A, а другое 2A. Доказательство этого факта приведено в разборе заданий ВСоШ [6]. Таким образом, искомые x, у находятся в диапазоне от —2max{|b1|,... , |bn|} до 2max{|b1|,..., |bn|}, и перебор x, у в общем случае не пройдет по времени.
Если воспользоваться двумерным тернарным поиском, то число итераций будет порядка
(log15 (4 ■ 109))2 « 3000.
При этом, если функцию расстояния вычислять напрямую суммированием, то для ее вычисления потребуется 3 • 105 операций. На каждом шаге тернарного поиска по x нужно проводить два тернарных поиска по у, для каждого из которых может потребоваться около 50 итераций, с вычислением на каждой итерации значения f (x, у) в двух точках. Таким образом, даже при грубой оценке общее число операций для вычисления f (x, у) может достигать величины
50 • 2 • 50 • 6 • 105 w 3 • 109,
и поэтому не удовлетворяет временным ограничениям задачи. Поэтому целесообразно вычислять целевую функцию при помощи двоичного поиска, что приводит к значительному уменьшению числа операций. Идея двоичного поиска заключается в том, чтобы узнать, сколько модулей слагаемых в функции расстояния раскрываются с минусом, а сколько — с плюсом, т. е. сводится к проблеме вычисления количества элементов в заданной последовательности B, не превосходящих данного числа. Для этого требуется предварительно отсортировать элементы последовательности B по возрастанию и вычислить частичные суммы для функции расстояния. При этом все слагаемые в функции расстояния разбиваются на 3 группы в зависимости от их номера, поскольку нужно проводить отдельно двоичный поиск для x, у, у — x.
Список литературы
1. Дистанционная подготовка по информатике [Электронный ресурс]. URL: http://informatics.mccme.ru (дата обращения: 29.10.2017).
2. MAXimal. Сайт М. Иванова [Электронный ресурс]. URL: http://e-maxx.ru (дата обращения: 12.09.2017).
3. Кнут Д. Искусство программирования. Т. 3. Сортировка и поиск. М.: Вильямс, 2007. Т. 3. 832 с.
4. Конспекты студентов кафедры компьютерных технологий Университета ИТМО. URL: http: //neerc. ifmo. ru/wiki (дата обращения: 12.09.2017).
5. Мэтьюз Дж. Г., Финк К. Д. Численные методы. Использование
MATLAB. 3-е изд. СПб.: Вильямс, 2001. 716 с.
6. Олимпиады по информатике [Электронный ресурс].
URL: https://neerc.ifmo.ru/school (дата обращения: 12.09.2017).
Summary
Kotelina N. O Two-dimensional ternary search and its application in competitive programming
In this paper the application of ternary search in one problem of competitive programming is considered.
Keywords: two-dimensional ternary search, competitive programming.
References
1. Distantcionnaya podgotovka po informatike (Distance training in computer science). URL: http://informatics.mccme.ru (date of usage: 29.10.2017).
2. MAXimal. Sayt M. Ivanova (MAXimal. Site of M. Ivanov) URL: http://e-maxx.ru (date of usage: 12.09.2017).
3. Knuth D. E. Iskusstvo programmirovaniya (The Art of Computer Programming. Vol. 3. Sorting and Searching) M. :Williams (2007). 832 p.
4. Konspekty studentov kafedry komp'yuternykh tekhnologiy Universiteta ITMO (Conspects of students of ITMO)
URL: http://neerc.ifmo.ru/wiki (date of usage: 12.09.2017).
5. Mathews J. H., Fink K. D. Chislennyye metody. Ispol'zovaniye MATLAB (Numerical Methods: Using MATLAB) 3rd Edition. Spb.: Williams, 2001, 716 p.
6. Olimpiady po informatike (Olympiads on informatics) URL: https://neerc.ifmo.ru/school. (date of usage: 12.09.2017).
Для цитирования: Котелина Н. О. Двумерный тернарный поиск и его применение в задачах спортивного программирования // Вестник Сыктывкарского университета. Сер. 1: Математика. Механика. Информатика. 2018. Вып. 1 (26). C. 58-63.
For citation: Kotelina N. O. Two-dimensional ternary search and its application in competitive programming, Bulletin of Syktyvkar University, Series 1: Mathematics. Mechanics. Informatics, 2018, 1 (26), pp. 58-63.
СГУ им. Питирима Сорокина Поступила 29.12.2017