Позвольте v = (v(1), ..., v(n))
быть вектором положительных чисел, таких как v(1) + ... + v(n) = 1
. Пусть l > 0
такой, что 1/l ≤ n
и предположим, что v(k) > l
для некоторых k
.Ограничение записей весового вектора
Рассмотрим следующий алгоритм:
- Помещенный
v(k) = l
k
для каждого такого, чтоv(k) > l
. - Нормализация
v
, То есть, положитьv = v/(v(1) + ... + v(n))
.
Легко видеть, что повторное применение этого алгоритма v
сходится к некоторому вектору w
таким образом, что для каждого w(k) ≤ l
k
и w(1) + ... w(k) = 1
. Моя цель - найти быстрый алгоритм, который вычисляет точное значение w
.
Идея заменяет каждую запись v
, которая больше l
, на l
, а затем нормализует остальную часть записей. Это приводит к следующему алгоритму:
- Пусть
I = (i(1), ..., i(m))
будет список индексов, таких, чтоv(k) > l
тогда и только тогда, когдаk
принадлежитI
иJ = (j(1), ..., j(n-m))
его дополнение, то есть, список индексов, таких, чтоv(k) ≥ l
тогда и только еслиk
принадлежит кJ
. - Положить
v(i(k)) = l
на каждые1 ≤ k ≤ m
. - Положить
v = (1 - m * l) * v(j(k))/(v(j(1)) + ... + v(j(k)))
на каждые1 ≤ k ≤ n-m
.
Проблема заключается в том, что могут существовать некоторые k
такие, что v(k) < l
перед применением алгоритма и v(k) > l
после его применения. Таким образом, по-прежнему необходимо применять его повторно. Тем не менее он сходится к w
не более чем в n
шагах.
Применяя предыдущий алгоритм неоднократно эквивалентно замене m
крупнейших вхождений v
по l
, а затем нормализуя остальную часть записи, для определенного выбора m
. Есть ли быстрый способ найти значение m
или вектор w
, возможно, в линейном времени?