3SUM - 3SUM

Нерешенная проблема в информатике :

Есть ли алгоритм для решения проблемы 3SUM во время , для некоторых ?

В теории сложности вычислений , то 3SUM проблема спрашивает , является ли данный набор действительных чисел содержит три элемента, сумму к нулю. Обобщенная версия k -SUM задает тот же вопрос о k числах. 3SUM можно легко решить во времени, и соответствующие нижние границы известны в некоторых специализированных моделях вычислений ( Erickson 1999 ).

Было высказано предположение, что любой детерминированный алгоритм для 3SUM требует времени. В 2014 году исходная гипотеза 3SUM была опровергнута Алланом Грёнлундом и Сетом Петти, которые предложили детерминированный алгоритм, который решает 3SUM во времени. Кроме того, Гронлунд и Петти показали, что сложность 4- линейного дерева решений 3SUM равна . Впоследствии эти оценки были улучшены. Самый известный в настоящее время алгоритм для 3SUM работает во времени. Кейн, Ловетт и Моран показали, что сложность 6- линейного дерева решений 3SUM равна . Последняя граница точная (с точностью до логарифмического множителя). Все еще высказывается предположение, что 3SUM невозможно решить за ожидаемое время.

Когда элементы являются целыми числами в диапазоне , 3SUM можно решить во времени, представив входной набор в виде битового вектора , вычислив набор всех попарных сумм как дискретную свертку с использованием быстрого преобразования Фурье и, наконец, сравнив этот набор с .

Квадратичный алгоритм

Предположим, что входной массив . В целочисленных ( слово RAM ) моделях вычислений 3SUM можно решить в среднем по времени, вставив каждое число в хеш-таблицу , а затем для каждого индекса и проверяя, содержит ли хеш-таблица целое число .

Также возможно решить проблему в то же время в модели вычислений на основе сравнения или реальной RAM , для которой хеширование не разрешено. Приведенный ниже алгоритм сначала сортирует входной массив, а затем проверяет все возможные пары в тщательном порядке, чтобы избежать необходимости двоичного поиска пар в отсортированном списке, достигая наихудшего времени, как показано ниже.

sort(S);
for i = 0 to n - 2 do
    a = S[i];
    start = i + 1;
    end = n - 1;
    while (start < end) do
        b = S[start]
        c = S[end];
        if (a + b + c == 0) then
            output a, b, c;
            // Continue search for all triplet combinations summing to zero.
            // We need to update both end and start together since the array values are distinct.
            start = start + 1;
            end = end - 1;
        else if (a + b + c > 0) then
            end = end - 1;
        else
            start = start + 1;
    end
end

В следующем примере показано выполнение этого алгоритма на небольшом отсортированном массиве. Текущие значения a показаны красным, значения b и c показаны пурпурным.

 -25 -10 -7 -3 2 4 8 10  (a+b+c==-25)
 -25 -10 -7 -3 2 4 8 10  (a+b+c==-22)
 . . .
 -25 -10 -7 -3 2 4 8 10  (a+b+c==-7)
 -25 -10 -7 -3 2 4 8 10  (a+b+c==-7)
 -25 -10 -7 -3 2 4 8 10  (a+b+c==-3)
 -25 -10 -7 -3 2 4 8 10  (a+b+c==2)
 -25 -10 -7 -3 2 4 8 10  (a+b+c==0)

Правильность алгоритма можно увидеть в следующем. Предположим, у нас есть решение a + b + c = 0. Поскольку указатели движутся только в одном направлении, мы можем запускать алгоритм до тех пор, пока крайний левый указатель не укажет на a. Запустите алгоритм, пока один из оставшихся указателей не укажет на b или c, в зависимости от того, что произойдет раньше. Затем алгоритм будет работать до тех пор, пока последний указатель не укажет на оставшийся член, давая положительное решение.

Варианты

Ненулевая сумма

Вместо поиска чисел, сумма которых равна 0, можно искать числа, сумма которых является любой константой C, следующим образом:

  • Вычтите C / 3 из всех элементов входного массива.
  • В модифицированном массиве найдите 3 элемента, сумма которых равна 0.

Например, если A = [1,2,3,4] и вас попросят найти 3-ю сумму для C = 4, тогда вычтите все элементы A на 4/3 и решите это обычным способом 3-х сумм, т. Е.

Или вы можете просто изменить исходный алгоритм для поиска целого числа в хеш-таблице .

3 разных массива

Вместо того, чтобы искать 3 числа в одном массиве, мы можем искать их в 3 разных массивах. Т.е. по трем массивам X, Y и Z найдите три числа aX , bY , cZ , такие что . Назовите вариант с 1 массивом 3SUM × 1 и вариант с 3 массивами 3SUM × 3.

