<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=178.70.112.21&amp;*</id>
		<title>Викиконспекты - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=178.70.112.21&amp;*"/>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/178.70.112.21"/>
		<updated>2026-05-19T18:04:10Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D1%87%D1%91%D1%82%D1%87%D0%B8%D0%BA_%D0%9A%D0%BD%D1%83%D1%82%D0%B0&amp;diff=36216</id>
		<title>Счётчик Кнута</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D1%87%D1%91%D1%82%D1%87%D0%B8%D0%BA_%D0%9A%D0%BD%D1%83%D1%82%D0%B0&amp;diff=36216"/>
				<updated>2014-03-03T18:52:30Z</updated>
		
		<summary type="html">&lt;p&gt;178.70.112.21: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Счетчик Кнута''' (англ. ''Knuth's Counter'') - структура данных, представленная избыточной двоичной системой счисления, где добавление единицы к любому разряду выполняется за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
''Избыточная двоичная система счисления'' - двоичная система счисления, где кроме 0 и 1 допустима 2 в записи числа.&lt;br /&gt;
== Алгоритм ==&lt;br /&gt;
''Примечание: этот алгоритм работает не за истинное &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;. Например, чтобы прибавить 1 к 0111...111, нужно &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt; действий.''&lt;br /&gt;
&lt;br /&gt;
Имеется число, записанное в избыточной двоичной системе счисления, необходимо добавить 1 к какому-либо разряду. Будем поддерживать следующий инвариант: в следующем за любой двойкой разряде всегда стоит 0.&lt;br /&gt;
&lt;br /&gt;
Разберем случаи добавления единицы:&lt;br /&gt;
* a) Если 1 нужно добавить к 2, то в текущем разряде установить 1, в следующем 1.&lt;br /&gt;
* б) Если 1 нужно добавить к 1 и в следующем разряде 0, то в текущем разряде установить 2.&lt;br /&gt;
* в) Если 1 нужно добавить к 1 и в следующем разряде 1, то в текущем разряде установить 0, повторить алгоритм для следующего разряда.&lt;br /&gt;
* г) Если 1 нужно добавить к 1 и в следующем разряде 2, то в следующем за двойкой разряде установить 1, в разряде с двойкой установить 1, в текущем установить 0.&lt;br /&gt;
* д) Если 1 нужно добавить к 0 и в предыдущем разряде 2, в следующем 0, то в предыдущем разряде установить 0, в текущем 2.&lt;br /&gt;
* е) Если 1 нужно добавить к 0 и в предыдущем разряде 2, в следующем 1, то в предыдущем разряде установить 0, повторить алгоритм для следующего разряда.&lt;br /&gt;
* ж) Если 1 нужно добавить к 0 и в предыдущем разряде 2, в следующем 2, то в предыдущем разряде установить 0, повторить алгоритм для следующего разряда.&lt;br /&gt;
* з) Если 1 нужно добавить к 0 и в предыдущем разряде не 2, установить в текущем разряде 1.&lt;br /&gt;
&lt;br /&gt;
== Доказательство ==&lt;br /&gt;
Покажем, что инвариант не нарушится.&lt;br /&gt;
&lt;br /&gt;
Инвариант можно нарушить в 2 случаях: когда к единице прибавляют 1, и в следующем разряде стоит не 0, и когда к нулю прибавляется 1, а в предыдущем разряде стоит 2.&lt;br /&gt;
&lt;br /&gt;
В первом случае, если в следующем разряде 1, алгоритм будет устанавливать в текущий разряд 0 и запускаться от следующего разряда. Если в следующем разряде 2, то, согласно инварианту, следующий за 2 разряд 0, и, если установить в следующий за двойкой и в разряд с двойкой единицы, то инвариант не нарушится.&lt;br /&gt;
&lt;br /&gt;
Во втором случае, если в следующем разряде 0, то предыдущий установится в 0, текущий в 2 и так как в следующем 0 инвариант не нарушится. Если в следующем разряде не 0, то предыдущий установится в 0 и алгоритм запустится от следующего.&lt;br /&gt;
&lt;br /&gt;
== Пример ==&lt;br /&gt;
Рассмотрим пример для каждого варианта, добавление 1 происходит в 3 разряд.&lt;br /&gt;
&lt;br /&gt;
а) &amp;lt;tex&amp;gt;200_{2} \Rightarrow 1100_{2}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
б) &amp;lt;tex&amp;gt;0100_{2} \Rightarrow 0200_{2}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
в) &amp;lt;tex&amp;gt;1100_{2} \Rightarrow 1000_{2}&amp;lt;/tex&amp;gt; повторение алгоритма для 4 разряда, по варианту б &amp;lt;tex&amp;gt;1000_{2} \Rightarrow 2000_{2}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
г) &amp;lt;tex&amp;gt;2100_{2} \Rightarrow 11000_{2}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
д) &amp;lt;tex&amp;gt;10020_{2} \Rightarrow 10200_{2}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
е) &amp;lt;tex&amp;gt;1020_{2} \Rightarrow 1000_{2}&amp;lt;/tex&amp;gt; повторение алгоритма для 4 разряда, по варианту б &amp;lt;tex&amp;gt;1000_{2} \Rightarrow 2000_{2}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ж) &amp;lt;tex&amp;gt;2020_{2} \Rightarrow 2000_{2}&amp;lt;/tex&amp;gt; повторение алгоритма для 4 разряда, по варианту а &amp;lt;tex&amp;gt;2000_{2} \Rightarrow 11000_{2}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
з) &amp;lt;tex&amp;gt;010_{2} \Rightarrow 110_{2}&amp;lt;/tex&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Амортизационная оценка алгоритма ==&lt;br /&gt;
Воспользуемся методом предоплаты. Будем считать, что каждый раз когда мы начинаем выполнять алгоритм мы берем 2 монетки. Одна будет тратится на изменение текущего разряда и одна запасаться. Таким образом, если в разряде стоит 1, то для него запасена 1 монетка, если стоит 2, то запасено 2 монетки. Проверим все варианты.&lt;br /&gt;
&lt;br /&gt;
а) Так как в текущем разряде было 2, то уже запасено 2 монеты, а так же согласно инварианту после 2 стоит 0, тогда возьмем одну из запасенных у двойки монет и потратим их на присвоение следующему разряду 1, вторую запасенную передадим этой единице. Одну монету потратим на установку в текущий разряд 1, вторую запасем для это единицы.&lt;br /&gt;
&lt;br /&gt;
б) Так как в текущем разряде было 1, то прибавим наши монеты к уже запасенной от единицы. Одну монету потратим, что бы установить 2, останется 2 монеты.&lt;br /&gt;
&lt;br /&gt;
в) Так как в текущем разряде было 1, то прибавив наши монеты к запасенной получим 3. Одну монету потратим, что бы установить 0, оставшиеся 2 потратим на повторение алгоритма для следующего разряда.&lt;br /&gt;
&lt;br /&gt;
г) Так как в текущем разряде было 1, в следующем 2, то уже запасено 3 монеты и еще 2 наши. 3 монеты потратим, что бы следующему за 2 разряду установить 1, разряду с 2 установить 1, текущему установить 0. Останется 2 монеты, которые распределятся между двумя единицами.&lt;br /&gt;
&lt;br /&gt;
д) Так как в текущем разряде было 0, в предыдущем разряде 2, в следующем 0, то уже запасено 2 монеты. Одну монету потратим на изменение предыдущего разряда, одну на изменение текущего разряда, наши две монеты запасем для двойки в текущем разряде.&lt;br /&gt;
&lt;br /&gt;
е) Так как в текущем разряде было 0, в предыдущем разряде 2, в следующем 1, то уже запасено 3 монеты. Одну монету потратим на изменение предыдущего разряда, одну сохраним с единицей, наши две монеты потратим на повторение алгоритма на следующем разряде. Останется одна лишняя монета.&lt;br /&gt;
&lt;br /&gt;
ж) Так как в текущем разряде было 0, в предыдущем разряде 2, в следующем 2, то уже запасено 4 монеты. Одну монету потратим на изменение предыдущего разряда, две сохраним с двойкой, наши две монеты потратим на повторение алгоритма на следующем разряде. Останется одна лишняя монета.&lt;br /&gt;
&lt;br /&gt;
з) Одну монету потратим на изменение разряда, оставшуюся запасем с единицей.&lt;br /&gt;
&lt;br /&gt;
Получается 2 монет достаточно для прибавления 1 к любому разряду, тогда наш алгоритм работает в среднем за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Смотри также ==&lt;br /&gt;
* [[Амортизационный анализ]]&lt;br /&gt;
* [[Представление целых чисел: прямой код, код со сдвигом, дополнительный код]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Амортизационный анализ]]&lt;/div&gt;</summary>
		<author><name>178.70.112.21</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D1%87%D1%91%D1%82%D1%87%D0%B8%D0%BA_%D0%9A%D0%BD%D1%83%D1%82%D0%B0&amp;diff=36215</id>
		<title>Счётчик Кнута</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D1%87%D1%91%D1%82%D1%87%D0%B8%D0%BA_%D0%9A%D0%BD%D1%83%D1%82%D0%B0&amp;diff=36215"/>
				<updated>2014-03-03T17:12:26Z</updated>
		
		<summary type="html">&lt;p&gt;178.70.112.21: /* Алгоритм */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Счетчик Кнута''' (англ. ''Knuth's Counter'') - структура данных, представленная избыточной двоичной системой счисления, где добавление единицы к любому разряду выполняется за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
''Избыточная двоичная система счисления'' - двоичная система счисления, где кроме 0 и 1 допустима 2 в записи числа.&lt;br /&gt;
== Алгоритм ==&lt;br /&gt;
''Примечание: этот алгоритм работает на за истинное &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;. Например, чтобы прибавить 1 к 0111...111, нужно &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt; действий.''&lt;br /&gt;
&lt;br /&gt;
Имеется число, записанное в избыточной двоичной системе счисления, необходимо добавить 1 к какому-либо разряду. Будем поддерживать следующий инвариант: в следующем за любой двойкой разряде всегда стоит 0.&lt;br /&gt;
&lt;br /&gt;
Разберем случаи добавления единицы:&lt;br /&gt;
* a) Если 1 нужно добавить к 2, то в текущем разряде установить 1, в следующем 1.&lt;br /&gt;
* б) Если 1 нужно добавить к 1 и в следующем разряде 0, то в текущем разряде установить 2.&lt;br /&gt;
* в) Если 1 нужно добавить к 1 и в следующем разряде 1, то в текущем разряде установить 0, повторить алгоритм для следующего разряда.&lt;br /&gt;
* г) Если 1 нужно добавить к 1 и в следующем разряде 2, то в следующем за двойкой разряде установить 1, в разряде с двойкой установить 1, в текущем установить 0.&lt;br /&gt;
* д) Если 1 нужно добавить к 0 и в предыдущем разряде 2, в следующем 0, то в предыдущем разряде установить 0, в текущем 2.&lt;br /&gt;
* е) Если 1 нужно добавить к 0 и в предыдущем разряде 2, в следующем 1, то в предыдущем разряде установить 0, повторить алгоритм для следующего разряда.&lt;br /&gt;
* ж) Если 1 нужно добавить к 0 и в предыдущем разряде 2, в следующем 2, то в предыдущем разряде установить 0, повторить алгоритм для следующего разряда.&lt;br /&gt;
* з) Если 1 нужно добавить к 0 и в предыдущем разряде не 2, установить в текущем разряде 1.&lt;br /&gt;
&lt;br /&gt;
== Доказательство ==&lt;br /&gt;
Покажем, что инвариант не нарушится.&lt;br /&gt;
&lt;br /&gt;
Инвариант можно нарушить в 2 случаях: когда к единице прибавляют 1, и в следующем разряде стоит не 0, и когда к нулю прибавляется 1, а в предыдущем разряде стоит 2.&lt;br /&gt;
&lt;br /&gt;
В первом случае, если в следующем разряде 1, алгоритм будет устанавливать в текущий разряд 0 и запускаться от следующего разряда. Если в следующем разряде 2, то, согласно инварианту, следующий за 2 разряд 0, и, если установить в следующий за двойкой и в разряд с двойкой единицы, то инвариант не нарушится.&lt;br /&gt;
&lt;br /&gt;
Во втором случае, если в следующем разряде 0, то предыдущий установится в 0, текущий в 2 и так как в следующем 0 инвариант не нарушится. Если в следующем разряде не 0, то предыдущий установится в 0 и алгоритм запустится от следующего.&lt;br /&gt;
&lt;br /&gt;
== Пример ==&lt;br /&gt;
Рассмотрим пример для каждого варианта, добавление 1 происходит в 3 разряд.&lt;br /&gt;
&lt;br /&gt;
а) &amp;lt;tex&amp;gt;200_{2} \Rightarrow 1100_{2}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
б) &amp;lt;tex&amp;gt;0100_{2} \Rightarrow 0200_{2}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
в) &amp;lt;tex&amp;gt;1100_{2} \Rightarrow 1000_{2}&amp;lt;/tex&amp;gt; повторение алгоритма для 4 разряда, по варианту б &amp;lt;tex&amp;gt;1000_{2} \Rightarrow 2000_{2}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
г) &amp;lt;tex&amp;gt;2100_{2} \Rightarrow 11000_{2}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
д) &amp;lt;tex&amp;gt;10020_{2} \Rightarrow 10200_{2}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
е) &amp;lt;tex&amp;gt;1020_{2} \Rightarrow 1000_{2}&amp;lt;/tex&amp;gt; повторение алгоритма для 4 разряда, по варианту б &amp;lt;tex&amp;gt;1000_{2} \Rightarrow 2000_{2}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ж) &amp;lt;tex&amp;gt;2020_{2} \Rightarrow 2000_{2}&amp;lt;/tex&amp;gt; повторение алгоритма для 4 разряда, по варианту а &amp;lt;tex&amp;gt;2000_{2} \Rightarrow 11000_{2}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
з) &amp;lt;tex&amp;gt;010_{2} \Rightarrow 110_{2}&amp;lt;/tex&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Амортизационная оценка алгоритма ==&lt;br /&gt;
Воспользуемся методом предоплаты. Будем считать, что каждый раз когда мы начинаем выполнять алгоритм мы берем 2 монетки. Одна будет тратится на изменение текущего разряда и одна запасаться. Таким образом, если в разряде стоит 1, то для него запасена 1 монетка, если стоит 2, то запасено 2 монетки. Проверим все варианты.&lt;br /&gt;
&lt;br /&gt;
а) Так как в текущем разряде было 2, то уже запасено 2 монеты, а так же согласно инварианту после 2 стоит 0, тогда возьмем одну из запасенных у двойки монет и потратим их на присвоение следующему разряду 1, вторую запасенную передадим этой единице. Одну монету потратим на установку в текущий разряд 1, вторую запасем для это единицы.&lt;br /&gt;
&lt;br /&gt;
б) Так как в текущем разряде было 1, то прибавим наши монеты к уже запасенной от единицы. Одну монету потратим, что бы установить 2, останется 2 монеты.&lt;br /&gt;
&lt;br /&gt;
в) Так как в текущем разряде было 1, то прибавив наши монеты к запасенной получим 3. Одну монету потратим, что бы установить 0, оставшиеся 2 потратим на повторение алгоритма для следующего разряда.&lt;br /&gt;
&lt;br /&gt;
г) Так как в текущем разряде было 1, в следующем 2, то уже запасено 3 монеты и еще 2 наши. 3 монеты потратим, что бы следующему за 2 разряду установить 1, разряду с 2 установить 1, текущему установить 0. Останется 2 монеты, которые распределятся между двумя единицами.&lt;br /&gt;
&lt;br /&gt;
д) Так как в текущем разряде было 0, в предыдущем разряде 2, в следующем 0, то уже запасено 2 монеты. Одну монету потратим на изменение предыдущего разряда, одну на изменение текущего разряда, наши две монеты запасем для двойки в текущем разряде.&lt;br /&gt;
&lt;br /&gt;
е) Так как в текущем разряде было 0, в предыдущем разряде 2, в следующем 1, то уже запасено 3 монеты. Одну монету потратим на изменение предыдущего разряда, одну сохраним с единицей, наши две монеты потратим на повторение алгоритма на следующем разряде. Останется одна лишняя монета.&lt;br /&gt;
&lt;br /&gt;
ж) Так как в текущем разряде было 0, в предыдущем разряде 2, в следующем 2, то уже запасено 4 монеты. Одну монету потратим на изменение предыдущего разряда, две сохраним с двойкой, наши две монеты потратим на повторение алгоритма на следующем разряде. Останется одна лишняя монета.&lt;br /&gt;
&lt;br /&gt;
з) Одну монету потратим на изменение разряда, оставшуюся запасем с единицей.&lt;br /&gt;
&lt;br /&gt;
Получается 2 монет достаточно для прибавления 1 к любому разряду, тогда наш алгоритм работает в среднем за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Смотри также ==&lt;br /&gt;
* [[Амортизационный анализ]]&lt;br /&gt;
* [[Представление целых чисел: прямой код, код со сдвигом, дополнительный код]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Амортизационный анализ]]&lt;/div&gt;</summary>
		<author><name>178.70.112.21</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D1%87%D1%91%D1%82%D1%87%D0%B8%D0%BA_%D0%9A%D0%BD%D1%83%D1%82%D0%B0&amp;diff=36214</id>
		<title>Счётчик Кнута</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D1%87%D1%91%D1%82%D1%87%D0%B8%D0%BA_%D0%9A%D0%BD%D1%83%D1%82%D0%B0&amp;diff=36214"/>
				<updated>2014-03-03T17:08:28Z</updated>
		
		<summary type="html">&lt;p&gt;178.70.112.21: /* Алгоритм */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Счетчик Кнута''' (англ. ''Knuth's Counter'') - структура данных, представленная избыточной двоичной системой счисления, где добавление единицы к любому разряду выполняется за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
''Избыточная двоичная система счисления'' - двоичная система счисления, где кроме 0 и 1 допустима 2 в записи числа.&lt;br /&gt;
== Алгоритм ==&lt;br /&gt;
''Примечание: этот алгоритм работает не за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;. Например, чтобы прибавить 1 к 0111...111, нужно &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt; действий.''&lt;br /&gt;
&lt;br /&gt;
Имеется число, записанное в избыточной двоичной системе счисления, необходимо добавить 1 к какому-либо разряду. Будем поддерживать следующий инвариант: в следующем за любой двойкой разряде всегда стоит 0.&lt;br /&gt;
&lt;br /&gt;
Разберем случаи добавления единицы:&lt;br /&gt;
* a) Если 1 нужно добавить к 2, то в текущем разряде установить 1, в следующем 1.&lt;br /&gt;
* б) Если 1 нужно добавить к 1 и в следующем разряде 0, то в текущем разряде установить 2.&lt;br /&gt;
* в) Если 1 нужно добавить к 1 и в следующем разряде 1, то в текущем разряде установить 0, повторить алгоритм для следующего разряда.&lt;br /&gt;
* г) Если 1 нужно добавить к 1 и в следующем разряде 2, то в следующем за двойкой разряде установить 1, в разряде с двойкой установить 1, в текущем установить 0.&lt;br /&gt;
* д) Если 1 нужно добавить к 0 и в предыдущем разряде 2, в следующем 0, то в предыдущем разряде установить 0, в текущем 2.&lt;br /&gt;
* е) Если 1 нужно добавить к 0 и в предыдущем разряде 2, в следующем 1, то в предыдущем разряде установить 0, повторить алгоритм для следующего разряда.&lt;br /&gt;
* ж) Если 1 нужно добавить к 0 и в предыдущем разряде 2, в следующем 2, то в предыдущем разряде установить 0, повторить алгоритм для следующего разряда.&lt;br /&gt;
* з) Если 1 нужно добавить к 0 и в предыдущем разряде не 2, установить в текущем разряде 1.&lt;br /&gt;
&lt;br /&gt;
== Доказательство ==&lt;br /&gt;
Покажем, что инвариант не нарушится.&lt;br /&gt;
&lt;br /&gt;
Инвариант можно нарушить в 2 случаях: когда к единице прибавляют 1, и в следующем разряде стоит не 0, и когда к нулю прибавляется 1, а в предыдущем разряде стоит 2.&lt;br /&gt;
&lt;br /&gt;
В первом случае, если в следующем разряде 1, алгоритм будет устанавливать в текущий разряд 0 и запускаться от следующего разряда. Если в следующем разряде 2, то, согласно инварианту, следующий за 2 разряд 0, и, если установить в следующий за двойкой и в разряд с двойкой единицы, то инвариант не нарушится.&lt;br /&gt;
&lt;br /&gt;
Во втором случае, если в следующем разряде 0, то предыдущий установится в 0, текущий в 2 и так как в следующем 0 инвариант не нарушится. Если в следующем разряде не 0, то предыдущий установится в 0 и алгоритм запустится от следующего.&lt;br /&gt;
&lt;br /&gt;
== Пример ==&lt;br /&gt;
Рассмотрим пример для каждого варианта, добавление 1 происходит в 3 разряд.&lt;br /&gt;
&lt;br /&gt;
а) &amp;lt;tex&amp;gt;200_{2} \Rightarrow 1100_{2}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
б) &amp;lt;tex&amp;gt;0100_{2} \Rightarrow 0200_{2}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
в) &amp;lt;tex&amp;gt;1100_{2} \Rightarrow 1000_{2}&amp;lt;/tex&amp;gt; повторение алгоритма для 4 разряда, по варианту б &amp;lt;tex&amp;gt;1000_{2} \Rightarrow 2000_{2}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
г) &amp;lt;tex&amp;gt;2100_{2} \Rightarrow 11000_{2}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
д) &amp;lt;tex&amp;gt;10020_{2} \Rightarrow 10200_{2}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
е) &amp;lt;tex&amp;gt;1020_{2} \Rightarrow 1000_{2}&amp;lt;/tex&amp;gt; повторение алгоритма для 4 разряда, по варианту б &amp;lt;tex&amp;gt;1000_{2} \Rightarrow 2000_{2}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ж) &amp;lt;tex&amp;gt;2020_{2} \Rightarrow 2000_{2}&amp;lt;/tex&amp;gt; повторение алгоритма для 4 разряда, по варианту а &amp;lt;tex&amp;gt;2000_{2} \Rightarrow 11000_{2}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
з) &amp;lt;tex&amp;gt;010_{2} \Rightarrow 110_{2}&amp;lt;/tex&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Амортизационная оценка алгоритма ==&lt;br /&gt;
Воспользуемся методом предоплаты. Будем считать, что каждый раз когда мы начинаем выполнять алгоритм мы берем 2 монетки. Одна будет тратится на изменение текущего разряда и одна запасаться. Таким образом, если в разряде стоит 1, то для него запасена 1 монетка, если стоит 2, то запасено 2 монетки. Проверим все варианты.&lt;br /&gt;
&lt;br /&gt;
а) Так как в текущем разряде было 2, то уже запасено 2 монеты, а так же согласно инварианту после 2 стоит 0, тогда возьмем одну из запасенных у двойки монет и потратим их на присвоение следующему разряду 1, вторую запасенную передадим этой единице. Одну монету потратим на установку в текущий разряд 1, вторую запасем для это единицы.&lt;br /&gt;
&lt;br /&gt;
б) Так как в текущем разряде было 1, то прибавим наши монеты к уже запасенной от единицы. Одну монету потратим, что бы установить 2, останется 2 монеты.&lt;br /&gt;
&lt;br /&gt;
в) Так как в текущем разряде было 1, то прибавив наши монеты к запасенной получим 3. Одну монету потратим, что бы установить 0, оставшиеся 2 потратим на повторение алгоритма для следующего разряда.&lt;br /&gt;
&lt;br /&gt;
г) Так как в текущем разряде было 1, в следующем 2, то уже запасено 3 монеты и еще 2 наши. 3 монеты потратим, что бы следующему за 2 разряду установить 1, разряду с 2 установить 1, текущему установить 0. Останется 2 монеты, которые распределятся между двумя единицами.&lt;br /&gt;
&lt;br /&gt;
д) Так как в текущем разряде было 0, в предыдущем разряде 2, в следующем 0, то уже запасено 2 монеты. Одну монету потратим на изменение предыдущего разряда, одну на изменение текущего разряда, наши две монеты запасем для двойки в текущем разряде.&lt;br /&gt;
&lt;br /&gt;
е) Так как в текущем разряде было 0, в предыдущем разряде 2, в следующем 1, то уже запасено 3 монеты. Одну монету потратим на изменение предыдущего разряда, одну сохраним с единицей, наши две монеты потратим на повторение алгоритма на следующем разряде. Останется одна лишняя монета.&lt;br /&gt;
&lt;br /&gt;
ж) Так как в текущем разряде было 0, в предыдущем разряде 2, в следующем 2, то уже запасено 4 монеты. Одну монету потратим на изменение предыдущего разряда, две сохраним с двойкой, наши две монеты потратим на повторение алгоритма на следующем разряде. Останется одна лишняя монета.&lt;br /&gt;
&lt;br /&gt;
з) Одну монету потратим на изменение разряда, оставшуюся запасем с единицей.&lt;br /&gt;
&lt;br /&gt;
Получается 2 монет достаточно для прибавления 1 к любому разряду, тогда наш алгоритм работает в среднем за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Смотри также ==&lt;br /&gt;
* [[Амортизационный анализ]]&lt;br /&gt;
* [[Представление целых чисел: прямой код, код со сдвигом, дополнительный код]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Амортизационный анализ]]&lt;/div&gt;</summary>
		<author><name>178.70.112.21</name></author>	</entry>

	</feed>