Недавно мой друг получил этот вопрос интервью, который кажется нам разрешимым, но не в пределах асимптотических времен, которые, по мнению интервьюера, должны быть возможны. Вот проблема:
У вас есть массив из
N
целых чисел,xs
, отсортированный, но, возможно, нечеткий. Ваша цель состоит в том, чтобы найти четыре индекса массива (1)(a,b,c,d)
так, чтобы выполнялись следующие два свойства:xs[a] + xs[b] + xs[c] = xs[d] a < b < c < d
Цель состоит в том, чтобы сделать это в O (N 2) времени.
Во-первых, решение O (N 3 log (N)) очевидно: для каждой упорядоченной тройки (a,b,c)
используйте бинарный поиск, чтобы узнать, можно ли найти соответствующий d
. Теперь, как сделать лучше?
Одно интересное предложение интервьюера состоит в том, чтобы переписать первое условие следующим образом:
xs[a] + xs[b] = xs[d] - xs[c]
Непонятно, что делать после этого, но, возможно, мы могли бы выбрать некоторое значение поворота P и искать пару (a,b)
, добавляющую к P и пару (d,c)
, вычитая на нее. Этот поиск достаточно прост для выполнения в O (n) времени для данного P, путем поиска внутрь с обоих концов массива. Однако мне кажется, что проблема в том, что существуют N 2 такие значения P, а не только N из них, поэтому мы фактически не уменьшили размер проблемы: мы работа O (N), O (N 2) раз.
Мы обнаружили, что некоторые связанные проблемы обсуждаются онлайн в другом месте: Найти 3 числа в массиве, добавляющем к данной сумме, разрешимо в N 2 но требует, чтобы сумма фиксировалась раньше времени; приспосабливая один и тот же алгоритм, но итерация по каждой возможной сумме оставляет нас при N 3 как всегда.
Другая связанная проблема выглядит как Найти все триплеты в массиве с суммой, меньшей или равной заданной сумме, но я не уверен, какая часть материала там имеет значение здесь: неравенство, а не равенство, смешивает вещи совсем немного, и, конечно, цель фиксируется, а не изменяется.
Итак, что нам не хватает? Является ли проблема невозможной в конце концов, учитывая требования к производительности? Или есть умный алгоритм, который мы не можем определить?
(1) На самом деле проблема заключается в том, чтобы найти все такие кортежи (a,b,c,d)
и вернуть количество их количества. Но я думаю, что даже найти один из них в требуемых временных ограничениях достаточно сложно.