Предположим, у меня есть вектор V целых положительных чисел.Если сумма целых чисел больше положительного целого числа N, я хочу изменить масштаб целых чисел в V так, чтобы сумма была <= N. Элементы в V должны оставаться выше нуля.Длина V гарантированно будет <= N. </p>
Есть ли алгоритм для выполнения этого масштабирования за линейное время?
Это не домашняя работа, кстати :).Мне нужно изменить масштаб карты с символов на частоты символов, чтобы использовать кодировку диапазона.
Некоторое быстрое мышление и поиск в Google не дали решения проблемы.
РЕДАКТИРОВАТЬ:
Хорошо, вопрос был несколько неясным.«Масштабировать» означает «нормализовать».То есть преобразуйте целые числа в V, например, умножив их на константу, на меньшие натуральные числа, чтобы критерий суммы (V) <= N был выполнен.Чем лучше сохраняются соотношения между целыми числами, тем лучше будет сжатие. </p>
Таким образом, проблема не ограничена, метод не должен находить оптимальный (например, в наименьших квадратах)в смысле смысла) способ сохранить соотношения, но "хороший".Установка целого вектора в 1, как предлагается, недопустима (если не принудительно).Достаточно «хорошим», например, будет нахождение наименьшего делителя (определенного ниже), который удовлетворяет критерию суммы.
Следующий наивный алгоритм не работает.
- Найти текущую сумму (V), Зв
- делитель: = int (ceil (Sv / N))
- Разделите каждое целое число в V на делитель, округляя в меньшую сторону, но не ниже 1.
Сбой при v = [1,1,1,10] с N = 5.
divisor = ceil(13 / 5) = 3.
V := [1,1,1, max(1, floor(10/3)) = 3]
Sv is now 6 > 5.
В этом случае правильная нормализация равна [1,1,1,2]
Один алгоритм, который работал бы, - это выполнить бинарный поиск делителя (определенный выше), пока не будет найден самый маленький делитель в [1, N], удовлетворяющий критерию суммы.Начиная с предположения ceil (Sv / N).Это, однако, не линейно по количеству операций, а пропорционально len (V) * log (len (V)).
Я начинаю думать, что это невозможно сделать хорошо, в линейном времени,в общем случае.Я мог бы прибегнуть к какой-то эвристике.