В данном примере затраты на приращение - это количество выполненных битов.
Т.е. при увеличении с 3 (0b11
) до 4 (0b100
) стоимость 3 (все три позиции перевернуты)).
Теперь, когда вы не можете сказать, что алгоритм является амортизированной постоянной, потому что количество времени зависит от количества битовых переворотов и, следовательно, зависит от числа.
Чтобы обойти это, используйте потенциальный метод для последовательности операций приращения, начинающихся с 0. Теперь потенциальным является число битов, равное 1.
- φ (0) = 0
- φ (1) = 1
- φ (2) = 1
- φ (3) = 2
- φ (4) = 1 и т. Д.
Это имеет смысл, поскольку для каждого бита, равного 1, операции приращения в будущем придется изменить ее на 0 в некоторой точке.Таким образом, всякий раз, когда происходит приращение, которое должно перевернуться больше, чем последний бит, оно использует потенциал значения.
Теперь, продолжая амортизированный анализ, вы обнаружите, что потенциал всегда увеличивается на 1 и впри каждой операции приращения вы уменьшаете потенциал для каждого 1 бита, который вы перевернули.Комбинируя это в каждой операции, вы получаете затраты 2: а) переключение с 0 на 1, б) сохранение 1 для потенциала.Сбрасывание всех до 0 оплачивается с использованием потенциала.
См. Также: http://en.wikipedia.org/wiki/Potential_method