Счётчик Кнута — различия между версиями
(Ссылки) |
|||
Строка 125: | Строка 125: | ||
если этот разряд становится равен <tex>b-1</tex>. | если этот разряд становится равен <tex>b-1</tex>. | ||
− | == | + | == См. также == |
* [[Амортизационный анализ]] | * [[Амортизационный анализ]] | ||
* [[Представление целых чисел: прямой код, код со сдвигом, дополнительный код|Представление целых чисел]] | * [[Представление целых чисел: прямой код, код со сдвигом, дополнительный код|Представление целых чисел]] |
Версия 00:32, 16 июня 2014
Определение: |
Счетчик Кнута (англ. Knuth's Counter) — структура данных, представленная избыточной двоичной системой счисления, в которой добавление единицы к числу и вычитание единицы выполняется за | .
Определение: |
Неотрицательное целое число | в избыточной двоичной системе счисления записывается в виде последовательности разрядов , где обозначает количество разрядов в числе, — –й разряд числа , причем и
Содержание
Счетчик Кнута
Описание операции инкремента
Оригинальный метод предложен Кнутом, и состоит из двух правил:
- Найти младший разряд равный и, если таковой имеется, заменить последовательность на
- Заменить на .
Чтобы достичь необходимой оценки и не выполнять каждый раз поиск для первого правила, можно хранить односвязный список позиций двоек в числе. Тогда чтобы найти младший разряд равный двум нужно просто взять первый элемент списка. Также, непосредственно перед изменением значений разрядов в правилах необходимо выполнять следующее:
- Если , то заменить первый элемент списка с на , иначе удалить его.
- Если , то добавить в начало списка .
Инвариант с нулем
Проблемой может оказаться появление двух последовательных двоек, при этом перое правило может породить тройку. То есть недопустима следующая ситуация
. В свою очередь такая ситуация получается из этой . Причем количество единиц между двойками может быть любое, в итоге это приведет к появлению тройки. Однако если между любой парой двоек всегда будет находится хотя бы один , то такой ситуации не возникнет. Покажем, что что этот инвариант поддерживается после инкремента, рассмотрев возможные ситуации:- Число двоек не изменяется
- .
- .
- ) (частный случай предыдущего).
- .
- Пропадает одна двойка
- .
- .
- Появление новой двойки
- (имеется в виду появление единственной двойки).
- .
- (частный случай предыдущего).
Таким образом мы видим, что
всегда сохраняется.Пример
В таблице можно увидеть как будет изменятья представление при применении данных правил десять раз к нулю (представления чисел от
до ):Шаг | Представление |
---|---|
0 | 0 |
1 | 1 |
2 | 2 |
3 | 11 |
4 | 12 |
5 | 21 |
6 | 102 |
7 | 111 |
8 | 112 |
9 | 121 |
Обобщение на системы с произвольным основанием
Определение: |
В общем случае подобное представление называется | -ричными избыточными представлением (ИП, англ. b-ary redundant representation), которое похоже на представление в счетчике Кнута, но основание системы может быть произвольным, то есть и , где — основание. Оно позволяет прибавить единицу к любому разряду, то есть увеличить число на за
Определение: |
Назовем представление регулярным (англ. regular), если между дувумя разрядами равными | есть хотя бы один разряд отличный от .
Определение: |
Операция исправления (англ. fix) разряда | в регулярном ИП увеличивает на и устанавливает в , образуая новое регуляроне ИП, представляющее то же число, что и .
Чтобы добавить к разряду регулярного ИП ,
нужно выполнить следующие действия:
- Если , исправить .
- Если и самый младший значащий разряд , такой, что и , равен (т.е. ), применить операцию исправления к разряду .
- Добавить 1 к .
- Если , исправить .
Для реализации данной схемы, мы используем односвязный список разрядов от младших к старшим. В дополнение каждый разряд
равный будет иметь указатель на самый младший разряд , такой, что и , если он равен , иначе этот указатель будет на произвольный разряд ( ). Теперь, во время увеличения разряда на 1, будем проверять разряд по указателю вперед (п. 2).Такое представление позволяет увеличивать произвольный разряд на единицу за константное время. Обновление указателя вперед происходит следующим образом: когда
становится равен при исправлении разряда , устанавливаем указатель вперед разряда на , если , либо копируем указатель вперед из в , если . При собственно добавлении единицы к разряду , также необходимо обновлять его указатель вперед аналогичным образом, если этот разряд становится равен .См. также
Источники информации
- H. Kaplan и R. E. Tarjan. New heap data structures. 1998
- M. J. Clancy и D. E. Knuth. A programming and problem-solving seminar. Technical Report STAN-CS-77-606, Department of Computer Sciencr, Stanford University, Palo Alto, 1977.
- G. S. Brodal. Worst case priority queues. Proc. 7th annual ACM-SIAM Symposium on Discrete Algorithms (SODA 96), страницы 52-58. ACM Press, 1996.
- H. Kaplan и R. E. Tarjan. Purely functional representations of catenable sorted lists. Proceedings of the 28th Annual ACM Symposium of Computing, страницы 202-211. ACM Press, 1996
- In-Place Binary Counter