Если предположить, что записи B
положительные (звучит так, как будто этот особый случай может быть полезен для вас), существует алгоритм O(n^2 log n)
.
Давайте сначала решим проблему принятия решения,для конкретного t
, существует ли решение, такое, что
(sum a[i(j)])/(sum b[i(j)]) >= t.
Очистка знаменателя, это условие эквивалентно
sum (a[i(j)] - t*b[i(j)]) >= 0.
Все, что нам нужно сделать, это выбрать k
Наибольшие значения a[i(j)] - t*b[i(j)]
.
Теперь, чтобы решить проблему, когда t
неизвестно, мы используем кинетический алгоритм.Думайте о t
как о переменной времени;нас интересует эволюция одномерной физической системы с n
частицами, имеющими начальные положения A
и скорости -B
.Каждая частица пересекает друг друга не более одного раза, поэтому число событий составляет O(n^2)
.Между переходами оптимум sum (a[i(j)] - t*b[i(j)])
изменяется линейно, поскольку оптимальным является то же подмножество k
.