В теории вычислительной сложности задача 3SUM спрашивает, содержит ли заданный набор действительных чисел три элемента, сумма которых равна нулю. Обобщенная версия, k -SUM, задает тот же вопрос о k элементах, а не просто о 3. 3SUM может быть легко решена со временем, и соответствующие нижние границы известны в некоторых специализированных моделях вычислений (Erickson 1999).
Было высказано предположение, что любой детерминированный алгоритм для 3SUM требует времени. В 2014 году первоначальная гипотеза 3SUM была опровергнута Алланом Грёнлундом и Сетом Петти, которые предложили детерминированный алгоритм, который решает 3SUM за время. [1]
Кроме того, Грёнлунд и Петти показали, что 4- линейная сложность дерева решений 3SUM равна . Эти границы впоследствии были улучшены. [2] [3] [4]
Самый известный в настоящее время алгоритм для 3SUM работает за время. [4]
Кейн, Ловетт и Моран показали, что 6- линейная сложность дерева решений 3SUM равна . [5] Последняя граница является жесткой (с точностью до логарифмического множителя). По-прежнему предполагается, что 3SUM неразрешима за ожидаемое время. [6]
Когда элементы являются целыми числами в диапазоне , 3SUM может быть решена за время, представив входной набор как битовый вектор , вычислив набор всех попарных сумм как дискретную свертку с использованием быстрого преобразования Фурье и, наконец, сравнив этот набор с . [7]
Квадратичный алгоритм
Предположим, что входной массив — это . В целочисленных ( слово RAM ) моделях вычислений 3SUM может быть решена за среднее время путем вставки каждого числа в хэш-таблицу , а затем для каждого индекса и проверки того, содержит ли хэш-таблица целое число .
Также возможно решить проблему за то же время в сравнительной модели вычислений или реальной оперативной памяти , для которой хеширование не допускается. Алгоритм ниже сначала сортирует входной массив, а затем проверяет все возможные пары в тщательном порядке, который избегает необходимости бинарного поиска пар в отсортированном списке, достигая худшего времени, как указано ниже. [8]
сортировка(S); для i = 0 до n - 2 сделать а = S[i]; начало = я + 1; конец = n - 1; пока (начало < конец) делать б = С[начало] c = S[конец]; если (a + b + c == 0) , то вывести a, b, c; // Продолжаем поиск всех триплетных комбинаций, дающих в сумме ноль. // Нам нужно обновить и конец, и начало одновременно, поскольку значения массива различны. начало = начало + 1; конец = конец - 1; иначе если (a + b + c > 0) тогда конец = конец - 1; еще начало = начало + 1; конец конец
Следующий пример показывает выполнение этого алгоритма на небольшом отсортированном массиве. Текущие значения a показаны красным цветом, значения b и c показаны пурпурным цветом.
Корректность алгоритма можно увидеть следующим образом. Предположим, что у нас есть решение a + b + c = 0. Поскольку указатели движутся только в одном направлении, мы можем запустить алгоритм, пока самый левый указатель не укажет на a. Запускайте алгоритм, пока один из оставшихся указателей не укажет на b или c, в зависимости от того, что произойдет раньше. Затем алгоритм будет работать, пока последний указатель не укажет на оставшийся член, что даст утвердительное решение.
Варианты
Ненулевая сумма
Вместо поиска чисел, сумма которых равна 0, можно искать числа, сумма которых равна любой константе C. Самый простой способ — изменить исходный алгоритм для поиска целого числа в хэш-таблице .
Другой метод:
Вычтите C /3 из всех элементов входного массива.
В измененном массиве найдите 3 элемента, сумма которых равна 0.
Например, если A=[1,2,3,4] и вас просят найти 3СУММ для C =4, то вычтите 4/3 из всех элементов A и решите его обычным способом 3сумм, т. е. .
Три разных массива
Вместо поиска 3 чисел в одном массиве, мы можем искать их в 3 разных массивах. То есть, имея три массива X, Y и Z, найти три числа a ∈ X , b ∈ Y , c ∈ Z , такие, что . Назовем вариант с 1 массивом 3SUM×1, а вариант с 3 массивами 3SUM×3.
При наличии решателя для 3SUM×1 задачу 3SUM×3 можно решить следующим образом (предполагая, что все элементы являются целыми числами):
Для каждого элемента в X , Y и Z установите: , , .
Пусть S будет конкатенацией массивов X , Y и Z.
Используйте оракул 3SUM×1, чтобы найти три элемента такие, что .
Возврат .
Благодаря тому, как мы преобразовали массивы, гарантируется, что a ∈ X , b ∈ Y , c ∈ Z. [9]
Сумма свертки
Вместо поиска произвольных элементов массива, таких как:
задача свертки 3sum (Conv3SUM) ищет элементы в определенных местах: [10]
Сокращение от Conv3SUM до 3SUM
При наличии решателя для 3SUM задачу Conv3SUM можно решить следующим образом. [10]
Определим новый массив T таким образом, чтобы для каждого индекса i : (где n — количество элементов в массиве, а индексы варьируются от 0 до n -1).
Решите 3СУММ для массива T.
Доказательство корректности:
Если в исходном массиве есть тройка с , то , поэтому это решение будет найдено с помощью 3SUM на T .
Наоборот, если в новом массиве есть тройка с , то . Поскольку , обязательно и , поэтому это допустимое решение для Conv3SUM на S .
Сокращение с 3SUM до Conv3SUM
При наличии решателя для Conv3SUM задачу 3SUM можно решить следующим образом. [6] [10]
Редукция использует хэш-функцию . В первом приближении предположим, что у нас есть линейная хэш-функция, т.е. функция h такая, что:
Предположим, что все элементы являются целыми числами в диапазоне: 0... N -1, и что функция h сопоставляет каждый элемент с элементом в меньшем диапазоне индексов: 0... n -1. Создайте новый массив T и отправьте каждый элемент S в его хэш-значение в T , т. е. для каждого x в S ( ):
Первоначально предположим, что отображения уникальны (т.е. каждая ячейка в T принимает только один элемент из S ). Решим Conv3SUM для T. Теперь:
Если существует решение для 3SUM: , то: и , поэтому это решение будет найдено решателем Conv3SUM для T .
И наоборот, если Conv3SUM найдена на T , то, очевидно, она соответствует решению 3SUM на S, поскольку T — это просто перестановка S.
Это идеализированное решение не работает, потому что любая хэш-функция может сопоставить несколько различных элементов S с одной и той же ячейкой T . Хитрость заключается в том, чтобы создать массив , выбрав один случайный элемент из каждой ячейки T , и запустить Conv3SUM на . Если решение найдено, то это правильное решение для 3SUM на S . Если решение не найдено, то создайте другое случайное и попробуйте снова. Предположим, что в каждой ячейке T находится не более R элементов . Тогда вероятность нахождения решения (если решение существует) — это вероятность того, что случайный выбор выберет правильный элемент из каждой ячейки, что равно . Запустив Conv3SUM раз, решение будет найдено с высокой вероятностью.
К сожалению, у нас нет линейного идеального хеширования, поэтому нам приходится использовать почти линейную хеш-функцию, т.е. функцию h такую, что:
или
Для этого требуется дублировать элементы S при копировании их в T , т. е. помещать каждый элемент как в (как и раньше), так и в . Таким образом, каждая ячейка будет иметь 2 элемента R , и нам придется запустить Conv3SUM несколько раз.
3SUM-твердость
Задача называется 3SUM-трудной , если ее решение за субквадратичное время подразумевает алгоритм для 3SUM за субквадратичное время . Концепция 3SUM-трудности была введена Гажентааном и Овермарсом (1995). Они доказали, что большой класс задач в вычислительной геометрии являются 3SUM-трудными, включая следующие. (Авторы признают, что многие из этих задач были разработаны другими исследователями.)
Если на плоскости даны прямые, то существуют ли три из них, которые пересекаются в одной точке?
Дан набор непересекающихся отрезков прямых, параллельных осям, существует ли линия, которая разделяет их на два непустых подмножества?
Если на плоскости имеется набор бесконечных полос, полностью ли они покрывают заданный прямоугольник?
Дан набор треугольников на плоскости. Вычислите их меры.
Если на плоскости задано множество треугольников, будет ли в их объединении дырка?
Ряд проблем с видимостью и планированием движения, например,
Если в пространстве имеется набор горизонтальных треугольников, можно ли увидеть конкретный треугольник из определенной точки?
Если на плоскости задан набор непересекающихся отрезков прямых, параллельных осям, можно ли перемещать заданный стержень посредством перемещений и вращений между начальным и конечным положениями, не сталкиваясь с препятствиями?
На данный момент существует множество других проблем, которые попадают в эту категорию. Примером является версия решения сортировки X + Y : заданы наборы чисел X и Y по n элементов в каждом, существуют ли n ² различных x + y для x ∈ X , y ∈ Y ? [11]
^ Для сокращения в другом направлении см. Варианты задачи о 3-х суммах.
^ abc Patrascu, M. (2010). К нижним полиномиальным границам для динамических задач . Труды 42-го симпозиума ACM по теории вычислений - STOC '10. стр. 603. doi :10.1145/1806689.1806772. ISBN9781450300506.
^ Демейн, Эрик ; Эриксон, Джефф; О'Рурк, Джозеф (20 августа 2006 г.). "Задача 41: Сортировка X + Y (попарные суммы)". The Open Problems Project . Получено 23 сентября 2014 г.
Ссылки
Кейн, Дэниел М.; Ловетт, Шачар; Моран, Шей (2018). «Почти оптимальные линейные деревья решений для k-SUM и связанных с ними проблем». Труды 50-го ежегодного симпозиума ACM SIGACT по теории вычислений . стр. 554–563 . arXiv : 1705.01720 . doi : 10.1145 /3188745.3188770. ISBN9781450355599. S2CID 30368541.
Чан, Тимоти М. (2018), «Больше ускорений логарифмического фактора для 3SUM, (медианой,+)-свертки и некоторых геометрических 3SUM-трудных задач», Труды двадцать девятого ежегодного симпозиума ACM-SIAM по дискретным алгоритмам , стр. 881–897 , doi : 10.1137/1.9781611975031.57 , ISBN978-1-61197-503-1
Грёнлунд, А.; Петти, С. (2014). Тройнички, дегенераты и любовные треугольники . 55-й ежегодный симпозиум IEEE по основам компьютерной науки 2014 г. стр. 621. arXiv : 1404.0799 . Bibcode : 2014arXiv1404.0799G. doi : 10.1109/FOCS.2014.72. ISBN978-1-4799-6517-5.
Голд, Омер; Шарир, Миха (2017), «Улучшенные границы для 3SUM, k -SUM и линейной вырожденности», в трудах 25-го ежегодного Европейского симпозиума по алгоритмам (ESA) , LIPIcs, 87 : 42:1–42:13, doi : 10.4230/LIPIcs.ESA.2017.42 , S2CID 691387