Найти минимальные A [i] ^ 2 + B [i] ^ 2 при сортировке A и B

Для двух массивов A и B длина n. A сортируется по возрастанию и B сортируется по убыванию. Найти индекс i, для которого "произведение" A[i]^2 + B[i]^2 минимально.

Мне нужно решение в O(log(n)), которое является желаемой сложностью.

Пример:

>>> A
[0, 4, 10, 12, 17, 28, 31, 32, 35, 39]
>>> B
[39, 34, 34, 31, 27, 23, 19, 11, 3, 2]

Здесь "произведение" свернуто на я = 4

>>> [A[i]**2 + B[i]**2 for i in range(10)]
[1521, 1172, 1256, 1105, 1018, 1313, 1322, 1145, 1234, 1525]
>>> min(range(10), key=lambda i: A[i]**2 + B[i]**2)
4

Ответы

Ответ 1

Чтобы формализовать интуицию Эдгара в фактическую нижнюю границу ячейки, рассмотрим определение для i в [1, n] и некотором j, неизвестном алгоритму,

X[i] = 2 * (n**2 + i)
Y[i] = 2 * (n**2 - i)
A[i] = X[i] + 1 if i == j
       X[i]     if i != j
B[i] = Y[i] + 1 if i == j
       Y[i]     if i != j

Проведем некоторый анализ на A[i]**2 + B[i]**2, предполагая i != j.

A[i]**2 + B[i]**2 == 4 * n**4 + 8 * n**2 * i + 4 * i**2
                       + 4 * n**4 - 8 * n**2 * i + 4 * i**2
                  == 8 * n**4 + 8 * i**2
                  <= 8 * n**4 + 8 * n**2

Теперь предположим i == j.

A[i]**2 + B[i]**2 == 8 * n**4 + 8 * n**2 + 8 * i**2 + 2
                  >= 8 * n**4 + 8 * n**2 + 2

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

Семейство пар массивов с j меняется одинаково, кроме как в j, поэтому алгоритм должен в среднем определить половину индексов для определения j, что является синонимом для этого семейства для обнаружения правильного вывода.

Ответ 2

Мне кажется, что ответ на ваш вопрос - "НЕТ", а линейный алгоритм - самый быстрый.

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

Например, если у нас есть два массива длины 7:

5   8   10  11  12  14  15
12  11  10  9   7   6   1

мы получаем массив сумм квадратов:

169  185  200  202  193  232  225

Мы можем видеть, что максимум 232, но нет возможности найти его, кроме повторения по всему массиву, потому что последовательность сумм квадратов несортирована и максимум лежит где-то внутри.

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

Я уверен, что эта проблема эквивалентна обнаружению самого большого элемента в несортированном массиве, который имеет линейное решение как самое быстрое.

Ответ 3

Вот простой аргумент состязательности, что невозможно найти ответ, не глядя на все точки. То есть, алгоритм дает противнику возможную адаптивную последовательность индексов для проверки, и противник всегда будет заполнять A и B, которые сохраняют ограничение монотонности, и это сделает невозможным правильное решение алгоритма без запроса каждого местоположение и др.

Рассмотрим только верхний правый квадрант плоскости 2d, для некоторого заданного N. Противник будет просто складывать вещи на четверти четверти единицы, равномерно расположенных в полярных координатах для всех, кроме последнего запроса. Наконец, противник поместит N-й предмет только чуть-чуть внутри круга. Следовательно, этот последний запрошенный индекс является правильным ответом. Если запросов меньше, чем N, и алгоритм выбирает запрашиваемое местоположение, противник настаивает на том, чтобы одно оставшееся незарегистрированное местоположение едва было внутри круга, что означает, что правильный ответ имел расстояние меньше 1, но алгоритм возвращал расстояние 1. Если вместо этого алгоритм выбирает незарегистрированное местоположение, противник ставит его прямо за пределы круга.