Единственный способ получить O(1)
сложность времени - это использовать O(pn)
пробел и O(pn)
время для предварительного упорядочения P и распределения значений в массиве pn
.
Предзаказ P
, поэтому p1
- это минимум, а pn
- это максимум (я предполагаю, что они являются целыми числами.) Затем сохраните в массиве с размером (pn-p1+1)
значения:
A(p1) = p1
for i = 2 to n
for q = p(i-1)+1 to (p(i-1)+p(i))/2
A(q) = p(i-1)
for q = (p(i-1)+p(i))/2 to p(i)
A(q) = p(i)
Тогда все, что вам нужно проверить для определенного q
, это:
if q < A(p1)
closest = A(p1)
elif q > A(pn)
closest = A(pn)
else
closest = A(q)