Имея решатель для 3SUM × 1, задача 3SUM × 3 может быть решена следующим образом (предполагая, что все элементы являются целыми числами):

  • Для каждого элемента в X , Y и Z , установлено: , , .
  • Пусть S будет конкатенация массивов X , Y и Z .
  • Используйте оракул 3SUM × 1, чтобы найти три таких элемента , что .
  • Вернуться .

Кстати , мы преобразованного массивы, гарантируется , что X , BY , грZ .

Сумма свертки

Вместо поиска произвольных элементов массива, таких что:

свертка 3sum проблема (Conv3SUM) ищет элементы в определенных местах:

Снижение с Conv3SUM до 3SUM

Имея решатель для 3SUM, проблема Conv3SUM может быть решена следующим образом.

  • Определите новый массив T так , чтобы для каждого индекса i : (где n - количество элементов в массиве, а индексы меняются от 0 до n -1).
  • Решить 3SUM на массиве Т .

Доказательство правильности:

  • Если в исходном массиве существует тройная с , то , таким образом , это решение будет найдено 3SUM на T .
  • И наоборот, если в новом массиве есть тройка с , то . Потому что , обязательно и , таким образом , это правильное решение для Conv3SUM на S .

Снижение с 3SUM до Conv3SUM

Имея решатель для Conv3SUM, проблема 3SUM может быть решена следующим образом.

При сокращении используется хеш-функция . В первом приближении предположим, что у нас есть линейная хеш-функция, то есть функция h такая, что:

Предположим, что все элементы являются целыми числами в диапазоне: 0 ... N -1, и что функция h отображает каждый элемент на элемент в меньшем диапазоне индексов: 0 ... n -1. Создайте новый массив T и отправьте каждому элементу S его хеш-значение в T , то есть для каждого x в S ( ):

Первоначально предположим, что отображения уникальны (т.е. каждая ячейка в T принимает только один элемент из S ). Решить Conv3SUM на T . Сейчас же:

  • Если есть решение для 3SUM: , то: и , таким образом , это решение будет найдено решателем Conv3SUM на Т .
  • И наоборот, если Conv3SUM находится на Т , то , очевидно , что соответствует решению 3SUM на S , так как Т просто перестановка S .

Это идеализированное решение не работает, потому что любая хеш - функция может отобразить несколько различных элементов S в одной и те же ячейки T . Хитрость заключается в том, чтобы создать массив , выбрав один случайный элемент из каждой ячейки T , и запустить Conv3SUM . Если решение найдено, то это правильное решение для 3SUM на S . Если решение не найдено, создайте другое случайное число и повторите попытку. Предположим, что в каждой ячейке T содержится не более R элементов . Тогда вероятность найти решение (если решение существует) - это вероятность того, что случайный выбор выберет правильный элемент из каждой ячейки, а именно . Выполнив Conv3SUM раз, решение будет найдено с высокой вероятностью.

К сожалению, у нас нет линейного идеального хеширования, поэтому мы должны использовать почти линейную хеш-функцию , то есть функцию h, такую, что:

или

Это требует дублирования элементов S при копировании их в T , т.е. помещать каждый элемент как в (как раньше), так и в . Таким образом, каждая ячейка будет иметь 2 элемента R , и нам придется запускать Conv3SUM раз.

3SUM-жесткость

Задача называется 3SUM-сложной, если ее решение в субквадратичном времени подразумевает алгоритм субквадратичного времени для 3SUM. Концепция твердости 3SUM была введена Gajentaan & Overmars (1995) . Они доказали, что большой класс задач вычислительной геометрии является 3SUM-сложным, включая следующие. (Авторы признают, что многие из этих проблем созданы другими исследователями.)

  • Имеются ли три линии на плоскости, которые пересекаются в одной точке?
  • Учитывая набор непересекающихся отрезков прямых, параллельных осям, существует ли линия, разделяющая их на два непустых подмножества?
  • Учитывая набор бесконечных полос на плоскости, полностью ли они покрывают данный прямоугольник?
  • Дан набор треугольников на плоскости, вычислите их меру.
  • Имеется ли в их соединении отверстие для набора треугольников на плоскости?
  • Ряд проблем видимости и планирования движения, например,
    • Учитывая набор горизонтальных треугольников в пространстве, можно ли увидеть конкретный треугольник из определенной точки?
    • Учитывая набор непересекающихся препятствий на плоскости, параллельных осям, может ли данный стержень перемещаться посредством перемещений и вращений между начальным и конечным положениями без столкновения с препятствиями?

К настоящему времени в эту категорию попадает множество других проблем. Примером является решающая версия сортировки X + Y : заданы наборы чисел X и Y, состоящие из n элементов в каждом, существуют ли n ² различных x + y для xX , yY ?

Смотрите также

Примечания

использованная литература