<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://wiki.cs.hse.ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Kassalanche</id>
	<title>Wiki - Факультет компьютерных наук - Вклад [ru]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.cs.hse.ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Kassalanche"/>
	<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/%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/Kassalanche"/>
	<updated>2026-09-23T01:20:16Z</updated>
	<subtitle>Вклад</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2016&amp;diff=16751</id>
		<title>Алгоритмы и структуры данных 2016</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2016&amp;diff=16751"/>
		<updated>2015-06-10T00:27:59Z</updated>

		<summary type="html">&lt;p&gt;Kassalanche: /* Контрольная работа на получение зачёта по программистской части экзамена */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== О курсе ===&lt;br /&gt;
Лектор: Объедков Сергей Александрович&lt;br /&gt;
&lt;br /&gt;
== Лекции ==&lt;br /&gt;
[http://t-arxiv.appspot.com/ &#039;&#039;&#039;Конспект Ярослава Сергиенко.&#039;&#039;&#039;]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;13 января:&#039;&#039;&#039; Сортировка вставкой и слиянием. Использование инварианта цикла при доказательстве корректности сортировки вставкой.  Θ- и &#039;&#039;O&#039;&#039;-обозначения. Оценка сложности алгоритмов. Рекуррентные соотношения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;16 января:&#039;&#039;&#039; &#039;&#039;О&#039;&#039;-, &#039;&#039;o&#039;&#039;-, Ω-, ω-, Θ-обозначения. Быстрая сортировка, время работы в худшем, лучшем и среднем случаях. Оптимальность сортировки слиянием. Сортировка при помощи двоичного дерева поиска и ее связь с быстрой сортировкой.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;20 января:&#039;&#039;&#039; Примеры решения рекуррентных соотношений: решение с использованием дерева рекурсии и методом подстановки. Формулировка и интуитивное объяснение основной теоремы. [https://www.dropbox.com/s/6a0r410zjm9qwe7/algo-3-recurrences.pdf?dl=0 (Конспект.)]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;23 января:&#039;&#039;&#039; Выбор порядковой статистики за время &#039;&#039;O&#039;&#039;(&#039;&#039;n&#039;&#039;): [http://en.wikipedia.org/wiki/Quickselect рандомизированный] и [http://en.wikipedia.org/wiki/Median_of_medians детерминированный] алгоритмы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;27 января:&#039;&#039;&#039; Быстрое возведение в степень по модулю. Алгоритм Карацубы для умножения целых чисел. Алгоритм Штрассена для умножения матриц.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;30 января:&#039;&#039;&#039; [http://en.wikipedia.org/wiki/Closest_pair_of_points_problem#Planar_case Поиск ближайшей пары точек] за время &#039;&#039;O&#039;&#039;(&#039;&#039;n&#039;&#039;log &#039;&#039;n&#039;&#039;). Задача о планировании взвешенных интервалов: рекурсивное решение.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3 февраля:&#039;&#039;&#039; Динамическое программирование. Задача о планировании взвешенных интервалов: рекурсивное решение с мемоизацией и итеративное решение. Свойства задач, эффективно решаемых при помощи динамического программирования: наличие полиномиального числа подзадач, выразимость исходной задачи в терминах подзадач, сводимость больших подзадач к полиномиальному числу меньших подзадач. Выравнивание абзаца по ширине: рекурсивное решение с мемоизацией.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6 февраля:&#039;&#039;&#039; Лекция отменяется из-за болезни преподавателя, но будет компенсирована 11 апреля.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;10 февраля:&#039;&#039;&#039; [https://www.dropbox.com/s/1fa95j4om3kykh6/algo-alignment.pdf?dl=0 Вычисление редакционного расстояния и выравнивание последовательностей].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;12 февраля:&#039;&#039;&#039; Графы: обход в глубину и в ширину, поиск компонент связности в неориентированных графах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;17 февраля:&#039;&#039;&#039; Способы представления графов: матрица смежности и списки смежности. Оценка сложности алгоритмов поиска в ширину и глубину, поиска компонент связности в неориентированных графах. Связность в ориентированных графах, алгоритм проверки сильной связности ориентированного графа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;20 февраля:&#039;&#039;&#039; Топологическая сортировка. Вычисление компонент сильной связности в ориентированном графе.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;24 февраля:&#039;&#039;&#039; Поиск кратчайших путей во взвешенном графе: алгоритмы [http://en.wikipedia.org/wiki/Bellman–Ford_algorithm Беллмана – Форда] и [http://en.wikipedia.org/wiki/Floyd–Warshall_algorithm Флойда – Уоршелла].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;27 февраля:&#039;&#039;&#039; Выполнимость 2-КНФ и [http://en.wikipedia.org/wiki/2-satisfiability#Strongly_connected_components компоненты сильной связности]. Перемножение матриц, поиск пути через промежуточную точку и алгоритм Флойда – Уоршелла.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3 марта:&#039;&#039;&#039; Лекция переносится на 11 апреля.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6 марта:&#039;&#039;&#039; Жадные алгоритмы. Примеры: (1) выбор максимального подмножества непересекающихся интервалов; (2) разбиение множества интервалов на минимальное число подмножеств непересекающихся интервалов; (3) составление плана работ с заданными продолжительностями и крайними сроками выполнения, минимизирующего максимальную задержку. Различные методы доказательства корректности жадных алгоритмов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;10 марта:&#039;&#039;&#039; Алгоритм Дейкстры.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;13 марта:&#039;&#039;&#039; Структуры данных. Массив с операциями инициализации, чтения и  записи, выполняемыми за время O(1). Три подхода к амортизационному анализу: групповой анализ, банковский метод и метод потенциалов (на примере двоичного счетчика).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;17 марта:&#039;&#039;&#039; Реализация приоритетной очереди при помощи двоичной кучи.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;20 марта:&#039;&#039;&#039; Минимальные основные деревья. Алгоритмы Крускала, Прима и Reverse-Delete.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;31 марта:&#039;&#039;&#039; Система непересекающихся множеств.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3 апреля:&#039;&#039;&#039; Сжатие путей в системе непересекающихся множеств. Кластеризация и алгоритм Крускала.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;7 апреля:&#039;&#039;&#039; Жадный алгоритм на матроиде.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;10 апреля:&#039;&#039;&#039; Максимальный поток. Алгоритм Форда – Фалкерсона.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;11 апреля:&#039;&#039;&#039; Алгоритм Эдмондса – Карпа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;14 апреля:&#039;&#039;&#039; Двойственность задач о максимальном потоке и минимальном разрезе. Сведение задачи о максимальном паросочетании в двудольном графе к задаче о максимальном потоке.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;17 апреля:&#039;&#039;&#039; Задача о назначениях (поиск совершенного паросочетания с минимальным весом во взвешенном двудольном графе). Алгоритм, последовательно находящий самые дешевые увеличивающие пути.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;21 апреля:&#039;&#039;&#039; Рандомизированный алгоритм поиска минимального разреза (алгоритм Каргера). Простой рандомизированный алгоритм для вычисления означивания переменных, максимизирующего число истинных дизъюнктов в 3-КНФ: случайное означивание гарантирует истинность 7/8 всех дизъюнктов в среднем.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;24 апреля:&#039;&#039;&#039; Хеш-таблицы. Разрешение коллизий при помощи цепочек. Открытая адресация.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;28 апреля:&#039;&#039;&#039; Сбалансированные деревья поиска. Красно-черные деревья.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;12 мая:&#039;&#039;&#039; Самоорганизующиеся списки и конкурентный анализ онлайн-алгоритмов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;15 мая:&#039;&#039;&#039; Конечные автоматы. Регулярные языки. Эквивалентность детерминированных и недетерминированных автоматов. Замкнутость регулярных языков относительно регулярных операций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;19 мая:&#039;&#039;&#039; Регулярные выражения. Эквивалентность регулярных выражений и конечных автоматов. Нерегулярные языки. Лемма о накачке.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;22 мая:&#039;&#039;&#039; Доказательство леммы о накачке и ее использование для доказательства нерегулярности языков. Полиномиальные сведения. Задачи о вершинном покрытии графа, покрытии множества и независимом множестве.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;26 мая:&#039;&#039;&#039; Классы P и NP. Понятие NP-полной задачи. Теорема Кука – Левина, идея доказательства. Доказательство NP-полноты задачи о независимом множестве сведением к ней задачи о выполнимости 3-КНФ.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;29 мая:&#039;&#039;&#039; Приближенные алгоритмы. 2-аппроксимация минимального вершинного покрытия и кратчайшего циклического маршрута. Существование задач, для которых константная аппроксимация возможна, только если P = NP (максимальное независимое множество, максимальная клика). PTAS для задачи о рюкзаке.&lt;br /&gt;
&lt;br /&gt;
== Домашние задания ==&lt;br /&gt;
&lt;br /&gt;
=== Задание 1 ===&lt;br /&gt;
&lt;br /&gt;
Необходимо сдать все 6 задач в данном [https://official.contest.yandex.ru/contest/1002 контесте]. На выполнение задания даётся 2 недели (см. точное время окончания в контесте). Условия ревью определяют семинаристы.&lt;br /&gt;
&lt;br /&gt;
=== Задание 2 ===&lt;br /&gt;
&lt;br /&gt;
[https://official.contest.yandex.ru/contest/1085 Контест]. В домашнем задании пять задач, из которых нужно решить три, назначенные преподавателем, ведущим семинарские занятия в вашей группе. На выполнение задания даётся примерно 2 недели (см. точное время окончания в контесте). Условия ревью определяют семинаристы. [https://official.contest.yandex.ru/contest/1123 Дорешивание.]&lt;br /&gt;
&lt;br /&gt;
=== Задание 3 ===&lt;br /&gt;
&lt;br /&gt;
[https://official.contest.yandex.ru/contest/1196 Контест]. В домашнем задании пять задач. Они разделены на два варианта, помеченные римскими цифрами I и II. Свой вариант нужно узнать у семинариста. Третья задача — общая для двух вариантов; ее решение необходимо снабдить доказательством корректности алгоритма. На выполнение задания даётся примерно 2 недели (см. точное время окончания в контесте). Условия ревью определяют семинаристы.&lt;br /&gt;
&lt;br /&gt;
=== Задание 4 ===&lt;br /&gt;
&lt;br /&gt;
[https://official.contest.yandex.ru/contest/1259 Контест]. В домашнем задании четыре задачи. Обязательны первые три. Вместо одной из первых трёх можно сделать последнюю (только для первых 10 решивших 4-ую!). На выполнение задания даётся примерно 2 недели (см. точное время окончания в контесте). Условия ревью определяют семинаристы.&lt;br /&gt;
&lt;br /&gt;
=== Задание 5 ===&lt;br /&gt;
&lt;br /&gt;
[https://official.contest.yandex.ru/contest/1271 Контест]. На выполнение задания даётся примерно 2 недели (см. точное время окончания в контесте). Условия ревью определяют семинаристы. Также до 25 июня необходимо решить [https://www.dropbox.com/s/2mq9lr1950pnwio/algo-hw-5.pdf?dl=0 задачи] и прислать решение своему семинаристу и его учебному ассистенту.&lt;br /&gt;
&lt;br /&gt;
== Контрольная работа ==&lt;br /&gt;
Контрольная работа состоится 11 апреля в 13:40 – 15:00 в ауд. 622. [https://www.dropbox.com/s/uj2m9xdueq57y9o/sample.pdf?dl=0 Примеры задач] (и [https://www.dropbox.com/s/szdymvchx74b731/sample-solved.pdf?dl=0 решений])].&lt;br /&gt;
&lt;br /&gt;
== Контрольная работа на получение зачёта по программистской части экзамена ==&lt;br /&gt;
&#039;&#039;&#039;Что будет на контрольной?&#039;&#039;&#039;&lt;br /&gt;
# Будет одна задача на программирование.&lt;br /&gt;
# Задача будет или на написание известного (вам) алгоритма, или на небольшую модификацию.&lt;br /&gt;
&#039;&#039;&#039;Как будет проходить контрольная?&#039;&#039;&#039;&lt;br /&gt;
# Контрольная пройдёт на последнем семинаре по АиСД. Продолжительность: 1 час 20 минут, продлеваться НЕ будет. Форма: контест.&lt;br /&gt;
# Задача выдается в начале пары, её сразу же можно начать решать, а для тех, кто не знает нужный алгоритм, семинарист параллельно на доске рассказывает идею алгоритма.&lt;br /&gt;
# Запрещается использовать телефоны, планшеты и другие мобильные устройства.&lt;br /&gt;
# Можно писать на своём ноутбуке.&lt;br /&gt;
# На время пары, возможно, будет ограничен доступ к интернету, будeт доступен только Яндекс.Contest, cppreference.com, python.org&lt;br /&gt;
# Тесты будут открыты.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Что будет, если я её напишу?&#039;&#039;&#039;&lt;br /&gt;
# Если решение получило OK в контесте, студент получает зачёт по программистской части, которая составляет 20% от оценки за экзамен. На экзамене будут даны другие задачи на программирование. В отличие от контрольной, алгоритм напоминаться НЕ будет, поэтому проще сдать задачу на контрольной.&lt;br /&gt;
&#039;&#039;&#039;Что будет, если я её не напишу?&#039;&#039;&#039;&lt;br /&gt;
# Вам придётся решать задачу на программирование на экзамене. Вы также сможете получить за неё максимальное число баллов (2).&lt;br /&gt;
&#039;&#039;&#039;Какие правила? Чем можно пользоваться?&#039;&#039;&#039;&lt;br /&gt;
# Работа индивидуальная.&lt;br /&gt;
# Нельзя пользоваться никакими ресурсами, в том числе книгами (электронными или нет), pdf-ками, презентациями, распечатками, конспектом, своим старым кодом (в том числе в Яндекс.Contest) и пр.&lt;br /&gt;
# Можно писать на своём ноутбуке.&lt;br /&gt;
# Можно открывать только следующие сайты: Яндекс.Contest, cppreference.com, python.org&lt;br /&gt;
# За первое нарушение указанных правил работа аннулируется.&lt;br /&gt;
# Если по какой-то причине вам необходимо воспользоваться почтой, телефоном,.. поднимите руку и спросите/предупредите семинариста.&lt;br /&gt;
&#039;&#039;&#039;Советы&#039;&#039;&#039;&lt;br /&gt;
# Подготовьтесь к занятию, повторите все пройденные алгоритмы.&lt;br /&gt;
# Заранее выпишите свои логин-пароль от Яндекс.Контеста, возможно, мы отключим интернет и у вас не будет доступа к ресурсу, где они сохранены.&lt;br /&gt;
# Зайдите в класс пораньше, включите компьютер и залогиньтесь, чтобы не терять время во время контрольной.&lt;br /&gt;
&lt;br /&gt;
== Семинары ==&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппа 101-1|Подгруппа 101-1.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппа 101-2|Подгруппа 101-2.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппы 102-1, 102-2, 107-2|Подгруппа 102-1.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппы 102-1, 102-2, 107-2|Подгруппа 102-2.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппа 103-1|Подгруппа 103-1.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппа 105-1|Подгруппа 105-1.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппа 106-1|Подгруппа 106-1.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппа 106-2|Подгруппа 106-2.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппа 107-1|Подгруппа 107-1.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппы 102-1, 102-2, 107-2|Подгруппа 107-2.]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Рекомендуемая литература ==&lt;br /&gt;
# Кормен, Лейзерсон, Ривест, Штайн. Алгоритмы: построение и анализ ([https://vk.com/doc4262442_326131655?hash=9d6945b570241aa338&amp;amp;dl=681b57216bf37463e9 3-е изд.], [http://librarun.org/book/4121/1 2-е изд.], [http://e-maxx.ru/bookz/files/cormen.pdf  1-е изд.])&lt;br /&gt;
# [https://dl.dropboxusercontent.com/u/829163/draft.pdf Дасгупта, Пападимитриу, Вазирани. Алгоритмы] ([http://beust.com/algorithms.pdf оригинал] | [http://biblio.mccme.ru/node/5066/shop купить])&lt;br /&gt;
&lt;br /&gt;
== Полезные ссылки ==&lt;br /&gt;
# [[Reviewboard|Инструкция по использованию Review Board.]]&lt;/div&gt;</summary>
		<author><name>Kassalanche</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2016&amp;diff=16750</id>
		<title>Алгоритмы и структуры данных 2016</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2016&amp;diff=16750"/>
		<updated>2015-06-10T00:27:32Z</updated>

		<summary type="html">&lt;p&gt;Kassalanche: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== О курсе ===&lt;br /&gt;
Лектор: Объедков Сергей Александрович&lt;br /&gt;
&lt;br /&gt;
== Лекции ==&lt;br /&gt;
[http://t-arxiv.appspot.com/ &#039;&#039;&#039;Конспект Ярослава Сергиенко.&#039;&#039;&#039;]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;13 января:&#039;&#039;&#039; Сортировка вставкой и слиянием. Использование инварианта цикла при доказательстве корректности сортировки вставкой.  Θ- и &#039;&#039;O&#039;&#039;-обозначения. Оценка сложности алгоритмов. Рекуррентные соотношения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;16 января:&#039;&#039;&#039; &#039;&#039;О&#039;&#039;-, &#039;&#039;o&#039;&#039;-, Ω-, ω-, Θ-обозначения. Быстрая сортировка, время работы в худшем, лучшем и среднем случаях. Оптимальность сортировки слиянием. Сортировка при помощи двоичного дерева поиска и ее связь с быстрой сортировкой.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;20 января:&#039;&#039;&#039; Примеры решения рекуррентных соотношений: решение с использованием дерева рекурсии и методом подстановки. Формулировка и интуитивное объяснение основной теоремы. [https://www.dropbox.com/s/6a0r410zjm9qwe7/algo-3-recurrences.pdf?dl=0 (Конспект.)]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;23 января:&#039;&#039;&#039; Выбор порядковой статистики за время &#039;&#039;O&#039;&#039;(&#039;&#039;n&#039;&#039;): [http://en.wikipedia.org/wiki/Quickselect рандомизированный] и [http://en.wikipedia.org/wiki/Median_of_medians детерминированный] алгоритмы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;27 января:&#039;&#039;&#039; Быстрое возведение в степень по модулю. Алгоритм Карацубы для умножения целых чисел. Алгоритм Штрассена для умножения матриц.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;30 января:&#039;&#039;&#039; [http://en.wikipedia.org/wiki/Closest_pair_of_points_problem#Planar_case Поиск ближайшей пары точек] за время &#039;&#039;O&#039;&#039;(&#039;&#039;n&#039;&#039;log &#039;&#039;n&#039;&#039;). Задача о планировании взвешенных интервалов: рекурсивное решение.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3 февраля:&#039;&#039;&#039; Динамическое программирование. Задача о планировании взвешенных интервалов: рекурсивное решение с мемоизацией и итеративное решение. Свойства задач, эффективно решаемых при помощи динамического программирования: наличие полиномиального числа подзадач, выразимость исходной задачи в терминах подзадач, сводимость больших подзадач к полиномиальному числу меньших подзадач. Выравнивание абзаца по ширине: рекурсивное решение с мемоизацией.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6 февраля:&#039;&#039;&#039; Лекция отменяется из-за болезни преподавателя, но будет компенсирована 11 апреля.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;10 февраля:&#039;&#039;&#039; [https://www.dropbox.com/s/1fa95j4om3kykh6/algo-alignment.pdf?dl=0 Вычисление редакционного расстояния и выравнивание последовательностей].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;12 февраля:&#039;&#039;&#039; Графы: обход в глубину и в ширину, поиск компонент связности в неориентированных графах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;17 февраля:&#039;&#039;&#039; Способы представления графов: матрица смежности и списки смежности. Оценка сложности алгоритмов поиска в ширину и глубину, поиска компонент связности в неориентированных графах. Связность в ориентированных графах, алгоритм проверки сильной связности ориентированного графа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;20 февраля:&#039;&#039;&#039; Топологическая сортировка. Вычисление компонент сильной связности в ориентированном графе.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;24 февраля:&#039;&#039;&#039; Поиск кратчайших путей во взвешенном графе: алгоритмы [http://en.wikipedia.org/wiki/Bellman–Ford_algorithm Беллмана – Форда] и [http://en.wikipedia.org/wiki/Floyd–Warshall_algorithm Флойда – Уоршелла].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;27 февраля:&#039;&#039;&#039; Выполнимость 2-КНФ и [http://en.wikipedia.org/wiki/2-satisfiability#Strongly_connected_components компоненты сильной связности]. Перемножение матриц, поиск пути через промежуточную точку и алгоритм Флойда – Уоршелла.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3 марта:&#039;&#039;&#039; Лекция переносится на 11 апреля.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6 марта:&#039;&#039;&#039; Жадные алгоритмы. Примеры: (1) выбор максимального подмножества непересекающихся интервалов; (2) разбиение множества интервалов на минимальное число подмножеств непересекающихся интервалов; (3) составление плана работ с заданными продолжительностями и крайними сроками выполнения, минимизирующего максимальную задержку. Различные методы доказательства корректности жадных алгоритмов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;10 марта:&#039;&#039;&#039; Алгоритм Дейкстры.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;13 марта:&#039;&#039;&#039; Структуры данных. Массив с операциями инициализации, чтения и  записи, выполняемыми за время O(1). Три подхода к амортизационному анализу: групповой анализ, банковский метод и метод потенциалов (на примере двоичного счетчика).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;17 марта:&#039;&#039;&#039; Реализация приоритетной очереди при помощи двоичной кучи.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;20 марта:&#039;&#039;&#039; Минимальные основные деревья. Алгоритмы Крускала, Прима и Reverse-Delete.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;31 марта:&#039;&#039;&#039; Система непересекающихся множеств.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3 апреля:&#039;&#039;&#039; Сжатие путей в системе непересекающихся множеств. Кластеризация и алгоритм Крускала.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;7 апреля:&#039;&#039;&#039; Жадный алгоритм на матроиде.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;10 апреля:&#039;&#039;&#039; Максимальный поток. Алгоритм Форда – Фалкерсона.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;11 апреля:&#039;&#039;&#039; Алгоритм Эдмондса – Карпа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;14 апреля:&#039;&#039;&#039; Двойственность задач о максимальном потоке и минимальном разрезе. Сведение задачи о максимальном паросочетании в двудольном графе к задаче о максимальном потоке.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;17 апреля:&#039;&#039;&#039; Задача о назначениях (поиск совершенного паросочетания с минимальным весом во взвешенном двудольном графе). Алгоритм, последовательно находящий самые дешевые увеличивающие пути.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;21 апреля:&#039;&#039;&#039; Рандомизированный алгоритм поиска минимального разреза (алгоритм Каргера). Простой рандомизированный алгоритм для вычисления означивания переменных, максимизирующего число истинных дизъюнктов в 3-КНФ: случайное означивание гарантирует истинность 7/8 всех дизъюнктов в среднем.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;24 апреля:&#039;&#039;&#039; Хеш-таблицы. Разрешение коллизий при помощи цепочек. Открытая адресация.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;28 апреля:&#039;&#039;&#039; Сбалансированные деревья поиска. Красно-черные деревья.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;12 мая:&#039;&#039;&#039; Самоорганизующиеся списки и конкурентный анализ онлайн-алгоритмов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;15 мая:&#039;&#039;&#039; Конечные автоматы. Регулярные языки. Эквивалентность детерминированных и недетерминированных автоматов. Замкнутость регулярных языков относительно регулярных операций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;19 мая:&#039;&#039;&#039; Регулярные выражения. Эквивалентность регулярных выражений и конечных автоматов. Нерегулярные языки. Лемма о накачке.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;22 мая:&#039;&#039;&#039; Доказательство леммы о накачке и ее использование для доказательства нерегулярности языков. Полиномиальные сведения. Задачи о вершинном покрытии графа, покрытии множества и независимом множестве.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;26 мая:&#039;&#039;&#039; Классы P и NP. Понятие NP-полной задачи. Теорема Кука – Левина, идея доказательства. Доказательство NP-полноты задачи о независимом множестве сведением к ней задачи о выполнимости 3-КНФ.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;29 мая:&#039;&#039;&#039; Приближенные алгоритмы. 2-аппроксимация минимального вершинного покрытия и кратчайшего циклического маршрута. Существование задач, для которых константная аппроксимация возможна, только если P = NP (максимальное независимое множество, максимальная клика). PTAS для задачи о рюкзаке.&lt;br /&gt;
&lt;br /&gt;
== Домашние задания ==&lt;br /&gt;
&lt;br /&gt;
=== Задание 1 ===&lt;br /&gt;
&lt;br /&gt;
Необходимо сдать все 6 задач в данном [https://official.contest.yandex.ru/contest/1002 контесте]. На выполнение задания даётся 2 недели (см. точное время окончания в контесте). Условия ревью определяют семинаристы.&lt;br /&gt;
&lt;br /&gt;
=== Задание 2 ===&lt;br /&gt;
&lt;br /&gt;
[https://official.contest.yandex.ru/contest/1085 Контест]. В домашнем задании пять задач, из которых нужно решить три, назначенные преподавателем, ведущим семинарские занятия в вашей группе. На выполнение задания даётся примерно 2 недели (см. точное время окончания в контесте). Условия ревью определяют семинаристы. [https://official.contest.yandex.ru/contest/1123 Дорешивание.]&lt;br /&gt;
&lt;br /&gt;
=== Задание 3 ===&lt;br /&gt;
&lt;br /&gt;
[https://official.contest.yandex.ru/contest/1196 Контест]. В домашнем задании пять задач. Они разделены на два варианта, помеченные римскими цифрами I и II. Свой вариант нужно узнать у семинариста. Третья задача — общая для двух вариантов; ее решение необходимо снабдить доказательством корректности алгоритма. На выполнение задания даётся примерно 2 недели (см. точное время окончания в контесте). Условия ревью определяют семинаристы.&lt;br /&gt;
&lt;br /&gt;
=== Задание 4 ===&lt;br /&gt;
&lt;br /&gt;
[https://official.contest.yandex.ru/contest/1259 Контест]. В домашнем задании четыре задачи. Обязательны первые три. Вместо одной из первых трёх можно сделать последнюю (только для первых 10 решивших 4-ую!). На выполнение задания даётся примерно 2 недели (см. точное время окончания в контесте). Условия ревью определяют семинаристы.&lt;br /&gt;
&lt;br /&gt;
=== Задание 5 ===&lt;br /&gt;
&lt;br /&gt;
[https://official.contest.yandex.ru/contest/1271 Контест]. На выполнение задания даётся примерно 2 недели (см. точное время окончания в контесте). Условия ревью определяют семинаристы. Также до 25 июня необходимо решить [https://www.dropbox.com/s/2mq9lr1950pnwio/algo-hw-5.pdf?dl=0 задачи] и прислать решение своему семинаристу и его учебному ассистенту.&lt;br /&gt;
&lt;br /&gt;
== Контрольная работа ==&lt;br /&gt;
Контрольная работа состоится 11 апреля в 13:40 – 15:00 в ауд. 622. [https://www.dropbox.com/s/uj2m9xdueq57y9o/sample.pdf?dl=0 Примеры задач] (и [https://www.dropbox.com/s/szdymvchx74b731/sample-solved.pdf?dl=0 решений])].&lt;br /&gt;
&lt;br /&gt;
== Контрольная работа на получение зачёта по программистской части экзамена ==&lt;br /&gt;
&#039;&#039;&#039;Что будет на контрольной?&#039;&#039;&#039;&lt;br /&gt;
# Будет одна задача на программирование.&lt;br /&gt;
# Задача будет или на написание известного (вам) алгоритма, или на небольшую модификацию.&lt;br /&gt;
&#039;&#039;&#039;Как будет проходить контрольная?&#039;&#039;&#039;&lt;br /&gt;
# Контрольная пройдёт на последнем семинаре по АиСД. Продолжительность: 1 час 20 минут, продлеваться НЕ будет. Форма: контест.&lt;br /&gt;
# Задача выдается в начале пары, её сразу же можно начать решать, а для тех, кто не знает нужный алгоритм, семинарист параллельно на доске рассказывает идею алгоритма.&lt;br /&gt;
# Запрещается использовать телефоны, планшеты и другие мобильные устройства.&lt;br /&gt;
# Можно писать на своём ноутбуке.&lt;br /&gt;
# На время пары, возможно, будет ограничен доступ к интернету, будeт доступен только Яндекс.Contest, cppreference.com, python.org&lt;br /&gt;
# Тесты будут открыты.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Что будет, если я её напишу?&#039;&#039;&#039;&lt;br /&gt;
# Если решение получило OK в контесте, студент получает зачёт по программистской части, которая составляет 20% от оценки за экзамен. На экзамене будут даны другие задачи на программирование. В отличие от контрольной, алгоритм напоминаться НЕ будет, поэтому проще сдать задачу на контрольной.&lt;br /&gt;
&#039;&#039;&#039;Что будет, если я её не напишу?&#039;&#039;&#039;&lt;br /&gt;
# Вам придётся решать задачу на программирование на экзамене. Вы также сможете получить за неё максимальное число баллов (2).&lt;br /&gt;
&#039;&#039;&#039;Какие правила? Чем можно пользоваться?&#039;&#039;&#039;&lt;br /&gt;
# Работа индивидуальная.&lt;br /&gt;
# Нельзя пользоваться никакими ресурсами, в том числе книгами (электронными или нет), pdf-ками, презентациями, распечатками, конспектом, своим старым кодом (в том числе в Яндекс.Contest) и пр.&lt;br /&gt;
# Можно писать на своём ноутбуке.&lt;br /&gt;
# Можно открывать только следующие сайты: Яндекс.Contest, cppreference.com, python.org&lt;br /&gt;
# За первое нарушение указанных правил работа аннулируется.&lt;br /&gt;
# Если по какой-то причине вам необходимо воспользоваться почтой, телефоном,.. поднимите руку и спросите/предупредите семинариста.&lt;br /&gt;
&#039;&#039;&#039;Советы?&#039;&#039;&#039;&lt;br /&gt;
# Подготовьтесь к занятию, повторите все пройденные алгоритмы.&lt;br /&gt;
# Заранее выпишите свои логин-пароль от Яндекс.Контеста, возможно, мы отключим интернет и у вас не будет доступа к ресурсу, где они сохранены.&lt;br /&gt;
# Зайдите в класс пораньше, включите компьютер и залогиньтесь, чтобы не терять время во время контрольной.&lt;br /&gt;
&lt;br /&gt;
== Семинары ==&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппа 101-1|Подгруппа 101-1.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппа 101-2|Подгруппа 101-2.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппы 102-1, 102-2, 107-2|Подгруппа 102-1.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппы 102-1, 102-2, 107-2|Подгруппа 102-2.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппа 103-1|Подгруппа 103-1.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппа 105-1|Подгруппа 105-1.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппа 106-1|Подгруппа 106-1.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппа 106-2|Подгруппа 106-2.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппа 107-1|Подгруппа 107-1.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппы 102-1, 102-2, 107-2|Подгруппа 107-2.]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Рекомендуемая литература ==&lt;br /&gt;
# Кормен, Лейзерсон, Ривест, Штайн. Алгоритмы: построение и анализ ([https://vk.com/doc4262442_326131655?hash=9d6945b570241aa338&amp;amp;dl=681b57216bf37463e9 3-е изд.], [http://librarun.org/book/4121/1 2-е изд.], [http://e-maxx.ru/bookz/files/cormen.pdf  1-е изд.])&lt;br /&gt;
# [https://dl.dropboxusercontent.com/u/829163/draft.pdf Дасгупта, Пападимитриу, Вазирани. Алгоритмы] ([http://beust.com/algorithms.pdf оригинал] | [http://biblio.mccme.ru/node/5066/shop купить])&lt;br /&gt;
&lt;br /&gt;
== Полезные ссылки ==&lt;br /&gt;
# [[Reviewboard|Инструкция по использованию Review Board.]]&lt;/div&gt;</summary>
		<author><name>Kassalanche</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2016&amp;diff=16749</id>
		<title>Алгоритмы и структуры данных 2016</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2016&amp;diff=16749"/>
		<updated>2015-06-10T00:20:38Z</updated>

		<summary type="html">&lt;p&gt;Kassalanche: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== О курсе ===&lt;br /&gt;
Лектор: Объедков Сергей Александрович&lt;br /&gt;
&lt;br /&gt;
== Лекции ==&lt;br /&gt;
[http://t-arxiv.appspot.com/ &#039;&#039;&#039;Конспект Ярослава Сергиенко.&#039;&#039;&#039;]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;13 января:&#039;&#039;&#039; Сортировка вставкой и слиянием. Использование инварианта цикла при доказательстве корректности сортировки вставкой.  Θ- и &#039;&#039;O&#039;&#039;-обозначения. Оценка сложности алгоритмов. Рекуррентные соотношения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;16 января:&#039;&#039;&#039; &#039;&#039;О&#039;&#039;-, &#039;&#039;o&#039;&#039;-, Ω-, ω-, Θ-обозначения. Быстрая сортировка, время работы в худшем, лучшем и среднем случаях. Оптимальность сортировки слиянием. Сортировка при помощи двоичного дерева поиска и ее связь с быстрой сортировкой.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;20 января:&#039;&#039;&#039; Примеры решения рекуррентных соотношений: решение с использованием дерева рекурсии и методом подстановки. Формулировка и интуитивное объяснение основной теоремы. [https://www.dropbox.com/s/6a0r410zjm9qwe7/algo-3-recurrences.pdf?dl=0 (Конспект.)]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;23 января:&#039;&#039;&#039; Выбор порядковой статистики за время &#039;&#039;O&#039;&#039;(&#039;&#039;n&#039;&#039;): [http://en.wikipedia.org/wiki/Quickselect рандомизированный] и [http://en.wikipedia.org/wiki/Median_of_medians детерминированный] алгоритмы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;27 января:&#039;&#039;&#039; Быстрое возведение в степень по модулю. Алгоритм Карацубы для умножения целых чисел. Алгоритм Штрассена для умножения матриц.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;30 января:&#039;&#039;&#039; [http://en.wikipedia.org/wiki/Closest_pair_of_points_problem#Planar_case Поиск ближайшей пары точек] за время &#039;&#039;O&#039;&#039;(&#039;&#039;n&#039;&#039;log &#039;&#039;n&#039;&#039;). Задача о планировании взвешенных интервалов: рекурсивное решение.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3 февраля:&#039;&#039;&#039; Динамическое программирование. Задача о планировании взвешенных интервалов: рекурсивное решение с мемоизацией и итеративное решение. Свойства задач, эффективно решаемых при помощи динамического программирования: наличие полиномиального числа подзадач, выразимость исходной задачи в терминах подзадач, сводимость больших подзадач к полиномиальному числу меньших подзадач. Выравнивание абзаца по ширине: рекурсивное решение с мемоизацией.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6 февраля:&#039;&#039;&#039; Лекция отменяется из-за болезни преподавателя, но будет компенсирована 11 апреля.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;10 февраля:&#039;&#039;&#039; [https://www.dropbox.com/s/1fa95j4om3kykh6/algo-alignment.pdf?dl=0 Вычисление редакционного расстояния и выравнивание последовательностей].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;12 февраля:&#039;&#039;&#039; Графы: обход в глубину и в ширину, поиск компонент связности в неориентированных графах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;17 февраля:&#039;&#039;&#039; Способы представления графов: матрица смежности и списки смежности. Оценка сложности алгоритмов поиска в ширину и глубину, поиска компонент связности в неориентированных графах. Связность в ориентированных графах, алгоритм проверки сильной связности ориентированного графа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;20 февраля:&#039;&#039;&#039; Топологическая сортировка. Вычисление компонент сильной связности в ориентированном графе.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;24 февраля:&#039;&#039;&#039; Поиск кратчайших путей во взвешенном графе: алгоритмы [http://en.wikipedia.org/wiki/Bellman–Ford_algorithm Беллмана – Форда] и [http://en.wikipedia.org/wiki/Floyd–Warshall_algorithm Флойда – Уоршелла].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;27 февраля:&#039;&#039;&#039; Выполнимость 2-КНФ и [http://en.wikipedia.org/wiki/2-satisfiability#Strongly_connected_components компоненты сильной связности]. Перемножение матриц, поиск пути через промежуточную точку и алгоритм Флойда – Уоршелла.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3 марта:&#039;&#039;&#039; Лекция переносится на 11 апреля.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6 марта:&#039;&#039;&#039; Жадные алгоритмы. Примеры: (1) выбор максимального подмножества непересекающихся интервалов; (2) разбиение множества интервалов на минимальное число подмножеств непересекающихся интервалов; (3) составление плана работ с заданными продолжительностями и крайними сроками выполнения, минимизирующего максимальную задержку. Различные методы доказательства корректности жадных алгоритмов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;10 марта:&#039;&#039;&#039; Алгоритм Дейкстры.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;13 марта:&#039;&#039;&#039; Структуры данных. Массив с операциями инициализации, чтения и  записи, выполняемыми за время O(1). Три подхода к амортизационному анализу: групповой анализ, банковский метод и метод потенциалов (на примере двоичного счетчика).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;17 марта:&#039;&#039;&#039; Реализация приоритетной очереди при помощи двоичной кучи.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;20 марта:&#039;&#039;&#039; Минимальные основные деревья. Алгоритмы Крускала, Прима и Reverse-Delete.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;31 марта:&#039;&#039;&#039; Система непересекающихся множеств.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3 апреля:&#039;&#039;&#039; Сжатие путей в системе непересекающихся множеств. Кластеризация и алгоритм Крускала.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;7 апреля:&#039;&#039;&#039; Жадный алгоритм на матроиде.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;10 апреля:&#039;&#039;&#039; Максимальный поток. Алгоритм Форда – Фалкерсона.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;11 апреля:&#039;&#039;&#039; Алгоритм Эдмондса – Карпа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;14 апреля:&#039;&#039;&#039; Двойственность задач о максимальном потоке и минимальном разрезе. Сведение задачи о максимальном паросочетании в двудольном графе к задаче о максимальном потоке.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;17 апреля:&#039;&#039;&#039; Задача о назначениях (поиск совершенного паросочетания с минимальным весом во взвешенном двудольном графе). Алгоритм, последовательно находящий самые дешевые увеличивающие пути.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;21 апреля:&#039;&#039;&#039; Рандомизированный алгоритм поиска минимального разреза (алгоритм Каргера). Простой рандомизированный алгоритм для вычисления означивания переменных, максимизирующего число истинных дизъюнктов в 3-КНФ: случайное означивание гарантирует истинность 7/8 всех дизъюнктов в среднем.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;24 апреля:&#039;&#039;&#039; Хеш-таблицы. Разрешение коллизий при помощи цепочек. Открытая адресация.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;28 апреля:&#039;&#039;&#039; Сбалансированные деревья поиска. Красно-черные деревья.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;12 мая:&#039;&#039;&#039; Самоорганизующиеся списки и конкурентный анализ онлайн-алгоритмов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;15 мая:&#039;&#039;&#039; Конечные автоматы. Регулярные языки. Эквивалентность детерминированных и недетерминированных автоматов. Замкнутость регулярных языков относительно регулярных операций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;19 мая:&#039;&#039;&#039; Регулярные выражения. Эквивалентность регулярных выражений и конечных автоматов. Нерегулярные языки. Лемма о накачке.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;22 мая:&#039;&#039;&#039; Доказательство леммы о накачке и ее использование для доказательства нерегулярности языков. Полиномиальные сведения. Задачи о вершинном покрытии графа, покрытии множества и независимом множестве.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;26 мая:&#039;&#039;&#039; Классы P и NP. Понятие NP-полной задачи. Теорема Кука – Левина, идея доказательства. Доказательство NP-полноты задачи о независимом множестве сведением к ней задачи о выполнимости 3-КНФ.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;29 мая:&#039;&#039;&#039; Приближенные алгоритмы. 2-аппроксимация минимального вершинного покрытия и кратчайшего циклического маршрута. Существование задач, для которых константная аппроксимация возможна, только если P = NP (максимальное независимое множество, максимальная клика). PTAS для задачи о рюкзаке.&lt;br /&gt;
&lt;br /&gt;
== Домашние задания ==&lt;br /&gt;
&lt;br /&gt;
=== Задание 1 ===&lt;br /&gt;
&lt;br /&gt;
Необходимо сдать все 6 задач в данном [https://official.contest.yandex.ru/contest/1002 контесте]. На выполнение задания даётся 2 недели (см. точное время окончания в контесте). Условия ревью определяют семинаристы.&lt;br /&gt;
&lt;br /&gt;
=== Задание 2 ===&lt;br /&gt;
&lt;br /&gt;
[https://official.contest.yandex.ru/contest/1085 Контест]. В домашнем задании пять задач, из которых нужно решить три, назначенные преподавателем, ведущим семинарские занятия в вашей группе. На выполнение задания даётся примерно 2 недели (см. точное время окончания в контесте). Условия ревью определяют семинаристы. [https://official.contest.yandex.ru/contest/1123 Дорешивание.]&lt;br /&gt;
&lt;br /&gt;
=== Задание 3 ===&lt;br /&gt;
&lt;br /&gt;
[https://official.contest.yandex.ru/contest/1196 Контест]. В домашнем задании пять задач. Они разделены на два варианта, помеченные римскими цифрами I и II. Свой вариант нужно узнать у семинариста. Третья задача — общая для двух вариантов; ее решение необходимо снабдить доказательством корректности алгоритма. На выполнение задания даётся примерно 2 недели (см. точное время окончания в контесте). Условия ревью определяют семинаристы.&lt;br /&gt;
&lt;br /&gt;
=== Задание 4 ===&lt;br /&gt;
&lt;br /&gt;
[https://official.contest.yandex.ru/contest/1259 Контест]. В домашнем задании четыре задачи. Обязательны первые три. Вместо одной из первых трёх можно сделать последнюю (только для первых 10 решивших 4-ую!). На выполнение задания даётся примерно 2 недели (см. точное время окончания в контесте). Условия ревью определяют семинаристы.&lt;br /&gt;
&lt;br /&gt;
=== Задание 5 ===&lt;br /&gt;
&lt;br /&gt;
[https://official.contest.yandex.ru/contest/1271 Контест]. На выполнение задания даётся примерно 2 недели (см. точное время окончания в контесте). Условия ревью определяют семинаристы. Также до 25 июня необходимо решить [https://www.dropbox.com/s/2mq9lr1950pnwio/algo-hw-5.pdf?dl=0 задачи] и прислать решение своему семинаристу и его учебному ассистенту.&lt;br /&gt;
&lt;br /&gt;
== Контрольная работа ==&lt;br /&gt;
Контрольная работа состоится 11 апреля в 13:40 – 15:00 в ауд. 622. [https://www.dropbox.com/s/uj2m9xdueq57y9o/sample.pdf?dl=0 Примеры задач] (и [https://www.dropbox.com/s/szdymvchx74b731/sample-solved.pdf?dl=0 решений])].&lt;br /&gt;
&lt;br /&gt;
== Контрольная работа на получение зачёта по программистской части экзамена ==&lt;br /&gt;
&#039;&#039;&#039;Что будет на контрольной?&#039;&#039;&#039;&lt;br /&gt;
# Будет одна задача на программирование.&lt;br /&gt;
# Задача будет или на написание известного (вам) алгоритма, или на небольшую модификацию.&lt;br /&gt;
&#039;&#039;&#039;Как будет проходить контрольная?&#039;&#039;&#039;&lt;br /&gt;
# Задача выдается в начале пары, её сразу же можно начать решать, а для тех, кто не знает нужный алгоритм, семинарист параллельно на доске рассказывает идею алгоритма.&lt;br /&gt;
# Запрещается использовать телефоны, планшеты и другие мобильные устройства.&lt;br /&gt;
# Можно писать на своём ноутбуке.&lt;br /&gt;
# На время пары, возможно, будет ограничен доступ к интернету, будeт доступен только Яндекс.Contest, cppreference.com, python.org&lt;br /&gt;
# Тесты будут открыты.&lt;br /&gt;
# Контест продлеваться НЕ будет.&lt;br /&gt;
&#039;&#039;&#039;Что будет, если я её напишу?&#039;&#039;&#039;&lt;br /&gt;
# Если решение получило OK в контесте, студент получает зачёт по программистской части, которая составляет 20% от оценки за экзамен. На экзамене будут даны другие задачи на программирование. В отличие от контрольной, алгоритм напоминаться НЕ будет, поэтому проще сдать задачу на контрольной.&lt;br /&gt;
&#039;&#039;&#039;Что будет, если я её не напишу?&#039;&#039;&#039;&lt;br /&gt;
# Вам придётся решать задачу на программирование на экзамене. Вы также сможете получить за неё максимальное число баллов (2).&lt;br /&gt;
&#039;&#039;&#039;Какие правила? Чем можно пользоваться?&#039;&#039;&#039;&lt;br /&gt;
# Работа индивидуальная.&lt;br /&gt;
# Нельзя пользоваться никакими ресурсами, в том числе книгами (электронными или нет), pdf-ками, презентациями, распечатками, конспектом, своим старым кодом (в том числе в Яндекс.Contest) и пр.&lt;br /&gt;
# Можно писать на своём ноутбуке.&lt;br /&gt;
# Можно открывать только следующие сайты: Яндекс.Contest, cppreference.com, python.org&lt;br /&gt;
# За первое нарушение указанных правил работа аннулируется.&lt;br /&gt;
# Если по какой-то причине вам необходимо воспользоваться почтой, телефоном,.. поднимите руку и спросите/предупредите семинариста.&lt;br /&gt;
&#039;&#039;&#039;Советы?&#039;&#039;&#039;&lt;br /&gt;
# Подготовьтесь к занятию, повторите все пройденные алгоритмы.&lt;br /&gt;
# Заранее выпишите свои логин-пароль от Яндекс.Контеста, возможно, мы отключим интернет и у вас не будет доступа к ресурсу, где они сохранены.&lt;br /&gt;
# Зайдите в класс пораньше, включите компьютер и залогиньтесь, чтобы не терять время во время контрольной.&lt;br /&gt;
&lt;br /&gt;
== Семинары ==&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппа 101-1|Подгруппа 101-1.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппа 101-2|Подгруппа 101-2.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппы 102-1, 102-2, 107-2|Подгруппа 102-1.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппы 102-1, 102-2, 107-2|Подгруппа 102-2.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппа 103-1|Подгруппа 103-1.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппа 105-1|Подгруппа 105-1.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппа 106-1|Подгруппа 106-1.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппа 106-2|Подгруппа 106-2.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппа 107-1|Подгруппа 107-1.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппы 102-1, 102-2, 107-2|Подгруппа 107-2.]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Рекомендуемая литература ==&lt;br /&gt;
# Кормен, Лейзерсон, Ривест, Штайн. Алгоритмы: построение и анализ ([https://vk.com/doc4262442_326131655?hash=9d6945b570241aa338&amp;amp;dl=681b57216bf37463e9 3-е изд.], [http://librarun.org/book/4121/1 2-е изд.], [http://e-maxx.ru/bookz/files/cormen.pdf  1-е изд.])&lt;br /&gt;
# [https://dl.dropboxusercontent.com/u/829163/draft.pdf Дасгупта, Пападимитриу, Вазирани. Алгоритмы] ([http://beust.com/algorithms.pdf оригинал] | [http://biblio.mccme.ru/node/5066/shop купить])&lt;br /&gt;
&lt;br /&gt;
== Полезные ссылки ==&lt;br /&gt;
# [[Reviewboard|Инструкция по использованию Review Board.]]&lt;/div&gt;</summary>
		<author><name>Kassalanche</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2016&amp;diff=16748</id>
		<title>Алгоритмы и структуры данных 2016</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2016&amp;diff=16748"/>
		<updated>2015-06-10T00:18:31Z</updated>

		<summary type="html">&lt;p&gt;Kassalanche: /* Контрольная работа на получение зачёта по программистской части экзамена */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== О курсе ===&lt;br /&gt;
Лектор: Объедков Сергей Александрович&lt;br /&gt;
&lt;br /&gt;
== Лекции ==&lt;br /&gt;
[http://t-arxiv.appspot.com/ &#039;&#039;&#039;Конспект Ярослава Сергиенко.&#039;&#039;&#039;]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;13 января:&#039;&#039;&#039; Сортировка вставкой и слиянием. Использование инварианта цикла при доказательстве корректности сортировки вставкой.  Θ- и &#039;&#039;O&#039;&#039;-обозначения. Оценка сложности алгоритмов. Рекуррентные соотношения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;16 января:&#039;&#039;&#039; &#039;&#039;О&#039;&#039;-, &#039;&#039;o&#039;&#039;-, Ω-, ω-, Θ-обозначения. Быстрая сортировка, время работы в худшем, лучшем и среднем случаях. Оптимальность сортировки слиянием. Сортировка при помощи двоичного дерева поиска и ее связь с быстрой сортировкой.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;20 января:&#039;&#039;&#039; Примеры решения рекуррентных соотношений: решение с использованием дерева рекурсии и методом подстановки. Формулировка и интуитивное объяснение основной теоремы. [https://www.dropbox.com/s/6a0r410zjm9qwe7/algo-3-recurrences.pdf?dl=0 (Конспект.)]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;23 января:&#039;&#039;&#039; Выбор порядковой статистики за время &#039;&#039;O&#039;&#039;(&#039;&#039;n&#039;&#039;): [http://en.wikipedia.org/wiki/Quickselect рандомизированный] и [http://en.wikipedia.org/wiki/Median_of_medians детерминированный] алгоритмы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;27 января:&#039;&#039;&#039; Быстрое возведение в степень по модулю. Алгоритм Карацубы для умножения целых чисел. Алгоритм Штрассена для умножения матриц.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;30 января:&#039;&#039;&#039; [http://en.wikipedia.org/wiki/Closest_pair_of_points_problem#Planar_case Поиск ближайшей пары точек] за время &#039;&#039;O&#039;&#039;(&#039;&#039;n&#039;&#039;log &#039;&#039;n&#039;&#039;). Задача о планировании взвешенных интервалов: рекурсивное решение.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3 февраля:&#039;&#039;&#039; Динамическое программирование. Задача о планировании взвешенных интервалов: рекурсивное решение с мемоизацией и итеративное решение. Свойства задач, эффективно решаемых при помощи динамического программирования: наличие полиномиального числа подзадач, выразимость исходной задачи в терминах подзадач, сводимость больших подзадач к полиномиальному числу меньших подзадач. Выравнивание абзаца по ширине: рекурсивное решение с мемоизацией.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6 февраля:&#039;&#039;&#039; Лекция отменяется из-за болезни преподавателя, но будет компенсирована 11 апреля.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;10 февраля:&#039;&#039;&#039; [https://www.dropbox.com/s/1fa95j4om3kykh6/algo-alignment.pdf?dl=0 Вычисление редакционного расстояния и выравнивание последовательностей].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;12 февраля:&#039;&#039;&#039; Графы: обход в глубину и в ширину, поиск компонент связности в неориентированных графах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;17 февраля:&#039;&#039;&#039; Способы представления графов: матрица смежности и списки смежности. Оценка сложности алгоритмов поиска в ширину и глубину, поиска компонент связности в неориентированных графах. Связность в ориентированных графах, алгоритм проверки сильной связности ориентированного графа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;20 февраля:&#039;&#039;&#039; Топологическая сортировка. Вычисление компонент сильной связности в ориентированном графе.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;24 февраля:&#039;&#039;&#039; Поиск кратчайших путей во взвешенном графе: алгоритмы [http://en.wikipedia.org/wiki/Bellman–Ford_algorithm Беллмана – Форда] и [http://en.wikipedia.org/wiki/Floyd–Warshall_algorithm Флойда – Уоршелла].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;27 февраля:&#039;&#039;&#039; Выполнимость 2-КНФ и [http://en.wikipedia.org/wiki/2-satisfiability#Strongly_connected_components компоненты сильной связности]. Перемножение матриц, поиск пути через промежуточную точку и алгоритм Флойда – Уоршелла.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3 марта:&#039;&#039;&#039; Лекция переносится на 11 апреля.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6 марта:&#039;&#039;&#039; Жадные алгоритмы. Примеры: (1) выбор максимального подмножества непересекающихся интервалов; (2) разбиение множества интервалов на минимальное число подмножеств непересекающихся интервалов; (3) составление плана работ с заданными продолжительностями и крайними сроками выполнения, минимизирующего максимальную задержку. Различные методы доказательства корректности жадных алгоритмов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;10 марта:&#039;&#039;&#039; Алгоритм Дейкстры.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;13 марта:&#039;&#039;&#039; Структуры данных. Массив с операциями инициализации, чтения и  записи, выполняемыми за время O(1). Три подхода к амортизационному анализу: групповой анализ, банковский метод и метод потенциалов (на примере двоичного счетчика).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;17 марта:&#039;&#039;&#039; Реализация приоритетной очереди при помощи двоичной кучи.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;20 марта:&#039;&#039;&#039; Минимальные основные деревья. Алгоритмы Крускала, Прима и Reverse-Delete.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;31 марта:&#039;&#039;&#039; Система непересекающихся множеств.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3 апреля:&#039;&#039;&#039; Сжатие путей в системе непересекающихся множеств. Кластеризация и алгоритм Крускала.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;7 апреля:&#039;&#039;&#039; Жадный алгоритм на матроиде.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;10 апреля:&#039;&#039;&#039; Максимальный поток. Алгоритм Форда – Фалкерсона.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;11 апреля:&#039;&#039;&#039; Алгоритм Эдмондса – Карпа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;14 апреля:&#039;&#039;&#039; Двойственность задач о максимальном потоке и минимальном разрезе. Сведение задачи о максимальном паросочетании в двудольном графе к задаче о максимальном потоке.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;17 апреля:&#039;&#039;&#039; Задача о назначениях (поиск совершенного паросочетания с минимальным весом во взвешенном двудольном графе). Алгоритм, последовательно находящий самые дешевые увеличивающие пути.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;21 апреля:&#039;&#039;&#039; Рандомизированный алгоритм поиска минимального разреза (алгоритм Каргера). Простой рандомизированный алгоритм для вычисления означивания переменных, максимизирующего число истинных дизъюнктов в 3-КНФ: случайное означивание гарантирует истинность 7/8 всех дизъюнктов в среднем.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;24 апреля:&#039;&#039;&#039; Хеш-таблицы. Разрешение коллизий при помощи цепочек. Открытая адресация.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;28 апреля:&#039;&#039;&#039; Сбалансированные деревья поиска. Красно-черные деревья.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;12 мая:&#039;&#039;&#039; Самоорганизующиеся списки и конкурентный анализ онлайн-алгоритмов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;15 мая:&#039;&#039;&#039; Конечные автоматы. Регулярные языки. Эквивалентность детерминированных и недетерминированных автоматов. Замкнутость регулярных языков относительно регулярных операций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;19 мая:&#039;&#039;&#039; Регулярные выражения. Эквивалентность регулярных выражений и конечных автоматов. Нерегулярные языки. Лемма о накачке.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;22 мая:&#039;&#039;&#039; Доказательство леммы о накачке и ее использование для доказательства нерегулярности языков. Полиномиальные сведения. Задачи о вершинном покрытии графа, покрытии множества и независимом множестве.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;26 мая:&#039;&#039;&#039; Классы P и NP. Понятие NP-полной задачи. Теорема Кука – Левина, идея доказательства. Доказательство NP-полноты задачи о независимом множестве сведением к ней задачи о выполнимости 3-КНФ.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;29 мая:&#039;&#039;&#039; Приближенные алгоритмы. 2-аппроксимация минимального вершинного покрытия и кратчайшего циклического маршрута. Существование задач, для которых константная аппроксимация возможна, только если P = NP (максимальное независимое множество, максимальная клика). PTAS для задачи о рюкзаке.&lt;br /&gt;
&lt;br /&gt;
== Домашние задания ==&lt;br /&gt;
&lt;br /&gt;
=== Задание 1 ===&lt;br /&gt;
&lt;br /&gt;
Необходимо сдать все 6 задач в данном [https://official.contest.yandex.ru/contest/1002 контесте]. На выполнение задания даётся 2 недели (см. точное время окончания в контесте). Условия ревью определяют семинаристы.&lt;br /&gt;
&lt;br /&gt;
=== Задание 2 ===&lt;br /&gt;
&lt;br /&gt;
[https://official.contest.yandex.ru/contest/1085 Контест]. В домашнем задании пять задач, из которых нужно решить три, назначенные преподавателем, ведущим семинарские занятия в вашей группе. На выполнение задания даётся примерно 2 недели (см. точное время окончания в контесте). Условия ревью определяют семинаристы. [https://official.contest.yandex.ru/contest/1123 Дорешивание.]&lt;br /&gt;
&lt;br /&gt;
=== Задание 3 ===&lt;br /&gt;
&lt;br /&gt;
[https://official.contest.yandex.ru/contest/1196 Контест]. В домашнем задании пять задач. Они разделены на два варианта, помеченные римскими цифрами I и II. Свой вариант нужно узнать у семинариста. Третья задача — общая для двух вариантов; ее решение необходимо снабдить доказательством корректности алгоритма. На выполнение задания даётся примерно 2 недели (см. точное время окончания в контесте). Условия ревью определяют семинаристы.&lt;br /&gt;
&lt;br /&gt;
=== Задание 4 ===&lt;br /&gt;
&lt;br /&gt;
[https://official.contest.yandex.ru/contest/1259 Контест]. В домашнем задании четыре задачи. Обязательны первые три. Вместо одной из первых трёх можно сделать последнюю (только для первых 10 решивших 4-ую!). На выполнение задания даётся примерно 2 недели (см. точное время окончания в контесте). Условия ревью определяют семинаристы.&lt;br /&gt;
&lt;br /&gt;
=== Задание 5 ===&lt;br /&gt;
&lt;br /&gt;
[https://official.contest.yandex.ru/contest/1271 Контест]. На выполнение задания даётся примерно 2 недели (см. точное время окончания в контесте). Условия ревью определяют семинаристы. Также до 25 июня необходимо решить [https://www.dropbox.com/s/2mq9lr1950pnwio/algo-hw-5.pdf?dl=0 задачи] и прислать решение своему семинаристу и его учебному ассистенту.&lt;br /&gt;
&lt;br /&gt;
== Контрольная работа ==&lt;br /&gt;
Контрольная работа состоится 11 апреля в 13:40 – 15:00 в ауд. 622. [https://www.dropbox.com/s/uj2m9xdueq57y9o/sample.pdf?dl=0 Примеры задач] (и [https://www.dropbox.com/s/szdymvchx74b731/sample-solved.pdf?dl=0 решений])].&lt;br /&gt;
&lt;br /&gt;
== Контрольная работа на получение зачёта по программистской части экзамена ==&lt;br /&gt;
&#039;&#039;&#039;Что будет на контрольной?&#039;&#039;&#039;&lt;br /&gt;
# Будет одна задача на программирование.&lt;br /&gt;
# Задача будет или на написание известного (вам) алгоритма, или на небольшую модификацию.&lt;br /&gt;
&#039;&#039;&#039;Как будет проходить контрольная?&#039;&#039;&#039;&lt;br /&gt;
# Задача выдается в начале пары, её сразу же можно начать решать, а для тех, кто не знает нужный алгоритм, семинарист параллельно на доске рассказывает идею алгоритма.&lt;br /&gt;
# На время пары, возможно, будет ограничен доступ к интернету, будeт доступен только Яндекс.Contest, cppreference.com, python.org&lt;br /&gt;
# Тесты будут открыты.&lt;br /&gt;
# Контест продлеваться НЕ будет.&lt;br /&gt;
&#039;&#039;&#039;Что будет, если я её напишу?&#039;&#039;&#039;&lt;br /&gt;
# Если решение получило OK в контесте, студент получает зачёт по программистской части, которая составляет 20% от оценки за экзамен. На экзамене будут даны другие задачи на программирование. В отличие от контрольной, алгоритм напоминаться НЕ будет, поэтому проще сдать задачу на контрольной.&lt;br /&gt;
&#039;&#039;&#039;Что будет, если я её не напишу?&#039;&#039;&#039;&lt;br /&gt;
# Вам придётся решать задачу на программирование на экзамене. Вы также сможете получить за неё максимальное число баллов (2).&lt;br /&gt;
&#039;&#039;&#039;Какие правила? Чем можно пользоваться?&#039;&#039;&#039;&lt;br /&gt;
# Работа индивидуальная.&lt;br /&gt;
# Нельзя пользоваться никакими ресурсами, в том числе книгами (электронными или нет), pdf-ками, презентациями, распечатками, конспектом, своим старым кодом (в том числе в Яндекс.Contest) и пр.&lt;br /&gt;
# Можно писать на своём ноутбуке.&lt;br /&gt;
# Можно открывать только следующие сайты: Яндекс.Contest, cppreference.com, python.org&lt;br /&gt;
# За первое нарушение указанных правил работа аннулируется.&lt;br /&gt;
# Если по какой-то причине вам необходимо воспользоваться почтой, телефоном,.. поднимите руку и спросите/предупредите семинариста.&lt;br /&gt;
&#039;&#039;&#039;Советы?&#039;&#039;&#039;&lt;br /&gt;
# Подготовьтесь к занятию, повторите все пройденные алгоритмы.&lt;br /&gt;
# Заранее выпишите свои логин-пароль от Яндекс.Контеста, возможно, мы отключим интернет и у вас не будет доступа к ресурсу, где они сохранены.&lt;br /&gt;
# Зайдите в класс пораньше, включите компьютер и залогиньтесь, чтобы не терять время во время контрольной.&lt;br /&gt;
&lt;br /&gt;
== Семинары ==&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппа 101-1|Подгруппа 101-1.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппа 101-2|Подгруппа 101-2.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппы 102-1, 102-2, 107-2|Подгруппа 102-1.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппы 102-1, 102-2, 107-2|Подгруппа 102-2.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппа 103-1|Подгруппа 103-1.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппа 105-1|Подгруппа 105-1.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппа 106-1|Подгруппа 106-1.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппа 106-2|Подгруппа 106-2.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппа 107-1|Подгруппа 107-1.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппы 102-1, 102-2, 107-2|Подгруппа 107-2.]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Рекомендуемая литература ==&lt;br /&gt;
# Кормен, Лейзерсон, Ривест, Штайн. Алгоритмы: построение и анализ ([https://vk.com/doc4262442_326131655?hash=9d6945b570241aa338&amp;amp;dl=681b57216bf37463e9 3-е изд.], [http://librarun.org/book/4121/1 2-е изд.], [http://e-maxx.ru/bookz/files/cormen.pdf  1-е изд.])&lt;br /&gt;
# [https://dl.dropboxusercontent.com/u/829163/draft.pdf Дасгупта, Пападимитриу, Вазирани. Алгоритмы] ([http://beust.com/algorithms.pdf оригинал] | [http://biblio.mccme.ru/node/5066/shop купить])&lt;br /&gt;
&lt;br /&gt;
== Полезные ссылки ==&lt;br /&gt;
# [[Reviewboard|Инструкция по использованию Review Board.]]&lt;/div&gt;</summary>
		<author><name>Kassalanche</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2016&amp;diff=16747</id>
		<title>Алгоритмы и структуры данных 2016</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2016&amp;diff=16747"/>
		<updated>2015-06-09T23:59:44Z</updated>

		<summary type="html">&lt;p&gt;Kassalanche: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== О курсе ===&lt;br /&gt;
Лектор: Объедков Сергей Александрович&lt;br /&gt;
&lt;br /&gt;
== Лекции ==&lt;br /&gt;
[http://t-arxiv.appspot.com/ &#039;&#039;&#039;Конспект Ярослава Сергиенко.&#039;&#039;&#039;]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;13 января:&#039;&#039;&#039; Сортировка вставкой и слиянием. Использование инварианта цикла при доказательстве корректности сортировки вставкой.  Θ- и &#039;&#039;O&#039;&#039;-обозначения. Оценка сложности алгоритмов. Рекуррентные соотношения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;16 января:&#039;&#039;&#039; &#039;&#039;О&#039;&#039;-, &#039;&#039;o&#039;&#039;-, Ω-, ω-, Θ-обозначения. Быстрая сортировка, время работы в худшем, лучшем и среднем случаях. Оптимальность сортировки слиянием. Сортировка при помощи двоичного дерева поиска и ее связь с быстрой сортировкой.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;20 января:&#039;&#039;&#039; Примеры решения рекуррентных соотношений: решение с использованием дерева рекурсии и методом подстановки. Формулировка и интуитивное объяснение основной теоремы. [https://www.dropbox.com/s/6a0r410zjm9qwe7/algo-3-recurrences.pdf?dl=0 (Конспект.)]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;23 января:&#039;&#039;&#039; Выбор порядковой статистики за время &#039;&#039;O&#039;&#039;(&#039;&#039;n&#039;&#039;): [http://en.wikipedia.org/wiki/Quickselect рандомизированный] и [http://en.wikipedia.org/wiki/Median_of_medians детерминированный] алгоритмы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;27 января:&#039;&#039;&#039; Быстрое возведение в степень по модулю. Алгоритм Карацубы для умножения целых чисел. Алгоритм Штрассена для умножения матриц.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;30 января:&#039;&#039;&#039; [http://en.wikipedia.org/wiki/Closest_pair_of_points_problem#Planar_case Поиск ближайшей пары точек] за время &#039;&#039;O&#039;&#039;(&#039;&#039;n&#039;&#039;log &#039;&#039;n&#039;&#039;). Задача о планировании взвешенных интервалов: рекурсивное решение.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3 февраля:&#039;&#039;&#039; Динамическое программирование. Задача о планировании взвешенных интервалов: рекурсивное решение с мемоизацией и итеративное решение. Свойства задач, эффективно решаемых при помощи динамического программирования: наличие полиномиального числа подзадач, выразимость исходной задачи в терминах подзадач, сводимость больших подзадач к полиномиальному числу меньших подзадач. Выравнивание абзаца по ширине: рекурсивное решение с мемоизацией.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6 февраля:&#039;&#039;&#039; Лекция отменяется из-за болезни преподавателя, но будет компенсирована 11 апреля.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;10 февраля:&#039;&#039;&#039; [https://www.dropbox.com/s/1fa95j4om3kykh6/algo-alignment.pdf?dl=0 Вычисление редакционного расстояния и выравнивание последовательностей].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;12 февраля:&#039;&#039;&#039; Графы: обход в глубину и в ширину, поиск компонент связности в неориентированных графах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;17 февраля:&#039;&#039;&#039; Способы представления графов: матрица смежности и списки смежности. Оценка сложности алгоритмов поиска в ширину и глубину, поиска компонент связности в неориентированных графах. Связность в ориентированных графах, алгоритм проверки сильной связности ориентированного графа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;20 февраля:&#039;&#039;&#039; Топологическая сортировка. Вычисление компонент сильной связности в ориентированном графе.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;24 февраля:&#039;&#039;&#039; Поиск кратчайших путей во взвешенном графе: алгоритмы [http://en.wikipedia.org/wiki/Bellman–Ford_algorithm Беллмана – Форда] и [http://en.wikipedia.org/wiki/Floyd–Warshall_algorithm Флойда – Уоршелла].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;27 февраля:&#039;&#039;&#039; Выполнимость 2-КНФ и [http://en.wikipedia.org/wiki/2-satisfiability#Strongly_connected_components компоненты сильной связности]. Перемножение матриц, поиск пути через промежуточную точку и алгоритм Флойда – Уоршелла.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3 марта:&#039;&#039;&#039; Лекция переносится на 11 апреля.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6 марта:&#039;&#039;&#039; Жадные алгоритмы. Примеры: (1) выбор максимального подмножества непересекающихся интервалов; (2) разбиение множества интервалов на минимальное число подмножеств непересекающихся интервалов; (3) составление плана работ с заданными продолжительностями и крайними сроками выполнения, минимизирующего максимальную задержку. Различные методы доказательства корректности жадных алгоритмов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;10 марта:&#039;&#039;&#039; Алгоритм Дейкстры.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;13 марта:&#039;&#039;&#039; Структуры данных. Массив с операциями инициализации, чтения и  записи, выполняемыми за время O(1). Три подхода к амортизационному анализу: групповой анализ, банковский метод и метод потенциалов (на примере двоичного счетчика).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;17 марта:&#039;&#039;&#039; Реализация приоритетной очереди при помощи двоичной кучи.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;20 марта:&#039;&#039;&#039; Минимальные основные деревья. Алгоритмы Крускала, Прима и Reverse-Delete.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;31 марта:&#039;&#039;&#039; Система непересекающихся множеств.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3 апреля:&#039;&#039;&#039; Сжатие путей в системе непересекающихся множеств. Кластеризация и алгоритм Крускала.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;7 апреля:&#039;&#039;&#039; Жадный алгоритм на матроиде.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;10 апреля:&#039;&#039;&#039; Максимальный поток. Алгоритм Форда – Фалкерсона.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;11 апреля:&#039;&#039;&#039; Алгоритм Эдмондса – Карпа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;14 апреля:&#039;&#039;&#039; Двойственность задач о максимальном потоке и минимальном разрезе. Сведение задачи о максимальном паросочетании в двудольном графе к задаче о максимальном потоке.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;17 апреля:&#039;&#039;&#039; Задача о назначениях (поиск совершенного паросочетания с минимальным весом во взвешенном двудольном графе). Алгоритм, последовательно находящий самые дешевые увеличивающие пути.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;21 апреля:&#039;&#039;&#039; Рандомизированный алгоритм поиска минимального разреза (алгоритм Каргера). Простой рандомизированный алгоритм для вычисления означивания переменных, максимизирующего число истинных дизъюнктов в 3-КНФ: случайное означивание гарантирует истинность 7/8 всех дизъюнктов в среднем.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;24 апреля:&#039;&#039;&#039; Хеш-таблицы. Разрешение коллизий при помощи цепочек. Открытая адресация.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;28 апреля:&#039;&#039;&#039; Сбалансированные деревья поиска. Красно-черные деревья.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;12 мая:&#039;&#039;&#039; Самоорганизующиеся списки и конкурентный анализ онлайн-алгоритмов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;15 мая:&#039;&#039;&#039; Конечные автоматы. Регулярные языки. Эквивалентность детерминированных и недетерминированных автоматов. Замкнутость регулярных языков относительно регулярных операций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;19 мая:&#039;&#039;&#039; Регулярные выражения. Эквивалентность регулярных выражений и конечных автоматов. Нерегулярные языки. Лемма о накачке.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;22 мая:&#039;&#039;&#039; Доказательство леммы о накачке и ее использование для доказательства нерегулярности языков. Полиномиальные сведения. Задачи о вершинном покрытии графа, покрытии множества и независимом множестве.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;26 мая:&#039;&#039;&#039; Классы P и NP. Понятие NP-полной задачи. Теорема Кука – Левина, идея доказательства. Доказательство NP-полноты задачи о независимом множестве сведением к ней задачи о выполнимости 3-КНФ.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;29 мая:&#039;&#039;&#039; Приближенные алгоритмы. 2-аппроксимация минимального вершинного покрытия и кратчайшего циклического маршрута. Существование задач, для которых константная аппроксимация возможна, только если P = NP (максимальное независимое множество, максимальная клика). PTAS для задачи о рюкзаке.&lt;br /&gt;
&lt;br /&gt;
== Домашние задания ==&lt;br /&gt;
&lt;br /&gt;
=== Задание 1 ===&lt;br /&gt;
&lt;br /&gt;
Необходимо сдать все 6 задач в данном [https://official.contest.yandex.ru/contest/1002 контесте]. На выполнение задания даётся 2 недели (см. точное время окончания в контесте). Условия ревью определяют семинаристы.&lt;br /&gt;
&lt;br /&gt;
=== Задание 2 ===&lt;br /&gt;
&lt;br /&gt;
[https://official.contest.yandex.ru/contest/1085 Контест]. В домашнем задании пять задач, из которых нужно решить три, назначенные преподавателем, ведущим семинарские занятия в вашей группе. На выполнение задания даётся примерно 2 недели (см. точное время окончания в контесте). Условия ревью определяют семинаристы. [https://official.contest.yandex.ru/contest/1123 Дорешивание.]&lt;br /&gt;
&lt;br /&gt;
=== Задание 3 ===&lt;br /&gt;
&lt;br /&gt;
[https://official.contest.yandex.ru/contest/1196 Контест]. В домашнем задании пять задач. Они разделены на два варианта, помеченные римскими цифрами I и II. Свой вариант нужно узнать у семинариста. Третья задача — общая для двух вариантов; ее решение необходимо снабдить доказательством корректности алгоритма. На выполнение задания даётся примерно 2 недели (см. точное время окончания в контесте). Условия ревью определяют семинаристы.&lt;br /&gt;
&lt;br /&gt;
=== Задание 4 ===&lt;br /&gt;
&lt;br /&gt;
[https://official.contest.yandex.ru/contest/1259 Контест]. В домашнем задании четыре задачи. Обязательны первые три. Вместо одной из первых трёх можно сделать последнюю (только для первых 10 решивших 4-ую!). На выполнение задания даётся примерно 2 недели (см. точное время окончания в контесте). Условия ревью определяют семинаристы.&lt;br /&gt;
&lt;br /&gt;
=== Задание 5 ===&lt;br /&gt;
&lt;br /&gt;
[https://official.contest.yandex.ru/contest/1271 Контест]. На выполнение задания даётся примерно 2 недели (см. точное время окончания в контесте). Условия ревью определяют семинаристы. Также до 25 июня необходимо решить [https://www.dropbox.com/s/2mq9lr1950pnwio/algo-hw-5.pdf?dl=0 задачи] и прислать решение своему семинаристу и его учебному ассистенту.&lt;br /&gt;
&lt;br /&gt;
== Контрольная работа ==&lt;br /&gt;
Контрольная работа состоится 11 апреля в 13:40 – 15:00 в ауд. 622. [https://www.dropbox.com/s/uj2m9xdueq57y9o/sample.pdf?dl=0 Примеры задач] (и [https://www.dropbox.com/s/szdymvchx74b731/sample-solved.pdf?dl=0 решений])].&lt;br /&gt;
&lt;br /&gt;
== Контрольная работа на получение зачёта по программистской части экзамена ==&lt;br /&gt;
&#039;&#039;&#039;Что будет на контрольной?&#039;&#039;&#039;&lt;br /&gt;
# Будет одна задача на программирование.&lt;br /&gt;
# Задача будет или на написание известного (вам) алгоритма, или на небольшую модификацию.&lt;br /&gt;
&#039;&#039;&#039;Как будет проходить контрольная?&#039;&#039;&#039;&lt;br /&gt;
# Задача выдается в начале пары, её сразу же можно начать решать, а для тех, кто не знает нужный алгоритм, семинарист параллельно на доске рассказывает идею алгоритма.&lt;br /&gt;
# На время пары, возможно, будет ограничен доступ к интернету, будeт доступен только Яндекс.Contest, cppreference.com, python.org&lt;br /&gt;
# Тесты будут открыты.&lt;br /&gt;
# Контест продлеваться НЕ будет.&lt;br /&gt;
&#039;&#039;&#039;Что будет, если я её напишу?&#039;&#039;&#039;&lt;br /&gt;
# Если решение получило OK в контесте, студент получает зачет по программистской части экзамена и 2 балла (из двух) за неё. На экзамене будут даны другие задачи на программирование. В отличие от контрольной, алгоритм напоминаться НЕ будет, поэтому проще сдать задачу на контрольной.&lt;br /&gt;
&#039;&#039;&#039;Что будет, если я её не напишу?&#039;&#039;&#039;&lt;br /&gt;
# Вам придётся решать задачу на программирование на экзамене. Вы также сможете получить за неё максимальное число баллов (2).&lt;br /&gt;
&#039;&#039;&#039;Какие правила? Чем можно пользоваться?&#039;&#039;&#039;&lt;br /&gt;
# Работа индивидуальная.&lt;br /&gt;
# Нельзя пользоваться никакими электронными ресурсами, в том числе электронными книгами, pdf-ками, презентациями, своим старым кодом (в том числе в Яндекс.Contest) и пр.&lt;br /&gt;
# Можно писать на своём ноутбуке.&lt;br /&gt;
# Можно открывать только следующие сайты: Яндекс.Contest, cppreference.com, python.org&lt;br /&gt;
# Можно пользоваться любыми неэлектронными материалами (книги, конспекты, распечатки,..).&lt;br /&gt;
# За первое нарушение указанных правил работа аннулируется.&lt;br /&gt;
# Если по какой-то причине вам необходимо воспользоваться почтой, телефоном,.. поднимите руку и спросите/предупредите семинариста.&lt;br /&gt;
&#039;&#039;&#039;Советы?&#039;&#039;&#039;&lt;br /&gt;
# Подготовьтесь к занятию, повторите пройденные алгоритмы.&lt;br /&gt;
# Заранее выпишите свои логин-пароль от Яндекс.Контеста.&lt;br /&gt;
# Зайдите в класс пораньше, включите компьютер и залогиньтесь, чтобы не терять время во время контрольной.&lt;br /&gt;
&lt;br /&gt;
== Семинары ==&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппа 101-1|Подгруппа 101-1.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппа 101-2|Подгруппа 101-2.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппы 102-1, 102-2, 107-2|Подгруппа 102-1.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппы 102-1, 102-2, 107-2|Подгруппа 102-2.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппа 103-1|Подгруппа 103-1.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппа 105-1|Подгруппа 105-1.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппа 106-1|Подгруппа 106-1.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппа 106-2|Подгруппа 106-2.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппа 107-1|Подгруппа 107-1.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппы 102-1, 102-2, 107-2|Подгруппа 107-2.]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Рекомендуемая литература ==&lt;br /&gt;
# Кормен, Лейзерсон, Ривест, Штайн. Алгоритмы: построение и анализ ([https://vk.com/doc4262442_326131655?hash=9d6945b570241aa338&amp;amp;dl=681b57216bf37463e9 3-е изд.], [http://librarun.org/book/4121/1 2-е изд.], [http://e-maxx.ru/bookz/files/cormen.pdf  1-е изд.])&lt;br /&gt;
# [https://dl.dropboxusercontent.com/u/829163/draft.pdf Дасгупта, Пападимитриу, Вазирани. Алгоритмы] ([http://beust.com/algorithms.pdf оригинал] | [http://biblio.mccme.ru/node/5066/shop купить])&lt;br /&gt;
&lt;br /&gt;
== Полезные ссылки ==&lt;br /&gt;
# [[Reviewboard|Инструкция по использованию Review Board.]]&lt;/div&gt;</summary>
		<author><name>Kassalanche</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2016&amp;diff=16746</id>
		<title>Алгоритмы и структуры данных 2016</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2016&amp;diff=16746"/>
		<updated>2015-06-09T23:59:18Z</updated>

		<summary type="html">&lt;p&gt;Kassalanche: /* Контрольная работа */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== О курсе ===&lt;br /&gt;
Лектор: Объедков Сергей Александрович&lt;br /&gt;
&lt;br /&gt;
== Лекции ==&lt;br /&gt;
[http://t-arxiv.appspot.com/ &#039;&#039;&#039;Конспект Ярослава Сергиенко.&#039;&#039;&#039;]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;13 января:&#039;&#039;&#039; Сортировка вставкой и слиянием. Использование инварианта цикла при доказательстве корректности сортировки вставкой.  Θ- и &#039;&#039;O&#039;&#039;-обозначения. Оценка сложности алгоритмов. Рекуррентные соотношения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;16 января:&#039;&#039;&#039; &#039;&#039;О&#039;&#039;-, &#039;&#039;o&#039;&#039;-, Ω-, ω-, Θ-обозначения. Быстрая сортировка, время работы в худшем, лучшем и среднем случаях. Оптимальность сортировки слиянием. Сортировка при помощи двоичного дерева поиска и ее связь с быстрой сортировкой.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;20 января:&#039;&#039;&#039; Примеры решения рекуррентных соотношений: решение с использованием дерева рекурсии и методом подстановки. Формулировка и интуитивное объяснение основной теоремы. [https://www.dropbox.com/s/6a0r410zjm9qwe7/algo-3-recurrences.pdf?dl=0 (Конспект.)]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;23 января:&#039;&#039;&#039; Выбор порядковой статистики за время &#039;&#039;O&#039;&#039;(&#039;&#039;n&#039;&#039;): [http://en.wikipedia.org/wiki/Quickselect рандомизированный] и [http://en.wikipedia.org/wiki/Median_of_medians детерминированный] алгоритмы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;27 января:&#039;&#039;&#039; Быстрое возведение в степень по модулю. Алгоритм Карацубы для умножения целых чисел. Алгоритм Штрассена для умножения матриц.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;30 января:&#039;&#039;&#039; [http://en.wikipedia.org/wiki/Closest_pair_of_points_problem#Planar_case Поиск ближайшей пары точек] за время &#039;&#039;O&#039;&#039;(&#039;&#039;n&#039;&#039;log &#039;&#039;n&#039;&#039;). Задача о планировании взвешенных интервалов: рекурсивное решение.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3 февраля:&#039;&#039;&#039; Динамическое программирование. Задача о планировании взвешенных интервалов: рекурсивное решение с мемоизацией и итеративное решение. Свойства задач, эффективно решаемых при помощи динамического программирования: наличие полиномиального числа подзадач, выразимость исходной задачи в терминах подзадач, сводимость больших подзадач к полиномиальному числу меньших подзадач. Выравнивание абзаца по ширине: рекурсивное решение с мемоизацией.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6 февраля:&#039;&#039;&#039; Лекция отменяется из-за болезни преподавателя, но будет компенсирована 11 апреля.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;10 февраля:&#039;&#039;&#039; [https://www.dropbox.com/s/1fa95j4om3kykh6/algo-alignment.pdf?dl=0 Вычисление редакционного расстояния и выравнивание последовательностей].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;12 февраля:&#039;&#039;&#039; Графы: обход в глубину и в ширину, поиск компонент связности в неориентированных графах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;17 февраля:&#039;&#039;&#039; Способы представления графов: матрица смежности и списки смежности. Оценка сложности алгоритмов поиска в ширину и глубину, поиска компонент связности в неориентированных графах. Связность в ориентированных графах, алгоритм проверки сильной связности ориентированного графа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;20 февраля:&#039;&#039;&#039; Топологическая сортировка. Вычисление компонент сильной связности в ориентированном графе.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;24 февраля:&#039;&#039;&#039; Поиск кратчайших путей во взвешенном графе: алгоритмы [http://en.wikipedia.org/wiki/Bellman–Ford_algorithm Беллмана – Форда] и [http://en.wikipedia.org/wiki/Floyd–Warshall_algorithm Флойда – Уоршелла].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;27 февраля:&#039;&#039;&#039; Выполнимость 2-КНФ и [http://en.wikipedia.org/wiki/2-satisfiability#Strongly_connected_components компоненты сильной связности]. Перемножение матриц, поиск пути через промежуточную точку и алгоритм Флойда – Уоршелла.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3 марта:&#039;&#039;&#039; Лекция переносится на 11 апреля.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6 марта:&#039;&#039;&#039; Жадные алгоритмы. Примеры: (1) выбор максимального подмножества непересекающихся интервалов; (2) разбиение множества интервалов на минимальное число подмножеств непересекающихся интервалов; (3) составление плана работ с заданными продолжительностями и крайними сроками выполнения, минимизирующего максимальную задержку. Различные методы доказательства корректности жадных алгоритмов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;10 марта:&#039;&#039;&#039; Алгоритм Дейкстры.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;13 марта:&#039;&#039;&#039; Структуры данных. Массив с операциями инициализации, чтения и  записи, выполняемыми за время O(1). Три подхода к амортизационному анализу: групповой анализ, банковский метод и метод потенциалов (на примере двоичного счетчика).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;17 марта:&#039;&#039;&#039; Реализация приоритетной очереди при помощи двоичной кучи.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;20 марта:&#039;&#039;&#039; Минимальные основные деревья. Алгоритмы Крускала, Прима и Reverse-Delete.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;31 марта:&#039;&#039;&#039; Система непересекающихся множеств.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3 апреля:&#039;&#039;&#039; Сжатие путей в системе непересекающихся множеств. Кластеризация и алгоритм Крускала.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;7 апреля:&#039;&#039;&#039; Жадный алгоритм на матроиде.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;10 апреля:&#039;&#039;&#039; Максимальный поток. Алгоритм Форда – Фалкерсона.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;11 апреля:&#039;&#039;&#039; Алгоритм Эдмондса – Карпа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;14 апреля:&#039;&#039;&#039; Двойственность задач о максимальном потоке и минимальном разрезе. Сведение задачи о максимальном паросочетании в двудольном графе к задаче о максимальном потоке.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;17 апреля:&#039;&#039;&#039; Задача о назначениях (поиск совершенного паросочетания с минимальным весом во взвешенном двудольном графе). Алгоритм, последовательно находящий самые дешевые увеличивающие пути.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;21 апреля:&#039;&#039;&#039; Рандомизированный алгоритм поиска минимального разреза (алгоритм Каргера). Простой рандомизированный алгоритм для вычисления означивания переменных, максимизирующего число истинных дизъюнктов в 3-КНФ: случайное означивание гарантирует истинность 7/8 всех дизъюнктов в среднем.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;24 апреля:&#039;&#039;&#039; Хеш-таблицы. Разрешение коллизий при помощи цепочек. Открытая адресация.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;28 апреля:&#039;&#039;&#039; Сбалансированные деревья поиска. Красно-черные деревья.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;12 мая:&#039;&#039;&#039; Самоорганизующиеся списки и конкурентный анализ онлайн-алгоритмов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;15 мая:&#039;&#039;&#039; Конечные автоматы. Регулярные языки. Эквивалентность детерминированных и недетерминированных автоматов. Замкнутость регулярных языков относительно регулярных операций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;19 мая:&#039;&#039;&#039; Регулярные выражения. Эквивалентность регулярных выражений и конечных автоматов. Нерегулярные языки. Лемма о накачке.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;22 мая:&#039;&#039;&#039; Доказательство леммы о накачке и ее использование для доказательства нерегулярности языков. Полиномиальные сведения. Задачи о вершинном покрытии графа, покрытии множества и независимом множестве.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;26 мая:&#039;&#039;&#039; Классы P и NP. Понятие NP-полной задачи. Теорема Кука – Левина, идея доказательства. Доказательство NP-полноты задачи о независимом множестве сведением к ней задачи о выполнимости 3-КНФ.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;29 мая:&#039;&#039;&#039; Приближенные алгоритмы. 2-аппроксимация минимального вершинного покрытия и кратчайшего циклического маршрута. Существование задач, для которых константная аппроксимация возможна, только если P = NP (максимальное независимое множество, максимальная клика). PTAS для задачи о рюкзаке.&lt;br /&gt;
&lt;br /&gt;
== Домашние задания ==&lt;br /&gt;
&lt;br /&gt;
=== Задание 1 ===&lt;br /&gt;
&lt;br /&gt;
Необходимо сдать все 6 задач в данном [https://official.contest.yandex.ru/contest/1002 контесте]. На выполнение задания даётся 2 недели (см. точное время окончания в контесте). Условия ревью определяют семинаристы.&lt;br /&gt;
&lt;br /&gt;
=== Задание 2 ===&lt;br /&gt;
&lt;br /&gt;
[https://official.contest.yandex.ru/contest/1085 Контест]. В домашнем задании пять задач, из которых нужно решить три, назначенные преподавателем, ведущим семинарские занятия в вашей группе. На выполнение задания даётся примерно 2 недели (см. точное время окончания в контесте). Условия ревью определяют семинаристы. [https://official.contest.yandex.ru/contest/1123 Дорешивание.]&lt;br /&gt;
&lt;br /&gt;
=== Задание 3 ===&lt;br /&gt;
&lt;br /&gt;
[https://official.contest.yandex.ru/contest/1196 Контест]. В домашнем задании пять задач. Они разделены на два варианта, помеченные римскими цифрами I и II. Свой вариант нужно узнать у семинариста. Третья задача — общая для двух вариантов; ее решение необходимо снабдить доказательством корректности алгоритма. На выполнение задания даётся примерно 2 недели (см. точное время окончания в контесте). Условия ревью определяют семинаристы.&lt;br /&gt;
&lt;br /&gt;
=== Задание 4 ===&lt;br /&gt;
&lt;br /&gt;
[https://official.contest.yandex.ru/contest/1259 Контест]. В домашнем задании четыре задачи. Обязательны первые три. Вместо одной из первых трёх можно сделать последнюю (только для первых 10 решивших 4-ую!). На выполнение задания даётся примерно 2 недели (см. точное время окончания в контесте). Условия ревью определяют семинаристы.&lt;br /&gt;
&lt;br /&gt;
=== Задание 5 ===&lt;br /&gt;
&lt;br /&gt;
[https://official.contest.yandex.ru/contest/1271 Контест]. На выполнение задания даётся примерно 2 недели (см. точное время окончания в контесте). Условия ревью определяют семинаристы. Также до 25 июня необходимо решить [https://www.dropbox.com/s/2mq9lr1950pnwio/algo-hw-5.pdf?dl=0 задачи] и прислать решение своему семинаристу и его учебному ассистенту.&lt;br /&gt;
&lt;br /&gt;
== Контрольная работа ==&lt;br /&gt;
Контрольная работа состоится 11 апреля в 13:40 – 15:00 в ауд. 622. [https://www.dropbox.com/s/uj2m9xdueq57y9o/sample.pdf?dl=0 Примеры задач] (и [https://www.dropbox.com/s/szdymvchx74b731/sample-solved.pdf?dl=0 решений])].&lt;br /&gt;
&lt;br /&gt;
== Контрольная работа на получение зачёта по программистской части экзамена ==&lt;br /&gt;
&#039;&#039;&#039;Что будет на контрольной?&#039;&#039;&#039;&lt;br /&gt;
# Будет одна задача на программирование.&lt;br /&gt;
# Задача будет или на написание известного (вам) алгоритма, или на небольшую модификацию.&lt;br /&gt;
&#039;&#039;&#039;Как будет проходить контрольная?&#039;&#039;&#039;&lt;br /&gt;
# Задача выдается в начале пары, её сразу же можно начать решать, а для тех, кто не знает нужный алгоритм, семинарист параллельно на доске рассказывает идею алгоритма.&lt;br /&gt;
# На время пары, возможно, будет ограничен доступ к интернету, будeт доступен только Яндекс.Contest, cppreference.com, python.org&lt;br /&gt;
# Тесты будут открыты.&lt;br /&gt;
Контест продливаться НЕ будет.&lt;br /&gt;
&#039;&#039;&#039;Что будет, если я её напишу?&#039;&#039;&#039;&lt;br /&gt;
# Если решение получило OK в контесте, студент получает зачет по программистской части экзамена и 2 балла (из двух) за неё. На экзамене будут даны другие задачи на программирование. В отличие от контрольной, алгоритм напоминаться НЕ будет, поэтому проще сдать задачу на контрольной.&lt;br /&gt;
&#039;&#039;&#039;Что будет, если я её не напишу?&#039;&#039;&#039;&lt;br /&gt;
# Вам придётся решать задачу на программирование на экзамене. Вы также сможете получить за неё максимальное число баллов (2).&lt;br /&gt;
&#039;&#039;&#039;Какие правила? Чем можно пользоваться?&#039;&#039;&#039;&lt;br /&gt;
# Работа индивидуальная.&lt;br /&gt;
# Нельзя пользоваться никакими электронными ресурсами, в том числе электронными книгами, pdf-ками, презентациями, своим старым кодом (в том числе в Яндекс.Contest) и пр.&lt;br /&gt;
# Можно писать на своём ноутбуке.&lt;br /&gt;
# Можно открывать только следующие сайты: Яндекс.Contest, cppreference.com, python.org&lt;br /&gt;
# Можно пользоваться любыми неэлектронными материалами (книги, конспекты, распечатки,..).&lt;br /&gt;
# За первое нарушение указанных правил работа аннулируется.&lt;br /&gt;
# Если по какой-то причине вам необходимо воспользоваться почтой, телефоном,.. поднимите руку и спросите/предупредите семинариста.&lt;br /&gt;
&#039;&#039;&#039;Советы?&#039;&#039;&#039;&lt;br /&gt;
# Подготовьтесь к занятию, повторите пройденные алгоритмы.&lt;br /&gt;
# Заранее выпишите свои логин-пароль от Яндекс.Контеста.&lt;br /&gt;
# Зайдите в класс пораньше, включите компьютер и залогиньтесь, чтобы не терять время во время контрольной.&lt;br /&gt;
&lt;br /&gt;
== Семинары ==&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппа 101-1|Подгруппа 101-1.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппа 101-2|Подгруппа 101-2.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппы 102-1, 102-2, 107-2|Подгруппа 102-1.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппы 102-1, 102-2, 107-2|Подгруппа 102-2.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппа 103-1|Подгруппа 103-1.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппа 105-1|Подгруппа 105-1.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппа 106-1|Подгруппа 106-1.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппа 106-2|Подгруппа 106-2.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппа 107-1|Подгруппа 107-1.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппы 102-1, 102-2, 107-2|Подгруппа 107-2.]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Рекомендуемая литература ==&lt;br /&gt;
# Кормен, Лейзерсон, Ривест, Штайн. Алгоритмы: построение и анализ ([https://vk.com/doc4262442_326131655?hash=9d6945b570241aa338&amp;amp;dl=681b57216bf37463e9 3-е изд.], [http://librarun.org/book/4121/1 2-е изд.], [http://e-maxx.ru/bookz/files/cormen.pdf  1-е изд.])&lt;br /&gt;
# [https://dl.dropboxusercontent.com/u/829163/draft.pdf Дасгупта, Пападимитриу, Вазирани. Алгоритмы] ([http://beust.com/algorithms.pdf оригинал] | [http://biblio.mccme.ru/node/5066/shop купить])&lt;br /&gt;
&lt;br /&gt;
== Полезные ссылки ==&lt;br /&gt;
# [[Reviewboard|Инструкция по использованию Review Board.]]&lt;/div&gt;</summary>
		<author><name>Kassalanche</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=16699</id>
		<title>Алгоритмы и структуры данных. Подгруппа 105-1</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=16699"/>
		<updated>2015-06-01T06:44:17Z</updated>

		<summary type="html">&lt;p&gt;Kassalanche: /* Задание 22 (до 8.06) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==О курсе==&lt;br /&gt;
[[Алгоритмы_и_структуры_данных|План лекций и список рекомендуемой литературы.]]&lt;br /&gt;
&lt;br /&gt;
[[Алгоритмы_и_структуры_данных._Подгруппа_105-1._FAQ|FAQ.]]&lt;br /&gt;
&lt;br /&gt;
[[Reviewboard|Инструкция по использованию Reviewboard.]]&lt;br /&gt;
&lt;br /&gt;
[[Практические_занятия_по_курсу_ОиМП/C++_check|Style guide.]]&lt;br /&gt;
&lt;br /&gt;
==Итоговая оценка за курс==&lt;br /&gt;
Итоговая оценка (ИО) зависит от&lt;br /&gt;
* оценок за пять больших домашних заданий (БДЗ1, БДЗ2, ..., БДЗ5),&lt;br /&gt;
* оценок за домашние задания (ДЗ1, ДЗ2, ...),&lt;br /&gt;
* оценки за контрольную работу (КР),&lt;br /&gt;
* оценки за экзамен (ЭКЗ),&lt;br /&gt;
и может быть вычислена по формуле:&lt;br /&gt;
 ИО = 0.7 * (0.3 * КР + 0.7 *(ИДЗ1 + ИДЗ2 + ИДЗ3 + ИДЗ4 + ИДЗ5)/5) + 0.3 * ЭКЗ =&lt;br /&gt;
    = 0.21*КР + 0.098*ИДЗ1 + 0.098*ИДЗ2 + 0.098*ИДЗ3 + 0.098*ИДЗ4 + 0.098*ИДЗ5 + 0.3*ЭКЗ,&lt;br /&gt;
где&lt;br /&gt;
 ИДЗi = min (10, 0.7 * БДЗi + 0.4 * &amp;lt;cредняя оценка за ДЗj, прошедшие с предыдущего БДЗ по i-ое&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
==Порядок сдачи домашних работ==&lt;br /&gt;
===Большие домашние работы===&lt;br /&gt;
# Получить OK за задачу в контесте.&lt;br /&gt;
# Залить исходный код на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* На каждую задачу создавайте отдельный запрос на ревью. &lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении суток приходят замечания к коду. &#039;&#039;&#039;Если в течении суток замечаний или Ship It не появилось, проверьте, что вы правильно отправили запрос и, если всё сделано правильно, спросите у семинариста получил ли он запрос.&#039;&#039;&#039;&lt;br /&gt;
# Вы их исправляете, проверяете в контесте, что программа по-прежнему проходит все тесты, заливаете новую версию в Review Board. Штрафов за посылки НЕ будет.&lt;br /&gt;
# Процесс повторяется пока остаются замечания к коду или пока не истёк дедлайн. После закрытия контеста будут ещё одни сутки на доработку замечаний в Review Board.&lt;br /&gt;
# Оценивается только последняя версия работы в Review Board.&lt;br /&gt;
&lt;br /&gt;
===Маленькие домашние работы===&lt;br /&gt;
# Залить решение на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* Желаемые форматы: txt, py, cpp, h. Допускаются любые другие.&lt;br /&gt;
#* На каждую домашнюю работу создавайте отдельный запрос на ревью. Обязательно указывайте номер домашней работы.&lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении неопределенного промежутка времени придут оценки по каждому из заданий.&lt;br /&gt;
&lt;br /&gt;
==Оценивание домашних работ==&lt;br /&gt;
* Все задания предполагаются индивидуальными. Запрещены любые заимствования без ссылки на автора.&lt;br /&gt;
* Решения после установленного дедлайна не принимаются. Дедлайн указан в заголовке каждого задания.&lt;br /&gt;
* Везде, где требуется написать алгоритм, можно использовать любой язык программирования или псевдокод.&lt;br /&gt;
* Там, где требуется построить алгоритм с заданной асимптотикой, приведите обоснование, что полученный алгоритм удовлетворяет этому условию.&lt;br /&gt;
* Эти правила не действуют, если в задании явно оговорено иное.&lt;br /&gt;
&lt;br /&gt;
==Мотивация к изучению алгоритмов. Подсчёт числа операций (12.01)==&lt;br /&gt;
# Числа Фибоначчи. Определение. Примитивный рекурсивный алгоритм вычисления i-ого числа. Оценка числа операций. Анализ причин неэффективности. Алгоритм с запоминанием вычисленных ранее значений. Оценка числа операций. Сравнение с предыдущим. (подробнее: глава 0, страницы 8-10 из книги &amp;lt;&amp;lt;Алгоритмы&amp;gt;&amp;gt;, [[Алгоритмы_и_структуры_данных|см. список рекомендованной литературы]])&lt;br /&gt;
# Задача о ханойской башне. Постановка задачи. Рекурсивный алгоритм. Рекуррентная формула для числа перемещений. Замкнутая формула для числа перемещений (+ доказательство). Доказательство того, что эту задачу нельзя решить используя меньшее число перемещений дисков. ([https://www.dropbox.com/s/t8cbs7ttu4iasvj/algo-0-recursion.pdf?dl=0 Разбор задачи о ханойской башне], автор Сергей Объедков)&lt;br /&gt;
# Сортировка пузырьком. Алгоритм. Подсчёт количество операций сравнения и обмена (swap). Анализ наилучшего и наихудшего случаев ([https://ru.wikipedia.org/wiki/Сортировка_пузырьком Википедия])&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 1 (12.01 - 26.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
Во всех задачах, если не оговорено иного, предполагаем, что работаем с целыми неотрицательными числами. Для первых 7 задач необходимо&lt;br /&gt;
* описать что можно считать наилучшим и наихудшим случаями,&lt;br /&gt;
* для каждого из двух случаев подсчитать отдельно количество операций сравнения и swap (если есть).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Даны три числа, требуется вернуть наименьшее.&lt;br /&gt;
# Даны три числа, требуется отсортировать их.&lt;br /&gt;
# Дана последовательность A из n элементов и число x, требуется найти элемент равный x. Примечание: если таких значений i несколько, вернуть любое; если такого элемента нет, функция должна сообщить об этом.&lt;br /&gt;
# * Дана упорядоченная последовательность A из n элементов и число x, требуется найти такое i, что A[i] равно x. Алгоритм должен быть эффективней, чем в предыдущем пункте и использовать то, что последовательность упорядочена.&lt;br /&gt;
# Дана последовательность из 100 000 чисел от 0 до 100. Напишите эффективный алгоритм сортировки, который бы учитывал специфику входных данных.&lt;br /&gt;
# * Дано 32 битное неотрицательное число. Требуется номер первого ненулевого бит. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения, считая, что числа распределены равномерно.&lt;br /&gt;
# * Даны 32 битные неотрицательные числа m и n. Требуется вывести True, если m &amp;lt; n, иначе False. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения битов, считая, что числа распределены равномерно.&lt;br /&gt;
# Напишите рекурсивную функцию, вычисляющую n-ое число Фибоначчи (как на занятии). Подсчитайте количество рекурсивных вызовов.&lt;br /&gt;
# * Напишите функцию, вычисляющую n-ое число Фибоначчи, у которой число операций — полином от n, и которая использует количество памяти, независящее от n.&lt;br /&gt;
&lt;br /&gt;
==O-символика и стратегия &amp;quot;разделяй и властвуй&amp;quot; (15.01)==&lt;br /&gt;
# Сортировка слиянием. Алгоритм, рекуррентное соотношение для времени сортировки, сложность. Подробнее: [https://dl.dropboxusercontent.com/u/829163/draft.pdf §2.3 Сортировка слиянием (стр. 54)].&lt;br /&gt;
# О-символика. [https://dl.dropboxusercontent.com/u/829163/draft.pdf §0.3 О-символика (стр. 10)].&lt;br /&gt;
# Задача о слиянии m упорядоченных массивов по n элементов. Три алгоритма решения: последовательное слияние, слияние &amp;quot;деревом&amp;quot; (обе функции используют Merge из MergeSort), аналог Merge для m массивов. Анализ сложности каждого из них.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 2 (15.01-29.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
* Во всех задачах, если не оговорено иного, для простоты &#039;&#039;можно&#039;&#039; считать, что n является степенью какого-либо числа, например, степенью двойки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Дана функция F, определённая ниже. Сколько строк она напечатает? Указание: для обоих подпунктов рассмотрите два случая: 1. n является степенью двойки, 2. n не является степенью двойки.&lt;br /&gt;
## Запишите рекуррентное соотношение для числа строк.&lt;br /&gt;
## Решите уравнение, полученное в предыдущем пункте, то есть, выведите замкнутую (нерекуррентную формулу). Для простоты можно считать, что n является степенью двойки.&lt;br /&gt;
# В массиве A размера n записана возрастающая последовательность целых чисел. Постройте алгоритм типа &amp;quot;разделяй и властвуй&amp;quot;, который проверяет, существует ли такой индекс i, что A[i] = i&lt;br /&gt;
## за время O(n),&lt;br /&gt;
## * за время O(log n).&lt;br /&gt;
## Какие случаи для вашего алгоритма являются наихудшими и наилучшими? Какого время работы в лучшем и худшем случаях?&lt;br /&gt;
# Дан бесконечный массив A, первые n элементов которого содержат возрастающую последовательность положительных чисел, а дальше стоят -1. Значение n не дано. Постройте алгоритм, который получает на вход целое число x и находит это x в массиве --- или говорит, что там его нет, &lt;br /&gt;
## за время O(n),&lt;br /&gt;
## за время O(log n).&lt;br /&gt;
# Рассмотрим алгоритм вычисления наибольшего общего делителя (НОД) двух положительных чисел, основанный на методе &amp;quot;разделяй и властвуй&amp;quot;.&lt;br /&gt;
## (задание не оценивается) Прочитайте [https://dl.dropboxusercontent.com/u/829163/draft.pdf §1.2.3 Алгоритм Евклида (стр. 23)].&lt;br /&gt;
## * Докажите, что определение НОД-а, приведённое ниже, корректно.&lt;br /&gt;
## Постройте алгоритм, основанный на этом определении.&lt;br /&gt;
## Какой алгоритм будет быстрее для n-битовых чисел a и b при больших значениях n --- ваш или алгоритм Евклида?&lt;br /&gt;
# * Покажите как за время O(n log n) удалить из массива размера n все дубликаты, то есть оставить каждый элемент в одном экземпляре.&lt;br /&gt;
# * Даны два упорядоченных массива размера m и n. Постройте алгоритм, находящий k-й по величине элемент в объединении этих массивов за время O(log(n+m)). &lt;br /&gt;
&lt;br /&gt;
Функция F(n).&lt;br /&gt;
  если n &amp;gt; 1:&lt;br /&gt;
    напечатать &amp;quot;всё ещё работаю&amp;quot;&lt;br /&gt;
    F(n/2)&lt;br /&gt;
    F(n/2)&lt;br /&gt;
&lt;br /&gt;
Определение НОД-а.&lt;br /&gt;
             2НОД(a/2, b/2), если а и b чётны,&lt;br /&gt;
  НОД(a,b) = НОД(a, b/2), если а нечётно, b чётно,&lt;br /&gt;
             НОД((a-b)/2, b), если а и b нечётны.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;lt;nowiki&amp;gt;Задачи взяты из книги &amp;quot;Алгоритмы&amp;quot;, глава 2 (см. список рекомендованной литературы).&amp;lt;/nowiki&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Сложение и умножение (19.01)==&lt;br /&gt;
# Алгоритм сложения, его сложность (§1.1.1 Сложение*)&lt;br /&gt;
# &amp;quot;Школьный&amp;quot; алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Рекурсивный алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Алгоритм умножения, реализующий стратегию &amp;quot;разделяй и властвуй&amp;quot;, анализ сложности (§2.1 Умножение чисел*)&lt;br /&gt;
 * [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать.]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 3 (19.01 - 2.02)===&lt;br /&gt;
* Во всех задачах для простоты можно считать, что n является степенью какого-либо числа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Найдите произведение чисел 10011011 и 10111010 (в двоичной системе счисления), используя алгоритм умножения чисел, основанный на методе «разделяй и властвуй». Необходимо не только дать ответ, но и привести ход решения.&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 3 рекурсивных вызова для подзадач размера n-1 и комбинирует из них решение исходной задачи за О(n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте три верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 10 рекурсивных вызовов для подзадач размера n/2 и комбинирует из них решение исходной задачи за О(5n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте два верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Докажите, что 3m² + m = O(m²).&lt;br /&gt;
# Докажите, что lg m = O(m/1000), где lg m — это логарифм с двоичным основанием.&lt;br /&gt;
# Докажите, что из равенства f(n) = O(g(n)) не следует, что g(n) = O(f(n)).&lt;br /&gt;
# Докажите, что O(m) содержится в O(m²).&lt;br /&gt;
&lt;br /&gt;
==Решение рекуррентных уравнений (22.01)==&lt;br /&gt;
# Примеры решений рекуррентных уравнений (см. [https://www.dropbox.com/s/6a0r410zjm9qwe7/algo-3-recurrences.pdf?dl=0 конспект]).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 4 (до 14.02)===&lt;br /&gt;
* Нельзя использовать утверждение основной теоремы о решении рекуррентных соотношений.&lt;br /&gt;
* &#039;&#039;Можно&#039;&#039; использовать метод построения дерева рекурсии или подстановку (метод с угадыванием ответа).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Какой из трёх приведённых ниже алгоритмов вы бы предпочли? Обоснуйте свой ответ.&lt;br /&gt;
#* Алгоритм A, решая задачу, производит пять рекурсивных вызовов для подзадач вдвое меньшего размера, после чего строит ответ для исходной задачи за линейное время.&lt;br /&gt;
#* Алгоритм B, решая задачу размера n, делает два рекурсивных вызова для задач размера n − 1, после чего находит ответ за время O(1).&lt;br /&gt;
#* Алгоритм C, решая задачу размера n, рекурсивно решает девять задач размера n/3 и строит ответ за время O(n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Найдите T(n) в замкнутой форме для любых 7 из 10 приведённых ниже рекуррентных соотношений:&lt;br /&gt;
## T(n) ≤ 2T(n/3) + 1;&lt;br /&gt;
## T(n) ≤ 7T(n/7) + n;&lt;br /&gt;
## T(n) ≤ 9T(n/3) + n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 8T(n/2) + n&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 49T(n/25) + n&amp;lt;sup&amp;gt;3/2&amp;lt;/sup&amp;gt;log n;&lt;br /&gt;
## T(n) ≤ T(n − 1) + 2;&lt;br /&gt;
## T(n) ≤ T(n − 1) + n&amp;lt;sup&amp;gt;c&amp;lt;/sup&amp;gt;, где c ≥ 1 –– константа;&lt;br /&gt;
## T(n) ≤ T(n − 1) + c&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;, где c &amp;gt; 1 –– константа;&lt;br /&gt;
## T(n) ≤ 2T(n − 1) + 1;&lt;br /&gt;
## T(n) ≤ T(sqrt(n)) + 1.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №1==&lt;br /&gt;
Необходимо реализовать все 6 задач из [https://official.contest.yandex.ru/contest/1002 контеста]. Каждую задачу можно писать на С++ или Python. На выполнение работы отводится две недели. Каждая задача оценивается в 10/6 балла. Оценка &#039;&#039;может&#039;&#039; быть снижена за плохой код, но не более чем на 25%.&lt;br /&gt;
&lt;br /&gt;
==Бинарное дерево поиска (26.01)==&lt;br /&gt;
# Определение. Пример.&lt;br /&gt;
# Не модифицирующие алгоритмы: поиск (рекурсивный и итеративный алгоритмы), поиск минимума, inordered обход (вывод значений узлов в отсортированном порядке), поиск следующего по возрастанию.&lt;br /&gt;
# Модифицирующие алгоритмы: вставка (рекурсивная реализация), удаление (только идея).&lt;br /&gt;
 [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 13, стр. 248]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 5 (до 16.02)===&lt;br /&gt;
* Для получения максимальной оценки можно выполнить или все задачи без звёздочки, или задачу со звёздочкой. Преподаватель понимает, что реализацию БДП сложно не найти в интернете, но от копипасты не будет никакой пользы. Напротив, самостоятельная реализация очень полезна и приветствуется, даже если не получится выполнить всех пунктов задания.&lt;br /&gt;
* Задачи с двумя звёздочками необязательны.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Нарисуйте бинарные деревья поиска высотой 2, 3, 4, 5 и 6 для множества ключей {1, 4, 5, 10, 16, 17, 21}. Корень дерева имеет высоту 0.&lt;br /&gt;
# &#039;&#039;&#039;Сортировка с использованием БДП.&#039;&#039;&#039;&lt;br /&gt;
## Какова асимптотическая сложность алгоритма вставки элемента в дерево высоты d? Почему? Назовите наилучший и наиухдший случаи.&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который строит БДП в узлах которого стоят элементы данной последовательности. Можно использовать функцию Insert. Назовите наилучший и наихудший случаи. Есть теорема о том, что полученный алгоритм будет работать в среднем случае за время O(n * log n).&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который выводит их в порядке возрастания. Используйте бинарное дерево поиска. Какова в среднем случае сложность этого алгоритма? Назовите наилучший и наихудший случаи. Какова сложность в наихудшем случае?&lt;br /&gt;
# Напишите функцию GetRoot, которой на вход подаётся указатель на произвольный узел дерева, а она возвращает указатель на корень.&lt;br /&gt;
# Напишите процедуру PrintLeafs, которой на вход подаётся указатель на корень дерева, и она печатает листья дерева&lt;br /&gt;
## по возрастанию,&lt;br /&gt;
## по убыванию.&lt;br /&gt;
# ** Альтернативный обход в порядке возрастания бинарного дерева поиска с n узлами (или центрированный (inordered) обход) можно осуществить путём поиска минимального элемента дерева с помощью функции Minimum с последующий n-1 вызовом функции Next. Каково время работы такого алгоритма?&lt;br /&gt;
# * Реализуйте на С++ структуру данных бинарное дерево поиска, [https://yadi.sk/i/gi2SEStreFfSb используя заготовку].&lt;br /&gt;
## Нарисуйте бинарное дерево поиска, которое строится в функции getTreeExample.&lt;br /&gt;
## Реализуйте следующие алгоритмы: &lt;br /&gt;
### поиск минимума, &lt;br /&gt;
### inordered обход (вывод значений узлов в отсортированном порядке),&lt;br /&gt;
### поиск следующего по возрастанию,&lt;br /&gt;
### вставка элемента в дерево,&lt;br /&gt;
### сортировка последовательности с использованием БДП (дан вектор чисел, необходимо вывести их по возрастанию),&lt;br /&gt;
### ** удаление.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Карацубы, Штрассена. Быстрая сортировка (29.01)==&lt;br /&gt;
# Алгоритм Карацубы.&lt;br /&gt;
# Алгоритм Штрассена. [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать Дасгупту и др., §2.5 Умножение матриц]&lt;br /&gt;
# Быстрая сортировка и доказательство того, что в среднем случае она работает за О(n * log n). [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 8 Быстрая сортировка, стр. 148]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 6 (до 18.02)===&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Пусть мы хотим найти двоичное представление десятичного числа 10&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;. Будем считать, что n --- степень двойки (n = 2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt;).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Pwr2Bin(n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть 1010&lt;br /&gt;
    z = ...&lt;br /&gt;
    вернуть Multiply(z, z)&amp;lt;/source&amp;gt;&lt;br /&gt;
Multiply --- функция, перемножающая два n-битовых двоичных числа x и y по алгоритму Карацубы за O(n&amp;lt;sup&amp;gt;log&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;3&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Пусть мы хотим перевести произвольное десятичное число x в записи которого n=2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; чисел в двоичную систему счисления.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Dec2Bin(x, n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть binary[x]&lt;br /&gt;
    разделить x на два десятичных числа xl и xr из n/2 цифр.&lt;br /&gt;
    вернуть ...&amp;lt;/source&amp;gt;&lt;br /&gt;
Здесь binary --- это массив, содержащий двоичное представление десятичных цифр.&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Докажите, что математическое ожидание времени работы алгоритма быстрой сортировки (усреднение по всем вариантам выбора опорного элемента) на любом входе размера n удовлетворяет соотношению: T(n) ≤ O(n) + 1/n * &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt; (T(i-1) + T(n-i)).&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Найдите решение соотношения из предыдущего пункта.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Динамическое программирование (ДП). Первые примеры (02.01)==&lt;br /&gt;
# Нахождение самой длинной возрастающей подпоследовательности.&lt;br /&gt;
# Нахождение редакционного расстояния (или редакционной стоимости, расстояния Левенштейна).&lt;br /&gt;
# Нахождение представителя большинства.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 7 (до 20.02)===&lt;br /&gt;
* В этом задании везде, где требуется реализовать алгоритм, необходимо привести код на любом языке программирования.&lt;br /&gt;
* Для получения максимальной оценки нужно решить все задачи без звёздочек. Одна решённая задача со звёздочкой заменяет одну задачу без звёздочки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения редакционного расстояния (алгоритм Вагнера — Фишера). Например, редакционное расстояние между словами &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равно 6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения длины наибольшей общей подстроки. Например, длина наибольшей общей подстроки &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равна 8 (&amp;quot;antholog&amp;quot;). Чем больше это значение, тем схожей строки.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Предположим теперь, что сравниваемые строки состоят из символов A, С, G и T; за удаление или вставку мы платим -5; за замену буквы x на y платим w[x, y], где x, y принадлежат множеству {A, С, G, T}, a w — это матрица весов:&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
!-!! A!! G!! C!! T&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! A&lt;br /&gt;
|10||-1||-3||-4&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
!G&lt;br /&gt;
||-1||7||-5||-3&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! C&lt;br /&gt;
||-3||-5||9||0&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! T&lt;br /&gt;
||-4||-3||0||8&lt;br /&gt;
|}&lt;br /&gt;
Тогда выравнивание:&lt;br /&gt;
 AGACTAGTTAC&lt;br /&gt;
 CGA‒‒‒GACGT&lt;br /&gt;
будет иметь следующую оценку:&lt;br /&gt;
 w[A,C] + w[G,G] + w[A,A] + 3*(-5) + w[G,G] + w[T,A] + w[T,C] + w[A,G] + w[C,T] = -3 + 7 + 10 - 3*5 + 7 + (-4) + 0 + (-1) + 0 = 1.&lt;br /&gt;
&lt;br /&gt;
Напишите алгоритм, который находит максимальную стоимость всех возможных выравниваний. Верно ли, что чем больше это значение, тем непохожей строки?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как давно один народ отделился от другого? Кто похожей — итальянец и китаец или якут и эфиоп? На эти вопросы можно отвечать с разных точек зрения — культурной, исторической, лингвистической, ... В последние же годы человечество научилось секвенировать геном, что позволило исследовать этот вопрос с точки зрения генетики. Секвенирование генома — это процесс записи ДНК в виде нуклеотидной последовательности, которая представляет собой последовательность из четырёх символов — A, С, G и T. Существуют базы, которые хранят генетическую информацию о людях из разных стран и континентов, например, [http://www.mtdb.igp.uu.se/ http://www.mtdb.igp.uu.se/ → Download mtDNA sequences]. Чем больше сходство между геномами, тем сильнее родственные связи между их обладателями. Используя решение предыдущего пункта, выполните задания:&lt;br /&gt;
# Определите, кто похожей — итальянец и китаец или якут и эфиоп?&lt;br /&gt;
# Найдите нескольких похожих и нескольких непохожих народностей.&lt;br /&gt;
# * Выберите одну народность. Найдите самых похожих и самых непохожих на неё.&lt;br /&gt;
# * Найдите самые похожие и самые непохожие народности.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Задача о разрезании стержня (05.01)==&lt;br /&gt;
# Постановка задачи.&lt;br /&gt;
# Решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Решение с нахождением максимума по p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Восходящий алгоритм с запоминанием. Вывод длин кусочков стержня. Оценка сложности.&lt;br /&gt;
# Нисходящий алгоритм с запоминанием. Оценка сложности.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.1 Разрезание стержня, стр. 393]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 8 (до 22.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Решая задачу о разрезании стержня мы вначале построили рекурсивное решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt; для всех 1 ≤ i &amp;lt; n. Его сложность описывалась рекуррентной формулой T(n) = n + &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n-1&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt;(T(i) + T(n-i)), T(1) = 1.&lt;br /&gt;
# Объясните эту формулу.&lt;br /&gt;
# Покажите с помощью метода подстановок, что T(n) ≤ 2&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Покажите с помощью контрпримера, что описанная далее жадная стратегия не всегда определяет оптимальный способ разрезания стержня. Определим плотность стержня длиной i как p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;/i, то есть как стоимость единицы его длины. Жадная стратегия для стержня длиной n отрезает от стержня первую часть длиной i, где 1 ≤ i ≤ n, имеющую максимальную плотность. Затем та же жадная стратегия применяется к оставшейся части длиной n-i.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Рассмотрим модификацию задачи разрезания стержня, в которой в дополнение к цене p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; каждого стержня добавляется фиксированная цена разреза c. Теперь прибыль, связанная с решением, представляет собой сумму цен частей стержня минус стоимость разрезов. Разработайте алгоритм динамического программирования для этой модифицированной задачи.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Непрерывным участком называется группа подряд идущих элементов. Например, для последовательности&lt;br /&gt;
 5, 15, −30, 10, −5, 40, 10&lt;br /&gt;
элементы 15, −30, 10 образуют непрерывный участок, а 5, 15, 40 -- нет. Постройте линейный алгоритм для следующей задачи:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Вход: список чисел a1, a2, ... ‌, an.&lt;br /&gt;
Выход: непрерывный участок с максимальной суммой (сумма участка нулевой длины равна нулю).&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Для приведённого примера ответом будет 10, −5, 40, 10 с суммой 55. Какова сложность алгоритма? Почему?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Надо заплатить v рублей, имея купюры в x1, x2, ‌..., xn рублей (купюр каждого типа сколько угодно). Это не всегда возможно (скажем, купюрами в&lt;br /&gt;
10 и 25 рублей можно заплатить 45 рублей, но не 47 и не 15). Постройте основанный на методе динамического программирования алгоритм со временем работы O(nv), выясняющий, возможна ли уплата.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как решить предыдущую задачу, если каждая купюра имеется в единственном экземпляре? (Например, купюрами в 1, 5, 10, 20 рублей можно заплатить 16 = 1 + 5 + 10 и 31 = 1 + 10 + 20 рублей, но не 40 (не хватит денег). Время работы алгоритма по-прежнему O(nv).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Ещё один вариант той же задачи: купюр каждого типа сколько угодно, но всего разрешается использовать не более k купюр. (Например, если есть купюры в 5 и 10 рублей, а k = 6, то 55 разменять можно, а 65 –– нет).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Перемножение цепочки матриц. Оптимальное бинарное дерево поиска (начало) (09.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о перемножении цепочки матриц. Постановка задачи.Пример. Нисходящий алгоритм.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.2 Перемножение цепочки матриц, стр. 403]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 9 (до 24.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Найдите оптимальную расстановку скобок в произведении последовательности матриц, размерности которых равны 5×10, 10×3, 3×12, 12×5, 5×50, 50×6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Напишите восходящий алгоритм для поиска оптимальной расстановки скобок.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Расстановка пробелов. Оптимальное бинарное дерево поиска (середина) (12.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о расстановке пробелов. Постановка задачи. Решения для трёх случаев: 1. нужно вернуть можно ли разбить текст на слова; 2. вернуть разбивку на слова; 3. слова встречаются не равновероятно, вернуть наиболее вероятную разбивку на слова.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи. Вывод математического ожидания времени поиска.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Праздничное домашнее задание 10 (до 02.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[&amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;,&amp;quot;, &amp;quot;.&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;,&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;.&amp;quot;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Подсказка:&#039;&#039;&#039; разбейте текст на слова из списка и посмотрите на азбуку Морзе.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Способы представления графов в памяти (16.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Разбор ошибок в домашнем задании.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Графы. Способы представления графов в памяти (матрица смежности, список рёбер, список соседей (список смежностей), матрица инцидентности). Зависимость сложности алгоритмов от способа представления.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §22.1 Представление графов, стр. 626]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 11 (до 02.03)===&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача A.]&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача B.]&lt;br /&gt;
# Нарисуйте неориентированный граф с 5 вершинами и 8 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Нарисуйте ориентированный граф с 4 вершинами и 3 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Дан ориентированный граф. &#039;&#039;Исходящая степень вершины v&#039;&#039; --- это количество исходящих из неё рёбер, &#039;&#039;входящая степень v&#039;&#039; --- это количество рёбер входящих в  v. Имеется представление ориентированного графа с использование списка соседей. Как долго будут вычисляться исходящие степени всех вершин графа? А входящие степени?&lt;br /&gt;
# Дан граф G = (V, E). Какие из рассмотренных способов хранения графов используют меньше всего памяти для хранения G и почему? Указание: рассмотрите случаи |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;lt; |E| и |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;gt; |E|.&lt;br /&gt;
# Пусть C --- это матрица смежности графа G.&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
# Пусть B --- это матрица инцидентности ориентированного графа G. Как связаны элементы матрицы BB&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
&lt;br /&gt;
==Реализация поиска в глубину (19.02)==&lt;br /&gt;
# Реализация поиска в глубину и смежных задач.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 12 (до 5.03)===&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Выберите любой способ хранения графа. Реализуйте поиск в глубину.&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Напишите алгоритм, который возвращает данные о том, какие вершины лежат в одной компоненте связности.&lt;br /&gt;
# &#039;&#039;(любой ЯП или псевдокод)&#039;&#039; Напишите алгоритм проверки сильной связности ориентированного графа. Какова его сложность?&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №2==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
Необходимо реализовать 3 задачи из [https://official.contest.yandex.ru/contest/1085 контеста], см. [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing распределение задач]. Каждую задачу можно написать на С++ или Python. На выполнение работы отводится две недели (см. время окончания контеста). [https://official.contest.yandex.ru/contest/1123 Дорешивание.]&lt;br /&gt;
&lt;br /&gt;
==ДП и графы (26.02)==&lt;br /&gt;
==ДП и графы (02.03)==&lt;br /&gt;
==Жадные алгоритмы (12.03)==&lt;br /&gt;
===Домашнее задание 13 (до 23.03)===&lt;br /&gt;
# Вася хочет купить по одной акции каждой компании. Все акции стоят одинаково, но дорожают по-разному. Каждый месяц акция i-ой компании дорожает в r_i раз. В один месяц можно купить только одну акцию.&lt;br /&gt;
## Напишите алгоритм, который выводит оптимальную последовательность покупок (такую, что на покупку всех акций потратится меньше денег).&lt;br /&gt;
## Докажите корректность алгоритма, то есть докажите, что последовательность покупок, которую выводит ваш алгоритм, оптимальна.&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список, очередь (16.03)==&lt;br /&gt;
# Реализация линейного двусвязного списка (С++).&lt;br /&gt;
# Реализация очереди ограниченной длины на базе вектора (С++).&lt;br /&gt;
# Реализация очереди на базе списка (С++).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14 (до 23.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте (на С++) структуру данных Стек. У стека должно быть три операции:&lt;br /&gt;
* push --- положить элемент на вершину стека;&lt;br /&gt;
* pop --- удалить верхний элемент;&lt;br /&gt;
* front --- вернуть значение верхнего элемента.&lt;br /&gt;
Оцените время работы каждой функции.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список (19.03)==&lt;br /&gt;
===Домашнее задание 13* (до 30.03)===&lt;br /&gt;
#Для приведённой реализации класса List (https://yadi.sk/i/c5r_79WdfMyNS).&lt;br /&gt;
## Допишите print, push_back и push_front.&lt;br /&gt;
## В функции insert_after и delete_node вставьте необходимые проверки так, чтобы они работали для крайних случаев.&lt;br /&gt;
## Напишите main в котором&lt;br /&gt;
### создаётся объект класса List, &lt;br /&gt;
### заполняется элементами с помощью функций push_back, push_front и insert_after и&lt;br /&gt;
### удаляется i-ый элемент.&lt;br /&gt;
&lt;br /&gt;
==Повторение (30.03)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Для данных пар функций выясните их связь в терминах O-, o-, Ω-, ω-, Θ-обозначений. Поставьте галочку в клетке с Ω, если f(x) = Ω(g(x)) и прочерк, если равенства нет. [https://ru.wikipedia.org/wiki/«O»_большое_и_«o»_малое#.D0.94.D1.80.D1.83.D0.B3.D0.B8.D0.B5_.D0.BF.D0.BE.D0.B4.D0.BE.D0.B1.D0.BD.D1.8B.D0.B5_.D0.BE.D0.B1.D0.BE.D0.B7.D0.BD.D0.B0.D1.87.D0.B5.D0.BD.D0.B8.D1.8F Википедия]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! f(x)!! g(x)!! O!! o!! Ω!! ω!! Θ&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! 2^100&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n * log(n)&lt;br /&gt;
! 2^100 * n * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n&lt;br /&gt;
! 2^100 * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n!&lt;br /&gt;
! 2^(2015n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n*2^n&lt;br /&gt;
! 3^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 5^n&lt;br /&gt;
! 5^(n+1)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n + n^2 + n^3 + ... + n^1000&lt;br /&gt;
! 7^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм Quickselect нахождения k-ого элемента по возрастанию: http://en.wikipedia.org/wiki/Quickselect&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;На улице стоит ряд домов. В каждом из домов лежит сколько-то денег. Вор хочет обокрасть дома на переулке. Он не может обокрасть два соседних дома, потому что хозяин дома, который он обокрал, сразу предупредит соседей. Нужно найти, какую максимальную сумму вор может украсть с переулка. На вход программы подается массив неотрицательных целых чисел - количество долларов в доме с номером i. Соседние дома в массиве представлены соседними элементами. Например, пусть задан массив { 1, 4, 5 } - тогда вор максимум может украсть $6, обокрав дома 1 и 3. Пусть задан массив { 1, 7, 2 } - тогда вор максимум может украсть $7, обокрав дом 2.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Алфавит из всех маленьких латинских букв и пробела закодирован числами следующим способом:&lt;br /&gt;
  &#039;a&#039; -&amp;gt; 1&lt;br /&gt;
  &#039;b&#039; -&amp;gt; 2&lt;br /&gt;
  &#039;c&#039; -&amp;gt; 3&lt;br /&gt;
  ...&lt;br /&gt;
  &#039;z&#039; -&amp;gt; 26&lt;br /&gt;
  &#039; &#039; -&amp;gt; 27&lt;br /&gt;
На вход программы подается строка из цифр. Нужно посчитать, сколькими способами можно раскодировать эту строку.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Дан граф, заданный матрицей смежности. Вывести пары вершин между которыми нет пути.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Повторение (02.04) ==&lt;br /&gt;
Решали и разбирали первые 4 задачи из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14* (до 11.03)===&lt;br /&gt;
Решите любые две задачи (подпункты НЕ считаются отдельными задачами) с предыдущей пары (Повторение (30.03)).&lt;br /&gt;
&lt;br /&gt;
== Повторение (06.04) ==&lt;br /&gt;
Будем решать вторую половину задач из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 15 (до 16.04)===&lt;br /&gt;
# Приведите пример графа, который содержит отрицательные рёбра, не содержит циклов отрицательного веса и для которого алгоритм Дейкстры возвращает неверный результат.&lt;br /&gt;
# Используется ли в алгоритме Дейкстры то, что веса рёбер неотрицательны? Если &amp;quot;да&amp;quot;, то где именно?&lt;br /&gt;
# Пусть граф содержит рёбра с весами &amp;gt;= -100. Если прибавить к каждому ребру 101 и при помощи алгоритма Дейкстры найти кратчайшие пути. Будут ли эти пути кратчайшими в исходном графе? Почему?&lt;br /&gt;
&lt;br /&gt;
== Повторение (07.04) ==&lt;br /&gt;
&#039;&#039;&#039;Решение рекуррентных соотношений&#039;&#039;&#039;&lt;br /&gt;
# Решите уравнение: T(n) = 4*T(n/2) + O(n^2) с базой T(1) = O(1)&lt;br /&gt;
## Используя основную теорему.&lt;br /&gt;
## Используя дерево рекурсий.&lt;br /&gt;
## Методом подстановки.&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2)) + n является \Theta(n lg n).&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2) + 17) + n является \Theta(n lg n).&lt;br /&gt;
# Решите уравнения, считая, что T(1) = O(1):&lt;br /&gt;
## T(n) = T(n-1) + n&lt;br /&gt;
## T(n) = 2*T(floor(sqrt(n))) + lg n. Указание: попробуйте использовать замену переменных.&lt;br /&gt;
## T(n) = 3*T(sqrt(n)) + lg n&lt;br /&gt;
# Дайте верхнюю и нижнюю оценки функции T(n). Постарайтесь, чтобы оценки были как можно более точные&lt;br /&gt;
## T(n) = 4T(n/3) + n*lg(n)&lt;br /&gt;
## T(n) = 3T(n/3) + n/lg(n)&lt;br /&gt;
## T(n) = 4T(n/2) + n^2*sqrt(n)&lt;br /&gt;
## T(n) = T(n/2) + T(n/4) + T(n/8) + n&lt;br /&gt;
## T(n) = T(n-1) + 1/n&lt;br /&gt;
## T(n) = T(n-2) + 1/lg(n)&lt;br /&gt;
## T(n) = sqrt(n) * T(sqrt(n)) + n&lt;br /&gt;
&#039;&#039;&#039;Анализ и построение алгоритмов&#039;&#039;&#039;&lt;br /&gt;
# Числа Фибоначчи F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; можно выразить через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, используя матрицу: https://yadi.sk/i/Pm_aNzHCforFU. &lt;br /&gt;
## Покажите как вычислить F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;.&lt;br /&gt;
## Как вычислить F&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;n+1&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;?&lt;br /&gt;
## Напишите алгоритм.&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
## Ускорьте его так, чтобы он работал за O(log n).&lt;br /&gt;
# Дана последовательность символов. Какое минимальное количество символов нужно удалить из неё, чтобы получить палиндром?&lt;br /&gt;
## Напишите алгоритм (на псевдокоде или на любом языке программирования).&lt;br /&gt;
## Оцените время работы алгоритма.&lt;br /&gt;
# Какую структуру данных вы бы использовали для реализации упорядоченного множества (http://neerc.ifmo.ru/wiki/index.php?title=Упорядоченное_множество)? Какая будет сложность каждой из операций над множеством?&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 16 (до 20.04)===&lt;br /&gt;
# Решите 6 задач из первой части и 6 из второй. (Укажите какие именно.) Каждый из подпунктов является отдельной задачей.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм и теорема Форда-Фалкерсона (16.04)==&lt;br /&gt;
# Базовые определения (пропускные способности, сток, исток и пр.). Пример. &lt;br /&gt;
# Ограничения на поток (сохранение и что меньше пропускных способностей).&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, пример работы&lt;br /&gt;
# Разрез, определение, пример.&lt;br /&gt;
# Утверждение: максимальный поток &amp;lt;= любого разреза.&lt;br /&gt;
# Теорема Форда-Фалкерсона (с доказательством).&lt;br /&gt;
# Пример на котором алгоритм Форда-Фалкерсонаработает работает очень долго при неудачном выборе путей.&lt;br /&gt;
# Сложность алгоритма Форда-Фалкерсона.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №3==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
В [https://official.contest.yandex.ru/contest/1196 домашнем задании] пять задач. Они разделены на два варианта, помеченные римскими цифрами I и II. Свой вариант нужно узнать [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing здесь на вкладке HW3]. Третья задача — общая для двух вариантов; ее решение необходимо снабдить доказательством корректности алгоритма. На выполнение задания дается примерно 2 недели (см. точное время окончания в контесте). Каждую задачу можно написать на С++ или Python.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Форда-Фалкерсона и Эдмондса-Карпа (20.04)==&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, напоминание: базовые определения, пример работы, пример на котором алгоритм работает долго, сложность.&lt;br /&gt;
# Алгоритм Эдмодса-Карпа. Доказательство асимптотики времени работы.&lt;br /&gt;
&lt;br /&gt;
==(23.04)==&lt;br /&gt;
&lt;br /&gt;
==(11.05) Красно-чёрные деревья==&lt;br /&gt;
[https://ru.wikipedia.org/wiki/Красно-чёрное_дерево Красно-чёрное дерево]&lt;br /&gt;
===Домашнее задание 17 (до 18.05)===&lt;br /&gt;
# Зачем нужны красно-чёрные деревья?&lt;br /&gt;
# Благодаря какому свойству и почему красно-чёрное дерево является сбалансированным?&lt;br /&gt;
# Нарисуйте полное бинарное дерево поиска высотой 3 с ключами {1, 2, ..., 15}. Сделайте из него красно-чёрные деревья высотой 2, 3 и 4.&lt;br /&gt;
# Нарисуйте красно-чёрные деревья, получающиеся последовательной вставкой элементов 12, 10, 29, 30, 31, 32 в [https://ru.wikipedia.org/wiki/Красно-чёрное_дерево#/media/File:Red-black_tree_example.svg данное дерево]. Для вставки используйте алгоритм вставки из Википедии. Укажите какой именно функцией вы воспользовались.&lt;br /&gt;
# Определим &#039;&#039;&#039;ослабленное красно-чёрное дерево&#039;&#039;&#039; как бинарное дерево поиска, которое удовлетворяет красно-чёрным свойствам 1, 3, 4 и 5. Другими словами, корень может быть как чёрным, так и красным. Рассмотрите ослабленное красно-чёрное дерево T, корень которого красный. Если перекрасить корень дерева T в чёрный, будет ли оно красно-чёрным деревом?&lt;br /&gt;
# Покажите, что самый длинный простой нисходящий путь от вершины x к листу красно-черного дерева имеет длину, не более чем в два раза превышающую кратчайший путь от x к листу-потомку.&lt;br /&gt;
# Чему равно наибольшее возможное количество внутренних узлов в красно-чёрном дереве с чёрной высоты k? А наименьшее возможное количество?&lt;br /&gt;
# Нарисуйте красно-чёрные деревья, получающиеся последовательной вставкой ключей 41, 38, 31, 12, 19, 8 в изначально пустое дерево.&lt;br /&gt;
# Покажите какие деревья будут получаться в результате последовательного удаления ключей в порядке 8, 12, 19, 31, 38, 41.&lt;br /&gt;
&lt;br /&gt;
==(14.05) Конкурентный анализ самоорганизующихся циклов==&lt;br /&gt;
[https://vk.com/doc12518218_390369758 Лекция]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 18 (до 21.05)===&lt;br /&gt;
Все вычисления сопроводите подробными объяснениями о том, почему верно то или иное (не)равенство.&lt;br /&gt;
# Пусть имеется n-элементный список и m поисковых запросов к нему. После каждой операции поиска можно переупорядочить список. Обозначим стоимость последовательности поисков через C. Докажите, что в худшем случае C = Ω(mn).&lt;br /&gt;
#  Обозначим через c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; стоимость i-ого поискового запроса с применением эвристики перемещения в начало, которая включает стоимость поиска элемента в списке и стоимость его перемещения в начало списка путём ряда обменов соседних элементов списка. Покажите, что i-ая операция поиска находит элемент x в списке L с применением эвристики перемещения в начало, то c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = 2 * rank&amp;lt;sub&amp;gt;L&amp;lt;/sub&amp;gt;(x) - 1.&lt;br /&gt;
# Покажите, что c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = 2 * rank&amp;lt;sub&amp;gt;L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) - 1.&lt;br /&gt;
# Покажите, что c*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = rank&amp;lt;sub&amp;gt;L*&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) + t&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;.&lt;br /&gt;
# Докажите, что после одного обмена двух соседних элементов потенциал либо увеличивается на 2, либо уменьшается на 2.&lt;br /&gt;
# Докажите, что rank&amp;lt;sub&amp;gt;L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) = |A| + |B| + 1.&lt;br /&gt;
# Докажите, что rank&amp;lt;sub&amp;gt;L*&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) = |A| + |С| + 1.&lt;br /&gt;
# Покажите, что поиск i-ого элемента приводит к изменению потенциала Ф(L&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;) - Ф(L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;) &amp;lt;= 2 (|A| - |B| + t*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;), где t*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; --- это количество обменов при i-ом поиске.&lt;br /&gt;
# Во сколько раз стоимость С&amp;lt;sub&amp;gt;MFT&amp;lt;/sub&amp;gt;(S) превышает C&amp;lt;sub&amp;gt;OPT&amp;lt;/sub&amp;gt;(S)?&lt;br /&gt;
&lt;br /&gt;
== (18.05) Конечные автоматы ==&lt;br /&gt;
=== Задание 19 (до 25.05) ===&lt;br /&gt;
# Постройте автомат для языка над алфавитом Σ = {0, 1} каждое слово которого содержит хотя бы два нуля. Является ли он детерминированным?&lt;br /&gt;
# Постройте автомат над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5. Является ли он детерминированным?&lt;br /&gt;
# Постройте автомат, который допускает пустой язык (язык в котором нет ни одного слова).&lt;br /&gt;
# Постройте автомат, который допускает все слова над алфавитом Σ.&lt;br /&gt;
# Постройте ДКА над алфавитом Σ = {К, Ж, З}, который допускает слова в которых после К идёт З, после З --- Ж, после Ж --- К.&lt;br /&gt;
# * Постройте ДКА над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5, а число нулей на 3.&lt;br /&gt;
# Постройте НКА для языка над алфавитом Σ = {0, 1, 2, 3}, состоящий из слов, в которых хотя бы одна из последних пяти букв является 1.&lt;br /&gt;
# Постройте НКА над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5, а число нулей на 3.&lt;br /&gt;
# Какие языки допускают автоматы https://yadi.sk/d/fNAHbjCZghERG?&lt;br /&gt;
# Для каждого из автоматов https://yadi.sk/d/fNAHbjCZghERG постройте соответствующий ему ДКА.&lt;br /&gt;
&lt;br /&gt;
== (21.05) Регулярные выражения, КА, их эквивалентность. Лемма о накачке  ==&lt;br /&gt;
=== Задание 20 (до 28.05) ===&lt;br /&gt;
&#039;&#039;&#039;I Написать регулярные выражения&#039;&#039;&#039;&lt;br /&gt;
# Напишите регулярное выражение для языка над алфавитом Σ = {0, 1} каждое слово которого содержит хотя бы два нуля.&lt;br /&gt;
# Напишите регулярное выражение над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5.&lt;br /&gt;
# Напишите регулярное выражение, которое допускает пустой язык (язык в котором нет ни одного слова).&lt;br /&gt;
# Напишите регулярное выражение, которое допускает все слова над алфавитом Σ.&lt;br /&gt;
# Напишите регулярное выражение для языка над алфавитом Σ = {0, 1, 2, 3}, состоящий из слов, в которых хотя бы одна из последних пяти букв является 1.&lt;br /&gt;
&#039;&#039;&#039;II КА и регулярные выражения&#039;&#039;&#039;&lt;br /&gt;
# Постройте конечный автомат для языка (111 U 01)&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;1(00 U 11)&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;.&lt;br /&gt;
# Постройте конечный автомат для языка (ab)&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;(a U b)(b U a)&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;(a U bab).&lt;br /&gt;
&#039;&#039;&#039;III Доказать замкнутость относительно различных операций&#039;&#039;&#039;&lt;br /&gt;
# Покажите, что если для языков L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; и L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; существует КА, который их читает, то существует КА и для их объединения L = {w | w ∈ L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; или w ∈ L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;}.&lt;br /&gt;
# Покажите, что если для языка L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; и L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; существует КА, который их читает, то существует КА и для языка L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; = {xy | x ∈ L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, y ∈ L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;}.&lt;br /&gt;
# Покажите, что если для языка L существует КА, который его читает, то существует КА и для &#039;&#039;&#039;замыкания Клини&#039;&#039;&#039; L* = {w&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; w&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; ... w&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;| w&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; ∈ L, w&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; ∈ L, ..., w&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; ∈ L}.&lt;br /&gt;
# Покажите, что если язык L регулярен, то регулярно его дополнение (т.е. язык над тем же алфавитом, которому принадлежит слово тогда и только тогда, когда оно НЕ принадлежит L) .&lt;br /&gt;
# Покажите, что если язык L регулярен, то регулярно его обращение L&amp;lt;sub&amp;gt;R&amp;lt;/sub&amp;gt; = {a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; . . . a&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; | a&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; . . . a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; ∈ L}. (L&amp;lt;sub&amp;gt;R&amp;lt;/sub&amp;gt; --- это язык в котором все слова языка L записаны наоборот.)&lt;br /&gt;
# * Покажите, что если языки L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; и L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; регулярны, то регулярно их пересечение.&lt;br /&gt;
&#039;&#039;&#039;IV Использование леммы о накачке&#039;&#039;&#039; (см. [https://vk.com/doc12518218_392750846 конспект])&lt;br /&gt;
# Докажите, что не существует КА, который бы читал язык {0&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;1&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;2&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;}. (Пояснение: запись 0&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; означает строку из n нулей: 00...0.)&lt;br /&gt;
# Докажите, что не существует КА, который бы читал язык {0&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;1&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;}.&lt;br /&gt;
# Докажите, что не существует КА, который бы читал язык {0&amp;lt;sup&amp;gt;n!&amp;lt;/sup&amp;gt;}.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== (25.05) Автоматный подход ==&lt;br /&gt;
=== Задание 21 (до 01.06) ===&lt;br /&gt;
Реализуйте один из следующих проектов:&lt;br /&gt;
# Программа, которая считывает строку и говорит принадлежит ли она языку 0(123)*(00 U (231)*) U 111.&lt;br /&gt;
# Программа, которая считывает КА и генерирует программу на языке С++, которая говорит принадлежит ли заданное слово языку, описываемому этим КА.&lt;br /&gt;
# Программа, которая считывает регулярное выражение и строку и говорит принадлежит ли слово языку, описываемому этим регулярным выражением.&lt;br /&gt;
# Программа, которая моделирует работу банкомата, автомата с газировкой, лифта... (что-то одно на выбор)&lt;br /&gt;
# Текстовый симулятор студента. Возможные состояния: на паре, дома, есть приглашение прогулять, завтра коллоквиум, сплю и др. Есть два параметра: успеваемость и весёлось. Если хотя бы один из них упадёт ниже критической отметки, студент умрёт. Игрок принимает решение куда идти студенту. Цель: продержаться как можно дольше.&lt;br /&gt;
&lt;br /&gt;
== Большое домашнее задание 4 ==&lt;br /&gt;
[https://official.contest.yandex.ru/contest/1259 Контест]. В домашнем задании четыре задачи. Обязательны первые три. Вместо одной из первых трёх можно сделать последнюю (только для первых 10 решивших 4-ую!). На выполнение задания даётся примерно 2 недели (см. точное время окончания в контесте). Условия ревью определяют семинаристы.&lt;br /&gt;
&lt;br /&gt;
== (01.06) P vs NP ==&lt;br /&gt;
&#039;&#039;&#039;План занятия&#039;&#039;&#039;&lt;br /&gt;
# Напоминание: P; NP; проблема P ?= NP; NPC; сведения; пример сведений.&lt;br /&gt;
&lt;br /&gt;
=== Задание 22 (до 8.06) ===&lt;br /&gt;
1. Задачи о гамильтоновом цикле и о гамильтоновом пути.&lt;br /&gt;
  Задачи о гамильтоновом цикле:&lt;br /&gt;
  Дан граф. Необходимо найти цикл, проходящий через каждую вершину по одному разу.&lt;br /&gt;
&lt;br /&gt;
  Задачи о гамильтоновом пути:&lt;br /&gt;
  Дан граф и две его вершины s и t. Необходимо найти путь из s в t, проходящий через каждую вершину по одному разу.&lt;br /&gt;
&lt;br /&gt;
Покажите, что задача поиске гамильтонова цикл сводится к задаче поиска гамильтонова пути. Из этого будет следовать, что искать цикл не проще, чем искать путь.&lt;br /&gt;
&lt;br /&gt;
2. &#039;&#039;Задачи поиска&#039;&#039; и &#039;&#039;задачи оптимизации&#039;&#039;. Для задачи коммивояжёра варианты с поиском и оптимизацией выглядят так:&lt;br /&gt;
  Задача поиска:&lt;br /&gt;
  &#039;&#039;Вход:&#039;&#039; матрица расстояний, бюджет b&lt;br /&gt;
  &#039;&#039;Выход:&#039;&#039; цикл веса не более b, проходящий по всем вершинам графа, если такой есть.&lt;br /&gt;
&lt;br /&gt;
  Оптимизационная задача:&lt;br /&gt;
  &#039;&#039;Вход:&#039;&#039; матрица расстояний&lt;br /&gt;
  &#039;&#039;Выход:&#039;&#039; цикл минимального веса, проходящий по всем вершинам графа, если такой есть.&lt;br /&gt;
&lt;br /&gt;
Покажите, что если поисковую задачу коммивояжёра можно решить за полиномиальное время, то и оптимизационный вариант можно решить за полиномиальное время.&lt;br /&gt;
&lt;br /&gt;
3. &#039;&#039;Задача поиска&#039;&#039; и &#039;&#039;задача разрешения&#039;&#039;. Пусть имеется программа, которая за полиномиальное время отвечает на вопрос , содержит л входной граф гамильтонов цикл. Как с её помощью найти за полиномиальное время сам цикл (есть он есть)?&lt;br /&gt;
&lt;br /&gt;
4. Сведите задачу поиска гамильтонова цикла к задаче коммивояжёра.&lt;br /&gt;
&lt;br /&gt;
5. Для задач ниже или приведите алгоритм, работающий за полиномиальное время, или сведите их к NP-полной задаче:&lt;br /&gt;
# Поиск самого длинного пути&lt;br /&gt;
# Поиск кратчайшего пути&lt;br /&gt;
# Двудольное паросочетание&lt;br /&gt;
# Трёхдольное паросочетание&lt;br /&gt;
# Четырёхдольное паросочетание&lt;/div&gt;</summary>
		<author><name>Kassalanche</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=16698</id>
		<title>Алгоритмы и структуры данных. Подгруппа 105-1</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=16698"/>
		<updated>2015-06-01T06:37:29Z</updated>

		<summary type="html">&lt;p&gt;Kassalanche: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==О курсе==&lt;br /&gt;
[[Алгоритмы_и_структуры_данных|План лекций и список рекомендуемой литературы.]]&lt;br /&gt;
&lt;br /&gt;
[[Алгоритмы_и_структуры_данных._Подгруппа_105-1._FAQ|FAQ.]]&lt;br /&gt;
&lt;br /&gt;
[[Reviewboard|Инструкция по использованию Reviewboard.]]&lt;br /&gt;
&lt;br /&gt;
[[Практические_занятия_по_курсу_ОиМП/C++_check|Style guide.]]&lt;br /&gt;
&lt;br /&gt;
==Итоговая оценка за курс==&lt;br /&gt;
Итоговая оценка (ИО) зависит от&lt;br /&gt;
* оценок за пять больших домашних заданий (БДЗ1, БДЗ2, ..., БДЗ5),&lt;br /&gt;
* оценок за домашние задания (ДЗ1, ДЗ2, ...),&lt;br /&gt;
* оценки за контрольную работу (КР),&lt;br /&gt;
* оценки за экзамен (ЭКЗ),&lt;br /&gt;
и может быть вычислена по формуле:&lt;br /&gt;
 ИО = 0.7 * (0.3 * КР + 0.7 *(ИДЗ1 + ИДЗ2 + ИДЗ3 + ИДЗ4 + ИДЗ5)/5) + 0.3 * ЭКЗ =&lt;br /&gt;
    = 0.21*КР + 0.098*ИДЗ1 + 0.098*ИДЗ2 + 0.098*ИДЗ3 + 0.098*ИДЗ4 + 0.098*ИДЗ5 + 0.3*ЭКЗ,&lt;br /&gt;
где&lt;br /&gt;
 ИДЗi = min (10, 0.7 * БДЗi + 0.4 * &amp;lt;cредняя оценка за ДЗj, прошедшие с предыдущего БДЗ по i-ое&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
==Порядок сдачи домашних работ==&lt;br /&gt;
===Большие домашние работы===&lt;br /&gt;
# Получить OK за задачу в контесте.&lt;br /&gt;
# Залить исходный код на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* На каждую задачу создавайте отдельный запрос на ревью. &lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении суток приходят замечания к коду. &#039;&#039;&#039;Если в течении суток замечаний или Ship It не появилось, проверьте, что вы правильно отправили запрос и, если всё сделано правильно, спросите у семинариста получил ли он запрос.&#039;&#039;&#039;&lt;br /&gt;
# Вы их исправляете, проверяете в контесте, что программа по-прежнему проходит все тесты, заливаете новую версию в Review Board. Штрафов за посылки НЕ будет.&lt;br /&gt;
# Процесс повторяется пока остаются замечания к коду или пока не истёк дедлайн. После закрытия контеста будут ещё одни сутки на доработку замечаний в Review Board.&lt;br /&gt;
# Оценивается только последняя версия работы в Review Board.&lt;br /&gt;
&lt;br /&gt;
===Маленькие домашние работы===&lt;br /&gt;
# Залить решение на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* Желаемые форматы: txt, py, cpp, h. Допускаются любые другие.&lt;br /&gt;
#* На каждую домашнюю работу создавайте отдельный запрос на ревью. Обязательно указывайте номер домашней работы.&lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении неопределенного промежутка времени придут оценки по каждому из заданий.&lt;br /&gt;
&lt;br /&gt;
==Оценивание домашних работ==&lt;br /&gt;
* Все задания предполагаются индивидуальными. Запрещены любые заимствования без ссылки на автора.&lt;br /&gt;
* Решения после установленного дедлайна не принимаются. Дедлайн указан в заголовке каждого задания.&lt;br /&gt;
* Везде, где требуется написать алгоритм, можно использовать любой язык программирования или псевдокод.&lt;br /&gt;
* Там, где требуется построить алгоритм с заданной асимптотикой, приведите обоснование, что полученный алгоритм удовлетворяет этому условию.&lt;br /&gt;
* Эти правила не действуют, если в задании явно оговорено иное.&lt;br /&gt;
&lt;br /&gt;
==Мотивация к изучению алгоритмов. Подсчёт числа операций (12.01)==&lt;br /&gt;
# Числа Фибоначчи. Определение. Примитивный рекурсивный алгоритм вычисления i-ого числа. Оценка числа операций. Анализ причин неэффективности. Алгоритм с запоминанием вычисленных ранее значений. Оценка числа операций. Сравнение с предыдущим. (подробнее: глава 0, страницы 8-10 из книги &amp;lt;&amp;lt;Алгоритмы&amp;gt;&amp;gt;, [[Алгоритмы_и_структуры_данных|см. список рекомендованной литературы]])&lt;br /&gt;
# Задача о ханойской башне. Постановка задачи. Рекурсивный алгоритм. Рекуррентная формула для числа перемещений. Замкнутая формула для числа перемещений (+ доказательство). Доказательство того, что эту задачу нельзя решить используя меньшее число перемещений дисков. ([https://www.dropbox.com/s/t8cbs7ttu4iasvj/algo-0-recursion.pdf?dl=0 Разбор задачи о ханойской башне], автор Сергей Объедков)&lt;br /&gt;
# Сортировка пузырьком. Алгоритм. Подсчёт количество операций сравнения и обмена (swap). Анализ наилучшего и наихудшего случаев ([https://ru.wikipedia.org/wiki/Сортировка_пузырьком Википедия])&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 1 (12.01 - 26.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
Во всех задачах, если не оговорено иного, предполагаем, что работаем с целыми неотрицательными числами. Для первых 7 задач необходимо&lt;br /&gt;
* описать что можно считать наилучшим и наихудшим случаями,&lt;br /&gt;
* для каждого из двух случаев подсчитать отдельно количество операций сравнения и swap (если есть).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Даны три числа, требуется вернуть наименьшее.&lt;br /&gt;
# Даны три числа, требуется отсортировать их.&lt;br /&gt;
# Дана последовательность A из n элементов и число x, требуется найти элемент равный x. Примечание: если таких значений i несколько, вернуть любое; если такого элемента нет, функция должна сообщить об этом.&lt;br /&gt;
# * Дана упорядоченная последовательность A из n элементов и число x, требуется найти такое i, что A[i] равно x. Алгоритм должен быть эффективней, чем в предыдущем пункте и использовать то, что последовательность упорядочена.&lt;br /&gt;
# Дана последовательность из 100 000 чисел от 0 до 100. Напишите эффективный алгоритм сортировки, который бы учитывал специфику входных данных.&lt;br /&gt;
# * Дано 32 битное неотрицательное число. Требуется номер первого ненулевого бит. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения, считая, что числа распределены равномерно.&lt;br /&gt;
# * Даны 32 битные неотрицательные числа m и n. Требуется вывести True, если m &amp;lt; n, иначе False. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения битов, считая, что числа распределены равномерно.&lt;br /&gt;
# Напишите рекурсивную функцию, вычисляющую n-ое число Фибоначчи (как на занятии). Подсчитайте количество рекурсивных вызовов.&lt;br /&gt;
# * Напишите функцию, вычисляющую n-ое число Фибоначчи, у которой число операций — полином от n, и которая использует количество памяти, независящее от n.&lt;br /&gt;
&lt;br /&gt;
==O-символика и стратегия &amp;quot;разделяй и властвуй&amp;quot; (15.01)==&lt;br /&gt;
# Сортировка слиянием. Алгоритм, рекуррентное соотношение для времени сортировки, сложность. Подробнее: [https://dl.dropboxusercontent.com/u/829163/draft.pdf §2.3 Сортировка слиянием (стр. 54)].&lt;br /&gt;
# О-символика. [https://dl.dropboxusercontent.com/u/829163/draft.pdf §0.3 О-символика (стр. 10)].&lt;br /&gt;
# Задача о слиянии m упорядоченных массивов по n элементов. Три алгоритма решения: последовательное слияние, слияние &amp;quot;деревом&amp;quot; (обе функции используют Merge из MergeSort), аналог Merge для m массивов. Анализ сложности каждого из них.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 2 (15.01-29.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
* Во всех задачах, если не оговорено иного, для простоты &#039;&#039;можно&#039;&#039; считать, что n является степенью какого-либо числа, например, степенью двойки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Дана функция F, определённая ниже. Сколько строк она напечатает? Указание: для обоих подпунктов рассмотрите два случая: 1. n является степенью двойки, 2. n не является степенью двойки.&lt;br /&gt;
## Запишите рекуррентное соотношение для числа строк.&lt;br /&gt;
## Решите уравнение, полученное в предыдущем пункте, то есть, выведите замкнутую (нерекуррентную формулу). Для простоты можно считать, что n является степенью двойки.&lt;br /&gt;
# В массиве A размера n записана возрастающая последовательность целых чисел. Постройте алгоритм типа &amp;quot;разделяй и властвуй&amp;quot;, который проверяет, существует ли такой индекс i, что A[i] = i&lt;br /&gt;
## за время O(n),&lt;br /&gt;
## * за время O(log n).&lt;br /&gt;
## Какие случаи для вашего алгоритма являются наихудшими и наилучшими? Какого время работы в лучшем и худшем случаях?&lt;br /&gt;
# Дан бесконечный массив A, первые n элементов которого содержат возрастающую последовательность положительных чисел, а дальше стоят -1. Значение n не дано. Постройте алгоритм, который получает на вход целое число x и находит это x в массиве --- или говорит, что там его нет, &lt;br /&gt;
## за время O(n),&lt;br /&gt;
## за время O(log n).&lt;br /&gt;
# Рассмотрим алгоритм вычисления наибольшего общего делителя (НОД) двух положительных чисел, основанный на методе &amp;quot;разделяй и властвуй&amp;quot;.&lt;br /&gt;
## (задание не оценивается) Прочитайте [https://dl.dropboxusercontent.com/u/829163/draft.pdf §1.2.3 Алгоритм Евклида (стр. 23)].&lt;br /&gt;
## * Докажите, что определение НОД-а, приведённое ниже, корректно.&lt;br /&gt;
## Постройте алгоритм, основанный на этом определении.&lt;br /&gt;
## Какой алгоритм будет быстрее для n-битовых чисел a и b при больших значениях n --- ваш или алгоритм Евклида?&lt;br /&gt;
# * Покажите как за время O(n log n) удалить из массива размера n все дубликаты, то есть оставить каждый элемент в одном экземпляре.&lt;br /&gt;
# * Даны два упорядоченных массива размера m и n. Постройте алгоритм, находящий k-й по величине элемент в объединении этих массивов за время O(log(n+m)). &lt;br /&gt;
&lt;br /&gt;
Функция F(n).&lt;br /&gt;
  если n &amp;gt; 1:&lt;br /&gt;
    напечатать &amp;quot;всё ещё работаю&amp;quot;&lt;br /&gt;
    F(n/2)&lt;br /&gt;
    F(n/2)&lt;br /&gt;
&lt;br /&gt;
Определение НОД-а.&lt;br /&gt;
             2НОД(a/2, b/2), если а и b чётны,&lt;br /&gt;
  НОД(a,b) = НОД(a, b/2), если а нечётно, b чётно,&lt;br /&gt;
             НОД((a-b)/2, b), если а и b нечётны.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;lt;nowiki&amp;gt;Задачи взяты из книги &amp;quot;Алгоритмы&amp;quot;, глава 2 (см. список рекомендованной литературы).&amp;lt;/nowiki&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Сложение и умножение (19.01)==&lt;br /&gt;
# Алгоритм сложения, его сложность (§1.1.1 Сложение*)&lt;br /&gt;
# &amp;quot;Школьный&amp;quot; алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Рекурсивный алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Алгоритм умножения, реализующий стратегию &amp;quot;разделяй и властвуй&amp;quot;, анализ сложности (§2.1 Умножение чисел*)&lt;br /&gt;
 * [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать.]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 3 (19.01 - 2.02)===&lt;br /&gt;
* Во всех задачах для простоты можно считать, что n является степенью какого-либо числа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Найдите произведение чисел 10011011 и 10111010 (в двоичной системе счисления), используя алгоритм умножения чисел, основанный на методе «разделяй и властвуй». Необходимо не только дать ответ, но и привести ход решения.&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 3 рекурсивных вызова для подзадач размера n-1 и комбинирует из них решение исходной задачи за О(n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте три верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 10 рекурсивных вызовов для подзадач размера n/2 и комбинирует из них решение исходной задачи за О(5n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте два верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Докажите, что 3m² + m = O(m²).&lt;br /&gt;
# Докажите, что lg m = O(m/1000), где lg m — это логарифм с двоичным основанием.&lt;br /&gt;
# Докажите, что из равенства f(n) = O(g(n)) не следует, что g(n) = O(f(n)).&lt;br /&gt;
# Докажите, что O(m) содержится в O(m²).&lt;br /&gt;
&lt;br /&gt;
==Решение рекуррентных уравнений (22.01)==&lt;br /&gt;
# Примеры решений рекуррентных уравнений (см. [https://www.dropbox.com/s/6a0r410zjm9qwe7/algo-3-recurrences.pdf?dl=0 конспект]).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 4 (до 14.02)===&lt;br /&gt;
* Нельзя использовать утверждение основной теоремы о решении рекуррентных соотношений.&lt;br /&gt;
* &#039;&#039;Можно&#039;&#039; использовать метод построения дерева рекурсии или подстановку (метод с угадыванием ответа).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Какой из трёх приведённых ниже алгоритмов вы бы предпочли? Обоснуйте свой ответ.&lt;br /&gt;
#* Алгоритм A, решая задачу, производит пять рекурсивных вызовов для подзадач вдвое меньшего размера, после чего строит ответ для исходной задачи за линейное время.&lt;br /&gt;
#* Алгоритм B, решая задачу размера n, делает два рекурсивных вызова для задач размера n − 1, после чего находит ответ за время O(1).&lt;br /&gt;
#* Алгоритм C, решая задачу размера n, рекурсивно решает девять задач размера n/3 и строит ответ за время O(n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Найдите T(n) в замкнутой форме для любых 7 из 10 приведённых ниже рекуррентных соотношений:&lt;br /&gt;
## T(n) ≤ 2T(n/3) + 1;&lt;br /&gt;
## T(n) ≤ 7T(n/7) + n;&lt;br /&gt;
## T(n) ≤ 9T(n/3) + n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 8T(n/2) + n&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 49T(n/25) + n&amp;lt;sup&amp;gt;3/2&amp;lt;/sup&amp;gt;log n;&lt;br /&gt;
## T(n) ≤ T(n − 1) + 2;&lt;br /&gt;
## T(n) ≤ T(n − 1) + n&amp;lt;sup&amp;gt;c&amp;lt;/sup&amp;gt;, где c ≥ 1 –– константа;&lt;br /&gt;
## T(n) ≤ T(n − 1) + c&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;, где c &amp;gt; 1 –– константа;&lt;br /&gt;
## T(n) ≤ 2T(n − 1) + 1;&lt;br /&gt;
## T(n) ≤ T(sqrt(n)) + 1.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №1==&lt;br /&gt;
Необходимо реализовать все 6 задач из [https://official.contest.yandex.ru/contest/1002 контеста]. Каждую задачу можно писать на С++ или Python. На выполнение работы отводится две недели. Каждая задача оценивается в 10/6 балла. Оценка &#039;&#039;может&#039;&#039; быть снижена за плохой код, но не более чем на 25%.&lt;br /&gt;
&lt;br /&gt;
==Бинарное дерево поиска (26.01)==&lt;br /&gt;
# Определение. Пример.&lt;br /&gt;
# Не модифицирующие алгоритмы: поиск (рекурсивный и итеративный алгоритмы), поиск минимума, inordered обход (вывод значений узлов в отсортированном порядке), поиск следующего по возрастанию.&lt;br /&gt;
# Модифицирующие алгоритмы: вставка (рекурсивная реализация), удаление (только идея).&lt;br /&gt;
 [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 13, стр. 248]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 5 (до 16.02)===&lt;br /&gt;
* Для получения максимальной оценки можно выполнить или все задачи без звёздочки, или задачу со звёздочкой. Преподаватель понимает, что реализацию БДП сложно не найти в интернете, но от копипасты не будет никакой пользы. Напротив, самостоятельная реализация очень полезна и приветствуется, даже если не получится выполнить всех пунктов задания.&lt;br /&gt;
* Задачи с двумя звёздочками необязательны.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Нарисуйте бинарные деревья поиска высотой 2, 3, 4, 5 и 6 для множества ключей {1, 4, 5, 10, 16, 17, 21}. Корень дерева имеет высоту 0.&lt;br /&gt;
# &#039;&#039;&#039;Сортировка с использованием БДП.&#039;&#039;&#039;&lt;br /&gt;
## Какова асимптотическая сложность алгоритма вставки элемента в дерево высоты d? Почему? Назовите наилучший и наиухдший случаи.&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который строит БДП в узлах которого стоят элементы данной последовательности. Можно использовать функцию Insert. Назовите наилучший и наихудший случаи. Есть теорема о том, что полученный алгоритм будет работать в среднем случае за время O(n * log n).&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который выводит их в порядке возрастания. Используйте бинарное дерево поиска. Какова в среднем случае сложность этого алгоритма? Назовите наилучший и наихудший случаи. Какова сложность в наихудшем случае?&lt;br /&gt;
# Напишите функцию GetRoot, которой на вход подаётся указатель на произвольный узел дерева, а она возвращает указатель на корень.&lt;br /&gt;
# Напишите процедуру PrintLeafs, которой на вход подаётся указатель на корень дерева, и она печатает листья дерева&lt;br /&gt;
## по возрастанию,&lt;br /&gt;
## по убыванию.&lt;br /&gt;
# ** Альтернативный обход в порядке возрастания бинарного дерева поиска с n узлами (или центрированный (inordered) обход) можно осуществить путём поиска минимального элемента дерева с помощью функции Minimum с последующий n-1 вызовом функции Next. Каково время работы такого алгоритма?&lt;br /&gt;
# * Реализуйте на С++ структуру данных бинарное дерево поиска, [https://yadi.sk/i/gi2SEStreFfSb используя заготовку].&lt;br /&gt;
## Нарисуйте бинарное дерево поиска, которое строится в функции getTreeExample.&lt;br /&gt;
## Реализуйте следующие алгоритмы: &lt;br /&gt;
### поиск минимума, &lt;br /&gt;
### inordered обход (вывод значений узлов в отсортированном порядке),&lt;br /&gt;
### поиск следующего по возрастанию,&lt;br /&gt;
### вставка элемента в дерево,&lt;br /&gt;
### сортировка последовательности с использованием БДП (дан вектор чисел, необходимо вывести их по возрастанию),&lt;br /&gt;
### ** удаление.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Карацубы, Штрассена. Быстрая сортировка (29.01)==&lt;br /&gt;
# Алгоритм Карацубы.&lt;br /&gt;
# Алгоритм Штрассена. [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать Дасгупту и др., §2.5 Умножение матриц]&lt;br /&gt;
# Быстрая сортировка и доказательство того, что в среднем случае она работает за О(n * log n). [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 8 Быстрая сортировка, стр. 148]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 6 (до 18.02)===&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Пусть мы хотим найти двоичное представление десятичного числа 10&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;. Будем считать, что n --- степень двойки (n = 2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt;).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Pwr2Bin(n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть 1010&lt;br /&gt;
    z = ...&lt;br /&gt;
    вернуть Multiply(z, z)&amp;lt;/source&amp;gt;&lt;br /&gt;
Multiply --- функция, перемножающая два n-битовых двоичных числа x и y по алгоритму Карацубы за O(n&amp;lt;sup&amp;gt;log&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;3&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Пусть мы хотим перевести произвольное десятичное число x в записи которого n=2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; чисел в двоичную систему счисления.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Dec2Bin(x, n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть binary[x]&lt;br /&gt;
    разделить x на два десятичных числа xl и xr из n/2 цифр.&lt;br /&gt;
    вернуть ...&amp;lt;/source&amp;gt;&lt;br /&gt;
Здесь binary --- это массив, содержащий двоичное представление десятичных цифр.&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Докажите, что математическое ожидание времени работы алгоритма быстрой сортировки (усреднение по всем вариантам выбора опорного элемента) на любом входе размера n удовлетворяет соотношению: T(n) ≤ O(n) + 1/n * &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt; (T(i-1) + T(n-i)).&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Найдите решение соотношения из предыдущего пункта.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Динамическое программирование (ДП). Первые примеры (02.01)==&lt;br /&gt;
# Нахождение самой длинной возрастающей подпоследовательности.&lt;br /&gt;
# Нахождение редакционного расстояния (или редакционной стоимости, расстояния Левенштейна).&lt;br /&gt;
# Нахождение представителя большинства.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 7 (до 20.02)===&lt;br /&gt;
* В этом задании везде, где требуется реализовать алгоритм, необходимо привести код на любом языке программирования.&lt;br /&gt;
* Для получения максимальной оценки нужно решить все задачи без звёздочек. Одна решённая задача со звёздочкой заменяет одну задачу без звёздочки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения редакционного расстояния (алгоритм Вагнера — Фишера). Например, редакционное расстояние между словами &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равно 6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения длины наибольшей общей подстроки. Например, длина наибольшей общей подстроки &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равна 8 (&amp;quot;antholog&amp;quot;). Чем больше это значение, тем схожей строки.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Предположим теперь, что сравниваемые строки состоят из символов A, С, G и T; за удаление или вставку мы платим -5; за замену буквы x на y платим w[x, y], где x, y принадлежат множеству {A, С, G, T}, a w — это матрица весов:&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
!-!! A!! G!! C!! T&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! A&lt;br /&gt;
|10||-1||-3||-4&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
!G&lt;br /&gt;
||-1||7||-5||-3&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! C&lt;br /&gt;
||-3||-5||9||0&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! T&lt;br /&gt;
||-4||-3||0||8&lt;br /&gt;
|}&lt;br /&gt;
Тогда выравнивание:&lt;br /&gt;
 AGACTAGTTAC&lt;br /&gt;
 CGA‒‒‒GACGT&lt;br /&gt;
будет иметь следующую оценку:&lt;br /&gt;
 w[A,C] + w[G,G] + w[A,A] + 3*(-5) + w[G,G] + w[T,A] + w[T,C] + w[A,G] + w[C,T] = -3 + 7 + 10 - 3*5 + 7 + (-4) + 0 + (-1) + 0 = 1.&lt;br /&gt;
&lt;br /&gt;
Напишите алгоритм, который находит максимальную стоимость всех возможных выравниваний. Верно ли, что чем больше это значение, тем непохожей строки?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как давно один народ отделился от другого? Кто похожей — итальянец и китаец или якут и эфиоп? На эти вопросы можно отвечать с разных точек зрения — культурной, исторической, лингвистической, ... В последние же годы человечество научилось секвенировать геном, что позволило исследовать этот вопрос с точки зрения генетики. Секвенирование генома — это процесс записи ДНК в виде нуклеотидной последовательности, которая представляет собой последовательность из четырёх символов — A, С, G и T. Существуют базы, которые хранят генетическую информацию о людях из разных стран и континентов, например, [http://www.mtdb.igp.uu.se/ http://www.mtdb.igp.uu.se/ → Download mtDNA sequences]. Чем больше сходство между геномами, тем сильнее родственные связи между их обладателями. Используя решение предыдущего пункта, выполните задания:&lt;br /&gt;
# Определите, кто похожей — итальянец и китаец или якут и эфиоп?&lt;br /&gt;
# Найдите нескольких похожих и нескольких непохожих народностей.&lt;br /&gt;
# * Выберите одну народность. Найдите самых похожих и самых непохожих на неё.&lt;br /&gt;
# * Найдите самые похожие и самые непохожие народности.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Задача о разрезании стержня (05.01)==&lt;br /&gt;
# Постановка задачи.&lt;br /&gt;
# Решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Решение с нахождением максимума по p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Восходящий алгоритм с запоминанием. Вывод длин кусочков стержня. Оценка сложности.&lt;br /&gt;
# Нисходящий алгоритм с запоминанием. Оценка сложности.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.1 Разрезание стержня, стр. 393]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 8 (до 22.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Решая задачу о разрезании стержня мы вначале построили рекурсивное решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt; для всех 1 ≤ i &amp;lt; n. Его сложность описывалась рекуррентной формулой T(n) = n + &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n-1&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt;(T(i) + T(n-i)), T(1) = 1.&lt;br /&gt;
# Объясните эту формулу.&lt;br /&gt;
# Покажите с помощью метода подстановок, что T(n) ≤ 2&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Покажите с помощью контрпримера, что описанная далее жадная стратегия не всегда определяет оптимальный способ разрезания стержня. Определим плотность стержня длиной i как p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;/i, то есть как стоимость единицы его длины. Жадная стратегия для стержня длиной n отрезает от стержня первую часть длиной i, где 1 ≤ i ≤ n, имеющую максимальную плотность. Затем та же жадная стратегия применяется к оставшейся части длиной n-i.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Рассмотрим модификацию задачи разрезания стержня, в которой в дополнение к цене p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; каждого стержня добавляется фиксированная цена разреза c. Теперь прибыль, связанная с решением, представляет собой сумму цен частей стержня минус стоимость разрезов. Разработайте алгоритм динамического программирования для этой модифицированной задачи.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Непрерывным участком называется группа подряд идущих элементов. Например, для последовательности&lt;br /&gt;
 5, 15, −30, 10, −5, 40, 10&lt;br /&gt;
элементы 15, −30, 10 образуют непрерывный участок, а 5, 15, 40 -- нет. Постройте линейный алгоритм для следующей задачи:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Вход: список чисел a1, a2, ... ‌, an.&lt;br /&gt;
Выход: непрерывный участок с максимальной суммой (сумма участка нулевой длины равна нулю).&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Для приведённого примера ответом будет 10, −5, 40, 10 с суммой 55. Какова сложность алгоритма? Почему?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Надо заплатить v рублей, имея купюры в x1, x2, ‌..., xn рублей (купюр каждого типа сколько угодно). Это не всегда возможно (скажем, купюрами в&lt;br /&gt;
10 и 25 рублей можно заплатить 45 рублей, но не 47 и не 15). Постройте основанный на методе динамического программирования алгоритм со временем работы O(nv), выясняющий, возможна ли уплата.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как решить предыдущую задачу, если каждая купюра имеется в единственном экземпляре? (Например, купюрами в 1, 5, 10, 20 рублей можно заплатить 16 = 1 + 5 + 10 и 31 = 1 + 10 + 20 рублей, но не 40 (не хватит денег). Время работы алгоритма по-прежнему O(nv).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Ещё один вариант той же задачи: купюр каждого типа сколько угодно, но всего разрешается использовать не более k купюр. (Например, если есть купюры в 5 и 10 рублей, а k = 6, то 55 разменять можно, а 65 –– нет).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Перемножение цепочки матриц. Оптимальное бинарное дерево поиска (начало) (09.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о перемножении цепочки матриц. Постановка задачи.Пример. Нисходящий алгоритм.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.2 Перемножение цепочки матриц, стр. 403]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 9 (до 24.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Найдите оптимальную расстановку скобок в произведении последовательности матриц, размерности которых равны 5×10, 10×3, 3×12, 12×5, 5×50, 50×6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Напишите восходящий алгоритм для поиска оптимальной расстановки скобок.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Расстановка пробелов. Оптимальное бинарное дерево поиска (середина) (12.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о расстановке пробелов. Постановка задачи. Решения для трёх случаев: 1. нужно вернуть можно ли разбить текст на слова; 2. вернуть разбивку на слова; 3. слова встречаются не равновероятно, вернуть наиболее вероятную разбивку на слова.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи. Вывод математического ожидания времени поиска.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Праздничное домашнее задание 10 (до 02.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[&amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;,&amp;quot;, &amp;quot;.&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;,&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;.&amp;quot;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Подсказка:&#039;&#039;&#039; разбейте текст на слова из списка и посмотрите на азбуку Морзе.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Способы представления графов в памяти (16.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Разбор ошибок в домашнем задании.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Графы. Способы представления графов в памяти (матрица смежности, список рёбер, список соседей (список смежностей), матрица инцидентности). Зависимость сложности алгоритмов от способа представления.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §22.1 Представление графов, стр. 626]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 11 (до 02.03)===&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача A.]&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача B.]&lt;br /&gt;
# Нарисуйте неориентированный граф с 5 вершинами и 8 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Нарисуйте ориентированный граф с 4 вершинами и 3 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Дан ориентированный граф. &#039;&#039;Исходящая степень вершины v&#039;&#039; --- это количество исходящих из неё рёбер, &#039;&#039;входящая степень v&#039;&#039; --- это количество рёбер входящих в  v. Имеется представление ориентированного графа с использование списка соседей. Как долго будут вычисляться исходящие степени всех вершин графа? А входящие степени?&lt;br /&gt;
# Дан граф G = (V, E). Какие из рассмотренных способов хранения графов используют меньше всего памяти для хранения G и почему? Указание: рассмотрите случаи |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;lt; |E| и |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;gt; |E|.&lt;br /&gt;
# Пусть C --- это матрица смежности графа G.&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
# Пусть B --- это матрица инцидентности ориентированного графа G. Как связаны элементы матрицы BB&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
&lt;br /&gt;
==Реализация поиска в глубину (19.02)==&lt;br /&gt;
# Реализация поиска в глубину и смежных задач.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 12 (до 5.03)===&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Выберите любой способ хранения графа. Реализуйте поиск в глубину.&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Напишите алгоритм, который возвращает данные о том, какие вершины лежат в одной компоненте связности.&lt;br /&gt;
# &#039;&#039;(любой ЯП или псевдокод)&#039;&#039; Напишите алгоритм проверки сильной связности ориентированного графа. Какова его сложность?&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №2==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
Необходимо реализовать 3 задачи из [https://official.contest.yandex.ru/contest/1085 контеста], см. [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing распределение задач]. Каждую задачу можно написать на С++ или Python. На выполнение работы отводится две недели (см. время окончания контеста). [https://official.contest.yandex.ru/contest/1123 Дорешивание.]&lt;br /&gt;
&lt;br /&gt;
==ДП и графы (26.02)==&lt;br /&gt;
==ДП и графы (02.03)==&lt;br /&gt;
==Жадные алгоритмы (12.03)==&lt;br /&gt;
===Домашнее задание 13 (до 23.03)===&lt;br /&gt;
# Вася хочет купить по одной акции каждой компании. Все акции стоят одинаково, но дорожают по-разному. Каждый месяц акция i-ой компании дорожает в r_i раз. В один месяц можно купить только одну акцию.&lt;br /&gt;
## Напишите алгоритм, который выводит оптимальную последовательность покупок (такую, что на покупку всех акций потратится меньше денег).&lt;br /&gt;
## Докажите корректность алгоритма, то есть докажите, что последовательность покупок, которую выводит ваш алгоритм, оптимальна.&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список, очередь (16.03)==&lt;br /&gt;
# Реализация линейного двусвязного списка (С++).&lt;br /&gt;
# Реализация очереди ограниченной длины на базе вектора (С++).&lt;br /&gt;
# Реализация очереди на базе списка (С++).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14 (до 23.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте (на С++) структуру данных Стек. У стека должно быть три операции:&lt;br /&gt;
* push --- положить элемент на вершину стека;&lt;br /&gt;
* pop --- удалить верхний элемент;&lt;br /&gt;
* front --- вернуть значение верхнего элемента.&lt;br /&gt;
Оцените время работы каждой функции.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список (19.03)==&lt;br /&gt;
===Домашнее задание 13* (до 30.03)===&lt;br /&gt;
#Для приведённой реализации класса List (https://yadi.sk/i/c5r_79WdfMyNS).&lt;br /&gt;
## Допишите print, push_back и push_front.&lt;br /&gt;
## В функции insert_after и delete_node вставьте необходимые проверки так, чтобы они работали для крайних случаев.&lt;br /&gt;
## Напишите main в котором&lt;br /&gt;
### создаётся объект класса List, &lt;br /&gt;
### заполняется элементами с помощью функций push_back, push_front и insert_after и&lt;br /&gt;
### удаляется i-ый элемент.&lt;br /&gt;
&lt;br /&gt;
==Повторение (30.03)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Для данных пар функций выясните их связь в терминах O-, o-, Ω-, ω-, Θ-обозначений. Поставьте галочку в клетке с Ω, если f(x) = Ω(g(x)) и прочерк, если равенства нет. [https://ru.wikipedia.org/wiki/«O»_большое_и_«o»_малое#.D0.94.D1.80.D1.83.D0.B3.D0.B8.D0.B5_.D0.BF.D0.BE.D0.B4.D0.BE.D0.B1.D0.BD.D1.8B.D0.B5_.D0.BE.D0.B1.D0.BE.D0.B7.D0.BD.D0.B0.D1.87.D0.B5.D0.BD.D0.B8.D1.8F Википедия]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! f(x)!! g(x)!! O!! o!! Ω!! ω!! Θ&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! 2^100&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n * log(n)&lt;br /&gt;
! 2^100 * n * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n&lt;br /&gt;
! 2^100 * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n!&lt;br /&gt;
! 2^(2015n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n*2^n&lt;br /&gt;
! 3^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 5^n&lt;br /&gt;
! 5^(n+1)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n + n^2 + n^3 + ... + n^1000&lt;br /&gt;
! 7^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм Quickselect нахождения k-ого элемента по возрастанию: http://en.wikipedia.org/wiki/Quickselect&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;На улице стоит ряд домов. В каждом из домов лежит сколько-то денег. Вор хочет обокрасть дома на переулке. Он не может обокрасть два соседних дома, потому что хозяин дома, который он обокрал, сразу предупредит соседей. Нужно найти, какую максимальную сумму вор может украсть с переулка. На вход программы подается массив неотрицательных целых чисел - количество долларов в доме с номером i. Соседние дома в массиве представлены соседними элементами. Например, пусть задан массив { 1, 4, 5 } - тогда вор максимум может украсть $6, обокрав дома 1 и 3. Пусть задан массив { 1, 7, 2 } - тогда вор максимум может украсть $7, обокрав дом 2.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Алфавит из всех маленьких латинских букв и пробела закодирован числами следующим способом:&lt;br /&gt;
  &#039;a&#039; -&amp;gt; 1&lt;br /&gt;
  &#039;b&#039; -&amp;gt; 2&lt;br /&gt;
  &#039;c&#039; -&amp;gt; 3&lt;br /&gt;
  ...&lt;br /&gt;
  &#039;z&#039; -&amp;gt; 26&lt;br /&gt;
  &#039; &#039; -&amp;gt; 27&lt;br /&gt;
На вход программы подается строка из цифр. Нужно посчитать, сколькими способами можно раскодировать эту строку.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Дан граф, заданный матрицей смежности. Вывести пары вершин между которыми нет пути.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Повторение (02.04) ==&lt;br /&gt;
Решали и разбирали первые 4 задачи из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14* (до 11.03)===&lt;br /&gt;
Решите любые две задачи (подпункты НЕ считаются отдельными задачами) с предыдущей пары (Повторение (30.03)).&lt;br /&gt;
&lt;br /&gt;
== Повторение (06.04) ==&lt;br /&gt;
Будем решать вторую половину задач из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 15 (до 16.04)===&lt;br /&gt;
# Приведите пример графа, который содержит отрицательные рёбра, не содержит циклов отрицательного веса и для которого алгоритм Дейкстры возвращает неверный результат.&lt;br /&gt;
# Используется ли в алгоритме Дейкстры то, что веса рёбер неотрицательны? Если &amp;quot;да&amp;quot;, то где именно?&lt;br /&gt;
# Пусть граф содержит рёбра с весами &amp;gt;= -100. Если прибавить к каждому ребру 101 и при помощи алгоритма Дейкстры найти кратчайшие пути. Будут ли эти пути кратчайшими в исходном графе? Почему?&lt;br /&gt;
&lt;br /&gt;
== Повторение (07.04) ==&lt;br /&gt;
&#039;&#039;&#039;Решение рекуррентных соотношений&#039;&#039;&#039;&lt;br /&gt;
# Решите уравнение: T(n) = 4*T(n/2) + O(n^2) с базой T(1) = O(1)&lt;br /&gt;
## Используя основную теорему.&lt;br /&gt;
## Используя дерево рекурсий.&lt;br /&gt;
## Методом подстановки.&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2)) + n является \Theta(n lg n).&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2) + 17) + n является \Theta(n lg n).&lt;br /&gt;
# Решите уравнения, считая, что T(1) = O(1):&lt;br /&gt;
## T(n) = T(n-1) + n&lt;br /&gt;
## T(n) = 2*T(floor(sqrt(n))) + lg n. Указание: попробуйте использовать замену переменных.&lt;br /&gt;
## T(n) = 3*T(sqrt(n)) + lg n&lt;br /&gt;
# Дайте верхнюю и нижнюю оценки функции T(n). Постарайтесь, чтобы оценки были как можно более точные&lt;br /&gt;
## T(n) = 4T(n/3) + n*lg(n)&lt;br /&gt;
## T(n) = 3T(n/3) + n/lg(n)&lt;br /&gt;
## T(n) = 4T(n/2) + n^2*sqrt(n)&lt;br /&gt;
## T(n) = T(n/2) + T(n/4) + T(n/8) + n&lt;br /&gt;
## T(n) = T(n-1) + 1/n&lt;br /&gt;
## T(n) = T(n-2) + 1/lg(n)&lt;br /&gt;
## T(n) = sqrt(n) * T(sqrt(n)) + n&lt;br /&gt;
&#039;&#039;&#039;Анализ и построение алгоритмов&#039;&#039;&#039;&lt;br /&gt;
# Числа Фибоначчи F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; можно выразить через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, используя матрицу: https://yadi.sk/i/Pm_aNzHCforFU. &lt;br /&gt;
## Покажите как вычислить F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;.&lt;br /&gt;
## Как вычислить F&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;n+1&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;?&lt;br /&gt;
## Напишите алгоритм.&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
## Ускорьте его так, чтобы он работал за O(log n).&lt;br /&gt;
# Дана последовательность символов. Какое минимальное количество символов нужно удалить из неё, чтобы получить палиндром?&lt;br /&gt;
## Напишите алгоритм (на псевдокоде или на любом языке программирования).&lt;br /&gt;
## Оцените время работы алгоритма.&lt;br /&gt;
# Какую структуру данных вы бы использовали для реализации упорядоченного множества (http://neerc.ifmo.ru/wiki/index.php?title=Упорядоченное_множество)? Какая будет сложность каждой из операций над множеством?&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 16 (до 20.04)===&lt;br /&gt;
# Решите 6 задач из первой части и 6 из второй. (Укажите какие именно.) Каждый из подпунктов является отдельной задачей.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм и теорема Форда-Фалкерсона (16.04)==&lt;br /&gt;
# Базовые определения (пропускные способности, сток, исток и пр.). Пример. &lt;br /&gt;
# Ограничения на поток (сохранение и что меньше пропускных способностей).&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, пример работы&lt;br /&gt;
# Разрез, определение, пример.&lt;br /&gt;
# Утверждение: максимальный поток &amp;lt;= любого разреза.&lt;br /&gt;
# Теорема Форда-Фалкерсона (с доказательством).&lt;br /&gt;
# Пример на котором алгоритм Форда-Фалкерсонаработает работает очень долго при неудачном выборе путей.&lt;br /&gt;
# Сложность алгоритма Форда-Фалкерсона.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №3==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
В [https://official.contest.yandex.ru/contest/1196 домашнем задании] пять задач. Они разделены на два варианта, помеченные римскими цифрами I и II. Свой вариант нужно узнать [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing здесь на вкладке HW3]. Третья задача — общая для двух вариантов; ее решение необходимо снабдить доказательством корректности алгоритма. На выполнение задания дается примерно 2 недели (см. точное время окончания в контесте). Каждую задачу можно написать на С++ или Python.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Форда-Фалкерсона и Эдмондса-Карпа (20.04)==&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, напоминание: базовые определения, пример работы, пример на котором алгоритм работает долго, сложность.&lt;br /&gt;
# Алгоритм Эдмодса-Карпа. Доказательство асимптотики времени работы.&lt;br /&gt;
&lt;br /&gt;
==(23.04)==&lt;br /&gt;
&lt;br /&gt;
==(11.05) Красно-чёрные деревья==&lt;br /&gt;
[https://ru.wikipedia.org/wiki/Красно-чёрное_дерево Красно-чёрное дерево]&lt;br /&gt;
===Домашнее задание 17 (до 18.05)===&lt;br /&gt;
# Зачем нужны красно-чёрные деревья?&lt;br /&gt;
# Благодаря какому свойству и почему красно-чёрное дерево является сбалансированным?&lt;br /&gt;
# Нарисуйте полное бинарное дерево поиска высотой 3 с ключами {1, 2, ..., 15}. Сделайте из него красно-чёрные деревья высотой 2, 3 и 4.&lt;br /&gt;
# Нарисуйте красно-чёрные деревья, получающиеся последовательной вставкой элементов 12, 10, 29, 30, 31, 32 в [https://ru.wikipedia.org/wiki/Красно-чёрное_дерево#/media/File:Red-black_tree_example.svg данное дерево]. Для вставки используйте алгоритм вставки из Википедии. Укажите какой именно функцией вы воспользовались.&lt;br /&gt;
# Определим &#039;&#039;&#039;ослабленное красно-чёрное дерево&#039;&#039;&#039; как бинарное дерево поиска, которое удовлетворяет красно-чёрным свойствам 1, 3, 4 и 5. Другими словами, корень может быть как чёрным, так и красным. Рассмотрите ослабленное красно-чёрное дерево T, корень которого красный. Если перекрасить корень дерева T в чёрный, будет ли оно красно-чёрным деревом?&lt;br /&gt;
# Покажите, что самый длинный простой нисходящий путь от вершины x к листу красно-черного дерева имеет длину, не более чем в два раза превышающую кратчайший путь от x к листу-потомку.&lt;br /&gt;
# Чему равно наибольшее возможное количество внутренних узлов в красно-чёрном дереве с чёрной высоты k? А наименьшее возможное количество?&lt;br /&gt;
# Нарисуйте красно-чёрные деревья, получающиеся последовательной вставкой ключей 41, 38, 31, 12, 19, 8 в изначально пустое дерево.&lt;br /&gt;
# Покажите какие деревья будут получаться в результате последовательного удаления ключей в порядке 8, 12, 19, 31, 38, 41.&lt;br /&gt;
&lt;br /&gt;
==(14.05) Конкурентный анализ самоорганизующихся циклов==&lt;br /&gt;
[https://vk.com/doc12518218_390369758 Лекция]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 18 (до 21.05)===&lt;br /&gt;
Все вычисления сопроводите подробными объяснениями о том, почему верно то или иное (не)равенство.&lt;br /&gt;
# Пусть имеется n-элементный список и m поисковых запросов к нему. После каждой операции поиска можно переупорядочить список. Обозначим стоимость последовательности поисков через C. Докажите, что в худшем случае C = Ω(mn).&lt;br /&gt;
#  Обозначим через c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; стоимость i-ого поискового запроса с применением эвристики перемещения в начало, которая включает стоимость поиска элемента в списке и стоимость его перемещения в начало списка путём ряда обменов соседних элементов списка. Покажите, что i-ая операция поиска находит элемент x в списке L с применением эвристики перемещения в начало, то c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = 2 * rank&amp;lt;sub&amp;gt;L&amp;lt;/sub&amp;gt;(x) - 1.&lt;br /&gt;
# Покажите, что c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = 2 * rank&amp;lt;sub&amp;gt;L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) - 1.&lt;br /&gt;
# Покажите, что c*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = rank&amp;lt;sub&amp;gt;L*&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) + t&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;.&lt;br /&gt;
# Докажите, что после одного обмена двух соседних элементов потенциал либо увеличивается на 2, либо уменьшается на 2.&lt;br /&gt;
# Докажите, что rank&amp;lt;sub&amp;gt;L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) = |A| + |B| + 1.&lt;br /&gt;
# Докажите, что rank&amp;lt;sub&amp;gt;L*&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) = |A| + |С| + 1.&lt;br /&gt;
# Покажите, что поиск i-ого элемента приводит к изменению потенциала Ф(L&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;) - Ф(L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;) &amp;lt;= 2 (|A| - |B| + t*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;), где t*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; --- это количество обменов при i-ом поиске.&lt;br /&gt;
# Во сколько раз стоимость С&amp;lt;sub&amp;gt;MFT&amp;lt;/sub&amp;gt;(S) превышает C&amp;lt;sub&amp;gt;OPT&amp;lt;/sub&amp;gt;(S)?&lt;br /&gt;
&lt;br /&gt;
== (18.05) Конечные автоматы ==&lt;br /&gt;
=== Задание 19 (до 25.05) ===&lt;br /&gt;
# Постройте автомат для языка над алфавитом Σ = {0, 1} каждое слово которого содержит хотя бы два нуля. Является ли он детерминированным?&lt;br /&gt;
# Постройте автомат над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5. Является ли он детерминированным?&lt;br /&gt;
# Постройте автомат, который допускает пустой язык (язык в котором нет ни одного слова).&lt;br /&gt;
# Постройте автомат, который допускает все слова над алфавитом Σ.&lt;br /&gt;
# Постройте ДКА над алфавитом Σ = {К, Ж, З}, который допускает слова в которых после К идёт З, после З --- Ж, после Ж --- К.&lt;br /&gt;
# * Постройте ДКА над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5, а число нулей на 3.&lt;br /&gt;
# Постройте НКА для языка над алфавитом Σ = {0, 1, 2, 3}, состоящий из слов, в которых хотя бы одна из последних пяти букв является 1.&lt;br /&gt;
# Постройте НКА над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5, а число нулей на 3.&lt;br /&gt;
# Какие языки допускают автоматы https://yadi.sk/d/fNAHbjCZghERG?&lt;br /&gt;
# Для каждого из автоматов https://yadi.sk/d/fNAHbjCZghERG постройте соответствующий ему ДКА.&lt;br /&gt;
&lt;br /&gt;
== (21.05) Регулярные выражения, КА, их эквивалентность. Лемма о накачке  ==&lt;br /&gt;
=== Задание 20 (до 28.05) ===&lt;br /&gt;
&#039;&#039;&#039;I Написать регулярные выражения&#039;&#039;&#039;&lt;br /&gt;
# Напишите регулярное выражение для языка над алфавитом Σ = {0, 1} каждое слово которого содержит хотя бы два нуля.&lt;br /&gt;
# Напишите регулярное выражение над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5.&lt;br /&gt;
# Напишите регулярное выражение, которое допускает пустой язык (язык в котором нет ни одного слова).&lt;br /&gt;
# Напишите регулярное выражение, которое допускает все слова над алфавитом Σ.&lt;br /&gt;
# Напишите регулярное выражение для языка над алфавитом Σ = {0, 1, 2, 3}, состоящий из слов, в которых хотя бы одна из последних пяти букв является 1.&lt;br /&gt;
&#039;&#039;&#039;II КА и регулярные выражения&#039;&#039;&#039;&lt;br /&gt;
# Постройте конечный автомат для языка (111 U 01)&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;1(00 U 11)&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;.&lt;br /&gt;
# Постройте конечный автомат для языка (ab)&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;(a U b)(b U a)&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;(a U bab).&lt;br /&gt;
&#039;&#039;&#039;III Доказать замкнутость относительно различных операций&#039;&#039;&#039;&lt;br /&gt;
# Покажите, что если для языков L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; и L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; существует КА, который их читает, то существует КА и для их объединения L = {w | w ∈ L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; или w ∈ L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;}.&lt;br /&gt;
# Покажите, что если для языка L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; и L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; существует КА, который их читает, то существует КА и для языка L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; = {xy | x ∈ L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, y ∈ L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;}.&lt;br /&gt;
# Покажите, что если для языка L существует КА, который его читает, то существует КА и для &#039;&#039;&#039;замыкания Клини&#039;&#039;&#039; L* = {w&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; w&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; ... w&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;| w&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; ∈ L, w&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; ∈ L, ..., w&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; ∈ L}.&lt;br /&gt;
# Покажите, что если язык L регулярен, то регулярно его дополнение (т.е. язык над тем же алфавитом, которому принадлежит слово тогда и только тогда, когда оно НЕ принадлежит L) .&lt;br /&gt;
# Покажите, что если язык L регулярен, то регулярно его обращение L&amp;lt;sub&amp;gt;R&amp;lt;/sub&amp;gt; = {a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; . . . a&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; | a&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; . . . a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; ∈ L}. (L&amp;lt;sub&amp;gt;R&amp;lt;/sub&amp;gt; --- это язык в котором все слова языка L записаны наоборот.)&lt;br /&gt;
# * Покажите, что если языки L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; и L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; регулярны, то регулярно их пересечение.&lt;br /&gt;
&#039;&#039;&#039;IV Использование леммы о накачке&#039;&#039;&#039; (см. [https://vk.com/doc12518218_392750846 конспект])&lt;br /&gt;
# Докажите, что не существует КА, который бы читал язык {0&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;1&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;2&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;}. (Пояснение: запись 0&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; означает строку из n нулей: 00...0.)&lt;br /&gt;
# Докажите, что не существует КА, который бы читал язык {0&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;1&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;}.&lt;br /&gt;
# Докажите, что не существует КА, который бы читал язык {0&amp;lt;sup&amp;gt;n!&amp;lt;/sup&amp;gt;}.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== (25.05) Автоматный подход ==&lt;br /&gt;
=== Задание 21 (до 01.06) ===&lt;br /&gt;
Реализуйте один из следующих проектов:&lt;br /&gt;
# Программа, которая считывает строку и говорит принадлежит ли она языку 0(123)*(00 U (231)*) U 111.&lt;br /&gt;
# Программа, которая считывает КА и генерирует программу на языке С++, которая говорит принадлежит ли заданное слово языку, описываемому этим КА.&lt;br /&gt;
# Программа, которая считывает регулярное выражение и строку и говорит принадлежит ли слово языку, описываемому этим регулярным выражением.&lt;br /&gt;
# Программа, которая моделирует работу банкомата, автомата с газировкой, лифта... (что-то одно на выбор)&lt;br /&gt;
# Текстовый симулятор студента. Возможные состояния: на паре, дома, есть приглашение прогулять, завтра коллоквиум, сплю и др. Есть два параметра: успеваемость и весёлось. Если хотя бы один из них упадёт ниже критической отметки, студент умрёт. Игрок принимает решение куда идти студенту. Цель: продержаться как можно дольше.&lt;br /&gt;
&lt;br /&gt;
== Большое домашнее задание 4 ==&lt;br /&gt;
[https://official.contest.yandex.ru/contest/1259 Контест]. В домашнем задании четыре задачи. Обязательны первые три. Вместо одной из первых трёх можно сделать последнюю (только для первых 10 решивших 4-ую!). На выполнение задания даётся примерно 2 недели (см. точное время окончания в контесте). Условия ревью определяют семинаристы.&lt;br /&gt;
&lt;br /&gt;
== (01.06) P vs NP ==&lt;br /&gt;
&#039;&#039;&#039;План занятия&#039;&#039;&#039;&lt;br /&gt;
# Напоминание: P; NP; проблема P ?= NP; NPC; сведения; пример сведений.&lt;br /&gt;
&lt;br /&gt;
=== Задание 22 (до 8.06) ===&lt;br /&gt;
1. Задачи о гамильтоновом цикле и о гамильтоновом пути.&lt;br /&gt;
  Задачи о гамильтоновом цикле:&lt;br /&gt;
  Дан граф. Необходимо найти цикл, проходящий через каждую вершину по одному разу.&lt;br /&gt;
&lt;br /&gt;
  Задачи о гамильтоновом пути:&lt;br /&gt;
  Дан граф и две его вершины s и t. Необходимо найти путь из s в t, проходящий через каждую вершину по одному разу.&lt;br /&gt;
&lt;br /&gt;
Покажите, что задача поиске гамильтонова цикл сводится к задаче поиска гамильтонова пути. Из этого будет следовать, что искать цикл не проще, чем искать путь.&lt;br /&gt;
&lt;br /&gt;
2. &#039;&#039;Задачи поиска&#039;&#039; и &#039;&#039;задачи оптимизации&#039;&#039;. Для задачи коммивояжёра варианты с поиском и оптимизацией выглядят так:&lt;br /&gt;
  Задача поиска:&lt;br /&gt;
  &#039;&#039;Вход:&#039;&#039; матрица расстояний, бюджет b&lt;br /&gt;
  &#039;&#039;Выход:&#039;&#039; цикл веса не более b, проходящий по всем вершинам графа, если такой есть.&lt;br /&gt;
&lt;br /&gt;
  Оптимизационная задача:&lt;br /&gt;
  &#039;&#039;Вход:&#039;&#039; матрица расстояний&lt;br /&gt;
  &#039;&#039;Выход:&#039;&#039; цикл минимального веса, проходящий по всем вершинам графа, если такой есть.&lt;br /&gt;
&lt;br /&gt;
Покажите, что если поисковую задачу коммивояжёра можно решить за полиномиальное время, то и оптимизационный вариант можно решить за полиномиальное время.&lt;br /&gt;
&lt;br /&gt;
3. &#039;&#039;Задача поиска&#039;&#039; и &#039;&#039;задача разрешения&#039;&#039;. Пусть имеется программа, которая за полиномиальное время отвечает на вопрос , содержит л входной граф гамильтонов цикл. Как с её помощью найти за полиномиальное время сам цикл (есть он есть)?&lt;br /&gt;
&lt;br /&gt;
4. Для задач ниже или приведите алгоритм, работающий за полиномиальное время, или сведите их к NP-полной задаче:&lt;br /&gt;
# Поиск самого длинного пути&lt;br /&gt;
# Поиск кратчайшего пути&lt;br /&gt;
# Двудольное паросочетание&lt;br /&gt;
# Трёхдольное паросочетание&lt;br /&gt;
# Четырёхдольное паросочетание&lt;/div&gt;</summary>
		<author><name>Kassalanche</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=16697</id>
		<title>Алгоритмы и структуры данных. Подгруппа 105-1</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=16697"/>
		<updated>2015-06-01T06:21:16Z</updated>

		<summary type="html">&lt;p&gt;Kassalanche: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==О курсе==&lt;br /&gt;
[[Алгоритмы_и_структуры_данных|План лекций и список рекомендуемой литературы.]]&lt;br /&gt;
&lt;br /&gt;
[[Алгоритмы_и_структуры_данных._Подгруппа_105-1._FAQ|FAQ.]]&lt;br /&gt;
&lt;br /&gt;
[[Reviewboard|Инструкция по использованию Reviewboard.]]&lt;br /&gt;
&lt;br /&gt;
[[Практические_занятия_по_курсу_ОиМП/C++_check|Style guide.]]&lt;br /&gt;
&lt;br /&gt;
==Итоговая оценка за курс==&lt;br /&gt;
Итоговая оценка (ИО) зависит от&lt;br /&gt;
* оценок за пять больших домашних заданий (БДЗ1, БДЗ2, ..., БДЗ5),&lt;br /&gt;
* оценок за домашние задания (ДЗ1, ДЗ2, ...),&lt;br /&gt;
* оценки за контрольную работу (КР),&lt;br /&gt;
* оценки за экзамен (ЭКЗ),&lt;br /&gt;
и может быть вычислена по формуле:&lt;br /&gt;
 ИО = 0.7 * (0.3 * КР + 0.7 *(ИДЗ1 + ИДЗ2 + ИДЗ3 + ИДЗ4 + ИДЗ5)/5) + 0.3 * ЭКЗ =&lt;br /&gt;
    = 0.21*КР + 0.098*ИДЗ1 + 0.098*ИДЗ2 + 0.098*ИДЗ3 + 0.098*ИДЗ4 + 0.098*ИДЗ5 + 0.3*ЭКЗ,&lt;br /&gt;
где&lt;br /&gt;
 ИДЗi = min (10, 0.7 * БДЗi + 0.4 * &amp;lt;cредняя оценка за ДЗj, прошедшие с предыдущего БДЗ по i-ое&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
==Порядок сдачи домашних работ==&lt;br /&gt;
===Большие домашние работы===&lt;br /&gt;
# Получить OK за задачу в контесте.&lt;br /&gt;
# Залить исходный код на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* На каждую задачу создавайте отдельный запрос на ревью. &lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении суток приходят замечания к коду. &#039;&#039;&#039;Если в течении суток замечаний или Ship It не появилось, проверьте, что вы правильно отправили запрос и, если всё сделано правильно, спросите у семинариста получил ли он запрос.&#039;&#039;&#039;&lt;br /&gt;
# Вы их исправляете, проверяете в контесте, что программа по-прежнему проходит все тесты, заливаете новую версию в Review Board. Штрафов за посылки НЕ будет.&lt;br /&gt;
# Процесс повторяется пока остаются замечания к коду или пока не истёк дедлайн. После закрытия контеста будут ещё одни сутки на доработку замечаний в Review Board.&lt;br /&gt;
# Оценивается только последняя версия работы в Review Board.&lt;br /&gt;
&lt;br /&gt;
===Маленькие домашние работы===&lt;br /&gt;
# Залить решение на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* Желаемые форматы: txt, py, cpp, h. Допускаются любые другие.&lt;br /&gt;
#* На каждую домашнюю работу создавайте отдельный запрос на ревью. Обязательно указывайте номер домашней работы.&lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении неопределенного промежутка времени придут оценки по каждому из заданий.&lt;br /&gt;
&lt;br /&gt;
==Оценивание домашних работ==&lt;br /&gt;
* Все задания предполагаются индивидуальными. Запрещены любые заимствования без ссылки на автора.&lt;br /&gt;
* Решения после установленного дедлайна не принимаются. Дедлайн указан в заголовке каждого задания.&lt;br /&gt;
* Везде, где требуется написать алгоритм, можно использовать любой язык программирования или псевдокод.&lt;br /&gt;
* Там, где требуется построить алгоритм с заданной асимптотикой, приведите обоснование, что полученный алгоритм удовлетворяет этому условию.&lt;br /&gt;
* Эти правила не действуют, если в задании явно оговорено иное.&lt;br /&gt;
&lt;br /&gt;
==Мотивация к изучению алгоритмов. Подсчёт числа операций (12.01)==&lt;br /&gt;
# Числа Фибоначчи. Определение. Примитивный рекурсивный алгоритм вычисления i-ого числа. Оценка числа операций. Анализ причин неэффективности. Алгоритм с запоминанием вычисленных ранее значений. Оценка числа операций. Сравнение с предыдущим. (подробнее: глава 0, страницы 8-10 из книги &amp;lt;&amp;lt;Алгоритмы&amp;gt;&amp;gt;, [[Алгоритмы_и_структуры_данных|см. список рекомендованной литературы]])&lt;br /&gt;
# Задача о ханойской башне. Постановка задачи. Рекурсивный алгоритм. Рекуррентная формула для числа перемещений. Замкнутая формула для числа перемещений (+ доказательство). Доказательство того, что эту задачу нельзя решить используя меньшее число перемещений дисков. ([https://www.dropbox.com/s/t8cbs7ttu4iasvj/algo-0-recursion.pdf?dl=0 Разбор задачи о ханойской башне], автор Сергей Объедков)&lt;br /&gt;
# Сортировка пузырьком. Алгоритм. Подсчёт количество операций сравнения и обмена (swap). Анализ наилучшего и наихудшего случаев ([https://ru.wikipedia.org/wiki/Сортировка_пузырьком Википедия])&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 1 (12.01 - 26.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
Во всех задачах, если не оговорено иного, предполагаем, что работаем с целыми неотрицательными числами. Для первых 7 задач необходимо&lt;br /&gt;
* описать что можно считать наилучшим и наихудшим случаями,&lt;br /&gt;
* для каждого из двух случаев подсчитать отдельно количество операций сравнения и swap (если есть).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Даны три числа, требуется вернуть наименьшее.&lt;br /&gt;
# Даны три числа, требуется отсортировать их.&lt;br /&gt;
# Дана последовательность A из n элементов и число x, требуется найти элемент равный x. Примечание: если таких значений i несколько, вернуть любое; если такого элемента нет, функция должна сообщить об этом.&lt;br /&gt;
# * Дана упорядоченная последовательность A из n элементов и число x, требуется найти такое i, что A[i] равно x. Алгоритм должен быть эффективней, чем в предыдущем пункте и использовать то, что последовательность упорядочена.&lt;br /&gt;
# Дана последовательность из 100 000 чисел от 0 до 100. Напишите эффективный алгоритм сортировки, который бы учитывал специфику входных данных.&lt;br /&gt;
# * Дано 32 битное неотрицательное число. Требуется номер первого ненулевого бит. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения, считая, что числа распределены равномерно.&lt;br /&gt;
# * Даны 32 битные неотрицательные числа m и n. Требуется вывести True, если m &amp;lt; n, иначе False. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения битов, считая, что числа распределены равномерно.&lt;br /&gt;
# Напишите рекурсивную функцию, вычисляющую n-ое число Фибоначчи (как на занятии). Подсчитайте количество рекурсивных вызовов.&lt;br /&gt;
# * Напишите функцию, вычисляющую n-ое число Фибоначчи, у которой число операций — полином от n, и которая использует количество памяти, независящее от n.&lt;br /&gt;
&lt;br /&gt;
==O-символика и стратегия &amp;quot;разделяй и властвуй&amp;quot; (15.01)==&lt;br /&gt;
# Сортировка слиянием. Алгоритм, рекуррентное соотношение для времени сортировки, сложность. Подробнее: [https://dl.dropboxusercontent.com/u/829163/draft.pdf §2.3 Сортировка слиянием (стр. 54)].&lt;br /&gt;
# О-символика. [https://dl.dropboxusercontent.com/u/829163/draft.pdf §0.3 О-символика (стр. 10)].&lt;br /&gt;
# Задача о слиянии m упорядоченных массивов по n элементов. Три алгоритма решения: последовательное слияние, слияние &amp;quot;деревом&amp;quot; (обе функции используют Merge из MergeSort), аналог Merge для m массивов. Анализ сложности каждого из них.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 2 (15.01-29.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
* Во всех задачах, если не оговорено иного, для простоты &#039;&#039;можно&#039;&#039; считать, что n является степенью какого-либо числа, например, степенью двойки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Дана функция F, определённая ниже. Сколько строк она напечатает? Указание: для обоих подпунктов рассмотрите два случая: 1. n является степенью двойки, 2. n не является степенью двойки.&lt;br /&gt;
## Запишите рекуррентное соотношение для числа строк.&lt;br /&gt;
## Решите уравнение, полученное в предыдущем пункте, то есть, выведите замкнутую (нерекуррентную формулу). Для простоты можно считать, что n является степенью двойки.&lt;br /&gt;
# В массиве A размера n записана возрастающая последовательность целых чисел. Постройте алгоритм типа &amp;quot;разделяй и властвуй&amp;quot;, который проверяет, существует ли такой индекс i, что A[i] = i&lt;br /&gt;
## за время O(n),&lt;br /&gt;
## * за время O(log n).&lt;br /&gt;
## Какие случаи для вашего алгоритма являются наихудшими и наилучшими? Какого время работы в лучшем и худшем случаях?&lt;br /&gt;
# Дан бесконечный массив A, первые n элементов которого содержат возрастающую последовательность положительных чисел, а дальше стоят -1. Значение n не дано. Постройте алгоритм, который получает на вход целое число x и находит это x в массиве --- или говорит, что там его нет, &lt;br /&gt;
## за время O(n),&lt;br /&gt;
## за время O(log n).&lt;br /&gt;
# Рассмотрим алгоритм вычисления наибольшего общего делителя (НОД) двух положительных чисел, основанный на методе &amp;quot;разделяй и властвуй&amp;quot;.&lt;br /&gt;
## (задание не оценивается) Прочитайте [https://dl.dropboxusercontent.com/u/829163/draft.pdf §1.2.3 Алгоритм Евклида (стр. 23)].&lt;br /&gt;
## * Докажите, что определение НОД-а, приведённое ниже, корректно.&lt;br /&gt;
## Постройте алгоритм, основанный на этом определении.&lt;br /&gt;
## Какой алгоритм будет быстрее для n-битовых чисел a и b при больших значениях n --- ваш или алгоритм Евклида?&lt;br /&gt;
# * Покажите как за время O(n log n) удалить из массива размера n все дубликаты, то есть оставить каждый элемент в одном экземпляре.&lt;br /&gt;
# * Даны два упорядоченных массива размера m и n. Постройте алгоритм, находящий k-й по величине элемент в объединении этих массивов за время O(log(n+m)). &lt;br /&gt;
&lt;br /&gt;
Функция F(n).&lt;br /&gt;
  если n &amp;gt; 1:&lt;br /&gt;
    напечатать &amp;quot;всё ещё работаю&amp;quot;&lt;br /&gt;
    F(n/2)&lt;br /&gt;
    F(n/2)&lt;br /&gt;
&lt;br /&gt;
Определение НОД-а.&lt;br /&gt;
             2НОД(a/2, b/2), если а и b чётны,&lt;br /&gt;
  НОД(a,b) = НОД(a, b/2), если а нечётно, b чётно,&lt;br /&gt;
             НОД((a-b)/2, b), если а и b нечётны.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;lt;nowiki&amp;gt;Задачи взяты из книги &amp;quot;Алгоритмы&amp;quot;, глава 2 (см. список рекомендованной литературы).&amp;lt;/nowiki&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Сложение и умножение (19.01)==&lt;br /&gt;
# Алгоритм сложения, его сложность (§1.1.1 Сложение*)&lt;br /&gt;
# &amp;quot;Школьный&amp;quot; алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Рекурсивный алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Алгоритм умножения, реализующий стратегию &amp;quot;разделяй и властвуй&amp;quot;, анализ сложности (§2.1 Умножение чисел*)&lt;br /&gt;
 * [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать.]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 3 (19.01 - 2.02)===&lt;br /&gt;
* Во всех задачах для простоты можно считать, что n является степенью какого-либо числа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Найдите произведение чисел 10011011 и 10111010 (в двоичной системе счисления), используя алгоритм умножения чисел, основанный на методе «разделяй и властвуй». Необходимо не только дать ответ, но и привести ход решения.&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 3 рекурсивных вызова для подзадач размера n-1 и комбинирует из них решение исходной задачи за О(n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте три верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 10 рекурсивных вызовов для подзадач размера n/2 и комбинирует из них решение исходной задачи за О(5n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте два верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Докажите, что 3m² + m = O(m²).&lt;br /&gt;
# Докажите, что lg m = O(m/1000), где lg m — это логарифм с двоичным основанием.&lt;br /&gt;
# Докажите, что из равенства f(n) = O(g(n)) не следует, что g(n) = O(f(n)).&lt;br /&gt;
# Докажите, что O(m) содержится в O(m²).&lt;br /&gt;
&lt;br /&gt;
==Решение рекуррентных уравнений (22.01)==&lt;br /&gt;
# Примеры решений рекуррентных уравнений (см. [https://www.dropbox.com/s/6a0r410zjm9qwe7/algo-3-recurrences.pdf?dl=0 конспект]).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 4 (до 14.02)===&lt;br /&gt;
* Нельзя использовать утверждение основной теоремы о решении рекуррентных соотношений.&lt;br /&gt;
* &#039;&#039;Можно&#039;&#039; использовать метод построения дерева рекурсии или подстановку (метод с угадыванием ответа).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Какой из трёх приведённых ниже алгоритмов вы бы предпочли? Обоснуйте свой ответ.&lt;br /&gt;
#* Алгоритм A, решая задачу, производит пять рекурсивных вызовов для подзадач вдвое меньшего размера, после чего строит ответ для исходной задачи за линейное время.&lt;br /&gt;
#* Алгоритм B, решая задачу размера n, делает два рекурсивных вызова для задач размера n − 1, после чего находит ответ за время O(1).&lt;br /&gt;
#* Алгоритм C, решая задачу размера n, рекурсивно решает девять задач размера n/3 и строит ответ за время O(n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Найдите T(n) в замкнутой форме для любых 7 из 10 приведённых ниже рекуррентных соотношений:&lt;br /&gt;
## T(n) ≤ 2T(n/3) + 1;&lt;br /&gt;
## T(n) ≤ 7T(n/7) + n;&lt;br /&gt;
## T(n) ≤ 9T(n/3) + n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 8T(n/2) + n&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 49T(n/25) + n&amp;lt;sup&amp;gt;3/2&amp;lt;/sup&amp;gt;log n;&lt;br /&gt;
## T(n) ≤ T(n − 1) + 2;&lt;br /&gt;
## T(n) ≤ T(n − 1) + n&amp;lt;sup&amp;gt;c&amp;lt;/sup&amp;gt;, где c ≥ 1 –– константа;&lt;br /&gt;
## T(n) ≤ T(n − 1) + c&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;, где c &amp;gt; 1 –– константа;&lt;br /&gt;
## T(n) ≤ 2T(n − 1) + 1;&lt;br /&gt;
## T(n) ≤ T(sqrt(n)) + 1.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №1==&lt;br /&gt;
Необходимо реализовать все 6 задач из [https://official.contest.yandex.ru/contest/1002 контеста]. Каждую задачу можно писать на С++ или Python. На выполнение работы отводится две недели. Каждая задача оценивается в 10/6 балла. Оценка &#039;&#039;может&#039;&#039; быть снижена за плохой код, но не более чем на 25%.&lt;br /&gt;
&lt;br /&gt;
==Бинарное дерево поиска (26.01)==&lt;br /&gt;
# Определение. Пример.&lt;br /&gt;
# Не модифицирующие алгоритмы: поиск (рекурсивный и итеративный алгоритмы), поиск минимума, inordered обход (вывод значений узлов в отсортированном порядке), поиск следующего по возрастанию.&lt;br /&gt;
# Модифицирующие алгоритмы: вставка (рекурсивная реализация), удаление (только идея).&lt;br /&gt;
 [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 13, стр. 248]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 5 (до 16.02)===&lt;br /&gt;
* Для получения максимальной оценки можно выполнить или все задачи без звёздочки, или задачу со звёздочкой. Преподаватель понимает, что реализацию БДП сложно не найти в интернете, но от копипасты не будет никакой пользы. Напротив, самостоятельная реализация очень полезна и приветствуется, даже если не получится выполнить всех пунктов задания.&lt;br /&gt;
* Задачи с двумя звёздочками необязательны.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Нарисуйте бинарные деревья поиска высотой 2, 3, 4, 5 и 6 для множества ключей {1, 4, 5, 10, 16, 17, 21}. Корень дерева имеет высоту 0.&lt;br /&gt;
# &#039;&#039;&#039;Сортировка с использованием БДП.&#039;&#039;&#039;&lt;br /&gt;
## Какова асимптотическая сложность алгоритма вставки элемента в дерево высоты d? Почему? Назовите наилучший и наиухдший случаи.&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который строит БДП в узлах которого стоят элементы данной последовательности. Можно использовать функцию Insert. Назовите наилучший и наихудший случаи. Есть теорема о том, что полученный алгоритм будет работать в среднем случае за время O(n * log n).&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который выводит их в порядке возрастания. Используйте бинарное дерево поиска. Какова в среднем случае сложность этого алгоритма? Назовите наилучший и наихудший случаи. Какова сложность в наихудшем случае?&lt;br /&gt;
# Напишите функцию GetRoot, которой на вход подаётся указатель на произвольный узел дерева, а она возвращает указатель на корень.&lt;br /&gt;
# Напишите процедуру PrintLeafs, которой на вход подаётся указатель на корень дерева, и она печатает листья дерева&lt;br /&gt;
## по возрастанию,&lt;br /&gt;
## по убыванию.&lt;br /&gt;
# ** Альтернативный обход в порядке возрастания бинарного дерева поиска с n узлами (или центрированный (inordered) обход) можно осуществить путём поиска минимального элемента дерева с помощью функции Minimum с последующий n-1 вызовом функции Next. Каково время работы такого алгоритма?&lt;br /&gt;
# * Реализуйте на С++ структуру данных бинарное дерево поиска, [https://yadi.sk/i/gi2SEStreFfSb используя заготовку].&lt;br /&gt;
## Нарисуйте бинарное дерево поиска, которое строится в функции getTreeExample.&lt;br /&gt;
## Реализуйте следующие алгоритмы: &lt;br /&gt;
### поиск минимума, &lt;br /&gt;
### inordered обход (вывод значений узлов в отсортированном порядке),&lt;br /&gt;
### поиск следующего по возрастанию,&lt;br /&gt;
### вставка элемента в дерево,&lt;br /&gt;
### сортировка последовательности с использованием БДП (дан вектор чисел, необходимо вывести их по возрастанию),&lt;br /&gt;
### ** удаление.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Карацубы, Штрассена. Быстрая сортировка (29.01)==&lt;br /&gt;
# Алгоритм Карацубы.&lt;br /&gt;
# Алгоритм Штрассена. [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать Дасгупту и др., §2.5 Умножение матриц]&lt;br /&gt;
# Быстрая сортировка и доказательство того, что в среднем случае она работает за О(n * log n). [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 8 Быстрая сортировка, стр. 148]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 6 (до 18.02)===&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Пусть мы хотим найти двоичное представление десятичного числа 10&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;. Будем считать, что n --- степень двойки (n = 2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt;).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Pwr2Bin(n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть 1010&lt;br /&gt;
    z = ...&lt;br /&gt;
    вернуть Multiply(z, z)&amp;lt;/source&amp;gt;&lt;br /&gt;
Multiply --- функция, перемножающая два n-битовых двоичных числа x и y по алгоритму Карацубы за O(n&amp;lt;sup&amp;gt;log&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;3&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Пусть мы хотим перевести произвольное десятичное число x в записи которого n=2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; чисел в двоичную систему счисления.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Dec2Bin(x, n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть binary[x]&lt;br /&gt;
    разделить x на два десятичных числа xl и xr из n/2 цифр.&lt;br /&gt;
    вернуть ...&amp;lt;/source&amp;gt;&lt;br /&gt;
Здесь binary --- это массив, содержащий двоичное представление десятичных цифр.&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Докажите, что математическое ожидание времени работы алгоритма быстрой сортировки (усреднение по всем вариантам выбора опорного элемента) на любом входе размера n удовлетворяет соотношению: T(n) ≤ O(n) + 1/n * &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt; (T(i-1) + T(n-i)).&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Найдите решение соотношения из предыдущего пункта.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Динамическое программирование (ДП). Первые примеры (02.01)==&lt;br /&gt;
# Нахождение самой длинной возрастающей подпоследовательности.&lt;br /&gt;
# Нахождение редакционного расстояния (или редакционной стоимости, расстояния Левенштейна).&lt;br /&gt;
# Нахождение представителя большинства.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 7 (до 20.02)===&lt;br /&gt;
* В этом задании везде, где требуется реализовать алгоритм, необходимо привести код на любом языке программирования.&lt;br /&gt;
* Для получения максимальной оценки нужно решить все задачи без звёздочек. Одна решённая задача со звёздочкой заменяет одну задачу без звёздочки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения редакционного расстояния (алгоритм Вагнера — Фишера). Например, редакционное расстояние между словами &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равно 6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения длины наибольшей общей подстроки. Например, длина наибольшей общей подстроки &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равна 8 (&amp;quot;antholog&amp;quot;). Чем больше это значение, тем схожей строки.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Предположим теперь, что сравниваемые строки состоят из символов A, С, G и T; за удаление или вставку мы платим -5; за замену буквы x на y платим w[x, y], где x, y принадлежат множеству {A, С, G, T}, a w — это матрица весов:&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
!-!! A!! G!! C!! T&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! A&lt;br /&gt;
|10||-1||-3||-4&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
!G&lt;br /&gt;
||-1||7||-5||-3&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! C&lt;br /&gt;
||-3||-5||9||0&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! T&lt;br /&gt;
||-4||-3||0||8&lt;br /&gt;
|}&lt;br /&gt;
Тогда выравнивание:&lt;br /&gt;
 AGACTAGTTAC&lt;br /&gt;
 CGA‒‒‒GACGT&lt;br /&gt;
будет иметь следующую оценку:&lt;br /&gt;
 w[A,C] + w[G,G] + w[A,A] + 3*(-5) + w[G,G] + w[T,A] + w[T,C] + w[A,G] + w[C,T] = -3 + 7 + 10 - 3*5 + 7 + (-4) + 0 + (-1) + 0 = 1.&lt;br /&gt;
&lt;br /&gt;
Напишите алгоритм, который находит максимальную стоимость всех возможных выравниваний. Верно ли, что чем больше это значение, тем непохожей строки?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как давно один народ отделился от другого? Кто похожей — итальянец и китаец или якут и эфиоп? На эти вопросы можно отвечать с разных точек зрения — культурной, исторической, лингвистической, ... В последние же годы человечество научилось секвенировать геном, что позволило исследовать этот вопрос с точки зрения генетики. Секвенирование генома — это процесс записи ДНК в виде нуклеотидной последовательности, которая представляет собой последовательность из четырёх символов — A, С, G и T. Существуют базы, которые хранят генетическую информацию о людях из разных стран и континентов, например, [http://www.mtdb.igp.uu.se/ http://www.mtdb.igp.uu.se/ → Download mtDNA sequences]. Чем больше сходство между геномами, тем сильнее родственные связи между их обладателями. Используя решение предыдущего пункта, выполните задания:&lt;br /&gt;
# Определите, кто похожей — итальянец и китаец или якут и эфиоп?&lt;br /&gt;
# Найдите нескольких похожих и нескольких непохожих народностей.&lt;br /&gt;
# * Выберите одну народность. Найдите самых похожих и самых непохожих на неё.&lt;br /&gt;
# * Найдите самые похожие и самые непохожие народности.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Задача о разрезании стержня (05.01)==&lt;br /&gt;
# Постановка задачи.&lt;br /&gt;
# Решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Решение с нахождением максимума по p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Восходящий алгоритм с запоминанием. Вывод длин кусочков стержня. Оценка сложности.&lt;br /&gt;
# Нисходящий алгоритм с запоминанием. Оценка сложности.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.1 Разрезание стержня, стр. 393]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 8 (до 22.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Решая задачу о разрезании стержня мы вначале построили рекурсивное решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt; для всех 1 ≤ i &amp;lt; n. Его сложность описывалась рекуррентной формулой T(n) = n + &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n-1&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt;(T(i) + T(n-i)), T(1) = 1.&lt;br /&gt;
# Объясните эту формулу.&lt;br /&gt;
# Покажите с помощью метода подстановок, что T(n) ≤ 2&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Покажите с помощью контрпримера, что описанная далее жадная стратегия не всегда определяет оптимальный способ разрезания стержня. Определим плотность стержня длиной i как p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;/i, то есть как стоимость единицы его длины. Жадная стратегия для стержня длиной n отрезает от стержня первую часть длиной i, где 1 ≤ i ≤ n, имеющую максимальную плотность. Затем та же жадная стратегия применяется к оставшейся части длиной n-i.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Рассмотрим модификацию задачи разрезания стержня, в которой в дополнение к цене p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; каждого стержня добавляется фиксированная цена разреза c. Теперь прибыль, связанная с решением, представляет собой сумму цен частей стержня минус стоимость разрезов. Разработайте алгоритм динамического программирования для этой модифицированной задачи.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Непрерывным участком называется группа подряд идущих элементов. Например, для последовательности&lt;br /&gt;
 5, 15, −30, 10, −5, 40, 10&lt;br /&gt;
элементы 15, −30, 10 образуют непрерывный участок, а 5, 15, 40 -- нет. Постройте линейный алгоритм для следующей задачи:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Вход: список чисел a1, a2, ... ‌, an.&lt;br /&gt;
Выход: непрерывный участок с максимальной суммой (сумма участка нулевой длины равна нулю).&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Для приведённого примера ответом будет 10, −5, 40, 10 с суммой 55. Какова сложность алгоритма? Почему?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Надо заплатить v рублей, имея купюры в x1, x2, ‌..., xn рублей (купюр каждого типа сколько угодно). Это не всегда возможно (скажем, купюрами в&lt;br /&gt;
10 и 25 рублей можно заплатить 45 рублей, но не 47 и не 15). Постройте основанный на методе динамического программирования алгоритм со временем работы O(nv), выясняющий, возможна ли уплата.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как решить предыдущую задачу, если каждая купюра имеется в единственном экземпляре? (Например, купюрами в 1, 5, 10, 20 рублей можно заплатить 16 = 1 + 5 + 10 и 31 = 1 + 10 + 20 рублей, но не 40 (не хватит денег). Время работы алгоритма по-прежнему O(nv).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Ещё один вариант той же задачи: купюр каждого типа сколько угодно, но всего разрешается использовать не более k купюр. (Например, если есть купюры в 5 и 10 рублей, а k = 6, то 55 разменять можно, а 65 –– нет).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Перемножение цепочки матриц. Оптимальное бинарное дерево поиска (начало) (09.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о перемножении цепочки матриц. Постановка задачи.Пример. Нисходящий алгоритм.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.2 Перемножение цепочки матриц, стр. 403]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 9 (до 24.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Найдите оптимальную расстановку скобок в произведении последовательности матриц, размерности которых равны 5×10, 10×3, 3×12, 12×5, 5×50, 50×6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Напишите восходящий алгоритм для поиска оптимальной расстановки скобок.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Расстановка пробелов. Оптимальное бинарное дерево поиска (середина) (12.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о расстановке пробелов. Постановка задачи. Решения для трёх случаев: 1. нужно вернуть можно ли разбить текст на слова; 2. вернуть разбивку на слова; 3. слова встречаются не равновероятно, вернуть наиболее вероятную разбивку на слова.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи. Вывод математического ожидания времени поиска.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Праздничное домашнее задание 10 (до 02.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[&amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;,&amp;quot;, &amp;quot;.&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;,&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;.&amp;quot;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Подсказка:&#039;&#039;&#039; разбейте текст на слова из списка и посмотрите на азбуку Морзе.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Способы представления графов в памяти (16.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Разбор ошибок в домашнем задании.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Графы. Способы представления графов в памяти (матрица смежности, список рёбер, список соседей (список смежностей), матрица инцидентности). Зависимость сложности алгоритмов от способа представления.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §22.1 Представление графов, стр. 626]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 11 (до 02.03)===&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача A.]&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача B.]&lt;br /&gt;
# Нарисуйте неориентированный граф с 5 вершинами и 8 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Нарисуйте ориентированный граф с 4 вершинами и 3 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Дан ориентированный граф. &#039;&#039;Исходящая степень вершины v&#039;&#039; --- это количество исходящих из неё рёбер, &#039;&#039;входящая степень v&#039;&#039; --- это количество рёбер входящих в  v. Имеется представление ориентированного графа с использование списка соседей. Как долго будут вычисляться исходящие степени всех вершин графа? А входящие степени?&lt;br /&gt;
# Дан граф G = (V, E). Какие из рассмотренных способов хранения графов используют меньше всего памяти для хранения G и почему? Указание: рассмотрите случаи |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;lt; |E| и |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;gt; |E|.&lt;br /&gt;
# Пусть C --- это матрица смежности графа G.&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
# Пусть B --- это матрица инцидентности ориентированного графа G. Как связаны элементы матрицы BB&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
&lt;br /&gt;
==Реализация поиска в глубину (19.02)==&lt;br /&gt;
# Реализация поиска в глубину и смежных задач.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 12 (до 5.03)===&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Выберите любой способ хранения графа. Реализуйте поиск в глубину.&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Напишите алгоритм, который возвращает данные о том, какие вершины лежат в одной компоненте связности.&lt;br /&gt;
# &#039;&#039;(любой ЯП или псевдокод)&#039;&#039; Напишите алгоритм проверки сильной связности ориентированного графа. Какова его сложность?&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №2==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
Необходимо реализовать 3 задачи из [https://official.contest.yandex.ru/contest/1085 контеста], см. [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing распределение задач]. Каждую задачу можно написать на С++ или Python. На выполнение работы отводится две недели (см. время окончания контеста). [https://official.contest.yandex.ru/contest/1123 Дорешивание.]&lt;br /&gt;
&lt;br /&gt;
==ДП и графы (26.02)==&lt;br /&gt;
==ДП и графы (02.03)==&lt;br /&gt;
==Жадные алгоритмы (12.03)==&lt;br /&gt;
===Домашнее задание 13 (до 23.03)===&lt;br /&gt;
# Вася хочет купить по одной акции каждой компании. Все акции стоят одинаково, но дорожают по-разному. Каждый месяц акция i-ой компании дорожает в r_i раз. В один месяц можно купить только одну акцию.&lt;br /&gt;
## Напишите алгоритм, который выводит оптимальную последовательность покупок (такую, что на покупку всех акций потратится меньше денег).&lt;br /&gt;
## Докажите корректность алгоритма, то есть докажите, что последовательность покупок, которую выводит ваш алгоритм, оптимальна.&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список, очередь (16.03)==&lt;br /&gt;
# Реализация линейного двусвязного списка (С++).&lt;br /&gt;
# Реализация очереди ограниченной длины на базе вектора (С++).&lt;br /&gt;
# Реализация очереди на базе списка (С++).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14 (до 23.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте (на С++) структуру данных Стек. У стека должно быть три операции:&lt;br /&gt;
* push --- положить элемент на вершину стека;&lt;br /&gt;
* pop --- удалить верхний элемент;&lt;br /&gt;
* front --- вернуть значение верхнего элемента.&lt;br /&gt;
Оцените время работы каждой функции.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список (19.03)==&lt;br /&gt;
===Домашнее задание 13* (до 30.03)===&lt;br /&gt;
#Для приведённой реализации класса List (https://yadi.sk/i/c5r_79WdfMyNS).&lt;br /&gt;
## Допишите print, push_back и push_front.&lt;br /&gt;
## В функции insert_after и delete_node вставьте необходимые проверки так, чтобы они работали для крайних случаев.&lt;br /&gt;
## Напишите main в котором&lt;br /&gt;
### создаётся объект класса List, &lt;br /&gt;
### заполняется элементами с помощью функций push_back, push_front и insert_after и&lt;br /&gt;
### удаляется i-ый элемент.&lt;br /&gt;
&lt;br /&gt;
==Повторение (30.03)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Для данных пар функций выясните их связь в терминах O-, o-, Ω-, ω-, Θ-обозначений. Поставьте галочку в клетке с Ω, если f(x) = Ω(g(x)) и прочерк, если равенства нет. [https://ru.wikipedia.org/wiki/«O»_большое_и_«o»_малое#.D0.94.D1.80.D1.83.D0.B3.D0.B8.D0.B5_.D0.BF.D0.BE.D0.B4.D0.BE.D0.B1.D0.BD.D1.8B.D0.B5_.D0.BE.D0.B1.D0.BE.D0.B7.D0.BD.D0.B0.D1.87.D0.B5.D0.BD.D0.B8.D1.8F Википедия]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! f(x)!! g(x)!! O!! o!! Ω!! ω!! Θ&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! 2^100&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n * log(n)&lt;br /&gt;
! 2^100 * n * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n&lt;br /&gt;
! 2^100 * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n!&lt;br /&gt;
! 2^(2015n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n*2^n&lt;br /&gt;
! 3^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 5^n&lt;br /&gt;
! 5^(n+1)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n + n^2 + n^3 + ... + n^1000&lt;br /&gt;
! 7^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм Quickselect нахождения k-ого элемента по возрастанию: http://en.wikipedia.org/wiki/Quickselect&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;На улице стоит ряд домов. В каждом из домов лежит сколько-то денег. Вор хочет обокрасть дома на переулке. Он не может обокрасть два соседних дома, потому что хозяин дома, который он обокрал, сразу предупредит соседей. Нужно найти, какую максимальную сумму вор может украсть с переулка. На вход программы подается массив неотрицательных целых чисел - количество долларов в доме с номером i. Соседние дома в массиве представлены соседними элементами. Например, пусть задан массив { 1, 4, 5 } - тогда вор максимум может украсть $6, обокрав дома 1 и 3. Пусть задан массив { 1, 7, 2 } - тогда вор максимум может украсть $7, обокрав дом 2.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Алфавит из всех маленьких латинских букв и пробела закодирован числами следующим способом:&lt;br /&gt;
  &#039;a&#039; -&amp;gt; 1&lt;br /&gt;
  &#039;b&#039; -&amp;gt; 2&lt;br /&gt;
  &#039;c&#039; -&amp;gt; 3&lt;br /&gt;
  ...&lt;br /&gt;
  &#039;z&#039; -&amp;gt; 26&lt;br /&gt;
  &#039; &#039; -&amp;gt; 27&lt;br /&gt;
На вход программы подается строка из цифр. Нужно посчитать, сколькими способами можно раскодировать эту строку.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Дан граф, заданный матрицей смежности. Вывести пары вершин между которыми нет пути.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Повторение (02.04) ==&lt;br /&gt;
Решали и разбирали первые 4 задачи из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14* (до 11.03)===&lt;br /&gt;
Решите любые две задачи (подпункты НЕ считаются отдельными задачами) с предыдущей пары (Повторение (30.03)).&lt;br /&gt;
&lt;br /&gt;
== Повторение (06.04) ==&lt;br /&gt;
Будем решать вторую половину задач из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 15 (до 16.04)===&lt;br /&gt;
# Приведите пример графа, который содержит отрицательные рёбра, не содержит циклов отрицательного веса и для которого алгоритм Дейкстры возвращает неверный результат.&lt;br /&gt;
# Используется ли в алгоритме Дейкстры то, что веса рёбер неотрицательны? Если &amp;quot;да&amp;quot;, то где именно?&lt;br /&gt;
# Пусть граф содержит рёбра с весами &amp;gt;= -100. Если прибавить к каждому ребру 101 и при помощи алгоритма Дейкстры найти кратчайшие пути. Будут ли эти пути кратчайшими в исходном графе? Почему?&lt;br /&gt;
&lt;br /&gt;
== Повторение (07.04) ==&lt;br /&gt;
&#039;&#039;&#039;Решение рекуррентных соотношений&#039;&#039;&#039;&lt;br /&gt;
# Решите уравнение: T(n) = 4*T(n/2) + O(n^2) с базой T(1) = O(1)&lt;br /&gt;
## Используя основную теорему.&lt;br /&gt;
## Используя дерево рекурсий.&lt;br /&gt;
## Методом подстановки.&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2)) + n является \Theta(n lg n).&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2) + 17) + n является \Theta(n lg n).&lt;br /&gt;
# Решите уравнения, считая, что T(1) = O(1):&lt;br /&gt;
## T(n) = T(n-1) + n&lt;br /&gt;
## T(n) = 2*T(floor(sqrt(n))) + lg n. Указание: попробуйте использовать замену переменных.&lt;br /&gt;
## T(n) = 3*T(sqrt(n)) + lg n&lt;br /&gt;
# Дайте верхнюю и нижнюю оценки функции T(n). Постарайтесь, чтобы оценки были как можно более точные&lt;br /&gt;
## T(n) = 4T(n/3) + n*lg(n)&lt;br /&gt;
## T(n) = 3T(n/3) + n/lg(n)&lt;br /&gt;
## T(n) = 4T(n/2) + n^2*sqrt(n)&lt;br /&gt;
## T(n) = T(n/2) + T(n/4) + T(n/8) + n&lt;br /&gt;
## T(n) = T(n-1) + 1/n&lt;br /&gt;
## T(n) = T(n-2) + 1/lg(n)&lt;br /&gt;
## T(n) = sqrt(n) * T(sqrt(n)) + n&lt;br /&gt;
&#039;&#039;&#039;Анализ и построение алгоритмов&#039;&#039;&#039;&lt;br /&gt;
# Числа Фибоначчи F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; можно выразить через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, используя матрицу: https://yadi.sk/i/Pm_aNzHCforFU. &lt;br /&gt;
## Покажите как вычислить F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;.&lt;br /&gt;
## Как вычислить F&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;n+1&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;?&lt;br /&gt;
## Напишите алгоритм.&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
## Ускорьте его так, чтобы он работал за O(log n).&lt;br /&gt;
# Дана последовательность символов. Какое минимальное количество символов нужно удалить из неё, чтобы получить палиндром?&lt;br /&gt;
## Напишите алгоритм (на псевдокоде или на любом языке программирования).&lt;br /&gt;
## Оцените время работы алгоритма.&lt;br /&gt;
# Какую структуру данных вы бы использовали для реализации упорядоченного множества (http://neerc.ifmo.ru/wiki/index.php?title=Упорядоченное_множество)? Какая будет сложность каждой из операций над множеством?&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 16 (до 20.04)===&lt;br /&gt;
# Решите 6 задач из первой части и 6 из второй. (Укажите какие именно.) Каждый из подпунктов является отдельной задачей.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм и теорема Форда-Фалкерсона (16.04)==&lt;br /&gt;
# Базовые определения (пропускные способности, сток, исток и пр.). Пример. &lt;br /&gt;
# Ограничения на поток (сохранение и что меньше пропускных способностей).&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, пример работы&lt;br /&gt;
# Разрез, определение, пример.&lt;br /&gt;
# Утверждение: максимальный поток &amp;lt;= любого разреза.&lt;br /&gt;
# Теорема Форда-Фалкерсона (с доказательством).&lt;br /&gt;
# Пример на котором алгоритм Форда-Фалкерсонаработает работает очень долго при неудачном выборе путей.&lt;br /&gt;
# Сложность алгоритма Форда-Фалкерсона.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №3==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
В [https://official.contest.yandex.ru/contest/1196 домашнем задании] пять задач. Они разделены на два варианта, помеченные римскими цифрами I и II. Свой вариант нужно узнать [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing здесь на вкладке HW3]. Третья задача — общая для двух вариантов; ее решение необходимо снабдить доказательством корректности алгоритма. На выполнение задания дается примерно 2 недели (см. точное время окончания в контесте). Каждую задачу можно написать на С++ или Python.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Форда-Фалкерсона и Эдмондса-Карпа (20.04)==&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, напоминание: базовые определения, пример работы, пример на котором алгоритм работает долго, сложность.&lt;br /&gt;
# Алгоритм Эдмодса-Карпа. Доказательство асимптотики времени работы.&lt;br /&gt;
&lt;br /&gt;
==(23.04)==&lt;br /&gt;
&lt;br /&gt;
==(11.05) Красно-чёрные деревья==&lt;br /&gt;
[https://ru.wikipedia.org/wiki/Красно-чёрное_дерево Красно-чёрное дерево]&lt;br /&gt;
===Домашнее задание 17 (до 18.05)===&lt;br /&gt;
# Зачем нужны красно-чёрные деревья?&lt;br /&gt;
# Благодаря какому свойству и почему красно-чёрное дерево является сбалансированным?&lt;br /&gt;
# Нарисуйте полное бинарное дерево поиска высотой 3 с ключами {1, 2, ..., 15}. Сделайте из него красно-чёрные деревья высотой 2, 3 и 4.&lt;br /&gt;
# Нарисуйте красно-чёрные деревья, получающиеся последовательной вставкой элементов 12, 10, 29, 30, 31, 32 в [https://ru.wikipedia.org/wiki/Красно-чёрное_дерево#/media/File:Red-black_tree_example.svg данное дерево]. Для вставки используйте алгоритм вставки из Википедии. Укажите какой именно функцией вы воспользовались.&lt;br /&gt;
# Определим &#039;&#039;&#039;ослабленное красно-чёрное дерево&#039;&#039;&#039; как бинарное дерево поиска, которое удовлетворяет красно-чёрным свойствам 1, 3, 4 и 5. Другими словами, корень может быть как чёрным, так и красным. Рассмотрите ослабленное красно-чёрное дерево T, корень которого красный. Если перекрасить корень дерева T в чёрный, будет ли оно красно-чёрным деревом?&lt;br /&gt;
# Покажите, что самый длинный простой нисходящий путь от вершины x к листу красно-черного дерева имеет длину, не более чем в два раза превышающую кратчайший путь от x к листу-потомку.&lt;br /&gt;
# Чему равно наибольшее возможное количество внутренних узлов в красно-чёрном дереве с чёрной высоты k? А наименьшее возможное количество?&lt;br /&gt;
# Нарисуйте красно-чёрные деревья, получающиеся последовательной вставкой ключей 41, 38, 31, 12, 19, 8 в изначально пустое дерево.&lt;br /&gt;
# Покажите какие деревья будут получаться в результате последовательного удаления ключей в порядке 8, 12, 19, 31, 38, 41.&lt;br /&gt;
&lt;br /&gt;
==(14.05) Конкурентный анализ самоорганизующихся циклов==&lt;br /&gt;
[https://vk.com/doc12518218_390369758 Лекция]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 18 (до 21.05)===&lt;br /&gt;
Все вычисления сопроводите подробными объяснениями о том, почему верно то или иное (не)равенство.&lt;br /&gt;
# Пусть имеется n-элементный список и m поисковых запросов к нему. После каждой операции поиска можно переупорядочить список. Обозначим стоимость последовательности поисков через C. Докажите, что в худшем случае C = Ω(mn).&lt;br /&gt;
#  Обозначим через c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; стоимость i-ого поискового запроса с применением эвристики перемещения в начало, которая включает стоимость поиска элемента в списке и стоимость его перемещения в начало списка путём ряда обменов соседних элементов списка. Покажите, что i-ая операция поиска находит элемент x в списке L с применением эвристики перемещения в начало, то c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = 2 * rank&amp;lt;sub&amp;gt;L&amp;lt;/sub&amp;gt;(x) - 1.&lt;br /&gt;
# Покажите, что c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = 2 * rank&amp;lt;sub&amp;gt;L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) - 1.&lt;br /&gt;
# Покажите, что c*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = rank&amp;lt;sub&amp;gt;L*&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) + t&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;.&lt;br /&gt;
# Докажите, что после одного обмена двух соседних элементов потенциал либо увеличивается на 2, либо уменьшается на 2.&lt;br /&gt;
# Докажите, что rank&amp;lt;sub&amp;gt;L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) = |A| + |B| + 1.&lt;br /&gt;
# Докажите, что rank&amp;lt;sub&amp;gt;L*&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) = |A| + |С| + 1.&lt;br /&gt;
# Покажите, что поиск i-ого элемента приводит к изменению потенциала Ф(L&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;) - Ф(L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;) &amp;lt;= 2 (|A| - |B| + t*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;), где t*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; --- это количество обменов при i-ом поиске.&lt;br /&gt;
# Во сколько раз стоимость С&amp;lt;sub&amp;gt;MFT&amp;lt;/sub&amp;gt;(S) превышает C&amp;lt;sub&amp;gt;OPT&amp;lt;/sub&amp;gt;(S)?&lt;br /&gt;
&lt;br /&gt;
== (18.05) Конечные автоматы ==&lt;br /&gt;
=== Задание 19 (до 25.05) ===&lt;br /&gt;
# Постройте автомат для языка над алфавитом Σ = {0, 1} каждое слово которого содержит хотя бы два нуля. Является ли он детерминированным?&lt;br /&gt;
# Постройте автомат над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5. Является ли он детерминированным?&lt;br /&gt;
# Постройте автомат, который допускает пустой язык (язык в котором нет ни одного слова).&lt;br /&gt;
# Постройте автомат, который допускает все слова над алфавитом Σ.&lt;br /&gt;
# Постройте ДКА над алфавитом Σ = {К, Ж, З}, который допускает слова в которых после К идёт З, после З --- Ж, после Ж --- К.&lt;br /&gt;
# * Постройте ДКА над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5, а число нулей на 3.&lt;br /&gt;
# Постройте НКА для языка над алфавитом Σ = {0, 1, 2, 3}, состоящий из слов, в которых хотя бы одна из последних пяти букв является 1.&lt;br /&gt;
# Постройте НКА над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5, а число нулей на 3.&lt;br /&gt;
# Какие языки допускают автоматы https://yadi.sk/d/fNAHbjCZghERG?&lt;br /&gt;
# Для каждого из автоматов https://yadi.sk/d/fNAHbjCZghERG постройте соответствующий ему ДКА.&lt;br /&gt;
&lt;br /&gt;
== (21.05) Регулярные выражения, КА, их эквивалентность. Лемма о накачке  ==&lt;br /&gt;
=== Задание 20 (до 28.05) ===&lt;br /&gt;
&#039;&#039;&#039;I Написать регулярные выражения&#039;&#039;&#039;&lt;br /&gt;
# Напишите регулярное выражение для языка над алфавитом Σ = {0, 1} каждое слово которого содержит хотя бы два нуля.&lt;br /&gt;
# Напишите регулярное выражение над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5.&lt;br /&gt;
# Напишите регулярное выражение, которое допускает пустой язык (язык в котором нет ни одного слова).&lt;br /&gt;
# Напишите регулярное выражение, которое допускает все слова над алфавитом Σ.&lt;br /&gt;
# Напишите регулярное выражение для языка над алфавитом Σ = {0, 1, 2, 3}, состоящий из слов, в которых хотя бы одна из последних пяти букв является 1.&lt;br /&gt;
&#039;&#039;&#039;II КА и регулярные выражения&#039;&#039;&#039;&lt;br /&gt;
# Постройте конечный автомат для языка (111 U 01)&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;1(00 U 11)&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;.&lt;br /&gt;
# Постройте конечный автомат для языка (ab)&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;(a U b)(b U a)&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;(a U bab).&lt;br /&gt;
&#039;&#039;&#039;III Доказать замкнутость относительно различных операций&#039;&#039;&#039;&lt;br /&gt;
# Покажите, что если для языков L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; и L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; существует КА, который их читает, то существует КА и для их объединения L = {w | w ∈ L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; или w ∈ L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;}.&lt;br /&gt;
# Покажите, что если для языка L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; и L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; существует КА, который их читает, то существует КА и для языка L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; = {xy | x ∈ L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, y ∈ L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;}.&lt;br /&gt;
# Покажите, что если для языка L существует КА, который его читает, то существует КА и для &#039;&#039;&#039;замыкания Клини&#039;&#039;&#039; L* = {w&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; w&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; ... w&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;| w&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; ∈ L, w&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; ∈ L, ..., w&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; ∈ L}.&lt;br /&gt;
# Покажите, что если язык L регулярен, то регулярно его дополнение (т.е. язык над тем же алфавитом, которому принадлежит слово тогда и только тогда, когда оно НЕ принадлежит L) .&lt;br /&gt;
# Покажите, что если язык L регулярен, то регулярно его обращение L&amp;lt;sub&amp;gt;R&amp;lt;/sub&amp;gt; = {a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; . . . a&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; | a&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; . . . a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; ∈ L}. (L&amp;lt;sub&amp;gt;R&amp;lt;/sub&amp;gt; --- это язык в котором все слова языка L записаны наоборот.)&lt;br /&gt;
# * Покажите, что если языки L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; и L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; регулярны, то регулярно их пересечение.&lt;br /&gt;
&#039;&#039;&#039;IV Использование леммы о накачке&#039;&#039;&#039; (см. [https://vk.com/doc12518218_392750846 конспект])&lt;br /&gt;
# Докажите, что не существует КА, который бы читал язык {0&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;1&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;2&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;}. (Пояснение: запись 0&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; означает строку из n нулей: 00...0.)&lt;br /&gt;
# Докажите, что не существует КА, который бы читал язык {0&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;1&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;}.&lt;br /&gt;
# Докажите, что не существует КА, который бы читал язык {0&amp;lt;sup&amp;gt;n!&amp;lt;/sup&amp;gt;}.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== (25.05) Автоматный подход ==&lt;br /&gt;
=== Задание 21 (до 01.06) ===&lt;br /&gt;
Реализуйте один из следующих проектов:&lt;br /&gt;
# Программа, которая считывает строку и говорит принадлежит ли она языку 0(123)*(00 U (231)*) U 111.&lt;br /&gt;
# Программа, которая считывает КА и генерирует программу на языке С++, которая говорит принадлежит ли заданное слово языку, описываемому этим КА.&lt;br /&gt;
# Программа, которая считывает регулярное выражение и строку и говорит принадлежит ли слово языку, описываемому этим регулярным выражением.&lt;br /&gt;
# Программа, которая моделирует работу банкомата, автомата с газировкой, лифта... (что-то одно на выбор)&lt;br /&gt;
# Текстовый симулятор студента. Возможные состояния: на паре, дома, есть приглашение прогулять, завтра коллоквиум, сплю и др. Есть два параметра: успеваемость и весёлось. Если хотя бы один из них упадёт ниже критической отметки, студент умрёт. Игрок принимает решение куда идти студенту. Цель: продержаться как можно дольше.&lt;br /&gt;
&lt;br /&gt;
== Большое домашнее задание 4 ==&lt;br /&gt;
[https://official.contest.yandex.ru/contest/1259 Контест]. В домашнем задании четыре задачи. Обязательны первые три. Вместо одной из первых трёх можно сделать последнюю (только для первых 10 решивших 4-ую!). На выполнение задания даётся примерно 2 недели (см. точное время окончания в контесте). Условия ревью определяют семинаристы.&lt;br /&gt;
&lt;br /&gt;
== (01.06) P vs NP ==&lt;br /&gt;
&#039;&#039;&#039;План занятия&#039;&#039;&#039;&lt;br /&gt;
# Напоминание: P; NP; проблема P ?= NP; NPC; сведения; пример сведений.&lt;br /&gt;
&lt;br /&gt;
=== Задание 22 (до 8.06) ===&lt;br /&gt;
1. Задачи о гамильтоновом цикле и о гамильтоновом пути.&lt;br /&gt;
  Задачи о гамильтоновом цикле:&lt;br /&gt;
  Дан граф. Необходимо найти цикл, проходящий через каждую вершину по одному разу.&lt;br /&gt;
&lt;br /&gt;
  Задачи о гамильтоновом пути:&lt;br /&gt;
  Дан граф и две его вершины s и t. Необходимо найти путь из s в t, проходящий через каждую вершину по одному разу.&lt;br /&gt;
&lt;br /&gt;
Покажите, что искать цикл не проще, чем искать путь.&lt;br /&gt;
&lt;br /&gt;
2. &#039;&#039;Задачи поиска&#039;&#039; и &#039;&#039;задачи оптимизации&#039;&#039;. Для задачи коммивояжёра варианты с поиском и оптимизацией выглядят так:&lt;br /&gt;
  Задача поиска:&lt;br /&gt;
  &#039;&#039;Вход:&#039;&#039; матрица расстояний, бюджет b&lt;br /&gt;
  &#039;&#039;Выход:&#039;&#039; цикл веса не более b, проходящий по всем вершинам графа, если такой есть.&lt;br /&gt;
&lt;br /&gt;
  Оптимизационная задача:&lt;br /&gt;
  &#039;&#039;Вход:&#039;&#039; матрица расстояний&lt;br /&gt;
  &#039;&#039;Выход:&#039;&#039; цикл минимального веса, проходящий по всем вершинам графа, если такой есть.&lt;br /&gt;
&lt;br /&gt;
Покажите, что если поисковую задачу коммивояжёра можно решить за полиномиальное время, то и оптимизационный вариант можно решить за полиномиальное время.&lt;br /&gt;
&lt;br /&gt;
3. &#039;&#039;Задача поиска&#039;&#039; и &#039;&#039;задача разрешения&#039;&#039;. Пусть имеется программа, которая за полиномиальное время отвечает на вопрос , содержит л входной граф гамильтонов цикл. Как с её помощью найти за полиномиальное время сам цикл (есть он есть)?&lt;br /&gt;
&lt;br /&gt;
4. Для задач ниже или приведите алгоритм, работающий за полиномиальное время, или сведите их к NP-полной задаче:&lt;br /&gt;
# Поиск самого длинного пути&lt;br /&gt;
# Поиск кратчайшего пути&lt;br /&gt;
# Двудольное паросочетание&lt;br /&gt;
# Трёхдольное паросочетание&lt;br /&gt;
# Четырёхдольное паросочетание&lt;/div&gt;</summary>
		<author><name>Kassalanche</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=16696</id>
		<title>Алгоритмы и структуры данных. Подгруппа 105-1</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=16696"/>
		<updated>2015-06-01T06:15:47Z</updated>

		<summary type="html">&lt;p&gt;Kassalanche: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==О курсе==&lt;br /&gt;
[[Алгоритмы_и_структуры_данных|План лекций и список рекомендуемой литературы.]]&lt;br /&gt;
&lt;br /&gt;
[[Алгоритмы_и_структуры_данных._Подгруппа_105-1._FAQ|FAQ.]]&lt;br /&gt;
&lt;br /&gt;
[[Reviewboard|Инструкция по использованию Reviewboard.]]&lt;br /&gt;
&lt;br /&gt;
[[Практические_занятия_по_курсу_ОиМП/C++_check|Style guide.]]&lt;br /&gt;
&lt;br /&gt;
==Итоговая оценка за курс==&lt;br /&gt;
Итоговая оценка (ИО) зависит от&lt;br /&gt;
* оценок за пять больших домашних заданий (БДЗ1, БДЗ2, ..., БДЗ5),&lt;br /&gt;
* оценок за домашние задания (ДЗ1, ДЗ2, ...),&lt;br /&gt;
* оценки за контрольную работу (КР),&lt;br /&gt;
* оценки за экзамен (ЭКЗ),&lt;br /&gt;
и может быть вычислена по формуле:&lt;br /&gt;
 ИО = 0.7 * (0.3 * КР + 0.7 *(ИДЗ1 + ИДЗ2 + ИДЗ3 + ИДЗ4 + ИДЗ5)/5) + 0.3 * ЭКЗ =&lt;br /&gt;
    = 0.21*КР + 0.098*ИДЗ1 + 0.098*ИДЗ2 + 0.098*ИДЗ3 + 0.098*ИДЗ4 + 0.098*ИДЗ5 + 0.3*ЭКЗ,&lt;br /&gt;
где&lt;br /&gt;
 ИДЗi = min (10, 0.7 * БДЗi + 0.4 * &amp;lt;cредняя оценка за ДЗj, прошедшие с предыдущего БДЗ по i-ое&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
==Порядок сдачи домашних работ==&lt;br /&gt;
===Большие домашние работы===&lt;br /&gt;
# Получить OK за задачу в контесте.&lt;br /&gt;
# Залить исходный код на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* На каждую задачу создавайте отдельный запрос на ревью. &lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении суток приходят замечания к коду. &#039;&#039;&#039;Если в течении суток замечаний или Ship It не появилось, проверьте, что вы правильно отправили запрос и, если всё сделано правильно, спросите у семинариста получил ли он запрос.&#039;&#039;&#039;&lt;br /&gt;
# Вы их исправляете, проверяете в контесте, что программа по-прежнему проходит все тесты, заливаете новую версию в Review Board. Штрафов за посылки НЕ будет.&lt;br /&gt;
# Процесс повторяется пока остаются замечания к коду или пока не истёк дедлайн. После закрытия контеста будут ещё одни сутки на доработку замечаний в Review Board.&lt;br /&gt;
# Оценивается только последняя версия работы в Review Board.&lt;br /&gt;
&lt;br /&gt;
===Маленькие домашние работы===&lt;br /&gt;
# Залить решение на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* Желаемые форматы: txt, py, cpp, h. Допускаются любые другие.&lt;br /&gt;
#* На каждую домашнюю работу создавайте отдельный запрос на ревью. Обязательно указывайте номер домашней работы.&lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении неопределенного промежутка времени придут оценки по каждому из заданий.&lt;br /&gt;
&lt;br /&gt;
==Оценивание домашних работ==&lt;br /&gt;
* Все задания предполагаются индивидуальными. Запрещены любые заимствования без ссылки на автора.&lt;br /&gt;
* Решения после установленного дедлайна не принимаются. Дедлайн указан в заголовке каждого задания.&lt;br /&gt;
* Везде, где требуется написать алгоритм, можно использовать любой язык программирования или псевдокод.&lt;br /&gt;
* Там, где требуется построить алгоритм с заданной асимптотикой, приведите обоснование, что полученный алгоритм удовлетворяет этому условию.&lt;br /&gt;
* Эти правила не действуют, если в задании явно оговорено иное.&lt;br /&gt;
&lt;br /&gt;
==Мотивация к изучению алгоритмов. Подсчёт числа операций (12.01)==&lt;br /&gt;
# Числа Фибоначчи. Определение. Примитивный рекурсивный алгоритм вычисления i-ого числа. Оценка числа операций. Анализ причин неэффективности. Алгоритм с запоминанием вычисленных ранее значений. Оценка числа операций. Сравнение с предыдущим. (подробнее: глава 0, страницы 8-10 из книги &amp;lt;&amp;lt;Алгоритмы&amp;gt;&amp;gt;, [[Алгоритмы_и_структуры_данных|см. список рекомендованной литературы]])&lt;br /&gt;
# Задача о ханойской башне. Постановка задачи. Рекурсивный алгоритм. Рекуррентная формула для числа перемещений. Замкнутая формула для числа перемещений (+ доказательство). Доказательство того, что эту задачу нельзя решить используя меньшее число перемещений дисков. ([https://www.dropbox.com/s/t8cbs7ttu4iasvj/algo-0-recursion.pdf?dl=0 Разбор задачи о ханойской башне], автор Сергей Объедков)&lt;br /&gt;
# Сортировка пузырьком. Алгоритм. Подсчёт количество операций сравнения и обмена (swap). Анализ наилучшего и наихудшего случаев ([https://ru.wikipedia.org/wiki/Сортировка_пузырьком Википедия])&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 1 (12.01 - 26.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
Во всех задачах, если не оговорено иного, предполагаем, что работаем с целыми неотрицательными числами. Для первых 7 задач необходимо&lt;br /&gt;
* описать что можно считать наилучшим и наихудшим случаями,&lt;br /&gt;
* для каждого из двух случаев подсчитать отдельно количество операций сравнения и swap (если есть).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Даны три числа, требуется вернуть наименьшее.&lt;br /&gt;
# Даны три числа, требуется отсортировать их.&lt;br /&gt;
# Дана последовательность A из n элементов и число x, требуется найти элемент равный x. Примечание: если таких значений i несколько, вернуть любое; если такого элемента нет, функция должна сообщить об этом.&lt;br /&gt;
# * Дана упорядоченная последовательность A из n элементов и число x, требуется найти такое i, что A[i] равно x. Алгоритм должен быть эффективней, чем в предыдущем пункте и использовать то, что последовательность упорядочена.&lt;br /&gt;
# Дана последовательность из 100 000 чисел от 0 до 100. Напишите эффективный алгоритм сортировки, который бы учитывал специфику входных данных.&lt;br /&gt;
# * Дано 32 битное неотрицательное число. Требуется номер первого ненулевого бит. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения, считая, что числа распределены равномерно.&lt;br /&gt;
# * Даны 32 битные неотрицательные числа m и n. Требуется вывести True, если m &amp;lt; n, иначе False. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения битов, считая, что числа распределены равномерно.&lt;br /&gt;
# Напишите рекурсивную функцию, вычисляющую n-ое число Фибоначчи (как на занятии). Подсчитайте количество рекурсивных вызовов.&lt;br /&gt;
# * Напишите функцию, вычисляющую n-ое число Фибоначчи, у которой число операций — полином от n, и которая использует количество памяти, независящее от n.&lt;br /&gt;
&lt;br /&gt;
==O-символика и стратегия &amp;quot;разделяй и властвуй&amp;quot; (15.01)==&lt;br /&gt;
# Сортировка слиянием. Алгоритм, рекуррентное соотношение для времени сортировки, сложность. Подробнее: [https://dl.dropboxusercontent.com/u/829163/draft.pdf §2.3 Сортировка слиянием (стр. 54)].&lt;br /&gt;
# О-символика. [https://dl.dropboxusercontent.com/u/829163/draft.pdf §0.3 О-символика (стр. 10)].&lt;br /&gt;
# Задача о слиянии m упорядоченных массивов по n элементов. Три алгоритма решения: последовательное слияние, слияние &amp;quot;деревом&amp;quot; (обе функции используют Merge из MergeSort), аналог Merge для m массивов. Анализ сложности каждого из них.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 2 (15.01-29.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
* Во всех задачах, если не оговорено иного, для простоты &#039;&#039;можно&#039;&#039; считать, что n является степенью какого-либо числа, например, степенью двойки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Дана функция F, определённая ниже. Сколько строк она напечатает? Указание: для обоих подпунктов рассмотрите два случая: 1. n является степенью двойки, 2. n не является степенью двойки.&lt;br /&gt;
## Запишите рекуррентное соотношение для числа строк.&lt;br /&gt;
## Решите уравнение, полученное в предыдущем пункте, то есть, выведите замкнутую (нерекуррентную формулу). Для простоты можно считать, что n является степенью двойки.&lt;br /&gt;
# В массиве A размера n записана возрастающая последовательность целых чисел. Постройте алгоритм типа &amp;quot;разделяй и властвуй&amp;quot;, который проверяет, существует ли такой индекс i, что A[i] = i&lt;br /&gt;
## за время O(n),&lt;br /&gt;
## * за время O(log n).&lt;br /&gt;
## Какие случаи для вашего алгоритма являются наихудшими и наилучшими? Какого время работы в лучшем и худшем случаях?&lt;br /&gt;
# Дан бесконечный массив A, первые n элементов которого содержат возрастающую последовательность положительных чисел, а дальше стоят -1. Значение n не дано. Постройте алгоритм, который получает на вход целое число x и находит это x в массиве --- или говорит, что там его нет, &lt;br /&gt;
## за время O(n),&lt;br /&gt;
## за время O(log n).&lt;br /&gt;
# Рассмотрим алгоритм вычисления наибольшего общего делителя (НОД) двух положительных чисел, основанный на методе &amp;quot;разделяй и властвуй&amp;quot;.&lt;br /&gt;
## (задание не оценивается) Прочитайте [https://dl.dropboxusercontent.com/u/829163/draft.pdf §1.2.3 Алгоритм Евклида (стр. 23)].&lt;br /&gt;
## * Докажите, что определение НОД-а, приведённое ниже, корректно.&lt;br /&gt;
## Постройте алгоритм, основанный на этом определении.&lt;br /&gt;
## Какой алгоритм будет быстрее для n-битовых чисел a и b при больших значениях n --- ваш или алгоритм Евклида?&lt;br /&gt;
# * Покажите как за время O(n log n) удалить из массива размера n все дубликаты, то есть оставить каждый элемент в одном экземпляре.&lt;br /&gt;
# * Даны два упорядоченных массива размера m и n. Постройте алгоритм, находящий k-й по величине элемент в объединении этих массивов за время O(log(n+m)). &lt;br /&gt;
&lt;br /&gt;
Функция F(n).&lt;br /&gt;
  если n &amp;gt; 1:&lt;br /&gt;
    напечатать &amp;quot;всё ещё работаю&amp;quot;&lt;br /&gt;
    F(n/2)&lt;br /&gt;
    F(n/2)&lt;br /&gt;
&lt;br /&gt;
Определение НОД-а.&lt;br /&gt;
             2НОД(a/2, b/2), если а и b чётны,&lt;br /&gt;
  НОД(a,b) = НОД(a, b/2), если а нечётно, b чётно,&lt;br /&gt;
             НОД((a-b)/2, b), если а и b нечётны.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;lt;nowiki&amp;gt;Задачи взяты из книги &amp;quot;Алгоритмы&amp;quot;, глава 2 (см. список рекомендованной литературы).&amp;lt;/nowiki&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Сложение и умножение (19.01)==&lt;br /&gt;
# Алгоритм сложения, его сложность (§1.1.1 Сложение*)&lt;br /&gt;
# &amp;quot;Школьный&amp;quot; алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Рекурсивный алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Алгоритм умножения, реализующий стратегию &amp;quot;разделяй и властвуй&amp;quot;, анализ сложности (§2.1 Умножение чисел*)&lt;br /&gt;
 * [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать.]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 3 (19.01 - 2.02)===&lt;br /&gt;
* Во всех задачах для простоты можно считать, что n является степенью какого-либо числа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Найдите произведение чисел 10011011 и 10111010 (в двоичной системе счисления), используя алгоритм умножения чисел, основанный на методе «разделяй и властвуй». Необходимо не только дать ответ, но и привести ход решения.&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 3 рекурсивных вызова для подзадач размера n-1 и комбинирует из них решение исходной задачи за О(n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте три верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 10 рекурсивных вызовов для подзадач размера n/2 и комбинирует из них решение исходной задачи за О(5n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте два верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Докажите, что 3m² + m = O(m²).&lt;br /&gt;
# Докажите, что lg m = O(m/1000), где lg m — это логарифм с двоичным основанием.&lt;br /&gt;
# Докажите, что из равенства f(n) = O(g(n)) не следует, что g(n) = O(f(n)).&lt;br /&gt;
# Докажите, что O(m) содержится в O(m²).&lt;br /&gt;
&lt;br /&gt;
==Решение рекуррентных уравнений (22.01)==&lt;br /&gt;
# Примеры решений рекуррентных уравнений (см. [https://www.dropbox.com/s/6a0r410zjm9qwe7/algo-3-recurrences.pdf?dl=0 конспект]).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 4 (до 14.02)===&lt;br /&gt;
* Нельзя использовать утверждение основной теоремы о решении рекуррентных соотношений.&lt;br /&gt;
* &#039;&#039;Можно&#039;&#039; использовать метод построения дерева рекурсии или подстановку (метод с угадыванием ответа).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Какой из трёх приведённых ниже алгоритмов вы бы предпочли? Обоснуйте свой ответ.&lt;br /&gt;
#* Алгоритм A, решая задачу, производит пять рекурсивных вызовов для подзадач вдвое меньшего размера, после чего строит ответ для исходной задачи за линейное время.&lt;br /&gt;
#* Алгоритм B, решая задачу размера n, делает два рекурсивных вызова для задач размера n − 1, после чего находит ответ за время O(1).&lt;br /&gt;
#* Алгоритм C, решая задачу размера n, рекурсивно решает девять задач размера n/3 и строит ответ за время O(n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Найдите T(n) в замкнутой форме для любых 7 из 10 приведённых ниже рекуррентных соотношений:&lt;br /&gt;
## T(n) ≤ 2T(n/3) + 1;&lt;br /&gt;
## T(n) ≤ 7T(n/7) + n;&lt;br /&gt;
## T(n) ≤ 9T(n/3) + n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 8T(n/2) + n&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 49T(n/25) + n&amp;lt;sup&amp;gt;3/2&amp;lt;/sup&amp;gt;log n;&lt;br /&gt;
## T(n) ≤ T(n − 1) + 2;&lt;br /&gt;
## T(n) ≤ T(n − 1) + n&amp;lt;sup&amp;gt;c&amp;lt;/sup&amp;gt;, где c ≥ 1 –– константа;&lt;br /&gt;
## T(n) ≤ T(n − 1) + c&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;, где c &amp;gt; 1 –– константа;&lt;br /&gt;
## T(n) ≤ 2T(n − 1) + 1;&lt;br /&gt;
## T(n) ≤ T(sqrt(n)) + 1.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №1==&lt;br /&gt;
Необходимо реализовать все 6 задач из [https://official.contest.yandex.ru/contest/1002 контеста]. Каждую задачу можно писать на С++ или Python. На выполнение работы отводится две недели. Каждая задача оценивается в 10/6 балла. Оценка &#039;&#039;может&#039;&#039; быть снижена за плохой код, но не более чем на 25%.&lt;br /&gt;
&lt;br /&gt;
==Бинарное дерево поиска (26.01)==&lt;br /&gt;
# Определение. Пример.&lt;br /&gt;
# Не модифицирующие алгоритмы: поиск (рекурсивный и итеративный алгоритмы), поиск минимума, inordered обход (вывод значений узлов в отсортированном порядке), поиск следующего по возрастанию.&lt;br /&gt;
# Модифицирующие алгоритмы: вставка (рекурсивная реализация), удаление (только идея).&lt;br /&gt;
 [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 13, стр. 248]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 5 (до 16.02)===&lt;br /&gt;
* Для получения максимальной оценки можно выполнить или все задачи без звёздочки, или задачу со звёздочкой. Преподаватель понимает, что реализацию БДП сложно не найти в интернете, но от копипасты не будет никакой пользы. Напротив, самостоятельная реализация очень полезна и приветствуется, даже если не получится выполнить всех пунктов задания.&lt;br /&gt;
* Задачи с двумя звёздочками необязательны.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Нарисуйте бинарные деревья поиска высотой 2, 3, 4, 5 и 6 для множества ключей {1, 4, 5, 10, 16, 17, 21}. Корень дерева имеет высоту 0.&lt;br /&gt;
# &#039;&#039;&#039;Сортировка с использованием БДП.&#039;&#039;&#039;&lt;br /&gt;
## Какова асимптотическая сложность алгоритма вставки элемента в дерево высоты d? Почему? Назовите наилучший и наиухдший случаи.&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который строит БДП в узлах которого стоят элементы данной последовательности. Можно использовать функцию Insert. Назовите наилучший и наихудший случаи. Есть теорема о том, что полученный алгоритм будет работать в среднем случае за время O(n * log n).&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который выводит их в порядке возрастания. Используйте бинарное дерево поиска. Какова в среднем случае сложность этого алгоритма? Назовите наилучший и наихудший случаи. Какова сложность в наихудшем случае?&lt;br /&gt;
# Напишите функцию GetRoot, которой на вход подаётся указатель на произвольный узел дерева, а она возвращает указатель на корень.&lt;br /&gt;
# Напишите процедуру PrintLeafs, которой на вход подаётся указатель на корень дерева, и она печатает листья дерева&lt;br /&gt;
## по возрастанию,&lt;br /&gt;
## по убыванию.&lt;br /&gt;
# ** Альтернативный обход в порядке возрастания бинарного дерева поиска с n узлами (или центрированный (inordered) обход) можно осуществить путём поиска минимального элемента дерева с помощью функции Minimum с последующий n-1 вызовом функции Next. Каково время работы такого алгоритма?&lt;br /&gt;
# * Реализуйте на С++ структуру данных бинарное дерево поиска, [https://yadi.sk/i/gi2SEStreFfSb используя заготовку].&lt;br /&gt;
## Нарисуйте бинарное дерево поиска, которое строится в функции getTreeExample.&lt;br /&gt;
## Реализуйте следующие алгоритмы: &lt;br /&gt;
### поиск минимума, &lt;br /&gt;
### inordered обход (вывод значений узлов в отсортированном порядке),&lt;br /&gt;
### поиск следующего по возрастанию,&lt;br /&gt;
### вставка элемента в дерево,&lt;br /&gt;
### сортировка последовательности с использованием БДП (дан вектор чисел, необходимо вывести их по возрастанию),&lt;br /&gt;
### ** удаление.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Карацубы, Штрассена. Быстрая сортировка (29.01)==&lt;br /&gt;
# Алгоритм Карацубы.&lt;br /&gt;
# Алгоритм Штрассена. [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать Дасгупту и др., §2.5 Умножение матриц]&lt;br /&gt;
# Быстрая сортировка и доказательство того, что в среднем случае она работает за О(n * log n). [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 8 Быстрая сортировка, стр. 148]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 6 (до 18.02)===&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Пусть мы хотим найти двоичное представление десятичного числа 10&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;. Будем считать, что n --- степень двойки (n = 2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt;).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Pwr2Bin(n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть 1010&lt;br /&gt;
    z = ...&lt;br /&gt;
    вернуть Multiply(z, z)&amp;lt;/source&amp;gt;&lt;br /&gt;
Multiply --- функция, перемножающая два n-битовых двоичных числа x и y по алгоритму Карацубы за O(n&amp;lt;sup&amp;gt;log&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;3&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Пусть мы хотим перевести произвольное десятичное число x в записи которого n=2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; чисел в двоичную систему счисления.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Dec2Bin(x, n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть binary[x]&lt;br /&gt;
    разделить x на два десятичных числа xl и xr из n/2 цифр.&lt;br /&gt;
    вернуть ...&amp;lt;/source&amp;gt;&lt;br /&gt;
Здесь binary --- это массив, содержащий двоичное представление десятичных цифр.&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Докажите, что математическое ожидание времени работы алгоритма быстрой сортировки (усреднение по всем вариантам выбора опорного элемента) на любом входе размера n удовлетворяет соотношению: T(n) ≤ O(n) + 1/n * &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt; (T(i-1) + T(n-i)).&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Найдите решение соотношения из предыдущего пункта.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Динамическое программирование (ДП). Первые примеры (02.01)==&lt;br /&gt;
# Нахождение самой длинной возрастающей подпоследовательности.&lt;br /&gt;
# Нахождение редакционного расстояния (или редакционной стоимости, расстояния Левенштейна).&lt;br /&gt;
# Нахождение представителя большинства.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 7 (до 20.02)===&lt;br /&gt;
* В этом задании везде, где требуется реализовать алгоритм, необходимо привести код на любом языке программирования.&lt;br /&gt;
* Для получения максимальной оценки нужно решить все задачи без звёздочек. Одна решённая задача со звёздочкой заменяет одну задачу без звёздочки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения редакционного расстояния (алгоритм Вагнера — Фишера). Например, редакционное расстояние между словами &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равно 6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения длины наибольшей общей подстроки. Например, длина наибольшей общей подстроки &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равна 8 (&amp;quot;antholog&amp;quot;). Чем больше это значение, тем схожей строки.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Предположим теперь, что сравниваемые строки состоят из символов A, С, G и T; за удаление или вставку мы платим -5; за замену буквы x на y платим w[x, y], где x, y принадлежат множеству {A, С, G, T}, a w — это матрица весов:&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
!-!! A!! G!! C!! T&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! A&lt;br /&gt;
|10||-1||-3||-4&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
!G&lt;br /&gt;
||-1||7||-5||-3&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! C&lt;br /&gt;
||-3||-5||9||0&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! T&lt;br /&gt;
||-4||-3||0||8&lt;br /&gt;
|}&lt;br /&gt;
Тогда выравнивание:&lt;br /&gt;
 AGACTAGTTAC&lt;br /&gt;
 CGA‒‒‒GACGT&lt;br /&gt;
будет иметь следующую оценку:&lt;br /&gt;
 w[A,C] + w[G,G] + w[A,A] + 3*(-5) + w[G,G] + w[T,A] + w[T,C] + w[A,G] + w[C,T] = -3 + 7 + 10 - 3*5 + 7 + (-4) + 0 + (-1) + 0 = 1.&lt;br /&gt;
&lt;br /&gt;
Напишите алгоритм, который находит максимальную стоимость всех возможных выравниваний. Верно ли, что чем больше это значение, тем непохожей строки?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как давно один народ отделился от другого? Кто похожей — итальянец и китаец или якут и эфиоп? На эти вопросы можно отвечать с разных точек зрения — культурной, исторической, лингвистической, ... В последние же годы человечество научилось секвенировать геном, что позволило исследовать этот вопрос с точки зрения генетики. Секвенирование генома — это процесс записи ДНК в виде нуклеотидной последовательности, которая представляет собой последовательность из четырёх символов — A, С, G и T. Существуют базы, которые хранят генетическую информацию о людях из разных стран и континентов, например, [http://www.mtdb.igp.uu.se/ http://www.mtdb.igp.uu.se/ → Download mtDNA sequences]. Чем больше сходство между геномами, тем сильнее родственные связи между их обладателями. Используя решение предыдущего пункта, выполните задания:&lt;br /&gt;
# Определите, кто похожей — итальянец и китаец или якут и эфиоп?&lt;br /&gt;
# Найдите нескольких похожих и нескольких непохожих народностей.&lt;br /&gt;
# * Выберите одну народность. Найдите самых похожих и самых непохожих на неё.&lt;br /&gt;
# * Найдите самые похожие и самые непохожие народности.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Задача о разрезании стержня (05.01)==&lt;br /&gt;
# Постановка задачи.&lt;br /&gt;
# Решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Решение с нахождением максимума по p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Восходящий алгоритм с запоминанием. Вывод длин кусочков стержня. Оценка сложности.&lt;br /&gt;
# Нисходящий алгоритм с запоминанием. Оценка сложности.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.1 Разрезание стержня, стр. 393]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 8 (до 22.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Решая задачу о разрезании стержня мы вначале построили рекурсивное решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt; для всех 1 ≤ i &amp;lt; n. Его сложность описывалась рекуррентной формулой T(n) = n + &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n-1&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt;(T(i) + T(n-i)), T(1) = 1.&lt;br /&gt;
# Объясните эту формулу.&lt;br /&gt;
# Покажите с помощью метода подстановок, что T(n) ≤ 2&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Покажите с помощью контрпримера, что описанная далее жадная стратегия не всегда определяет оптимальный способ разрезания стержня. Определим плотность стержня длиной i как p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;/i, то есть как стоимость единицы его длины. Жадная стратегия для стержня длиной n отрезает от стержня первую часть длиной i, где 1 ≤ i ≤ n, имеющую максимальную плотность. Затем та же жадная стратегия применяется к оставшейся части длиной n-i.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Рассмотрим модификацию задачи разрезания стержня, в которой в дополнение к цене p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; каждого стержня добавляется фиксированная цена разреза c. Теперь прибыль, связанная с решением, представляет собой сумму цен частей стержня минус стоимость разрезов. Разработайте алгоритм динамического программирования для этой модифицированной задачи.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Непрерывным участком называется группа подряд идущих элементов. Например, для последовательности&lt;br /&gt;
 5, 15, −30, 10, −5, 40, 10&lt;br /&gt;
элементы 15, −30, 10 образуют непрерывный участок, а 5, 15, 40 -- нет. Постройте линейный алгоритм для следующей задачи:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Вход: список чисел a1, a2, ... ‌, an.&lt;br /&gt;
Выход: непрерывный участок с максимальной суммой (сумма участка нулевой длины равна нулю).&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Для приведённого примера ответом будет 10, −5, 40, 10 с суммой 55. Какова сложность алгоритма? Почему?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Надо заплатить v рублей, имея купюры в x1, x2, ‌..., xn рублей (купюр каждого типа сколько угодно). Это не всегда возможно (скажем, купюрами в&lt;br /&gt;
10 и 25 рублей можно заплатить 45 рублей, но не 47 и не 15). Постройте основанный на методе динамического программирования алгоритм со временем работы O(nv), выясняющий, возможна ли уплата.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как решить предыдущую задачу, если каждая купюра имеется в единственном экземпляре? (Например, купюрами в 1, 5, 10, 20 рублей можно заплатить 16 = 1 + 5 + 10 и 31 = 1 + 10 + 20 рублей, но не 40 (не хватит денег). Время работы алгоритма по-прежнему O(nv).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Ещё один вариант той же задачи: купюр каждого типа сколько угодно, но всего разрешается использовать не более k купюр. (Например, если есть купюры в 5 и 10 рублей, а k = 6, то 55 разменять можно, а 65 –– нет).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Перемножение цепочки матриц. Оптимальное бинарное дерево поиска (начало) (09.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о перемножении цепочки матриц. Постановка задачи.Пример. Нисходящий алгоритм.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.2 Перемножение цепочки матриц, стр. 403]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 9 (до 24.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Найдите оптимальную расстановку скобок в произведении последовательности матриц, размерности которых равны 5×10, 10×3, 3×12, 12×5, 5×50, 50×6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Напишите восходящий алгоритм для поиска оптимальной расстановки скобок.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Расстановка пробелов. Оптимальное бинарное дерево поиска (середина) (12.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о расстановке пробелов. Постановка задачи. Решения для трёх случаев: 1. нужно вернуть можно ли разбить текст на слова; 2. вернуть разбивку на слова; 3. слова встречаются не равновероятно, вернуть наиболее вероятную разбивку на слова.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи. Вывод математического ожидания времени поиска.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Праздничное домашнее задание 10 (до 02.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[&amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;,&amp;quot;, &amp;quot;.&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;,&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;.&amp;quot;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Подсказка:&#039;&#039;&#039; разбейте текст на слова из списка и посмотрите на азбуку Морзе.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Способы представления графов в памяти (16.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Разбор ошибок в домашнем задании.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Графы. Способы представления графов в памяти (матрица смежности, список рёбер, список соседей (список смежностей), матрица инцидентности). Зависимость сложности алгоритмов от способа представления.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §22.1 Представление графов, стр. 626]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 11 (до 02.03)===&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача A.]&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача B.]&lt;br /&gt;
# Нарисуйте неориентированный граф с 5 вершинами и 8 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Нарисуйте ориентированный граф с 4 вершинами и 3 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Дан ориентированный граф. &#039;&#039;Исходящая степень вершины v&#039;&#039; --- это количество исходящих из неё рёбер, &#039;&#039;входящая степень v&#039;&#039; --- это количество рёбер входящих в  v. Имеется представление ориентированного графа с использование списка соседей. Как долго будут вычисляться исходящие степени всех вершин графа? А входящие степени?&lt;br /&gt;
# Дан граф G = (V, E). Какие из рассмотренных способов хранения графов используют меньше всего памяти для хранения G и почему? Указание: рассмотрите случаи |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;lt; |E| и |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;gt; |E|.&lt;br /&gt;
# Пусть C --- это матрица смежности графа G.&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
# Пусть B --- это матрица инцидентности ориентированного графа G. Как связаны элементы матрицы BB&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
&lt;br /&gt;
==Реализация поиска в глубину (19.02)==&lt;br /&gt;
# Реализация поиска в глубину и смежных задач.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 12 (до 5.03)===&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Выберите любой способ хранения графа. Реализуйте поиск в глубину.&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Напишите алгоритм, который возвращает данные о том, какие вершины лежат в одной компоненте связности.&lt;br /&gt;
# &#039;&#039;(любой ЯП или псевдокод)&#039;&#039; Напишите алгоритм проверки сильной связности ориентированного графа. Какова его сложность?&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №2==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
Необходимо реализовать 3 задачи из [https://official.contest.yandex.ru/contest/1085 контеста], см. [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing распределение задач]. Каждую задачу можно написать на С++ или Python. На выполнение работы отводится две недели (см. время окончания контеста). [https://official.contest.yandex.ru/contest/1123 Дорешивание.]&lt;br /&gt;
&lt;br /&gt;
==ДП и графы (26.02)==&lt;br /&gt;
==ДП и графы (02.03)==&lt;br /&gt;
==Жадные алгоритмы (12.03)==&lt;br /&gt;
===Домашнее задание 13 (до 23.03)===&lt;br /&gt;
# Вася хочет купить по одной акции каждой компании. Все акции стоят одинаково, но дорожают по-разному. Каждый месяц акция i-ой компании дорожает в r_i раз. В один месяц можно купить только одну акцию.&lt;br /&gt;
## Напишите алгоритм, который выводит оптимальную последовательность покупок (такую, что на покупку всех акций потратится меньше денег).&lt;br /&gt;
## Докажите корректность алгоритма, то есть докажите, что последовательность покупок, которую выводит ваш алгоритм, оптимальна.&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список, очередь (16.03)==&lt;br /&gt;
# Реализация линейного двусвязного списка (С++).&lt;br /&gt;
# Реализация очереди ограниченной длины на базе вектора (С++).&lt;br /&gt;
# Реализация очереди на базе списка (С++).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14 (до 23.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте (на С++) структуру данных Стек. У стека должно быть три операции:&lt;br /&gt;
* push --- положить элемент на вершину стека;&lt;br /&gt;
* pop --- удалить верхний элемент;&lt;br /&gt;
* front --- вернуть значение верхнего элемента.&lt;br /&gt;
Оцените время работы каждой функции.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список (19.03)==&lt;br /&gt;
===Домашнее задание 13* (до 30.03)===&lt;br /&gt;
#Для приведённой реализации класса List (https://yadi.sk/i/c5r_79WdfMyNS).&lt;br /&gt;
## Допишите print, push_back и push_front.&lt;br /&gt;
## В функции insert_after и delete_node вставьте необходимые проверки так, чтобы они работали для крайних случаев.&lt;br /&gt;
## Напишите main в котором&lt;br /&gt;
### создаётся объект класса List, &lt;br /&gt;
### заполняется элементами с помощью функций push_back, push_front и insert_after и&lt;br /&gt;
### удаляется i-ый элемент.&lt;br /&gt;
&lt;br /&gt;
==Повторение (30.03)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Для данных пар функций выясните их связь в терминах O-, o-, Ω-, ω-, Θ-обозначений. Поставьте галочку в клетке с Ω, если f(x) = Ω(g(x)) и прочерк, если равенства нет. [https://ru.wikipedia.org/wiki/«O»_большое_и_«o»_малое#.D0.94.D1.80.D1.83.D0.B3.D0.B8.D0.B5_.D0.BF.D0.BE.D0.B4.D0.BE.D0.B1.D0.BD.D1.8B.D0.B5_.D0.BE.D0.B1.D0.BE.D0.B7.D0.BD.D0.B0.D1.87.D0.B5.D0.BD.D0.B8.D1.8F Википедия]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! f(x)!! g(x)!! O!! o!! Ω!! ω!! Θ&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! 2^100&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n * log(n)&lt;br /&gt;
! 2^100 * n * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n&lt;br /&gt;
! 2^100 * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n!&lt;br /&gt;
! 2^(2015n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n*2^n&lt;br /&gt;
! 3^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 5^n&lt;br /&gt;
! 5^(n+1)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n + n^2 + n^3 + ... + n^1000&lt;br /&gt;
! 7^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм Quickselect нахождения k-ого элемента по возрастанию: http://en.wikipedia.org/wiki/Quickselect&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;На улице стоит ряд домов. В каждом из домов лежит сколько-то денег. Вор хочет обокрасть дома на переулке. Он не может обокрасть два соседних дома, потому что хозяин дома, который он обокрал, сразу предупредит соседей. Нужно найти, какую максимальную сумму вор может украсть с переулка. На вход программы подается массив неотрицательных целых чисел - количество долларов в доме с номером i. Соседние дома в массиве представлены соседними элементами. Например, пусть задан массив { 1, 4, 5 } - тогда вор максимум может украсть $6, обокрав дома 1 и 3. Пусть задан массив { 1, 7, 2 } - тогда вор максимум может украсть $7, обокрав дом 2.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Алфавит из всех маленьких латинских букв и пробела закодирован числами следующим способом:&lt;br /&gt;
  &#039;a&#039; -&amp;gt; 1&lt;br /&gt;
  &#039;b&#039; -&amp;gt; 2&lt;br /&gt;
  &#039;c&#039; -&amp;gt; 3&lt;br /&gt;
  ...&lt;br /&gt;
  &#039;z&#039; -&amp;gt; 26&lt;br /&gt;
  &#039; &#039; -&amp;gt; 27&lt;br /&gt;
На вход программы подается строка из цифр. Нужно посчитать, сколькими способами можно раскодировать эту строку.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Дан граф, заданный матрицей смежности. Вывести пары вершин между которыми нет пути.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Повторение (02.04) ==&lt;br /&gt;
Решали и разбирали первые 4 задачи из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14* (до 11.03)===&lt;br /&gt;
Решите любые две задачи (подпункты НЕ считаются отдельными задачами) с предыдущей пары (Повторение (30.03)).&lt;br /&gt;
&lt;br /&gt;
== Повторение (06.04) ==&lt;br /&gt;
Будем решать вторую половину задач из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 15 (до 16.04)===&lt;br /&gt;
# Приведите пример графа, который содержит отрицательные рёбра, не содержит циклов отрицательного веса и для которого алгоритм Дейкстры возвращает неверный результат.&lt;br /&gt;
# Используется ли в алгоритме Дейкстры то, что веса рёбер неотрицательны? Если &amp;quot;да&amp;quot;, то где именно?&lt;br /&gt;
# Пусть граф содержит рёбра с весами &amp;gt;= -100. Если прибавить к каждому ребру 101 и при помощи алгоритма Дейкстры найти кратчайшие пути. Будут ли эти пути кратчайшими в исходном графе? Почему?&lt;br /&gt;
&lt;br /&gt;
== Повторение (07.04) ==&lt;br /&gt;
&#039;&#039;&#039;Решение рекуррентных соотношений&#039;&#039;&#039;&lt;br /&gt;
# Решите уравнение: T(n) = 4*T(n/2) + O(n^2) с базой T(1) = O(1)&lt;br /&gt;
## Используя основную теорему.&lt;br /&gt;
## Используя дерево рекурсий.&lt;br /&gt;
## Методом подстановки.&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2)) + n является \Theta(n lg n).&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2) + 17) + n является \Theta(n lg n).&lt;br /&gt;
# Решите уравнения, считая, что T(1) = O(1):&lt;br /&gt;
## T(n) = T(n-1) + n&lt;br /&gt;
## T(n) = 2*T(floor(sqrt(n))) + lg n. Указание: попробуйте использовать замену переменных.&lt;br /&gt;
## T(n) = 3*T(sqrt(n)) + lg n&lt;br /&gt;
# Дайте верхнюю и нижнюю оценки функции T(n). Постарайтесь, чтобы оценки были как можно более точные&lt;br /&gt;
## T(n) = 4T(n/3) + n*lg(n)&lt;br /&gt;
## T(n) = 3T(n/3) + n/lg(n)&lt;br /&gt;
## T(n) = 4T(n/2) + n^2*sqrt(n)&lt;br /&gt;
## T(n) = T(n/2) + T(n/4) + T(n/8) + n&lt;br /&gt;
## T(n) = T(n-1) + 1/n&lt;br /&gt;
## T(n) = T(n-2) + 1/lg(n)&lt;br /&gt;
## T(n) = sqrt(n) * T(sqrt(n)) + n&lt;br /&gt;
&#039;&#039;&#039;Анализ и построение алгоритмов&#039;&#039;&#039;&lt;br /&gt;
# Числа Фибоначчи F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; можно выразить через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, используя матрицу: https://yadi.sk/i/Pm_aNzHCforFU. &lt;br /&gt;
## Покажите как вычислить F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;.&lt;br /&gt;
## Как вычислить F&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;n+1&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;?&lt;br /&gt;
## Напишите алгоритм.&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
## Ускорьте его так, чтобы он работал за O(log n).&lt;br /&gt;
# Дана последовательность символов. Какое минимальное количество символов нужно удалить из неё, чтобы получить палиндром?&lt;br /&gt;
## Напишите алгоритм (на псевдокоде или на любом языке программирования).&lt;br /&gt;
## Оцените время работы алгоритма.&lt;br /&gt;
# Какую структуру данных вы бы использовали для реализации упорядоченного множества (http://neerc.ifmo.ru/wiki/index.php?title=Упорядоченное_множество)? Какая будет сложность каждой из операций над множеством?&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 16 (до 20.04)===&lt;br /&gt;
# Решите 6 задач из первой части и 6 из второй. (Укажите какие именно.) Каждый из подпунктов является отдельной задачей.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм и теорема Форда-Фалкерсона (16.04)==&lt;br /&gt;
# Базовые определения (пропускные способности, сток, исток и пр.). Пример. &lt;br /&gt;
# Ограничения на поток (сохранение и что меньше пропускных способностей).&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, пример работы&lt;br /&gt;
# Разрез, определение, пример.&lt;br /&gt;
# Утверждение: максимальный поток &amp;lt;= любого разреза.&lt;br /&gt;
# Теорема Форда-Фалкерсона (с доказательством).&lt;br /&gt;
# Пример на котором алгоритм Форда-Фалкерсонаработает работает очень долго при неудачном выборе путей.&lt;br /&gt;
# Сложность алгоритма Форда-Фалкерсона.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №3==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
В [https://official.contest.yandex.ru/contest/1196 домашнем задании] пять задач. Они разделены на два варианта, помеченные римскими цифрами I и II. Свой вариант нужно узнать [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing здесь на вкладке HW3]. Третья задача — общая для двух вариантов; ее решение необходимо снабдить доказательством корректности алгоритма. На выполнение задания дается примерно 2 недели (см. точное время окончания в контесте). Каждую задачу можно написать на С++ или Python.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Форда-Фалкерсона и Эдмондса-Карпа (20.04)==&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, напоминание: базовые определения, пример работы, пример на котором алгоритм работает долго, сложность.&lt;br /&gt;
# Алгоритм Эдмодса-Карпа. Доказательство асимптотики времени работы.&lt;br /&gt;
&lt;br /&gt;
==(23.04)==&lt;br /&gt;
&lt;br /&gt;
==(11.05) Красно-чёрные деревья==&lt;br /&gt;
[https://ru.wikipedia.org/wiki/Красно-чёрное_дерево Красно-чёрное дерево]&lt;br /&gt;
===Домашнее задание 17 (до 18.05)===&lt;br /&gt;
# Зачем нужны красно-чёрные деревья?&lt;br /&gt;
# Благодаря какому свойству и почему красно-чёрное дерево является сбалансированным?&lt;br /&gt;
# Нарисуйте полное бинарное дерево поиска высотой 3 с ключами {1, 2, ..., 15}. Сделайте из него красно-чёрные деревья высотой 2, 3 и 4.&lt;br /&gt;
# Нарисуйте красно-чёрные деревья, получающиеся последовательной вставкой элементов 12, 10, 29, 30, 31, 32 в [https://ru.wikipedia.org/wiki/Красно-чёрное_дерево#/media/File:Red-black_tree_example.svg данное дерево]. Для вставки используйте алгоритм вставки из Википедии. Укажите какой именно функцией вы воспользовались.&lt;br /&gt;
# Определим &#039;&#039;&#039;ослабленное красно-чёрное дерево&#039;&#039;&#039; как бинарное дерево поиска, которое удовлетворяет красно-чёрным свойствам 1, 3, 4 и 5. Другими словами, корень может быть как чёрным, так и красным. Рассмотрите ослабленное красно-чёрное дерево T, корень которого красный. Если перекрасить корень дерева T в чёрный, будет ли оно красно-чёрным деревом?&lt;br /&gt;
# Покажите, что самый длинный простой нисходящий путь от вершины x к листу красно-черного дерева имеет длину, не более чем в два раза превышающую кратчайший путь от x к листу-потомку.&lt;br /&gt;
# Чему равно наибольшее возможное количество внутренних узлов в красно-чёрном дереве с чёрной высоты k? А наименьшее возможное количество?&lt;br /&gt;
# Нарисуйте красно-чёрные деревья, получающиеся последовательной вставкой ключей 41, 38, 31, 12, 19, 8 в изначально пустое дерево.&lt;br /&gt;
# Покажите какие деревья будут получаться в результате последовательного удаления ключей в порядке 8, 12, 19, 31, 38, 41.&lt;br /&gt;
&lt;br /&gt;
==(14.05) Конкурентный анализ самоорганизующихся циклов==&lt;br /&gt;
[https://vk.com/doc12518218_390369758 Лекция]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 18 (до 21.05)===&lt;br /&gt;
Все вычисления сопроводите подробными объяснениями о том, почему верно то или иное (не)равенство.&lt;br /&gt;
# Пусть имеется n-элементный список и m поисковых запросов к нему. После каждой операции поиска можно переупорядочить список. Обозначим стоимость последовательности поисков через C. Докажите, что в худшем случае C = Ω(mn).&lt;br /&gt;
#  Обозначим через c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; стоимость i-ого поискового запроса с применением эвристики перемещения в начало, которая включает стоимость поиска элемента в списке и стоимость его перемещения в начало списка путём ряда обменов соседних элементов списка. Покажите, что i-ая операция поиска находит элемент x в списке L с применением эвристики перемещения в начало, то c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = 2 * rank&amp;lt;sub&amp;gt;L&amp;lt;/sub&amp;gt;(x) - 1.&lt;br /&gt;
# Покажите, что c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = 2 * rank&amp;lt;sub&amp;gt;L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) - 1.&lt;br /&gt;
# Покажите, что c*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = rank&amp;lt;sub&amp;gt;L*&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) + t&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;.&lt;br /&gt;
# Докажите, что после одного обмена двух соседних элементов потенциал либо увеличивается на 2, либо уменьшается на 2.&lt;br /&gt;
# Докажите, что rank&amp;lt;sub&amp;gt;L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) = |A| + |B| + 1.&lt;br /&gt;
# Докажите, что rank&amp;lt;sub&amp;gt;L*&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) = |A| + |С| + 1.&lt;br /&gt;
# Покажите, что поиск i-ого элемента приводит к изменению потенциала Ф(L&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;) - Ф(L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;) &amp;lt;= 2 (|A| - |B| + t*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;), где t*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; --- это количество обменов при i-ом поиске.&lt;br /&gt;
# Во сколько раз стоимость С&amp;lt;sub&amp;gt;MFT&amp;lt;/sub&amp;gt;(S) превышает C&amp;lt;sub&amp;gt;OPT&amp;lt;/sub&amp;gt;(S)?&lt;br /&gt;
&lt;br /&gt;
== (18.05) Конечные автоматы ==&lt;br /&gt;
=== Задание 19 (до 25.05) ===&lt;br /&gt;
# Постройте автомат для языка над алфавитом Σ = {0, 1} каждое слово которого содержит хотя бы два нуля. Является ли он детерминированным?&lt;br /&gt;
# Постройте автомат над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5. Является ли он детерминированным?&lt;br /&gt;
# Постройте автомат, который допускает пустой язык (язык в котором нет ни одного слова).&lt;br /&gt;
# Постройте автомат, который допускает все слова над алфавитом Σ.&lt;br /&gt;
# Постройте ДКА над алфавитом Σ = {К, Ж, З}, который допускает слова в которых после К идёт З, после З --- Ж, после Ж --- К.&lt;br /&gt;
# * Постройте ДКА над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5, а число нулей на 3.&lt;br /&gt;
# Постройте НКА для языка над алфавитом Σ = {0, 1, 2, 3}, состоящий из слов, в которых хотя бы одна из последних пяти букв является 1.&lt;br /&gt;
# Постройте НКА над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5, а число нулей на 3.&lt;br /&gt;
# Какие языки допускают автоматы https://yadi.sk/d/fNAHbjCZghERG?&lt;br /&gt;
# Для каждого из автоматов https://yadi.sk/d/fNAHbjCZghERG постройте соответствующий ему ДКА.&lt;br /&gt;
&lt;br /&gt;
== (21.05) Регулярные выражения, КА, их эквивалентность. Лемма о накачке  ==&lt;br /&gt;
=== Задание 20 (до 28.05) ===&lt;br /&gt;
&#039;&#039;&#039;I Написать регулярные выражения&#039;&#039;&#039;&lt;br /&gt;
# Напишите регулярное выражение для языка над алфавитом Σ = {0, 1} каждое слово которого содержит хотя бы два нуля.&lt;br /&gt;
# Напишите регулярное выражение над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5.&lt;br /&gt;
# Напишите регулярное выражение, которое допускает пустой язык (язык в котором нет ни одного слова).&lt;br /&gt;
# Напишите регулярное выражение, которое допускает все слова над алфавитом Σ.&lt;br /&gt;
# Напишите регулярное выражение для языка над алфавитом Σ = {0, 1, 2, 3}, состоящий из слов, в которых хотя бы одна из последних пяти букв является 1.&lt;br /&gt;
&#039;&#039;&#039;II КА и регулярные выражения&#039;&#039;&#039;&lt;br /&gt;
# Постройте конечный автомат для языка (111 U 01)&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;1(00 U 11)&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;.&lt;br /&gt;
# Постройте конечный автомат для языка (ab)&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;(a U b)(b U a)&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;(a U bab).&lt;br /&gt;
&#039;&#039;&#039;III Доказать замкнутость относительно различных операций&#039;&#039;&#039;&lt;br /&gt;
# Покажите, что если для языков L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; и L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; существует КА, который их читает, то существует КА и для их объединения L = {w | w ∈ L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; или w ∈ L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;}.&lt;br /&gt;
# Покажите, что если для языка L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; и L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; существует КА, который их читает, то существует КА и для языка L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; = {xy | x ∈ L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, y ∈ L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;}.&lt;br /&gt;
# Покажите, что если для языка L существует КА, который его читает, то существует КА и для &#039;&#039;&#039;замыкания Клини&#039;&#039;&#039; L* = {w&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; w&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; ... w&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;| w&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; ∈ L, w&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; ∈ L, ..., w&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; ∈ L}.&lt;br /&gt;
# Покажите, что если язык L регулярен, то регулярно его дополнение (т.е. язык над тем же алфавитом, которому принадлежит слово тогда и только тогда, когда оно НЕ принадлежит L) .&lt;br /&gt;
# Покажите, что если язык L регулярен, то регулярно его обращение L&amp;lt;sub&amp;gt;R&amp;lt;/sub&amp;gt; = {a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; . . . a&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; | a&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; . . . a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; ∈ L}. (L&amp;lt;sub&amp;gt;R&amp;lt;/sub&amp;gt; --- это язык в котором все слова языка L записаны наоборот.)&lt;br /&gt;
# * Покажите, что если языки L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; и L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; регулярны, то регулярно их пересечение.&lt;br /&gt;
&#039;&#039;&#039;IV Использование леммы о накачке&#039;&#039;&#039; (см. [https://vk.com/doc12518218_392750846 конспект])&lt;br /&gt;
# Докажите, что не существует КА, который бы читал язык {0&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;1&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;2&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;}. (Пояснение: запись 0&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; означает строку из n нулей: 00...0.)&lt;br /&gt;
# Докажите, что не существует КА, который бы читал язык {0&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;1&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;}.&lt;br /&gt;
# Докажите, что не существует КА, который бы читал язык {0&amp;lt;sup&amp;gt;n!&amp;lt;/sup&amp;gt;}.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== (25.05) Автоматный подход ==&lt;br /&gt;
=== Задание 21 (до 01.06) ===&lt;br /&gt;
Реализуйте один из следующих проектов:&lt;br /&gt;
# Программа, которая считывает строку и говорит принадлежит ли она языку 0(123)*(00 U (231)*) U 111.&lt;br /&gt;
# Программа, которая считывает КА и генерирует программу на языке С++, которая говорит принадлежит ли заданное слово языку, описываемому этим КА.&lt;br /&gt;
# Программа, которая считывает регулярное выражение и строку и говорит принадлежит ли слово языку, описываемому этим регулярным выражением.&lt;br /&gt;
# Программа, которая моделирует работу банкомата, автомата с газировкой, лифта... (что-то одно на выбор)&lt;br /&gt;
# Текстовый симулятор студента. Возможные состояния: на паре, дома, есть приглашение прогулять, завтра коллоквиум, сплю и др. Есть два параметра: успеваемость и весёлось. Если хотя бы один из них упадёт ниже критической отметки, студент умрёт. Игрок принимает решение куда идти студенту. Цель: продержаться как можно дольше.&lt;br /&gt;
&lt;br /&gt;
== Большое домашнее задание 4 ==&lt;br /&gt;
[https://official.contest.yandex.ru/contest/1259 Контест]. В домашнем задании четыре задачи. Обязательны первые три. Вместо одной из первых трёх можно сделать последнюю (только для первых 10 решивших 4-ую!). На выполнение задания даётся примерно 2 недели (см. точное время окончания в контесте). Условия ревью определяют семинаристы.&lt;br /&gt;
&lt;br /&gt;
== (01.06) P vs NP ==&lt;br /&gt;
&#039;&#039;&#039;План занятия&#039;&#039;&#039;&lt;br /&gt;
# Напоминание: P; NP; проблема P ?= NP; NPC; сведения; пример сведений.&lt;br /&gt;
&lt;br /&gt;
=== Задание 22 (до 8.06) ===&lt;br /&gt;
1. &#039;&#039;Задачи поиска&#039;&#039; и &#039;&#039;задачи оптимизации&#039;&#039;. Для задачи коммивояжёра варианты с поиском и оптимизацией выглядят так:&lt;br /&gt;
  Задача поиска:&lt;br /&gt;
  &#039;&#039;Вход:&#039;&#039; матрица расстояний, бюджет b&lt;br /&gt;
  &#039;&#039;Выход:&#039;&#039; цикл веса не более b, проходящий по всем вершинам графа, если такой есть.&lt;br /&gt;
&lt;br /&gt;
  Оптимизационная задача:&lt;br /&gt;
  &#039;&#039;Вход:&#039;&#039; матрица расстояний&lt;br /&gt;
  &#039;&#039;Выход:&#039;&#039; цикл минимального веса, проходящий по всем вершинам графа, если такой есть.&lt;br /&gt;
&lt;br /&gt;
Покажите, что если поисковую задачу коммивояжёра можно решить за полиномиальное время, то и оптимизационный вариант можно решить за полиномиальное время.&lt;br /&gt;
&lt;br /&gt;
2. &#039;&#039;Задача поиска&#039;&#039; и &#039;&#039;задача разрешения&#039;&#039;. Пусть имеется программа, которая за полиномиальное время отвечает на вопрос , содержит л входной граф гамильтонов цикл. Как с её помощью найти за полиномиальное время сам цикл (есть он есть)?&lt;br /&gt;
&lt;br /&gt;
3. Для задач ниже или приведите алгоритм, работающий за полиномиальное время, или сведите их к NP-полной задаче:&lt;br /&gt;
# Поиск самого длинного пути&lt;br /&gt;
# Поиск кратчайшего пути&lt;br /&gt;
# Двудольное паросочетание&lt;br /&gt;
# Трёхдольное паросочетание&lt;br /&gt;
# Четырёхдольное паросочетание&lt;/div&gt;</summary>
		<author><name>Kassalanche</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=16695</id>
		<title>Алгоритмы и структуры данных. Подгруппа 105-1</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=16695"/>
		<updated>2015-06-01T06:10:53Z</updated>

		<summary type="html">&lt;p&gt;Kassalanche: /* Задание 22 (до 8.06) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==О курсе==&lt;br /&gt;
[[Алгоритмы_и_структуры_данных|План лекций и список рекомендуемой литературы.]]&lt;br /&gt;
&lt;br /&gt;
[[Алгоритмы_и_структуры_данных._Подгруппа_105-1._FAQ|FAQ.]]&lt;br /&gt;
&lt;br /&gt;
[[Reviewboard|Инструкция по использованию Reviewboard.]]&lt;br /&gt;
&lt;br /&gt;
[[Практические_занятия_по_курсу_ОиМП/C++_check|Style guide.]]&lt;br /&gt;
&lt;br /&gt;
==Итоговая оценка за курс==&lt;br /&gt;
Итоговая оценка (ИО) зависит от&lt;br /&gt;
* оценок за пять больших домашних заданий (БДЗ1, БДЗ2, ..., БДЗ5),&lt;br /&gt;
* оценок за домашние задания (ДЗ1, ДЗ2, ...),&lt;br /&gt;
* оценки за контрольную работу (КР),&lt;br /&gt;
* оценки за экзамен (ЭКЗ),&lt;br /&gt;
и может быть вычислена по формуле:&lt;br /&gt;
 ИО = 0.7 * (0.3 * КР + 0.7 *(ИДЗ1 + ИДЗ2 + ИДЗ3 + ИДЗ4 + ИДЗ5)/5) + 0.3 * ЭКЗ =&lt;br /&gt;
    = 0.21*КР + 0.098*ИДЗ1 + 0.098*ИДЗ2 + 0.098*ИДЗ3 + 0.098*ИДЗ4 + 0.098*ИДЗ5 + 0.3*ЭКЗ,&lt;br /&gt;
где&lt;br /&gt;
 ИДЗi = min (10, 0.7 * БДЗi + 0.4 * &amp;lt;cредняя оценка за ДЗj, прошедшие с предыдущего БДЗ по i-ое&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
==Порядок сдачи домашних работ==&lt;br /&gt;
===Большие домашние работы===&lt;br /&gt;
# Получить OK за задачу в контесте.&lt;br /&gt;
# Залить исходный код на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* На каждую задачу создавайте отдельный запрос на ревью. &lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении суток приходят замечания к коду. &#039;&#039;&#039;Если в течении суток замечаний или Ship It не появилось, проверьте, что вы правильно отправили запрос и, если всё сделано правильно, спросите у семинариста получил ли он запрос.&#039;&#039;&#039;&lt;br /&gt;
# Вы их исправляете, проверяете в контесте, что программа по-прежнему проходит все тесты, заливаете новую версию в Review Board. Штрафов за посылки НЕ будет.&lt;br /&gt;
# Процесс повторяется пока остаются замечания к коду или пока не истёк дедлайн. После закрытия контеста будут ещё одни сутки на доработку замечаний в Review Board.&lt;br /&gt;
# Оценивается только последняя версия работы в Review Board.&lt;br /&gt;
&lt;br /&gt;
===Маленькие домашние работы===&lt;br /&gt;
# Залить решение на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* Желаемые форматы: txt, py, cpp, h. Допускаются любые другие.&lt;br /&gt;
#* На каждую домашнюю работу создавайте отдельный запрос на ревью. Обязательно указывайте номер домашней работы.&lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении неопределенного промежутка времени придут оценки по каждому из заданий.&lt;br /&gt;
&lt;br /&gt;
==Оценивание домашних работ==&lt;br /&gt;
* Все задания предполагаются индивидуальными. Запрещены любые заимствования без ссылки на автора.&lt;br /&gt;
* Решения после установленного дедлайна не принимаются. Дедлайн указан в заголовке каждого задания.&lt;br /&gt;
* Везде, где требуется написать алгоритм, можно использовать любой язык программирования или псевдокод.&lt;br /&gt;
* Там, где требуется построить алгоритм с заданной асимптотикой, приведите обоснование, что полученный алгоритм удовлетворяет этому условию.&lt;br /&gt;
* Эти правила не действуют, если в задании явно оговорено иное.&lt;br /&gt;
&lt;br /&gt;
==Мотивация к изучению алгоритмов. Подсчёт числа операций (12.01)==&lt;br /&gt;
# Числа Фибоначчи. Определение. Примитивный рекурсивный алгоритм вычисления i-ого числа. Оценка числа операций. Анализ причин неэффективности. Алгоритм с запоминанием вычисленных ранее значений. Оценка числа операций. Сравнение с предыдущим. (подробнее: глава 0, страницы 8-10 из книги &amp;lt;&amp;lt;Алгоритмы&amp;gt;&amp;gt;, [[Алгоритмы_и_структуры_данных|см. список рекомендованной литературы]])&lt;br /&gt;
# Задача о ханойской башне. Постановка задачи. Рекурсивный алгоритм. Рекуррентная формула для числа перемещений. Замкнутая формула для числа перемещений (+ доказательство). Доказательство того, что эту задачу нельзя решить используя меньшее число перемещений дисков. ([https://www.dropbox.com/s/t8cbs7ttu4iasvj/algo-0-recursion.pdf?dl=0 Разбор задачи о ханойской башне], автор Сергей Объедков)&lt;br /&gt;
# Сортировка пузырьком. Алгоритм. Подсчёт количество операций сравнения и обмена (swap). Анализ наилучшего и наихудшего случаев ([https://ru.wikipedia.org/wiki/Сортировка_пузырьком Википедия])&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 1 (12.01 - 26.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
Во всех задачах, если не оговорено иного, предполагаем, что работаем с целыми неотрицательными числами. Для первых 7 задач необходимо&lt;br /&gt;
* описать что можно считать наилучшим и наихудшим случаями,&lt;br /&gt;
* для каждого из двух случаев подсчитать отдельно количество операций сравнения и swap (если есть).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Даны три числа, требуется вернуть наименьшее.&lt;br /&gt;
# Даны три числа, требуется отсортировать их.&lt;br /&gt;
# Дана последовательность A из n элементов и число x, требуется найти элемент равный x. Примечание: если таких значений i несколько, вернуть любое; если такого элемента нет, функция должна сообщить об этом.&lt;br /&gt;
# * Дана упорядоченная последовательность A из n элементов и число x, требуется найти такое i, что A[i] равно x. Алгоритм должен быть эффективней, чем в предыдущем пункте и использовать то, что последовательность упорядочена.&lt;br /&gt;
# Дана последовательность из 100 000 чисел от 0 до 100. Напишите эффективный алгоритм сортировки, который бы учитывал специфику входных данных.&lt;br /&gt;
# * Дано 32 битное неотрицательное число. Требуется номер первого ненулевого бит. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения, считая, что числа распределены равномерно.&lt;br /&gt;
# * Даны 32 битные неотрицательные числа m и n. Требуется вывести True, если m &amp;lt; n, иначе False. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения битов, считая, что числа распределены равномерно.&lt;br /&gt;
# Напишите рекурсивную функцию, вычисляющую n-ое число Фибоначчи (как на занятии). Подсчитайте количество рекурсивных вызовов.&lt;br /&gt;
# * Напишите функцию, вычисляющую n-ое число Фибоначчи, у которой число операций — полином от n, и которая использует количество памяти, независящее от n.&lt;br /&gt;
&lt;br /&gt;
==O-символика и стратегия &amp;quot;разделяй и властвуй&amp;quot; (15.01)==&lt;br /&gt;
# Сортировка слиянием. Алгоритм, рекуррентное соотношение для времени сортировки, сложность. Подробнее: [https://dl.dropboxusercontent.com/u/829163/draft.pdf §2.3 Сортировка слиянием (стр. 54)].&lt;br /&gt;
# О-символика. [https://dl.dropboxusercontent.com/u/829163/draft.pdf §0.3 О-символика (стр. 10)].&lt;br /&gt;
# Задача о слиянии m упорядоченных массивов по n элементов. Три алгоритма решения: последовательное слияние, слияние &amp;quot;деревом&amp;quot; (обе функции используют Merge из MergeSort), аналог Merge для m массивов. Анализ сложности каждого из них.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 2 (15.01-29.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
* Во всех задачах, если не оговорено иного, для простоты &#039;&#039;можно&#039;&#039; считать, что n является степенью какого-либо числа, например, степенью двойки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Дана функция F, определённая ниже. Сколько строк она напечатает? Указание: для обоих подпунктов рассмотрите два случая: 1. n является степенью двойки, 2. n не является степенью двойки.&lt;br /&gt;
## Запишите рекуррентное соотношение для числа строк.&lt;br /&gt;
## Решите уравнение, полученное в предыдущем пункте, то есть, выведите замкнутую (нерекуррентную формулу). Для простоты можно считать, что n является степенью двойки.&lt;br /&gt;
# В массиве A размера n записана возрастающая последовательность целых чисел. Постройте алгоритм типа &amp;quot;разделяй и властвуй&amp;quot;, который проверяет, существует ли такой индекс i, что A[i] = i&lt;br /&gt;
## за время O(n),&lt;br /&gt;
## * за время O(log n).&lt;br /&gt;
## Какие случаи для вашего алгоритма являются наихудшими и наилучшими? Какого время работы в лучшем и худшем случаях?&lt;br /&gt;
# Дан бесконечный массив A, первые n элементов которого содержат возрастающую последовательность положительных чисел, а дальше стоят -1. Значение n не дано. Постройте алгоритм, который получает на вход целое число x и находит это x в массиве --- или говорит, что там его нет, &lt;br /&gt;
## за время O(n),&lt;br /&gt;
## за время O(log n).&lt;br /&gt;
# Рассмотрим алгоритм вычисления наибольшего общего делителя (НОД) двух положительных чисел, основанный на методе &amp;quot;разделяй и властвуй&amp;quot;.&lt;br /&gt;
## (задание не оценивается) Прочитайте [https://dl.dropboxusercontent.com/u/829163/draft.pdf §1.2.3 Алгоритм Евклида (стр. 23)].&lt;br /&gt;
## * Докажите, что определение НОД-а, приведённое ниже, корректно.&lt;br /&gt;
## Постройте алгоритм, основанный на этом определении.&lt;br /&gt;
## Какой алгоритм будет быстрее для n-битовых чисел a и b при больших значениях n --- ваш или алгоритм Евклида?&lt;br /&gt;
# * Покажите как за время O(n log n) удалить из массива размера n все дубликаты, то есть оставить каждый элемент в одном экземпляре.&lt;br /&gt;
# * Даны два упорядоченных массива размера m и n. Постройте алгоритм, находящий k-й по величине элемент в объединении этих массивов за время O(log(n+m)). &lt;br /&gt;
&lt;br /&gt;
Функция F(n).&lt;br /&gt;
  если n &amp;gt; 1:&lt;br /&gt;
    напечатать &amp;quot;всё ещё работаю&amp;quot;&lt;br /&gt;
    F(n/2)&lt;br /&gt;
    F(n/2)&lt;br /&gt;
&lt;br /&gt;
Определение НОД-а.&lt;br /&gt;
             2НОД(a/2, b/2), если а и b чётны,&lt;br /&gt;
  НОД(a,b) = НОД(a, b/2), если а нечётно, b чётно,&lt;br /&gt;
             НОД((a-b)/2, b), если а и b нечётны.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;lt;nowiki&amp;gt;Задачи взяты из книги &amp;quot;Алгоритмы&amp;quot;, глава 2 (см. список рекомендованной литературы).&amp;lt;/nowiki&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Сложение и умножение (19.01)==&lt;br /&gt;
# Алгоритм сложения, его сложность (§1.1.1 Сложение*)&lt;br /&gt;
# &amp;quot;Школьный&amp;quot; алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Рекурсивный алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Алгоритм умножения, реализующий стратегию &amp;quot;разделяй и властвуй&amp;quot;, анализ сложности (§2.1 Умножение чисел*)&lt;br /&gt;
 * [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать.]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 3 (19.01 - 2.02)===&lt;br /&gt;
* Во всех задачах для простоты можно считать, что n является степенью какого-либо числа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Найдите произведение чисел 10011011 и 10111010 (в двоичной системе счисления), используя алгоритм умножения чисел, основанный на методе «разделяй и властвуй». Необходимо не только дать ответ, но и привести ход решения.&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 3 рекурсивных вызова для подзадач размера n-1 и комбинирует из них решение исходной задачи за О(n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте три верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 10 рекурсивных вызовов для подзадач размера n/2 и комбинирует из них решение исходной задачи за О(5n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте два верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Докажите, что 3m² + m = O(m²).&lt;br /&gt;
# Докажите, что lg m = O(m/1000), где lg m — это логарифм с двоичным основанием.&lt;br /&gt;
# Докажите, что из равенства f(n) = O(g(n)) не следует, что g(n) = O(f(n)).&lt;br /&gt;
# Докажите, что O(m) содержится в O(m²).&lt;br /&gt;
&lt;br /&gt;
==Решение рекуррентных уравнений (22.01)==&lt;br /&gt;
# Примеры решений рекуррентных уравнений (см. [https://www.dropbox.com/s/6a0r410zjm9qwe7/algo-3-recurrences.pdf?dl=0 конспект]).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 4 (до 14.02)===&lt;br /&gt;
* Нельзя использовать утверждение основной теоремы о решении рекуррентных соотношений.&lt;br /&gt;
* &#039;&#039;Можно&#039;&#039; использовать метод построения дерева рекурсии или подстановку (метод с угадыванием ответа).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Какой из трёх приведённых ниже алгоритмов вы бы предпочли? Обоснуйте свой ответ.&lt;br /&gt;
#* Алгоритм A, решая задачу, производит пять рекурсивных вызовов для подзадач вдвое меньшего размера, после чего строит ответ для исходной задачи за линейное время.&lt;br /&gt;
#* Алгоритм B, решая задачу размера n, делает два рекурсивных вызова для задач размера n − 1, после чего находит ответ за время O(1).&lt;br /&gt;
#* Алгоритм C, решая задачу размера n, рекурсивно решает девять задач размера n/3 и строит ответ за время O(n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Найдите T(n) в замкнутой форме для любых 7 из 10 приведённых ниже рекуррентных соотношений:&lt;br /&gt;
## T(n) ≤ 2T(n/3) + 1;&lt;br /&gt;
## T(n) ≤ 7T(n/7) + n;&lt;br /&gt;
## T(n) ≤ 9T(n/3) + n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 8T(n/2) + n&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 49T(n/25) + n&amp;lt;sup&amp;gt;3/2&amp;lt;/sup&amp;gt;log n;&lt;br /&gt;
## T(n) ≤ T(n − 1) + 2;&lt;br /&gt;
## T(n) ≤ T(n − 1) + n&amp;lt;sup&amp;gt;c&amp;lt;/sup&amp;gt;, где c ≥ 1 –– константа;&lt;br /&gt;
## T(n) ≤ T(n − 1) + c&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;, где c &amp;gt; 1 –– константа;&lt;br /&gt;
## T(n) ≤ 2T(n − 1) + 1;&lt;br /&gt;
## T(n) ≤ T(sqrt(n)) + 1.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №1==&lt;br /&gt;
Необходимо реализовать все 6 задач из [https://official.contest.yandex.ru/contest/1002 контеста]. Каждую задачу можно писать на С++ или Python. На выполнение работы отводится две недели. Каждая задача оценивается в 10/6 балла. Оценка &#039;&#039;может&#039;&#039; быть снижена за плохой код, но не более чем на 25%.&lt;br /&gt;
&lt;br /&gt;
==Бинарное дерево поиска (26.01)==&lt;br /&gt;
# Определение. Пример.&lt;br /&gt;
# Не модифицирующие алгоритмы: поиск (рекурсивный и итеративный алгоритмы), поиск минимума, inordered обход (вывод значений узлов в отсортированном порядке), поиск следующего по возрастанию.&lt;br /&gt;
# Модифицирующие алгоритмы: вставка (рекурсивная реализация), удаление (только идея).&lt;br /&gt;
 [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 13, стр. 248]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 5 (до 16.02)===&lt;br /&gt;
* Для получения максимальной оценки можно выполнить или все задачи без звёздочки, или задачу со звёздочкой. Преподаватель понимает, что реализацию БДП сложно не найти в интернете, но от копипасты не будет никакой пользы. Напротив, самостоятельная реализация очень полезна и приветствуется, даже если не получится выполнить всех пунктов задания.&lt;br /&gt;
* Задачи с двумя звёздочками необязательны.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Нарисуйте бинарные деревья поиска высотой 2, 3, 4, 5 и 6 для множества ключей {1, 4, 5, 10, 16, 17, 21}. Корень дерева имеет высоту 0.&lt;br /&gt;
# &#039;&#039;&#039;Сортировка с использованием БДП.&#039;&#039;&#039;&lt;br /&gt;
## Какова асимптотическая сложность алгоритма вставки элемента в дерево высоты d? Почему? Назовите наилучший и наиухдший случаи.&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который строит БДП в узлах которого стоят элементы данной последовательности. Можно использовать функцию Insert. Назовите наилучший и наихудший случаи. Есть теорема о том, что полученный алгоритм будет работать в среднем случае за время O(n * log n).&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который выводит их в порядке возрастания. Используйте бинарное дерево поиска. Какова в среднем случае сложность этого алгоритма? Назовите наилучший и наихудший случаи. Какова сложность в наихудшем случае?&lt;br /&gt;
# Напишите функцию GetRoot, которой на вход подаётся указатель на произвольный узел дерева, а она возвращает указатель на корень.&lt;br /&gt;
# Напишите процедуру PrintLeafs, которой на вход подаётся указатель на корень дерева, и она печатает листья дерева&lt;br /&gt;
## по возрастанию,&lt;br /&gt;
## по убыванию.&lt;br /&gt;
# ** Альтернативный обход в порядке возрастания бинарного дерева поиска с n узлами (или центрированный (inordered) обход) можно осуществить путём поиска минимального элемента дерева с помощью функции Minimum с последующий n-1 вызовом функции Next. Каково время работы такого алгоритма?&lt;br /&gt;
# * Реализуйте на С++ структуру данных бинарное дерево поиска, [https://yadi.sk/i/gi2SEStreFfSb используя заготовку].&lt;br /&gt;
## Нарисуйте бинарное дерево поиска, которое строится в функции getTreeExample.&lt;br /&gt;
## Реализуйте следующие алгоритмы: &lt;br /&gt;
### поиск минимума, &lt;br /&gt;
### inordered обход (вывод значений узлов в отсортированном порядке),&lt;br /&gt;
### поиск следующего по возрастанию,&lt;br /&gt;
### вставка элемента в дерево,&lt;br /&gt;
### сортировка последовательности с использованием БДП (дан вектор чисел, необходимо вывести их по возрастанию),&lt;br /&gt;
### ** удаление.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Карацубы, Штрассена. Быстрая сортировка (29.01)==&lt;br /&gt;
# Алгоритм Карацубы.&lt;br /&gt;
# Алгоритм Штрассена. [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать Дасгупту и др., §2.5 Умножение матриц]&lt;br /&gt;
# Быстрая сортировка и доказательство того, что в среднем случае она работает за О(n * log n). [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 8 Быстрая сортировка, стр. 148]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 6 (до 18.02)===&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Пусть мы хотим найти двоичное представление десятичного числа 10&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;. Будем считать, что n --- степень двойки (n = 2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt;).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Pwr2Bin(n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть 1010&lt;br /&gt;
    z = ...&lt;br /&gt;
    вернуть Multiply(z, z)&amp;lt;/source&amp;gt;&lt;br /&gt;
Multiply --- функция, перемножающая два n-битовых двоичных числа x и y по алгоритму Карацубы за O(n&amp;lt;sup&amp;gt;log&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;3&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Пусть мы хотим перевести произвольное десятичное число x в записи которого n=2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; чисел в двоичную систему счисления.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Dec2Bin(x, n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть binary[x]&lt;br /&gt;
    разделить x на два десятичных числа xl и xr из n/2 цифр.&lt;br /&gt;
    вернуть ...&amp;lt;/source&amp;gt;&lt;br /&gt;
Здесь binary --- это массив, содержащий двоичное представление десятичных цифр.&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Докажите, что математическое ожидание времени работы алгоритма быстрой сортировки (усреднение по всем вариантам выбора опорного элемента) на любом входе размера n удовлетворяет соотношению: T(n) ≤ O(n) + 1/n * &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt; (T(i-1) + T(n-i)).&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Найдите решение соотношения из предыдущего пункта.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Динамическое программирование (ДП). Первые примеры (02.01)==&lt;br /&gt;
# Нахождение самой длинной возрастающей подпоследовательности.&lt;br /&gt;
# Нахождение редакционного расстояния (или редакционной стоимости, расстояния Левенштейна).&lt;br /&gt;
# Нахождение представителя большинства.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 7 (до 20.02)===&lt;br /&gt;
* В этом задании везде, где требуется реализовать алгоритм, необходимо привести код на любом языке программирования.&lt;br /&gt;
* Для получения максимальной оценки нужно решить все задачи без звёздочек. Одна решённая задача со звёздочкой заменяет одну задачу без звёздочки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения редакционного расстояния (алгоритм Вагнера — Фишера). Например, редакционное расстояние между словами &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равно 6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения длины наибольшей общей подстроки. Например, длина наибольшей общей подстроки &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равна 8 (&amp;quot;antholog&amp;quot;). Чем больше это значение, тем схожей строки.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Предположим теперь, что сравниваемые строки состоят из символов A, С, G и T; за удаление или вставку мы платим -5; за замену буквы x на y платим w[x, y], где x, y принадлежат множеству {A, С, G, T}, a w — это матрица весов:&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
!-!! A!! G!! C!! T&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! A&lt;br /&gt;
|10||-1||-3||-4&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
!G&lt;br /&gt;
||-1||7||-5||-3&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! C&lt;br /&gt;
||-3||-5||9||0&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! T&lt;br /&gt;
||-4||-3||0||8&lt;br /&gt;
|}&lt;br /&gt;
Тогда выравнивание:&lt;br /&gt;
 AGACTAGTTAC&lt;br /&gt;
 CGA‒‒‒GACGT&lt;br /&gt;
будет иметь следующую оценку:&lt;br /&gt;
 w[A,C] + w[G,G] + w[A,A] + 3*(-5) + w[G,G] + w[T,A] + w[T,C] + w[A,G] + w[C,T] = -3 + 7 + 10 - 3*5 + 7 + (-4) + 0 + (-1) + 0 = 1.&lt;br /&gt;
&lt;br /&gt;
Напишите алгоритм, который находит максимальную стоимость всех возможных выравниваний. Верно ли, что чем больше это значение, тем непохожей строки?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как давно один народ отделился от другого? Кто похожей — итальянец и китаец или якут и эфиоп? На эти вопросы можно отвечать с разных точек зрения — культурной, исторической, лингвистической, ... В последние же годы человечество научилось секвенировать геном, что позволило исследовать этот вопрос с точки зрения генетики. Секвенирование генома — это процесс записи ДНК в виде нуклеотидной последовательности, которая представляет собой последовательность из четырёх символов — A, С, G и T. Существуют базы, которые хранят генетическую информацию о людях из разных стран и континентов, например, [http://www.mtdb.igp.uu.se/ http://www.mtdb.igp.uu.se/ → Download mtDNA sequences]. Чем больше сходство между геномами, тем сильнее родственные связи между их обладателями. Используя решение предыдущего пункта, выполните задания:&lt;br /&gt;
# Определите, кто похожей — итальянец и китаец или якут и эфиоп?&lt;br /&gt;
# Найдите нескольких похожих и нескольких непохожих народностей.&lt;br /&gt;
# * Выберите одну народность. Найдите самых похожих и самых непохожих на неё.&lt;br /&gt;
# * Найдите самые похожие и самые непохожие народности.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Задача о разрезании стержня (05.01)==&lt;br /&gt;
# Постановка задачи.&lt;br /&gt;
# Решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Решение с нахождением максимума по p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Восходящий алгоритм с запоминанием. Вывод длин кусочков стержня. Оценка сложности.&lt;br /&gt;
# Нисходящий алгоритм с запоминанием. Оценка сложности.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.1 Разрезание стержня, стр. 393]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 8 (до 22.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Решая задачу о разрезании стержня мы вначале построили рекурсивное решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt; для всех 1 ≤ i &amp;lt; n. Его сложность описывалась рекуррентной формулой T(n) = n + &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n-1&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt;(T(i) + T(n-i)), T(1) = 1.&lt;br /&gt;
# Объясните эту формулу.&lt;br /&gt;
# Покажите с помощью метода подстановок, что T(n) ≤ 2&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Покажите с помощью контрпримера, что описанная далее жадная стратегия не всегда определяет оптимальный способ разрезания стержня. Определим плотность стержня длиной i как p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;/i, то есть как стоимость единицы его длины. Жадная стратегия для стержня длиной n отрезает от стержня первую часть длиной i, где 1 ≤ i ≤ n, имеющую максимальную плотность. Затем та же жадная стратегия применяется к оставшейся части длиной n-i.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Рассмотрим модификацию задачи разрезания стержня, в которой в дополнение к цене p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; каждого стержня добавляется фиксированная цена разреза c. Теперь прибыль, связанная с решением, представляет собой сумму цен частей стержня минус стоимость разрезов. Разработайте алгоритм динамического программирования для этой модифицированной задачи.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Непрерывным участком называется группа подряд идущих элементов. Например, для последовательности&lt;br /&gt;
 5, 15, −30, 10, −5, 40, 10&lt;br /&gt;
элементы 15, −30, 10 образуют непрерывный участок, а 5, 15, 40 -- нет. Постройте линейный алгоритм для следующей задачи:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Вход: список чисел a1, a2, ... ‌, an.&lt;br /&gt;
Выход: непрерывный участок с максимальной суммой (сумма участка нулевой длины равна нулю).&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Для приведённого примера ответом будет 10, −5, 40, 10 с суммой 55. Какова сложность алгоритма? Почему?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Надо заплатить v рублей, имея купюры в x1, x2, ‌..., xn рублей (купюр каждого типа сколько угодно). Это не всегда возможно (скажем, купюрами в&lt;br /&gt;
10 и 25 рублей можно заплатить 45 рублей, но не 47 и не 15). Постройте основанный на методе динамического программирования алгоритм со временем работы O(nv), выясняющий, возможна ли уплата.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как решить предыдущую задачу, если каждая купюра имеется в единственном экземпляре? (Например, купюрами в 1, 5, 10, 20 рублей можно заплатить 16 = 1 + 5 + 10 и 31 = 1 + 10 + 20 рублей, но не 40 (не хватит денег). Время работы алгоритма по-прежнему O(nv).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Ещё один вариант той же задачи: купюр каждого типа сколько угодно, но всего разрешается использовать не более k купюр. (Например, если есть купюры в 5 и 10 рублей, а k = 6, то 55 разменять можно, а 65 –– нет).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Перемножение цепочки матриц. Оптимальное бинарное дерево поиска (начало) (09.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о перемножении цепочки матриц. Постановка задачи.Пример. Нисходящий алгоритм.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.2 Перемножение цепочки матриц, стр. 403]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 9 (до 24.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Найдите оптимальную расстановку скобок в произведении последовательности матриц, размерности которых равны 5×10, 10×3, 3×12, 12×5, 5×50, 50×6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Напишите восходящий алгоритм для поиска оптимальной расстановки скобок.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Расстановка пробелов. Оптимальное бинарное дерево поиска (середина) (12.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о расстановке пробелов. Постановка задачи. Решения для трёх случаев: 1. нужно вернуть можно ли разбить текст на слова; 2. вернуть разбивку на слова; 3. слова встречаются не равновероятно, вернуть наиболее вероятную разбивку на слова.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи. Вывод математического ожидания времени поиска.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Праздничное домашнее задание 10 (до 02.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[&amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;,&amp;quot;, &amp;quot;.&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;,&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;.&amp;quot;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Подсказка:&#039;&#039;&#039; разбейте текст на слова из списка и посмотрите на азбуку Морзе.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Способы представления графов в памяти (16.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Разбор ошибок в домашнем задании.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Графы. Способы представления графов в памяти (матрица смежности, список рёбер, список соседей (список смежностей), матрица инцидентности). Зависимость сложности алгоритмов от способа представления.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §22.1 Представление графов, стр. 626]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 11 (до 02.03)===&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача A.]&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача B.]&lt;br /&gt;
# Нарисуйте неориентированный граф с 5 вершинами и 8 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Нарисуйте ориентированный граф с 4 вершинами и 3 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Дан ориентированный граф. &#039;&#039;Исходящая степень вершины v&#039;&#039; --- это количество исходящих из неё рёбер, &#039;&#039;входящая степень v&#039;&#039; --- это количество рёбер входящих в  v. Имеется представление ориентированного графа с использование списка соседей. Как долго будут вычисляться исходящие степени всех вершин графа? А входящие степени?&lt;br /&gt;
# Дан граф G = (V, E). Какие из рассмотренных способов хранения графов используют меньше всего памяти для хранения G и почему? Указание: рассмотрите случаи |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;lt; |E| и |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;gt; |E|.&lt;br /&gt;
# Пусть C --- это матрица смежности графа G.&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
# Пусть B --- это матрица инцидентности ориентированного графа G. Как связаны элементы матрицы BB&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
&lt;br /&gt;
==Реализация поиска в глубину (19.02)==&lt;br /&gt;
# Реализация поиска в глубину и смежных задач.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 12 (до 5.03)===&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Выберите любой способ хранения графа. Реализуйте поиск в глубину.&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Напишите алгоритм, который возвращает данные о том, какие вершины лежат в одной компоненте связности.&lt;br /&gt;
# &#039;&#039;(любой ЯП или псевдокод)&#039;&#039; Напишите алгоритм проверки сильной связности ориентированного графа. Какова его сложность?&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №2==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
Необходимо реализовать 3 задачи из [https://official.contest.yandex.ru/contest/1085 контеста], см. [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing распределение задач]. Каждую задачу можно написать на С++ или Python. На выполнение работы отводится две недели (см. время окончания контеста). [https://official.contest.yandex.ru/contest/1123 Дорешивание.]&lt;br /&gt;
&lt;br /&gt;
==ДП и графы (26.02)==&lt;br /&gt;
==ДП и графы (02.03)==&lt;br /&gt;
==Жадные алгоритмы (12.03)==&lt;br /&gt;
===Домашнее задание 13 (до 23.03)===&lt;br /&gt;
# Вася хочет купить по одной акции каждой компании. Все акции стоят одинаково, но дорожают по-разному. Каждый месяц акция i-ой компании дорожает в r_i раз. В один месяц можно купить только одну акцию.&lt;br /&gt;
## Напишите алгоритм, который выводит оптимальную последовательность покупок (такую, что на покупку всех акций потратится меньше денег).&lt;br /&gt;
## Докажите корректность алгоритма, то есть докажите, что последовательность покупок, которую выводит ваш алгоритм, оптимальна.&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список, очередь (16.03)==&lt;br /&gt;
# Реализация линейного двусвязного списка (С++).&lt;br /&gt;
# Реализация очереди ограниченной длины на базе вектора (С++).&lt;br /&gt;
# Реализация очереди на базе списка (С++).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14 (до 23.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте (на С++) структуру данных Стек. У стека должно быть три операции:&lt;br /&gt;
* push --- положить элемент на вершину стека;&lt;br /&gt;
* pop --- удалить верхний элемент;&lt;br /&gt;
* front --- вернуть значение верхнего элемента.&lt;br /&gt;
Оцените время работы каждой функции.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список (19.03)==&lt;br /&gt;
===Домашнее задание 13* (до 30.03)===&lt;br /&gt;
#Для приведённой реализации класса List (https://yadi.sk/i/c5r_79WdfMyNS).&lt;br /&gt;
## Допишите print, push_back и push_front.&lt;br /&gt;
## В функции insert_after и delete_node вставьте необходимые проверки так, чтобы они работали для крайних случаев.&lt;br /&gt;
## Напишите main в котором&lt;br /&gt;
### создаётся объект класса List, &lt;br /&gt;
### заполняется элементами с помощью функций push_back, push_front и insert_after и&lt;br /&gt;
### удаляется i-ый элемент.&lt;br /&gt;
&lt;br /&gt;
==Повторение (30.03)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Для данных пар функций выясните их связь в терминах O-, o-, Ω-, ω-, Θ-обозначений. Поставьте галочку в клетке с Ω, если f(x) = Ω(g(x)) и прочерк, если равенства нет. [https://ru.wikipedia.org/wiki/«O»_большое_и_«o»_малое#.D0.94.D1.80.D1.83.D0.B3.D0.B8.D0.B5_.D0.BF.D0.BE.D0.B4.D0.BE.D0.B1.D0.BD.D1.8B.D0.B5_.D0.BE.D0.B1.D0.BE.D0.B7.D0.BD.D0.B0.D1.87.D0.B5.D0.BD.D0.B8.D1.8F Википедия]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! f(x)!! g(x)!! O!! o!! Ω!! ω!! Θ&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! 2^100&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n * log(n)&lt;br /&gt;
! 2^100 * n * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n&lt;br /&gt;
! 2^100 * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n!&lt;br /&gt;
! 2^(2015n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n*2^n&lt;br /&gt;
! 3^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 5^n&lt;br /&gt;
! 5^(n+1)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n + n^2 + n^3 + ... + n^1000&lt;br /&gt;
! 7^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм Quickselect нахождения k-ого элемента по возрастанию: http://en.wikipedia.org/wiki/Quickselect&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;На улице стоит ряд домов. В каждом из домов лежит сколько-то денег. Вор хочет обокрасть дома на переулке. Он не может обокрасть два соседних дома, потому что хозяин дома, который он обокрал, сразу предупредит соседей. Нужно найти, какую максимальную сумму вор может украсть с переулка. На вход программы подается массив неотрицательных целых чисел - количество долларов в доме с номером i. Соседние дома в массиве представлены соседними элементами. Например, пусть задан массив { 1, 4, 5 } - тогда вор максимум может украсть $6, обокрав дома 1 и 3. Пусть задан массив { 1, 7, 2 } - тогда вор максимум может украсть $7, обокрав дом 2.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Алфавит из всех маленьких латинских букв и пробела закодирован числами следующим способом:&lt;br /&gt;
  &#039;a&#039; -&amp;gt; 1&lt;br /&gt;
  &#039;b&#039; -&amp;gt; 2&lt;br /&gt;
  &#039;c&#039; -&amp;gt; 3&lt;br /&gt;
  ...&lt;br /&gt;
  &#039;z&#039; -&amp;gt; 26&lt;br /&gt;
  &#039; &#039; -&amp;gt; 27&lt;br /&gt;
На вход программы подается строка из цифр. Нужно посчитать, сколькими способами можно раскодировать эту строку.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Дан граф, заданный матрицей смежности. Вывести пары вершин между которыми нет пути.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Повторение (02.04) ==&lt;br /&gt;
Решали и разбирали первые 4 задачи из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14* (до 11.03)===&lt;br /&gt;
Решите любые две задачи (подпункты НЕ считаются отдельными задачами) с предыдущей пары (Повторение (30.03)).&lt;br /&gt;
&lt;br /&gt;
== Повторение (06.04) ==&lt;br /&gt;
Будем решать вторую половину задач из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 15 (до 16.04)===&lt;br /&gt;
# Приведите пример графа, который содержит отрицательные рёбра, не содержит циклов отрицательного веса и для которого алгоритм Дейкстры возвращает неверный результат.&lt;br /&gt;
# Используется ли в алгоритме Дейкстры то, что веса рёбер неотрицательны? Если &amp;quot;да&amp;quot;, то где именно?&lt;br /&gt;
# Пусть граф содержит рёбра с весами &amp;gt;= -100. Если прибавить к каждому ребру 101 и при помощи алгоритма Дейкстры найти кратчайшие пути. Будут ли эти пути кратчайшими в исходном графе? Почему?&lt;br /&gt;
&lt;br /&gt;
== Повторение (07.04) ==&lt;br /&gt;
&#039;&#039;&#039;Решение рекуррентных соотношений&#039;&#039;&#039;&lt;br /&gt;
# Решите уравнение: T(n) = 4*T(n/2) + O(n^2) с базой T(1) = O(1)&lt;br /&gt;
## Используя основную теорему.&lt;br /&gt;
## Используя дерево рекурсий.&lt;br /&gt;
## Методом подстановки.&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2)) + n является \Theta(n lg n).&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2) + 17) + n является \Theta(n lg n).&lt;br /&gt;
# Решите уравнения, считая, что T(1) = O(1):&lt;br /&gt;
## T(n) = T(n-1) + n&lt;br /&gt;
## T(n) = 2*T(floor(sqrt(n))) + lg n. Указание: попробуйте использовать замену переменных.&lt;br /&gt;
## T(n) = 3*T(sqrt(n)) + lg n&lt;br /&gt;
# Дайте верхнюю и нижнюю оценки функции T(n). Постарайтесь, чтобы оценки были как можно более точные&lt;br /&gt;
## T(n) = 4T(n/3) + n*lg(n)&lt;br /&gt;
## T(n) = 3T(n/3) + n/lg(n)&lt;br /&gt;
## T(n) = 4T(n/2) + n^2*sqrt(n)&lt;br /&gt;
## T(n) = T(n/2) + T(n/4) + T(n/8) + n&lt;br /&gt;
## T(n) = T(n-1) + 1/n&lt;br /&gt;
## T(n) = T(n-2) + 1/lg(n)&lt;br /&gt;
## T(n) = sqrt(n) * T(sqrt(n)) + n&lt;br /&gt;
&#039;&#039;&#039;Анализ и построение алгоритмов&#039;&#039;&#039;&lt;br /&gt;
# Числа Фибоначчи F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; можно выразить через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, используя матрицу: https://yadi.sk/i/Pm_aNzHCforFU. &lt;br /&gt;
## Покажите как вычислить F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;.&lt;br /&gt;
## Как вычислить F&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;n+1&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;?&lt;br /&gt;
## Напишите алгоритм.&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
## Ускорьте его так, чтобы он работал за O(log n).&lt;br /&gt;
# Дана последовательность символов. Какое минимальное количество символов нужно удалить из неё, чтобы получить палиндром?&lt;br /&gt;
## Напишите алгоритм (на псевдокоде или на любом языке программирования).&lt;br /&gt;
## Оцените время работы алгоритма.&lt;br /&gt;
# Какую структуру данных вы бы использовали для реализации упорядоченного множества (http://neerc.ifmo.ru/wiki/index.php?title=Упорядоченное_множество)? Какая будет сложность каждой из операций над множеством?&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 16 (до 20.04)===&lt;br /&gt;
# Решите 6 задач из первой части и 6 из второй. (Укажите какие именно.) Каждый из подпунктов является отдельной задачей.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм и теорема Форда-Фалкерсона (16.04)==&lt;br /&gt;
# Базовые определения (пропускные способности, сток, исток и пр.). Пример. &lt;br /&gt;
# Ограничения на поток (сохранение и что меньше пропускных способностей).&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, пример работы&lt;br /&gt;
# Разрез, определение, пример.&lt;br /&gt;
# Утверждение: максимальный поток &amp;lt;= любого разреза.&lt;br /&gt;
# Теорема Форда-Фалкерсона (с доказательством).&lt;br /&gt;
# Пример на котором алгоритм Форда-Фалкерсонаработает работает очень долго при неудачном выборе путей.&lt;br /&gt;
# Сложность алгоритма Форда-Фалкерсона.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №3==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
В [https://official.contest.yandex.ru/contest/1196 домашнем задании] пять задач. Они разделены на два варианта, помеченные римскими цифрами I и II. Свой вариант нужно узнать [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing здесь на вкладке HW3]. Третья задача — общая для двух вариантов; ее решение необходимо снабдить доказательством корректности алгоритма. На выполнение задания дается примерно 2 недели (см. точное время окончания в контесте). Каждую задачу можно написать на С++ или Python.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Форда-Фалкерсона и Эдмондса-Карпа (20.04)==&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, напоминание: базовые определения, пример работы, пример на котором алгоритм работает долго, сложность.&lt;br /&gt;
# Алгоритм Эдмодса-Карпа. Доказательство асимптотики времени работы.&lt;br /&gt;
&lt;br /&gt;
==(23.04)==&lt;br /&gt;
&lt;br /&gt;
==(11.05) Красно-чёрные деревья==&lt;br /&gt;
[https://ru.wikipedia.org/wiki/Красно-чёрное_дерево Красно-чёрное дерево]&lt;br /&gt;
===Домашнее задание 17 (до 18.05)===&lt;br /&gt;
# Зачем нужны красно-чёрные деревья?&lt;br /&gt;
# Благодаря какому свойству и почему красно-чёрное дерево является сбалансированным?&lt;br /&gt;
# Нарисуйте полное бинарное дерево поиска высотой 3 с ключами {1, 2, ..., 15}. Сделайте из него красно-чёрные деревья высотой 2, 3 и 4.&lt;br /&gt;
# Нарисуйте красно-чёрные деревья, получающиеся последовательной вставкой элементов 12, 10, 29, 30, 31, 32 в [https://ru.wikipedia.org/wiki/Красно-чёрное_дерево#/media/File:Red-black_tree_example.svg данное дерево]. Для вставки используйте алгоритм вставки из Википедии. Укажите какой именно функцией вы воспользовались.&lt;br /&gt;
# Определим &#039;&#039;&#039;ослабленное красно-чёрное дерево&#039;&#039;&#039; как бинарное дерево поиска, которое удовлетворяет красно-чёрным свойствам 1, 3, 4 и 5. Другими словами, корень может быть как чёрным, так и красным. Рассмотрите ослабленное красно-чёрное дерево T, корень которого красный. Если перекрасить корень дерева T в чёрный, будет ли оно красно-чёрным деревом?&lt;br /&gt;
# Покажите, что самый длинный простой нисходящий путь от вершины x к листу красно-черного дерева имеет длину, не более чем в два раза превышающую кратчайший путь от x к листу-потомку.&lt;br /&gt;
# Чему равно наибольшее возможное количество внутренних узлов в красно-чёрном дереве с чёрной высоты k? А наименьшее возможное количество?&lt;br /&gt;
# Нарисуйте красно-чёрные деревья, получающиеся последовательной вставкой ключей 41, 38, 31, 12, 19, 8 в изначально пустое дерево.&lt;br /&gt;
# Покажите какие деревья будут получаться в результате последовательного удаления ключей в порядке 8, 12, 19, 31, 38, 41.&lt;br /&gt;
&lt;br /&gt;
==(14.05) Конкурентный анализ самоорганизующихся циклов==&lt;br /&gt;
[https://vk.com/doc12518218_390369758 Лекция]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 18 (до 21.05)===&lt;br /&gt;
Все вычисления сопроводите подробными объяснениями о том, почему верно то или иное (не)равенство.&lt;br /&gt;
# Пусть имеется n-элементный список и m поисковых запросов к нему. После каждой операции поиска можно переупорядочить список. Обозначим стоимость последовательности поисков через C. Докажите, что в худшем случае C = Ω(mn).&lt;br /&gt;
#  Обозначим через c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; стоимость i-ого поискового запроса с применением эвристики перемещения в начало, которая включает стоимость поиска элемента в списке и стоимость его перемещения в начало списка путём ряда обменов соседних элементов списка. Покажите, что i-ая операция поиска находит элемент x в списке L с применением эвристики перемещения в начало, то c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = 2 * rank&amp;lt;sub&amp;gt;L&amp;lt;/sub&amp;gt;(x) - 1.&lt;br /&gt;
# Покажите, что c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = 2 * rank&amp;lt;sub&amp;gt;L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) - 1.&lt;br /&gt;
# Покажите, что c*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = rank&amp;lt;sub&amp;gt;L*&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) + t&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;.&lt;br /&gt;
# Докажите, что после одного обмена двух соседних элементов потенциал либо увеличивается на 2, либо уменьшается на 2.&lt;br /&gt;
# Докажите, что rank&amp;lt;sub&amp;gt;L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) = |A| + |B| + 1.&lt;br /&gt;
# Докажите, что rank&amp;lt;sub&amp;gt;L*&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) = |A| + |С| + 1.&lt;br /&gt;
# Покажите, что поиск i-ого элемента приводит к изменению потенциала Ф(L&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;) - Ф(L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;) &amp;lt;= 2 (|A| - |B| + t*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;), где t*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; --- это количество обменов при i-ом поиске.&lt;br /&gt;
# Во сколько раз стоимость С&amp;lt;sub&amp;gt;MFT&amp;lt;/sub&amp;gt;(S) превышает C&amp;lt;sub&amp;gt;OPT&amp;lt;/sub&amp;gt;(S)?&lt;br /&gt;
&lt;br /&gt;
== (18.05) Конечные автоматы ==&lt;br /&gt;
=== Задание 19 (до 25.05) ===&lt;br /&gt;
# Постройте автомат для языка над алфавитом Σ = {0, 1} каждое слово которого содержит хотя бы два нуля. Является ли он детерминированным?&lt;br /&gt;
# Постройте автомат над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5. Является ли он детерминированным?&lt;br /&gt;
# Постройте автомат, который допускает пустой язык (язык в котором нет ни одного слова).&lt;br /&gt;
# Постройте автомат, который допускает все слова над алфавитом Σ.&lt;br /&gt;
# Постройте ДКА над алфавитом Σ = {К, Ж, З}, который допускает слова в которых после К идёт З, после З --- Ж, после Ж --- К.&lt;br /&gt;
# * Постройте ДКА над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5, а число нулей на 3.&lt;br /&gt;
# Постройте НКА для языка над алфавитом Σ = {0, 1, 2, 3}, состоящий из слов, в которых хотя бы одна из последних пяти букв является 1.&lt;br /&gt;
# Постройте НКА над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5, а число нулей на 3.&lt;br /&gt;
# Какие языки допускают автоматы https://yadi.sk/d/fNAHbjCZghERG?&lt;br /&gt;
# Для каждого из автоматов https://yadi.sk/d/fNAHbjCZghERG постройте соответствующий ему ДКА.&lt;br /&gt;
&lt;br /&gt;
== (21.05) Регулярные выражения, КА, их эквивалентность. Лемма о накачке  ==&lt;br /&gt;
=== Задание 20 (до 28.05) ===&lt;br /&gt;
&#039;&#039;&#039;I Написать регулярные выражения&#039;&#039;&#039;&lt;br /&gt;
# Напишите регулярное выражение для языка над алфавитом Σ = {0, 1} каждое слово которого содержит хотя бы два нуля.&lt;br /&gt;
# Напишите регулярное выражение над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5.&lt;br /&gt;
# Напишите регулярное выражение, которое допускает пустой язык (язык в котором нет ни одного слова).&lt;br /&gt;
# Напишите регулярное выражение, которое допускает все слова над алфавитом Σ.&lt;br /&gt;
# Напишите регулярное выражение для языка над алфавитом Σ = {0, 1, 2, 3}, состоящий из слов, в которых хотя бы одна из последних пяти букв является 1.&lt;br /&gt;
&#039;&#039;&#039;II КА и регулярные выражения&#039;&#039;&#039;&lt;br /&gt;
# Постройте конечный автомат для языка (111 U 01)&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;1(00 U 11)&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;.&lt;br /&gt;
# Постройте конечный автомат для языка (ab)&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;(a U b)(b U a)&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;(a U bab).&lt;br /&gt;
&#039;&#039;&#039;III Доказать замкнутость относительно различных операций&#039;&#039;&#039;&lt;br /&gt;
# Покажите, что если для языков L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; и L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; существует КА, который их читает, то существует КА и для их объединения L = {w | w ∈ L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; или w ∈ L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;}.&lt;br /&gt;
# Покажите, что если для языка L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; и L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; существует КА, который их читает, то существует КА и для языка L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; = {xy | x ∈ L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, y ∈ L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;}.&lt;br /&gt;
# Покажите, что если для языка L существует КА, который его читает, то существует КА и для &#039;&#039;&#039;замыкания Клини&#039;&#039;&#039; L* = {w&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; w&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; ... w&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;| w&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; ∈ L, w&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; ∈ L, ..., w&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; ∈ L}.&lt;br /&gt;
# Покажите, что если язык L регулярен, то регулярно его дополнение (т.е. язык над тем же алфавитом, которому принадлежит слово тогда и только тогда, когда оно НЕ принадлежит L) .&lt;br /&gt;
# Покажите, что если язык L регулярен, то регулярно его обращение L&amp;lt;sub&amp;gt;R&amp;lt;/sub&amp;gt; = {a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; . . . a&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; | a&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; . . . a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; ∈ L}. (L&amp;lt;sub&amp;gt;R&amp;lt;/sub&amp;gt; --- это язык в котором все слова языка L записаны наоборот.)&lt;br /&gt;
# * Покажите, что если языки L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; и L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; регулярны, то регулярно их пересечение.&lt;br /&gt;
&#039;&#039;&#039;IV Использование леммы о накачке&#039;&#039;&#039; (см. [https://vk.com/doc12518218_392750846 конспект])&lt;br /&gt;
# Докажите, что не существует КА, который бы читал язык {0&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;1&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;2&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;}. (Пояснение: запись 0&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; означает строку из n нулей: 00...0.)&lt;br /&gt;
# Докажите, что не существует КА, который бы читал язык {0&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;1&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;}.&lt;br /&gt;
# Докажите, что не существует КА, который бы читал язык {0&amp;lt;sup&amp;gt;n!&amp;lt;/sup&amp;gt;}.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== (25.05) Автоматный подход ==&lt;br /&gt;
=== Задание 21 (до 01.06) ===&lt;br /&gt;
Реализуйте один из следующих проектов:&lt;br /&gt;
# Программа, которая считывает строку и говорит принадлежит ли она языку 0(123)*(00 U (231)*) U 111.&lt;br /&gt;
# Программа, которая считывает КА и генерирует программу на языке С++, которая говорит принадлежит ли заданное слово языку, описываемому этим КА.&lt;br /&gt;
# Программа, которая считывает регулярное выражение и строку и говорит принадлежит ли слово языку, описываемому этим регулярным выражением.&lt;br /&gt;
# Программа, которая моделирует работу банкомата, автомата с газировкой, лифта... (что-то одно на выбор)&lt;br /&gt;
# Текстовый симулятор студента. Возможные состояния: на паре, дома, есть приглашение прогулять, завтра коллоквиум, сплю и др. Есть два параметра: успеваемость и весёлось. Если хотя бы один из них упадёт ниже критической отметки, студент умрёт. Игрок принимает решение куда идти студенту. Цель: продержаться как можно дольше.&lt;br /&gt;
&lt;br /&gt;
== Большое домашнее задание 4 ==&lt;br /&gt;
[https://official.contest.yandex.ru/contest/1259 Контест]. В домашнем задании четыре задачи. Обязательны первые три. Вместо одной из первых трёх можно сделать последнюю (только для первых 10 решивших 4-ую!). На выполнение задания даётся примерно 2 недели (см. точное время окончания в контесте). Условия ревью определяют семинаристы.&lt;br /&gt;
&lt;br /&gt;
== (01.06) P vs NP ==&lt;br /&gt;
&#039;&#039;&#039;План занятия&#039;&#039;&#039;&lt;br /&gt;
# Напоминание: P; NP; проблема P ?= NP; NPC; сведения; пример сведений.&lt;br /&gt;
&lt;br /&gt;
=== Задание 22 (до 8.06) ===&lt;br /&gt;
1. &#039;&#039;Задачи поиска&#039;&#039; и &#039;&#039;задачи оптимизации&#039;&#039;. Для задачи коммивояжёра варианты с поиском и оптимизацией выглядят так:&lt;br /&gt;
  Задача поиска:&lt;br /&gt;
  &#039;&#039;Вход:&#039;&#039; матрица расстояний, бюджет b&lt;br /&gt;
  &#039;&#039;Выход:&#039;&#039; цикл веса не более b, проходящий по всем вершинам графа, если такой есть.&lt;br /&gt;
&lt;br /&gt;
  Оптимизационная задача:&lt;br /&gt;
  &#039;&#039;Вход:&#039;&#039; матрица расстояний&lt;br /&gt;
  &#039;&#039;Выход:&#039;&#039; цикл минимального веса, проходящий по всем вершинам графа, если такой есть.&lt;br /&gt;
&lt;br /&gt;
Покажите, что если поисковую задачу коммивояжёра можно решить за полиномиальное время, то и оптимизационный вариант можно решить за полиномиальное время.&lt;br /&gt;
&lt;br /&gt;
2. &#039;&#039;Задача поиска&#039;&#039; и &#039;&#039;задача разрешения&#039;&#039;. Пусть имеется программа, которая за полиномиальное время отвечает на вопрос , содержит л входной граф гамильтонов цикл. Как с её помощью найти за полиномиальное время сам цикл (есть он есть)?&lt;br /&gt;
&lt;br /&gt;
3.&lt;/div&gt;</summary>
		<author><name>Kassalanche</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=16694</id>
		<title>Алгоритмы и структуры данных. Подгруппа 105-1</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=16694"/>
		<updated>2015-06-01T06:09:07Z</updated>

		<summary type="html">&lt;p&gt;Kassalanche: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==О курсе==&lt;br /&gt;
[[Алгоритмы_и_структуры_данных|План лекций и список рекомендуемой литературы.]]&lt;br /&gt;
&lt;br /&gt;
[[Алгоритмы_и_структуры_данных._Подгруппа_105-1._FAQ|FAQ.]]&lt;br /&gt;
&lt;br /&gt;
[[Reviewboard|Инструкция по использованию Reviewboard.]]&lt;br /&gt;
&lt;br /&gt;
[[Практические_занятия_по_курсу_ОиМП/C++_check|Style guide.]]&lt;br /&gt;
&lt;br /&gt;
==Итоговая оценка за курс==&lt;br /&gt;
Итоговая оценка (ИО) зависит от&lt;br /&gt;
* оценок за пять больших домашних заданий (БДЗ1, БДЗ2, ..., БДЗ5),&lt;br /&gt;
* оценок за домашние задания (ДЗ1, ДЗ2, ...),&lt;br /&gt;
* оценки за контрольную работу (КР),&lt;br /&gt;
* оценки за экзамен (ЭКЗ),&lt;br /&gt;
и может быть вычислена по формуле:&lt;br /&gt;
 ИО = 0.7 * (0.3 * КР + 0.7 *(ИДЗ1 + ИДЗ2 + ИДЗ3 + ИДЗ4 + ИДЗ5)/5) + 0.3 * ЭКЗ =&lt;br /&gt;
    = 0.21*КР + 0.098*ИДЗ1 + 0.098*ИДЗ2 + 0.098*ИДЗ3 + 0.098*ИДЗ4 + 0.098*ИДЗ5 + 0.3*ЭКЗ,&lt;br /&gt;
где&lt;br /&gt;
 ИДЗi = min (10, 0.7 * БДЗi + 0.4 * &amp;lt;cредняя оценка за ДЗj, прошедшие с предыдущего БДЗ по i-ое&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
==Порядок сдачи домашних работ==&lt;br /&gt;
===Большие домашние работы===&lt;br /&gt;
# Получить OK за задачу в контесте.&lt;br /&gt;
# Залить исходный код на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* На каждую задачу создавайте отдельный запрос на ревью. &lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении суток приходят замечания к коду. &#039;&#039;&#039;Если в течении суток замечаний или Ship It не появилось, проверьте, что вы правильно отправили запрос и, если всё сделано правильно, спросите у семинариста получил ли он запрос.&#039;&#039;&#039;&lt;br /&gt;
# Вы их исправляете, проверяете в контесте, что программа по-прежнему проходит все тесты, заливаете новую версию в Review Board. Штрафов за посылки НЕ будет.&lt;br /&gt;
# Процесс повторяется пока остаются замечания к коду или пока не истёк дедлайн. После закрытия контеста будут ещё одни сутки на доработку замечаний в Review Board.&lt;br /&gt;
# Оценивается только последняя версия работы в Review Board.&lt;br /&gt;
&lt;br /&gt;
===Маленькие домашние работы===&lt;br /&gt;
# Залить решение на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* Желаемые форматы: txt, py, cpp, h. Допускаются любые другие.&lt;br /&gt;
#* На каждую домашнюю работу создавайте отдельный запрос на ревью. Обязательно указывайте номер домашней работы.&lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении неопределенного промежутка времени придут оценки по каждому из заданий.&lt;br /&gt;
&lt;br /&gt;
==Оценивание домашних работ==&lt;br /&gt;
* Все задания предполагаются индивидуальными. Запрещены любые заимствования без ссылки на автора.&lt;br /&gt;
* Решения после установленного дедлайна не принимаются. Дедлайн указан в заголовке каждого задания.&lt;br /&gt;
* Везде, где требуется написать алгоритм, можно использовать любой язык программирования или псевдокод.&lt;br /&gt;
* Там, где требуется построить алгоритм с заданной асимптотикой, приведите обоснование, что полученный алгоритм удовлетворяет этому условию.&lt;br /&gt;
* Эти правила не действуют, если в задании явно оговорено иное.&lt;br /&gt;
&lt;br /&gt;
==Мотивация к изучению алгоритмов. Подсчёт числа операций (12.01)==&lt;br /&gt;
# Числа Фибоначчи. Определение. Примитивный рекурсивный алгоритм вычисления i-ого числа. Оценка числа операций. Анализ причин неэффективности. Алгоритм с запоминанием вычисленных ранее значений. Оценка числа операций. Сравнение с предыдущим. (подробнее: глава 0, страницы 8-10 из книги &amp;lt;&amp;lt;Алгоритмы&amp;gt;&amp;gt;, [[Алгоритмы_и_структуры_данных|см. список рекомендованной литературы]])&lt;br /&gt;
# Задача о ханойской башне. Постановка задачи. Рекурсивный алгоритм. Рекуррентная формула для числа перемещений. Замкнутая формула для числа перемещений (+ доказательство). Доказательство того, что эту задачу нельзя решить используя меньшее число перемещений дисков. ([https://www.dropbox.com/s/t8cbs7ttu4iasvj/algo-0-recursion.pdf?dl=0 Разбор задачи о ханойской башне], автор Сергей Объедков)&lt;br /&gt;
# Сортировка пузырьком. Алгоритм. Подсчёт количество операций сравнения и обмена (swap). Анализ наилучшего и наихудшего случаев ([https://ru.wikipedia.org/wiki/Сортировка_пузырьком Википедия])&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 1 (12.01 - 26.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
Во всех задачах, если не оговорено иного, предполагаем, что работаем с целыми неотрицательными числами. Для первых 7 задач необходимо&lt;br /&gt;
* описать что можно считать наилучшим и наихудшим случаями,&lt;br /&gt;
* для каждого из двух случаев подсчитать отдельно количество операций сравнения и swap (если есть).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Даны три числа, требуется вернуть наименьшее.&lt;br /&gt;
# Даны три числа, требуется отсортировать их.&lt;br /&gt;
# Дана последовательность A из n элементов и число x, требуется найти элемент равный x. Примечание: если таких значений i несколько, вернуть любое; если такого элемента нет, функция должна сообщить об этом.&lt;br /&gt;
# * Дана упорядоченная последовательность A из n элементов и число x, требуется найти такое i, что A[i] равно x. Алгоритм должен быть эффективней, чем в предыдущем пункте и использовать то, что последовательность упорядочена.&lt;br /&gt;
# Дана последовательность из 100 000 чисел от 0 до 100. Напишите эффективный алгоритм сортировки, который бы учитывал специфику входных данных.&lt;br /&gt;
# * Дано 32 битное неотрицательное число. Требуется номер первого ненулевого бит. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения, считая, что числа распределены равномерно.&lt;br /&gt;
# * Даны 32 битные неотрицательные числа m и n. Требуется вывести True, если m &amp;lt; n, иначе False. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения битов, считая, что числа распределены равномерно.&lt;br /&gt;
# Напишите рекурсивную функцию, вычисляющую n-ое число Фибоначчи (как на занятии). Подсчитайте количество рекурсивных вызовов.&lt;br /&gt;
# * Напишите функцию, вычисляющую n-ое число Фибоначчи, у которой число операций — полином от n, и которая использует количество памяти, независящее от n.&lt;br /&gt;
&lt;br /&gt;
==O-символика и стратегия &amp;quot;разделяй и властвуй&amp;quot; (15.01)==&lt;br /&gt;
# Сортировка слиянием. Алгоритм, рекуррентное соотношение для времени сортировки, сложность. Подробнее: [https://dl.dropboxusercontent.com/u/829163/draft.pdf §2.3 Сортировка слиянием (стр. 54)].&lt;br /&gt;
# О-символика. [https://dl.dropboxusercontent.com/u/829163/draft.pdf §0.3 О-символика (стр. 10)].&lt;br /&gt;
# Задача о слиянии m упорядоченных массивов по n элементов. Три алгоритма решения: последовательное слияние, слияние &amp;quot;деревом&amp;quot; (обе функции используют Merge из MergeSort), аналог Merge для m массивов. Анализ сложности каждого из них.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 2 (15.01-29.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
* Во всех задачах, если не оговорено иного, для простоты &#039;&#039;можно&#039;&#039; считать, что n является степенью какого-либо числа, например, степенью двойки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Дана функция F, определённая ниже. Сколько строк она напечатает? Указание: для обоих подпунктов рассмотрите два случая: 1. n является степенью двойки, 2. n не является степенью двойки.&lt;br /&gt;
## Запишите рекуррентное соотношение для числа строк.&lt;br /&gt;
## Решите уравнение, полученное в предыдущем пункте, то есть, выведите замкнутую (нерекуррентную формулу). Для простоты можно считать, что n является степенью двойки.&lt;br /&gt;
# В массиве A размера n записана возрастающая последовательность целых чисел. Постройте алгоритм типа &amp;quot;разделяй и властвуй&amp;quot;, который проверяет, существует ли такой индекс i, что A[i] = i&lt;br /&gt;
## за время O(n),&lt;br /&gt;
## * за время O(log n).&lt;br /&gt;
## Какие случаи для вашего алгоритма являются наихудшими и наилучшими? Какого время работы в лучшем и худшем случаях?&lt;br /&gt;
# Дан бесконечный массив A, первые n элементов которого содержат возрастающую последовательность положительных чисел, а дальше стоят -1. Значение n не дано. Постройте алгоритм, который получает на вход целое число x и находит это x в массиве --- или говорит, что там его нет, &lt;br /&gt;
## за время O(n),&lt;br /&gt;
## за время O(log n).&lt;br /&gt;
# Рассмотрим алгоритм вычисления наибольшего общего делителя (НОД) двух положительных чисел, основанный на методе &amp;quot;разделяй и властвуй&amp;quot;.&lt;br /&gt;
## (задание не оценивается) Прочитайте [https://dl.dropboxusercontent.com/u/829163/draft.pdf §1.2.3 Алгоритм Евклида (стр. 23)].&lt;br /&gt;
## * Докажите, что определение НОД-а, приведённое ниже, корректно.&lt;br /&gt;
## Постройте алгоритм, основанный на этом определении.&lt;br /&gt;
## Какой алгоритм будет быстрее для n-битовых чисел a и b при больших значениях n --- ваш или алгоритм Евклида?&lt;br /&gt;
# * Покажите как за время O(n log n) удалить из массива размера n все дубликаты, то есть оставить каждый элемент в одном экземпляре.&lt;br /&gt;
# * Даны два упорядоченных массива размера m и n. Постройте алгоритм, находящий k-й по величине элемент в объединении этих массивов за время O(log(n+m)). &lt;br /&gt;
&lt;br /&gt;
Функция F(n).&lt;br /&gt;
  если n &amp;gt; 1:&lt;br /&gt;
    напечатать &amp;quot;всё ещё работаю&amp;quot;&lt;br /&gt;
    F(n/2)&lt;br /&gt;
    F(n/2)&lt;br /&gt;
&lt;br /&gt;
Определение НОД-а.&lt;br /&gt;
             2НОД(a/2, b/2), если а и b чётны,&lt;br /&gt;
  НОД(a,b) = НОД(a, b/2), если а нечётно, b чётно,&lt;br /&gt;
             НОД((a-b)/2, b), если а и b нечётны.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;lt;nowiki&amp;gt;Задачи взяты из книги &amp;quot;Алгоритмы&amp;quot;, глава 2 (см. список рекомендованной литературы).&amp;lt;/nowiki&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Сложение и умножение (19.01)==&lt;br /&gt;
# Алгоритм сложения, его сложность (§1.1.1 Сложение*)&lt;br /&gt;
# &amp;quot;Школьный&amp;quot; алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Рекурсивный алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Алгоритм умножения, реализующий стратегию &amp;quot;разделяй и властвуй&amp;quot;, анализ сложности (§2.1 Умножение чисел*)&lt;br /&gt;
 * [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать.]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 3 (19.01 - 2.02)===&lt;br /&gt;
* Во всех задачах для простоты можно считать, что n является степенью какого-либо числа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Найдите произведение чисел 10011011 и 10111010 (в двоичной системе счисления), используя алгоритм умножения чисел, основанный на методе «разделяй и властвуй». Необходимо не только дать ответ, но и привести ход решения.&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 3 рекурсивных вызова для подзадач размера n-1 и комбинирует из них решение исходной задачи за О(n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте три верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 10 рекурсивных вызовов для подзадач размера n/2 и комбинирует из них решение исходной задачи за О(5n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте два верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Докажите, что 3m² + m = O(m²).&lt;br /&gt;
# Докажите, что lg m = O(m/1000), где lg m — это логарифм с двоичным основанием.&lt;br /&gt;
# Докажите, что из равенства f(n) = O(g(n)) не следует, что g(n) = O(f(n)).&lt;br /&gt;
# Докажите, что O(m) содержится в O(m²).&lt;br /&gt;
&lt;br /&gt;
==Решение рекуррентных уравнений (22.01)==&lt;br /&gt;
# Примеры решений рекуррентных уравнений (см. [https://www.dropbox.com/s/6a0r410zjm9qwe7/algo-3-recurrences.pdf?dl=0 конспект]).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 4 (до 14.02)===&lt;br /&gt;
* Нельзя использовать утверждение основной теоремы о решении рекуррентных соотношений.&lt;br /&gt;
* &#039;&#039;Можно&#039;&#039; использовать метод построения дерева рекурсии или подстановку (метод с угадыванием ответа).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Какой из трёх приведённых ниже алгоритмов вы бы предпочли? Обоснуйте свой ответ.&lt;br /&gt;
#* Алгоритм A, решая задачу, производит пять рекурсивных вызовов для подзадач вдвое меньшего размера, после чего строит ответ для исходной задачи за линейное время.&lt;br /&gt;
#* Алгоритм B, решая задачу размера n, делает два рекурсивных вызова для задач размера n − 1, после чего находит ответ за время O(1).&lt;br /&gt;
#* Алгоритм C, решая задачу размера n, рекурсивно решает девять задач размера n/3 и строит ответ за время O(n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Найдите T(n) в замкнутой форме для любых 7 из 10 приведённых ниже рекуррентных соотношений:&lt;br /&gt;
## T(n) ≤ 2T(n/3) + 1;&lt;br /&gt;
## T(n) ≤ 7T(n/7) + n;&lt;br /&gt;
## T(n) ≤ 9T(n/3) + n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 8T(n/2) + n&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 49T(n/25) + n&amp;lt;sup&amp;gt;3/2&amp;lt;/sup&amp;gt;log n;&lt;br /&gt;
## T(n) ≤ T(n − 1) + 2;&lt;br /&gt;
## T(n) ≤ T(n − 1) + n&amp;lt;sup&amp;gt;c&amp;lt;/sup&amp;gt;, где c ≥ 1 –– константа;&lt;br /&gt;
## T(n) ≤ T(n − 1) + c&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;, где c &amp;gt; 1 –– константа;&lt;br /&gt;
## T(n) ≤ 2T(n − 1) + 1;&lt;br /&gt;
## T(n) ≤ T(sqrt(n)) + 1.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №1==&lt;br /&gt;
Необходимо реализовать все 6 задач из [https://official.contest.yandex.ru/contest/1002 контеста]. Каждую задачу можно писать на С++ или Python. На выполнение работы отводится две недели. Каждая задача оценивается в 10/6 балла. Оценка &#039;&#039;может&#039;&#039; быть снижена за плохой код, но не более чем на 25%.&lt;br /&gt;
&lt;br /&gt;
==Бинарное дерево поиска (26.01)==&lt;br /&gt;
# Определение. Пример.&lt;br /&gt;
# Не модифицирующие алгоритмы: поиск (рекурсивный и итеративный алгоритмы), поиск минимума, inordered обход (вывод значений узлов в отсортированном порядке), поиск следующего по возрастанию.&lt;br /&gt;
# Модифицирующие алгоритмы: вставка (рекурсивная реализация), удаление (только идея).&lt;br /&gt;
 [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 13, стр. 248]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 5 (до 16.02)===&lt;br /&gt;
* Для получения максимальной оценки можно выполнить или все задачи без звёздочки, или задачу со звёздочкой. Преподаватель понимает, что реализацию БДП сложно не найти в интернете, но от копипасты не будет никакой пользы. Напротив, самостоятельная реализация очень полезна и приветствуется, даже если не получится выполнить всех пунктов задания.&lt;br /&gt;
* Задачи с двумя звёздочками необязательны.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Нарисуйте бинарные деревья поиска высотой 2, 3, 4, 5 и 6 для множества ключей {1, 4, 5, 10, 16, 17, 21}. Корень дерева имеет высоту 0.&lt;br /&gt;
# &#039;&#039;&#039;Сортировка с использованием БДП.&#039;&#039;&#039;&lt;br /&gt;
## Какова асимптотическая сложность алгоритма вставки элемента в дерево высоты d? Почему? Назовите наилучший и наиухдший случаи.&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который строит БДП в узлах которого стоят элементы данной последовательности. Можно использовать функцию Insert. Назовите наилучший и наихудший случаи. Есть теорема о том, что полученный алгоритм будет работать в среднем случае за время O(n * log n).&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который выводит их в порядке возрастания. Используйте бинарное дерево поиска. Какова в среднем случае сложность этого алгоритма? Назовите наилучший и наихудший случаи. Какова сложность в наихудшем случае?&lt;br /&gt;
# Напишите функцию GetRoot, которой на вход подаётся указатель на произвольный узел дерева, а она возвращает указатель на корень.&lt;br /&gt;
# Напишите процедуру PrintLeafs, которой на вход подаётся указатель на корень дерева, и она печатает листья дерева&lt;br /&gt;
## по возрастанию,&lt;br /&gt;
## по убыванию.&lt;br /&gt;
# ** Альтернативный обход в порядке возрастания бинарного дерева поиска с n узлами (или центрированный (inordered) обход) можно осуществить путём поиска минимального элемента дерева с помощью функции Minimum с последующий n-1 вызовом функции Next. Каково время работы такого алгоритма?&lt;br /&gt;
# * Реализуйте на С++ структуру данных бинарное дерево поиска, [https://yadi.sk/i/gi2SEStreFfSb используя заготовку].&lt;br /&gt;
## Нарисуйте бинарное дерево поиска, которое строится в функции getTreeExample.&lt;br /&gt;
## Реализуйте следующие алгоритмы: &lt;br /&gt;
### поиск минимума, &lt;br /&gt;
### inordered обход (вывод значений узлов в отсортированном порядке),&lt;br /&gt;
### поиск следующего по возрастанию,&lt;br /&gt;
### вставка элемента в дерево,&lt;br /&gt;
### сортировка последовательности с использованием БДП (дан вектор чисел, необходимо вывести их по возрастанию),&lt;br /&gt;
### ** удаление.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Карацубы, Штрассена. Быстрая сортировка (29.01)==&lt;br /&gt;
# Алгоритм Карацубы.&lt;br /&gt;
# Алгоритм Штрассена. [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать Дасгупту и др., §2.5 Умножение матриц]&lt;br /&gt;
# Быстрая сортировка и доказательство того, что в среднем случае она работает за О(n * log n). [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 8 Быстрая сортировка, стр. 148]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 6 (до 18.02)===&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Пусть мы хотим найти двоичное представление десятичного числа 10&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;. Будем считать, что n --- степень двойки (n = 2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt;).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Pwr2Bin(n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть 1010&lt;br /&gt;
    z = ...&lt;br /&gt;
    вернуть Multiply(z, z)&amp;lt;/source&amp;gt;&lt;br /&gt;
Multiply --- функция, перемножающая два n-битовых двоичных числа x и y по алгоритму Карацубы за O(n&amp;lt;sup&amp;gt;log&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;3&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Пусть мы хотим перевести произвольное десятичное число x в записи которого n=2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; чисел в двоичную систему счисления.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Dec2Bin(x, n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть binary[x]&lt;br /&gt;
    разделить x на два десятичных числа xl и xr из n/2 цифр.&lt;br /&gt;
    вернуть ...&amp;lt;/source&amp;gt;&lt;br /&gt;
Здесь binary --- это массив, содержащий двоичное представление десятичных цифр.&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Докажите, что математическое ожидание времени работы алгоритма быстрой сортировки (усреднение по всем вариантам выбора опорного элемента) на любом входе размера n удовлетворяет соотношению: T(n) ≤ O(n) + 1/n * &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt; (T(i-1) + T(n-i)).&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Найдите решение соотношения из предыдущего пункта.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Динамическое программирование (ДП). Первые примеры (02.01)==&lt;br /&gt;
# Нахождение самой длинной возрастающей подпоследовательности.&lt;br /&gt;
# Нахождение редакционного расстояния (или редакционной стоимости, расстояния Левенштейна).&lt;br /&gt;
# Нахождение представителя большинства.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 7 (до 20.02)===&lt;br /&gt;
* В этом задании везде, где требуется реализовать алгоритм, необходимо привести код на любом языке программирования.&lt;br /&gt;
* Для получения максимальной оценки нужно решить все задачи без звёздочек. Одна решённая задача со звёздочкой заменяет одну задачу без звёздочки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения редакционного расстояния (алгоритм Вагнера — Фишера). Например, редакционное расстояние между словами &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равно 6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения длины наибольшей общей подстроки. Например, длина наибольшей общей подстроки &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равна 8 (&amp;quot;antholog&amp;quot;). Чем больше это значение, тем схожей строки.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Предположим теперь, что сравниваемые строки состоят из символов A, С, G и T; за удаление или вставку мы платим -5; за замену буквы x на y платим w[x, y], где x, y принадлежат множеству {A, С, G, T}, a w — это матрица весов:&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
!-!! A!! G!! C!! T&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! A&lt;br /&gt;
|10||-1||-3||-4&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
!G&lt;br /&gt;
||-1||7||-5||-3&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! C&lt;br /&gt;
||-3||-5||9||0&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! T&lt;br /&gt;
||-4||-3||0||8&lt;br /&gt;
|}&lt;br /&gt;
Тогда выравнивание:&lt;br /&gt;
 AGACTAGTTAC&lt;br /&gt;
 CGA‒‒‒GACGT&lt;br /&gt;
будет иметь следующую оценку:&lt;br /&gt;
 w[A,C] + w[G,G] + w[A,A] + 3*(-5) + w[G,G] + w[T,A] + w[T,C] + w[A,G] + w[C,T] = -3 + 7 + 10 - 3*5 + 7 + (-4) + 0 + (-1) + 0 = 1.&lt;br /&gt;
&lt;br /&gt;
Напишите алгоритм, который находит максимальную стоимость всех возможных выравниваний. Верно ли, что чем больше это значение, тем непохожей строки?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как давно один народ отделился от другого? Кто похожей — итальянец и китаец или якут и эфиоп? На эти вопросы можно отвечать с разных точек зрения — культурной, исторической, лингвистической, ... В последние же годы человечество научилось секвенировать геном, что позволило исследовать этот вопрос с точки зрения генетики. Секвенирование генома — это процесс записи ДНК в виде нуклеотидной последовательности, которая представляет собой последовательность из четырёх символов — A, С, G и T. Существуют базы, которые хранят генетическую информацию о людях из разных стран и континентов, например, [http://www.mtdb.igp.uu.se/ http://www.mtdb.igp.uu.se/ → Download mtDNA sequences]. Чем больше сходство между геномами, тем сильнее родственные связи между их обладателями. Используя решение предыдущего пункта, выполните задания:&lt;br /&gt;
# Определите, кто похожей — итальянец и китаец или якут и эфиоп?&lt;br /&gt;
# Найдите нескольких похожих и нескольких непохожих народностей.&lt;br /&gt;
# * Выберите одну народность. Найдите самых похожих и самых непохожих на неё.&lt;br /&gt;
# * Найдите самые похожие и самые непохожие народности.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Задача о разрезании стержня (05.01)==&lt;br /&gt;
# Постановка задачи.&lt;br /&gt;
# Решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Решение с нахождением максимума по p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Восходящий алгоритм с запоминанием. Вывод длин кусочков стержня. Оценка сложности.&lt;br /&gt;
# Нисходящий алгоритм с запоминанием. Оценка сложности.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.1 Разрезание стержня, стр. 393]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 8 (до 22.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Решая задачу о разрезании стержня мы вначале построили рекурсивное решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt; для всех 1 ≤ i &amp;lt; n. Его сложность описывалась рекуррентной формулой T(n) = n + &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n-1&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt;(T(i) + T(n-i)), T(1) = 1.&lt;br /&gt;
# Объясните эту формулу.&lt;br /&gt;
# Покажите с помощью метода подстановок, что T(n) ≤ 2&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Покажите с помощью контрпримера, что описанная далее жадная стратегия не всегда определяет оптимальный способ разрезания стержня. Определим плотность стержня длиной i как p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;/i, то есть как стоимость единицы его длины. Жадная стратегия для стержня длиной n отрезает от стержня первую часть длиной i, где 1 ≤ i ≤ n, имеющую максимальную плотность. Затем та же жадная стратегия применяется к оставшейся части длиной n-i.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Рассмотрим модификацию задачи разрезания стержня, в которой в дополнение к цене p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; каждого стержня добавляется фиксированная цена разреза c. Теперь прибыль, связанная с решением, представляет собой сумму цен частей стержня минус стоимость разрезов. Разработайте алгоритм динамического программирования для этой модифицированной задачи.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Непрерывным участком называется группа подряд идущих элементов. Например, для последовательности&lt;br /&gt;
 5, 15, −30, 10, −5, 40, 10&lt;br /&gt;
элементы 15, −30, 10 образуют непрерывный участок, а 5, 15, 40 -- нет. Постройте линейный алгоритм для следующей задачи:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Вход: список чисел a1, a2, ... ‌, an.&lt;br /&gt;
Выход: непрерывный участок с максимальной суммой (сумма участка нулевой длины равна нулю).&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Для приведённого примера ответом будет 10, −5, 40, 10 с суммой 55. Какова сложность алгоритма? Почему?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Надо заплатить v рублей, имея купюры в x1, x2, ‌..., xn рублей (купюр каждого типа сколько угодно). Это не всегда возможно (скажем, купюрами в&lt;br /&gt;
10 и 25 рублей можно заплатить 45 рублей, но не 47 и не 15). Постройте основанный на методе динамического программирования алгоритм со временем работы O(nv), выясняющий, возможна ли уплата.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как решить предыдущую задачу, если каждая купюра имеется в единственном экземпляре? (Например, купюрами в 1, 5, 10, 20 рублей можно заплатить 16 = 1 + 5 + 10 и 31 = 1 + 10 + 20 рублей, но не 40 (не хватит денег). Время работы алгоритма по-прежнему O(nv).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Ещё один вариант той же задачи: купюр каждого типа сколько угодно, но всего разрешается использовать не более k купюр. (Например, если есть купюры в 5 и 10 рублей, а k = 6, то 55 разменять можно, а 65 –– нет).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Перемножение цепочки матриц. Оптимальное бинарное дерево поиска (начало) (09.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о перемножении цепочки матриц. Постановка задачи.Пример. Нисходящий алгоритм.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.2 Перемножение цепочки матриц, стр. 403]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 9 (до 24.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Найдите оптимальную расстановку скобок в произведении последовательности матриц, размерности которых равны 5×10, 10×3, 3×12, 12×5, 5×50, 50×6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Напишите восходящий алгоритм для поиска оптимальной расстановки скобок.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Расстановка пробелов. Оптимальное бинарное дерево поиска (середина) (12.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о расстановке пробелов. Постановка задачи. Решения для трёх случаев: 1. нужно вернуть можно ли разбить текст на слова; 2. вернуть разбивку на слова; 3. слова встречаются не равновероятно, вернуть наиболее вероятную разбивку на слова.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи. Вывод математического ожидания времени поиска.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Праздничное домашнее задание 10 (до 02.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[&amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;,&amp;quot;, &amp;quot;.&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;,&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;.&amp;quot;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Подсказка:&#039;&#039;&#039; разбейте текст на слова из списка и посмотрите на азбуку Морзе.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Способы представления графов в памяти (16.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Разбор ошибок в домашнем задании.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Графы. Способы представления графов в памяти (матрица смежности, список рёбер, список соседей (список смежностей), матрица инцидентности). Зависимость сложности алгоритмов от способа представления.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §22.1 Представление графов, стр. 626]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 11 (до 02.03)===&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача A.]&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача B.]&lt;br /&gt;
# Нарисуйте неориентированный граф с 5 вершинами и 8 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Нарисуйте ориентированный граф с 4 вершинами и 3 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Дан ориентированный граф. &#039;&#039;Исходящая степень вершины v&#039;&#039; --- это количество исходящих из неё рёбер, &#039;&#039;входящая степень v&#039;&#039; --- это количество рёбер входящих в  v. Имеется представление ориентированного графа с использование списка соседей. Как долго будут вычисляться исходящие степени всех вершин графа? А входящие степени?&lt;br /&gt;
# Дан граф G = (V, E). Какие из рассмотренных способов хранения графов используют меньше всего памяти для хранения G и почему? Указание: рассмотрите случаи |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;lt; |E| и |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;gt; |E|.&lt;br /&gt;
# Пусть C --- это матрица смежности графа G.&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
# Пусть B --- это матрица инцидентности ориентированного графа G. Как связаны элементы матрицы BB&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
&lt;br /&gt;
==Реализация поиска в глубину (19.02)==&lt;br /&gt;
# Реализация поиска в глубину и смежных задач.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 12 (до 5.03)===&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Выберите любой способ хранения графа. Реализуйте поиск в глубину.&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Напишите алгоритм, который возвращает данные о том, какие вершины лежат в одной компоненте связности.&lt;br /&gt;
# &#039;&#039;(любой ЯП или псевдокод)&#039;&#039; Напишите алгоритм проверки сильной связности ориентированного графа. Какова его сложность?&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №2==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
Необходимо реализовать 3 задачи из [https://official.contest.yandex.ru/contest/1085 контеста], см. [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing распределение задач]. Каждую задачу можно написать на С++ или Python. На выполнение работы отводится две недели (см. время окончания контеста). [https://official.contest.yandex.ru/contest/1123 Дорешивание.]&lt;br /&gt;
&lt;br /&gt;
==ДП и графы (26.02)==&lt;br /&gt;
==ДП и графы (02.03)==&lt;br /&gt;
==Жадные алгоритмы (12.03)==&lt;br /&gt;
===Домашнее задание 13 (до 23.03)===&lt;br /&gt;
# Вася хочет купить по одной акции каждой компании. Все акции стоят одинаково, но дорожают по-разному. Каждый месяц акция i-ой компании дорожает в r_i раз. В один месяц можно купить только одну акцию.&lt;br /&gt;
## Напишите алгоритм, который выводит оптимальную последовательность покупок (такую, что на покупку всех акций потратится меньше денег).&lt;br /&gt;
## Докажите корректность алгоритма, то есть докажите, что последовательность покупок, которую выводит ваш алгоритм, оптимальна.&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список, очередь (16.03)==&lt;br /&gt;
# Реализация линейного двусвязного списка (С++).&lt;br /&gt;
# Реализация очереди ограниченной длины на базе вектора (С++).&lt;br /&gt;
# Реализация очереди на базе списка (С++).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14 (до 23.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте (на С++) структуру данных Стек. У стека должно быть три операции:&lt;br /&gt;
* push --- положить элемент на вершину стека;&lt;br /&gt;
* pop --- удалить верхний элемент;&lt;br /&gt;
* front --- вернуть значение верхнего элемента.&lt;br /&gt;
Оцените время работы каждой функции.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список (19.03)==&lt;br /&gt;
===Домашнее задание 13* (до 30.03)===&lt;br /&gt;
#Для приведённой реализации класса List (https://yadi.sk/i/c5r_79WdfMyNS).&lt;br /&gt;
## Допишите print, push_back и push_front.&lt;br /&gt;
## В функции insert_after и delete_node вставьте необходимые проверки так, чтобы они работали для крайних случаев.&lt;br /&gt;
## Напишите main в котором&lt;br /&gt;
### создаётся объект класса List, &lt;br /&gt;
### заполняется элементами с помощью функций push_back, push_front и insert_after и&lt;br /&gt;
### удаляется i-ый элемент.&lt;br /&gt;
&lt;br /&gt;
==Повторение (30.03)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Для данных пар функций выясните их связь в терминах O-, o-, Ω-, ω-, Θ-обозначений. Поставьте галочку в клетке с Ω, если f(x) = Ω(g(x)) и прочерк, если равенства нет. [https://ru.wikipedia.org/wiki/«O»_большое_и_«o»_малое#.D0.94.D1.80.D1.83.D0.B3.D0.B8.D0.B5_.D0.BF.D0.BE.D0.B4.D0.BE.D0.B1.D0.BD.D1.8B.D0.B5_.D0.BE.D0.B1.D0.BE.D0.B7.D0.BD.D0.B0.D1.87.D0.B5.D0.BD.D0.B8.D1.8F Википедия]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! f(x)!! g(x)!! O!! o!! Ω!! ω!! Θ&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! 2^100&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n * log(n)&lt;br /&gt;
! 2^100 * n * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n&lt;br /&gt;
! 2^100 * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n!&lt;br /&gt;
! 2^(2015n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n*2^n&lt;br /&gt;
! 3^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 5^n&lt;br /&gt;
! 5^(n+1)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n + n^2 + n^3 + ... + n^1000&lt;br /&gt;
! 7^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм Quickselect нахождения k-ого элемента по возрастанию: http://en.wikipedia.org/wiki/Quickselect&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;На улице стоит ряд домов. В каждом из домов лежит сколько-то денег. Вор хочет обокрасть дома на переулке. Он не может обокрасть два соседних дома, потому что хозяин дома, который он обокрал, сразу предупредит соседей. Нужно найти, какую максимальную сумму вор может украсть с переулка. На вход программы подается массив неотрицательных целых чисел - количество долларов в доме с номером i. Соседние дома в массиве представлены соседними элементами. Например, пусть задан массив { 1, 4, 5 } - тогда вор максимум может украсть $6, обокрав дома 1 и 3. Пусть задан массив { 1, 7, 2 } - тогда вор максимум может украсть $7, обокрав дом 2.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Алфавит из всех маленьких латинских букв и пробела закодирован числами следующим способом:&lt;br /&gt;
  &#039;a&#039; -&amp;gt; 1&lt;br /&gt;
  &#039;b&#039; -&amp;gt; 2&lt;br /&gt;
  &#039;c&#039; -&amp;gt; 3&lt;br /&gt;
  ...&lt;br /&gt;
  &#039;z&#039; -&amp;gt; 26&lt;br /&gt;
  &#039; &#039; -&amp;gt; 27&lt;br /&gt;
На вход программы подается строка из цифр. Нужно посчитать, сколькими способами можно раскодировать эту строку.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Дан граф, заданный матрицей смежности. Вывести пары вершин между которыми нет пути.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Повторение (02.04) ==&lt;br /&gt;
Решали и разбирали первые 4 задачи из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14* (до 11.03)===&lt;br /&gt;
Решите любые две задачи (подпункты НЕ считаются отдельными задачами) с предыдущей пары (Повторение (30.03)).&lt;br /&gt;
&lt;br /&gt;
== Повторение (06.04) ==&lt;br /&gt;
Будем решать вторую половину задач из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 15 (до 16.04)===&lt;br /&gt;
# Приведите пример графа, который содержит отрицательные рёбра, не содержит циклов отрицательного веса и для которого алгоритм Дейкстры возвращает неверный результат.&lt;br /&gt;
# Используется ли в алгоритме Дейкстры то, что веса рёбер неотрицательны? Если &amp;quot;да&amp;quot;, то где именно?&lt;br /&gt;
# Пусть граф содержит рёбра с весами &amp;gt;= -100. Если прибавить к каждому ребру 101 и при помощи алгоритма Дейкстры найти кратчайшие пути. Будут ли эти пути кратчайшими в исходном графе? Почему?&lt;br /&gt;
&lt;br /&gt;
== Повторение (07.04) ==&lt;br /&gt;
&#039;&#039;&#039;Решение рекуррентных соотношений&#039;&#039;&#039;&lt;br /&gt;
# Решите уравнение: T(n) = 4*T(n/2) + O(n^2) с базой T(1) = O(1)&lt;br /&gt;
## Используя основную теорему.&lt;br /&gt;
## Используя дерево рекурсий.&lt;br /&gt;
## Методом подстановки.&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2)) + n является \Theta(n lg n).&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2) + 17) + n является \Theta(n lg n).&lt;br /&gt;
# Решите уравнения, считая, что T(1) = O(1):&lt;br /&gt;
## T(n) = T(n-1) + n&lt;br /&gt;
## T(n) = 2*T(floor(sqrt(n))) + lg n. Указание: попробуйте использовать замену переменных.&lt;br /&gt;
## T(n) = 3*T(sqrt(n)) + lg n&lt;br /&gt;
# Дайте верхнюю и нижнюю оценки функции T(n). Постарайтесь, чтобы оценки были как можно более точные&lt;br /&gt;
## T(n) = 4T(n/3) + n*lg(n)&lt;br /&gt;
## T(n) = 3T(n/3) + n/lg(n)&lt;br /&gt;
## T(n) = 4T(n/2) + n^2*sqrt(n)&lt;br /&gt;
## T(n) = T(n/2) + T(n/4) + T(n/8) + n&lt;br /&gt;
## T(n) = T(n-1) + 1/n&lt;br /&gt;
## T(n) = T(n-2) + 1/lg(n)&lt;br /&gt;
## T(n) = sqrt(n) * T(sqrt(n)) + n&lt;br /&gt;
&#039;&#039;&#039;Анализ и построение алгоритмов&#039;&#039;&#039;&lt;br /&gt;
# Числа Фибоначчи F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; можно выразить через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, используя матрицу: https://yadi.sk/i/Pm_aNzHCforFU. &lt;br /&gt;
## Покажите как вычислить F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;.&lt;br /&gt;
## Как вычислить F&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;n+1&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;?&lt;br /&gt;
## Напишите алгоритм.&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
## Ускорьте его так, чтобы он работал за O(log n).&lt;br /&gt;
# Дана последовательность символов. Какое минимальное количество символов нужно удалить из неё, чтобы получить палиндром?&lt;br /&gt;
## Напишите алгоритм (на псевдокоде или на любом языке программирования).&lt;br /&gt;
## Оцените время работы алгоритма.&lt;br /&gt;
# Какую структуру данных вы бы использовали для реализации упорядоченного множества (http://neerc.ifmo.ru/wiki/index.php?title=Упорядоченное_множество)? Какая будет сложность каждой из операций над множеством?&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 16 (до 20.04)===&lt;br /&gt;
# Решите 6 задач из первой части и 6 из второй. (Укажите какие именно.) Каждый из подпунктов является отдельной задачей.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм и теорема Форда-Фалкерсона (16.04)==&lt;br /&gt;
# Базовые определения (пропускные способности, сток, исток и пр.). Пример. &lt;br /&gt;
# Ограничения на поток (сохранение и что меньше пропускных способностей).&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, пример работы&lt;br /&gt;
# Разрез, определение, пример.&lt;br /&gt;
# Утверждение: максимальный поток &amp;lt;= любого разреза.&lt;br /&gt;
# Теорема Форда-Фалкерсона (с доказательством).&lt;br /&gt;
# Пример на котором алгоритм Форда-Фалкерсонаработает работает очень долго при неудачном выборе путей.&lt;br /&gt;
# Сложность алгоритма Форда-Фалкерсона.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №3==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
В [https://official.contest.yandex.ru/contest/1196 домашнем задании] пять задач. Они разделены на два варианта, помеченные римскими цифрами I и II. Свой вариант нужно узнать [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing здесь на вкладке HW3]. Третья задача — общая для двух вариантов; ее решение необходимо снабдить доказательством корректности алгоритма. На выполнение задания дается примерно 2 недели (см. точное время окончания в контесте). Каждую задачу можно написать на С++ или Python.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Форда-Фалкерсона и Эдмондса-Карпа (20.04)==&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, напоминание: базовые определения, пример работы, пример на котором алгоритм работает долго, сложность.&lt;br /&gt;
# Алгоритм Эдмодса-Карпа. Доказательство асимптотики времени работы.&lt;br /&gt;
&lt;br /&gt;
==(23.04)==&lt;br /&gt;
&lt;br /&gt;
==(11.05) Красно-чёрные деревья==&lt;br /&gt;
[https://ru.wikipedia.org/wiki/Красно-чёрное_дерево Красно-чёрное дерево]&lt;br /&gt;
===Домашнее задание 17 (до 18.05)===&lt;br /&gt;
# Зачем нужны красно-чёрные деревья?&lt;br /&gt;
# Благодаря какому свойству и почему красно-чёрное дерево является сбалансированным?&lt;br /&gt;
# Нарисуйте полное бинарное дерево поиска высотой 3 с ключами {1, 2, ..., 15}. Сделайте из него красно-чёрные деревья высотой 2, 3 и 4.&lt;br /&gt;
# Нарисуйте красно-чёрные деревья, получающиеся последовательной вставкой элементов 12, 10, 29, 30, 31, 32 в [https://ru.wikipedia.org/wiki/Красно-чёрное_дерево#/media/File:Red-black_tree_example.svg данное дерево]. Для вставки используйте алгоритм вставки из Википедии. Укажите какой именно функцией вы воспользовались.&lt;br /&gt;
# Определим &#039;&#039;&#039;ослабленное красно-чёрное дерево&#039;&#039;&#039; как бинарное дерево поиска, которое удовлетворяет красно-чёрным свойствам 1, 3, 4 и 5. Другими словами, корень может быть как чёрным, так и красным. Рассмотрите ослабленное красно-чёрное дерево T, корень которого красный. Если перекрасить корень дерева T в чёрный, будет ли оно красно-чёрным деревом?&lt;br /&gt;
# Покажите, что самый длинный простой нисходящий путь от вершины x к листу красно-черного дерева имеет длину, не более чем в два раза превышающую кратчайший путь от x к листу-потомку.&lt;br /&gt;
# Чему равно наибольшее возможное количество внутренних узлов в красно-чёрном дереве с чёрной высоты k? А наименьшее возможное количество?&lt;br /&gt;
# Нарисуйте красно-чёрные деревья, получающиеся последовательной вставкой ключей 41, 38, 31, 12, 19, 8 в изначально пустое дерево.&lt;br /&gt;
# Покажите какие деревья будут получаться в результате последовательного удаления ключей в порядке 8, 12, 19, 31, 38, 41.&lt;br /&gt;
&lt;br /&gt;
==(14.05) Конкурентный анализ самоорганизующихся циклов==&lt;br /&gt;
[https://vk.com/doc12518218_390369758 Лекция]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 18 (до 21.05)===&lt;br /&gt;
Все вычисления сопроводите подробными объяснениями о том, почему верно то или иное (не)равенство.&lt;br /&gt;
# Пусть имеется n-элементный список и m поисковых запросов к нему. После каждой операции поиска можно переупорядочить список. Обозначим стоимость последовательности поисков через C. Докажите, что в худшем случае C = Ω(mn).&lt;br /&gt;
#  Обозначим через c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; стоимость i-ого поискового запроса с применением эвристики перемещения в начало, которая включает стоимость поиска элемента в списке и стоимость его перемещения в начало списка путём ряда обменов соседних элементов списка. Покажите, что i-ая операция поиска находит элемент x в списке L с применением эвристики перемещения в начало, то c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = 2 * rank&amp;lt;sub&amp;gt;L&amp;lt;/sub&amp;gt;(x) - 1.&lt;br /&gt;
# Покажите, что c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = 2 * rank&amp;lt;sub&amp;gt;L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) - 1.&lt;br /&gt;
# Покажите, что c*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = rank&amp;lt;sub&amp;gt;L*&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) + t&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;.&lt;br /&gt;
# Докажите, что после одного обмена двух соседних элементов потенциал либо увеличивается на 2, либо уменьшается на 2.&lt;br /&gt;
# Докажите, что rank&amp;lt;sub&amp;gt;L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) = |A| + |B| + 1.&lt;br /&gt;
# Докажите, что rank&amp;lt;sub&amp;gt;L*&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) = |A| + |С| + 1.&lt;br /&gt;
# Покажите, что поиск i-ого элемента приводит к изменению потенциала Ф(L&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;) - Ф(L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;) &amp;lt;= 2 (|A| - |B| + t*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;), где t*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; --- это количество обменов при i-ом поиске.&lt;br /&gt;
# Во сколько раз стоимость С&amp;lt;sub&amp;gt;MFT&amp;lt;/sub&amp;gt;(S) превышает C&amp;lt;sub&amp;gt;OPT&amp;lt;/sub&amp;gt;(S)?&lt;br /&gt;
&lt;br /&gt;
== (18.05) Конечные автоматы ==&lt;br /&gt;
=== Задание 19 (до 25.05) ===&lt;br /&gt;
# Постройте автомат для языка над алфавитом Σ = {0, 1} каждое слово которого содержит хотя бы два нуля. Является ли он детерминированным?&lt;br /&gt;
# Постройте автомат над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5. Является ли он детерминированным?&lt;br /&gt;
# Постройте автомат, который допускает пустой язык (язык в котором нет ни одного слова).&lt;br /&gt;
# Постройте автомат, который допускает все слова над алфавитом Σ.&lt;br /&gt;
# Постройте ДКА над алфавитом Σ = {К, Ж, З}, который допускает слова в которых после К идёт З, после З --- Ж, после Ж --- К.&lt;br /&gt;
# * Постройте ДКА над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5, а число нулей на 3.&lt;br /&gt;
# Постройте НКА для языка над алфавитом Σ = {0, 1, 2, 3}, состоящий из слов, в которых хотя бы одна из последних пяти букв является 1.&lt;br /&gt;
# Постройте НКА над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5, а число нулей на 3.&lt;br /&gt;
# Какие языки допускают автоматы https://yadi.sk/d/fNAHbjCZghERG?&lt;br /&gt;
# Для каждого из автоматов https://yadi.sk/d/fNAHbjCZghERG постройте соответствующий ему ДКА.&lt;br /&gt;
&lt;br /&gt;
== (21.05) Регулярные выражения, КА, их эквивалентность. Лемма о накачке  ==&lt;br /&gt;
=== Задание 20 (до 28.05) ===&lt;br /&gt;
&#039;&#039;&#039;I Написать регулярные выражения&#039;&#039;&#039;&lt;br /&gt;
# Напишите регулярное выражение для языка над алфавитом Σ = {0, 1} каждое слово которого содержит хотя бы два нуля.&lt;br /&gt;
# Напишите регулярное выражение над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5.&lt;br /&gt;
# Напишите регулярное выражение, которое допускает пустой язык (язык в котором нет ни одного слова).&lt;br /&gt;
# Напишите регулярное выражение, которое допускает все слова над алфавитом Σ.&lt;br /&gt;
# Напишите регулярное выражение для языка над алфавитом Σ = {0, 1, 2, 3}, состоящий из слов, в которых хотя бы одна из последних пяти букв является 1.&lt;br /&gt;
&#039;&#039;&#039;II КА и регулярные выражения&#039;&#039;&#039;&lt;br /&gt;
# Постройте конечный автомат для языка (111 U 01)&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;1(00 U 11)&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;.&lt;br /&gt;
# Постройте конечный автомат для языка (ab)&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;(a U b)(b U a)&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;(a U bab).&lt;br /&gt;
&#039;&#039;&#039;III Доказать замкнутость относительно различных операций&#039;&#039;&#039;&lt;br /&gt;
# Покажите, что если для языков L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; и L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; существует КА, который их читает, то существует КА и для их объединения L = {w | w ∈ L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; или w ∈ L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;}.&lt;br /&gt;
# Покажите, что если для языка L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; и L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; существует КА, который их читает, то существует КА и для языка L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; = {xy | x ∈ L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, y ∈ L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;}.&lt;br /&gt;
# Покажите, что если для языка L существует КА, который его читает, то существует КА и для &#039;&#039;&#039;замыкания Клини&#039;&#039;&#039; L* = {w&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; w&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; ... w&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;| w&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; ∈ L, w&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; ∈ L, ..., w&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; ∈ L}.&lt;br /&gt;
# Покажите, что если язык L регулярен, то регулярно его дополнение (т.е. язык над тем же алфавитом, которому принадлежит слово тогда и только тогда, когда оно НЕ принадлежит L) .&lt;br /&gt;
# Покажите, что если язык L регулярен, то регулярно его обращение L&amp;lt;sub&amp;gt;R&amp;lt;/sub&amp;gt; = {a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; . . . a&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; | a&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; . . . a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; ∈ L}. (L&amp;lt;sub&amp;gt;R&amp;lt;/sub&amp;gt; --- это язык в котором все слова языка L записаны наоборот.)&lt;br /&gt;
# * Покажите, что если языки L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; и L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; регулярны, то регулярно их пересечение.&lt;br /&gt;
&#039;&#039;&#039;IV Использование леммы о накачке&#039;&#039;&#039; (см. [https://vk.com/doc12518218_392750846 конспект])&lt;br /&gt;
# Докажите, что не существует КА, который бы читал язык {0&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;1&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;2&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;}. (Пояснение: запись 0&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; означает строку из n нулей: 00...0.)&lt;br /&gt;
# Докажите, что не существует КА, который бы читал язык {0&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;1&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;}.&lt;br /&gt;
# Докажите, что не существует КА, который бы читал язык {0&amp;lt;sup&amp;gt;n!&amp;lt;/sup&amp;gt;}.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== (25.05) Автоматный подход ==&lt;br /&gt;
=== Задание 21 (до 01.06) ===&lt;br /&gt;
Реализуйте один из следующих проектов:&lt;br /&gt;
# Программа, которая считывает строку и говорит принадлежит ли она языку 0(123)*(00 U (231)*) U 111.&lt;br /&gt;
# Программа, которая считывает КА и генерирует программу на языке С++, которая говорит принадлежит ли заданное слово языку, описываемому этим КА.&lt;br /&gt;
# Программа, которая считывает регулярное выражение и строку и говорит принадлежит ли слово языку, описываемому этим регулярным выражением.&lt;br /&gt;
# Программа, которая моделирует работу банкомата, автомата с газировкой, лифта... (что-то одно на выбор)&lt;br /&gt;
# Текстовый симулятор студента. Возможные состояния: на паре, дома, есть приглашение прогулять, завтра коллоквиум, сплю и др. Есть два параметра: успеваемость и весёлось. Если хотя бы один из них упадёт ниже критической отметки, студент умрёт. Игрок принимает решение куда идти студенту. Цель: продержаться как можно дольше.&lt;br /&gt;
&lt;br /&gt;
== Большое домашнее задание 4 ==&lt;br /&gt;
[https://official.contest.yandex.ru/contest/1259 Контест]. В домашнем задании четыре задачи. Обязательны первые три. Вместо одной из первых трёх можно сделать последнюю (только для первых 10 решивших 4-ую!). На выполнение задания даётся примерно 2 недели (см. точное время окончания в контесте). Условия ревью определяют семинаристы.&lt;br /&gt;
&lt;br /&gt;
== (01.06) P vs NP ==&lt;br /&gt;
&#039;&#039;&#039;План занятия&#039;&#039;&#039;&lt;br /&gt;
# Напоминание: P; NP; проблема P ?= NP; NPC; сведения; пример сведений.&lt;br /&gt;
&lt;br /&gt;
=== Задание 22 (до 8.06) ===&lt;br /&gt;
1. &#039;&#039;Задачи поиска&#039;&#039; и &#039;&#039;задачи оптимизации&#039;&#039;. Для задачи коммивояжёра варианты с поиском и оптимизацией выглядят так:&lt;br /&gt;
Задача поиска:&lt;br /&gt;
&#039;&#039;Вход:&#039;&#039; матрица расстояний, бюджет b&lt;br /&gt;
&#039;&#039;Выход:&#039;&#039; цикл веса не более b, проходящий по всем вершинам графа, если такой есть.&lt;br /&gt;
&lt;br /&gt;
Оптимизационная задача:&lt;br /&gt;
&#039;&#039;Вход:&#039;&#039; матрица расстояний&lt;br /&gt;
&#039;&#039;Выход:&#039;&#039; цикл минимального веса, проходящий по всем вершинам графа, если такой есть.&lt;br /&gt;
&lt;br /&gt;
Покажите, что если поисковую задачу коммивояжёра можно решить за полиномиальное время, то и оптимизационный вариант можно решить за полиномиальное время.&lt;br /&gt;
&lt;br /&gt;
2. &#039;&#039;Задача поиска&#039;&#039; и &#039;&#039;задача разрешения&#039;&#039;. Пусть имеется программа, которая за полиномиальное время отвечает на вопрос , содержит л входной граф гамильтонов цикл. Как с её помощью найти за полиномиальное время сам цикл (есть он есть)?&lt;br /&gt;
&lt;br /&gt;
3.&lt;/div&gt;</summary>
		<author><name>Kassalanche</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=16693</id>
		<title>Алгоритмы и структуры данных. Подгруппа 105-1</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=16693"/>
		<updated>2015-06-01T05:18:56Z</updated>

		<summary type="html">&lt;p&gt;Kassalanche: /* Большое домашнее задание 4 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==О курсе==&lt;br /&gt;
[[Алгоритмы_и_структуры_данных|План лекций и список рекомендуемой литературы.]]&lt;br /&gt;
&lt;br /&gt;
[[Алгоритмы_и_структуры_данных._Подгруппа_105-1._FAQ|FAQ.]]&lt;br /&gt;
&lt;br /&gt;
[[Reviewboard|Инструкция по использованию Reviewboard.]]&lt;br /&gt;
&lt;br /&gt;
[[Практические_занятия_по_курсу_ОиМП/C++_check|Style guide.]]&lt;br /&gt;
&lt;br /&gt;
==Итоговая оценка за курс==&lt;br /&gt;
Итоговая оценка (ИО) зависит от&lt;br /&gt;
* оценок за пять больших домашних заданий (БДЗ1, БДЗ2, ..., БДЗ5),&lt;br /&gt;
* оценок за домашние задания (ДЗ1, ДЗ2, ...),&lt;br /&gt;
* оценки за контрольную работу (КР),&lt;br /&gt;
* оценки за экзамен (ЭКЗ),&lt;br /&gt;
и может быть вычислена по формуле:&lt;br /&gt;
 ИО = 0.7 * (0.3 * КР + 0.7 *(ИДЗ1 + ИДЗ2 + ИДЗ3 + ИДЗ4 + ИДЗ5)/5) + 0.3 * ЭКЗ =&lt;br /&gt;
    = 0.21*КР + 0.098*ИДЗ1 + 0.098*ИДЗ2 + 0.098*ИДЗ3 + 0.098*ИДЗ4 + 0.098*ИДЗ5 + 0.3*ЭКЗ,&lt;br /&gt;
где&lt;br /&gt;
 ИДЗi = min (10, 0.7 * БДЗi + 0.4 * &amp;lt;cредняя оценка за ДЗj, прошедшие с предыдущего БДЗ по i-ое&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
==Порядок сдачи домашних работ==&lt;br /&gt;
===Большие домашние работы===&lt;br /&gt;
# Получить OK за задачу в контесте.&lt;br /&gt;
# Залить исходный код на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* На каждую задачу создавайте отдельный запрос на ревью. &lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении суток приходят замечания к коду. &#039;&#039;&#039;Если в течении суток замечаний или Ship It не появилось, проверьте, что вы правильно отправили запрос и, если всё сделано правильно, спросите у семинариста получил ли он запрос.&#039;&#039;&#039;&lt;br /&gt;
# Вы их исправляете, проверяете в контесте, что программа по-прежнему проходит все тесты, заливаете новую версию в Review Board. Штрафов за посылки НЕ будет.&lt;br /&gt;
# Процесс повторяется пока остаются замечания к коду или пока не истёк дедлайн. После закрытия контеста будут ещё одни сутки на доработку замечаний в Review Board.&lt;br /&gt;
# Оценивается только последняя версия работы в Review Board.&lt;br /&gt;
&lt;br /&gt;
===Маленькие домашние работы===&lt;br /&gt;
# Залить решение на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* Желаемые форматы: txt, py, cpp, h. Допускаются любые другие.&lt;br /&gt;
#* На каждую домашнюю работу создавайте отдельный запрос на ревью. Обязательно указывайте номер домашней работы.&lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении неопределенного промежутка времени придут оценки по каждому из заданий.&lt;br /&gt;
&lt;br /&gt;
==Оценивание домашних работ==&lt;br /&gt;
* Все задания предполагаются индивидуальными. Запрещены любые заимствования без ссылки на автора.&lt;br /&gt;
* Решения после установленного дедлайна не принимаются. Дедлайн указан в заголовке каждого задания.&lt;br /&gt;
* Везде, где требуется написать алгоритм, можно использовать любой язык программирования или псевдокод.&lt;br /&gt;
* Там, где требуется построить алгоритм с заданной асимптотикой, приведите обоснование, что полученный алгоритм удовлетворяет этому условию.&lt;br /&gt;
* Эти правила не действуют, если в задании явно оговорено иное.&lt;br /&gt;
&lt;br /&gt;
==Мотивация к изучению алгоритмов. Подсчёт числа операций (12.01)==&lt;br /&gt;
# Числа Фибоначчи. Определение. Примитивный рекурсивный алгоритм вычисления i-ого числа. Оценка числа операций. Анализ причин неэффективности. Алгоритм с запоминанием вычисленных ранее значений. Оценка числа операций. Сравнение с предыдущим. (подробнее: глава 0, страницы 8-10 из книги &amp;lt;&amp;lt;Алгоритмы&amp;gt;&amp;gt;, [[Алгоритмы_и_структуры_данных|см. список рекомендованной литературы]])&lt;br /&gt;
# Задача о ханойской башне. Постановка задачи. Рекурсивный алгоритм. Рекуррентная формула для числа перемещений. Замкнутая формула для числа перемещений (+ доказательство). Доказательство того, что эту задачу нельзя решить используя меньшее число перемещений дисков. ([https://www.dropbox.com/s/t8cbs7ttu4iasvj/algo-0-recursion.pdf?dl=0 Разбор задачи о ханойской башне], автор Сергей Объедков)&lt;br /&gt;
# Сортировка пузырьком. Алгоритм. Подсчёт количество операций сравнения и обмена (swap). Анализ наилучшего и наихудшего случаев ([https://ru.wikipedia.org/wiki/Сортировка_пузырьком Википедия])&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 1 (12.01 - 26.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
Во всех задачах, если не оговорено иного, предполагаем, что работаем с целыми неотрицательными числами. Для первых 7 задач необходимо&lt;br /&gt;
* описать что можно считать наилучшим и наихудшим случаями,&lt;br /&gt;
* для каждого из двух случаев подсчитать отдельно количество операций сравнения и swap (если есть).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Даны три числа, требуется вернуть наименьшее.&lt;br /&gt;
# Даны три числа, требуется отсортировать их.&lt;br /&gt;
# Дана последовательность A из n элементов и число x, требуется найти элемент равный x. Примечание: если таких значений i несколько, вернуть любое; если такого элемента нет, функция должна сообщить об этом.&lt;br /&gt;
# * Дана упорядоченная последовательность A из n элементов и число x, требуется найти такое i, что A[i] равно x. Алгоритм должен быть эффективней, чем в предыдущем пункте и использовать то, что последовательность упорядочена.&lt;br /&gt;
# Дана последовательность из 100 000 чисел от 0 до 100. Напишите эффективный алгоритм сортировки, который бы учитывал специфику входных данных.&lt;br /&gt;
# * Дано 32 битное неотрицательное число. Требуется номер первого ненулевого бит. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения, считая, что числа распределены равномерно.&lt;br /&gt;
# * Даны 32 битные неотрицательные числа m и n. Требуется вывести True, если m &amp;lt; n, иначе False. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения битов, считая, что числа распределены равномерно.&lt;br /&gt;
# Напишите рекурсивную функцию, вычисляющую n-ое число Фибоначчи (как на занятии). Подсчитайте количество рекурсивных вызовов.&lt;br /&gt;
# * Напишите функцию, вычисляющую n-ое число Фибоначчи, у которой число операций — полином от n, и которая использует количество памяти, независящее от n.&lt;br /&gt;
&lt;br /&gt;
==O-символика и стратегия &amp;quot;разделяй и властвуй&amp;quot; (15.01)==&lt;br /&gt;
# Сортировка слиянием. Алгоритм, рекуррентное соотношение для времени сортировки, сложность. Подробнее: [https://dl.dropboxusercontent.com/u/829163/draft.pdf §2.3 Сортировка слиянием (стр. 54)].&lt;br /&gt;
# О-символика. [https://dl.dropboxusercontent.com/u/829163/draft.pdf §0.3 О-символика (стр. 10)].&lt;br /&gt;
# Задача о слиянии m упорядоченных массивов по n элементов. Три алгоритма решения: последовательное слияние, слияние &amp;quot;деревом&amp;quot; (обе функции используют Merge из MergeSort), аналог Merge для m массивов. Анализ сложности каждого из них.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 2 (15.01-29.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
* Во всех задачах, если не оговорено иного, для простоты &#039;&#039;можно&#039;&#039; считать, что n является степенью какого-либо числа, например, степенью двойки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Дана функция F, определённая ниже. Сколько строк она напечатает? Указание: для обоих подпунктов рассмотрите два случая: 1. n является степенью двойки, 2. n не является степенью двойки.&lt;br /&gt;
## Запишите рекуррентное соотношение для числа строк.&lt;br /&gt;
## Решите уравнение, полученное в предыдущем пункте, то есть, выведите замкнутую (нерекуррентную формулу). Для простоты можно считать, что n является степенью двойки.&lt;br /&gt;
# В массиве A размера n записана возрастающая последовательность целых чисел. Постройте алгоритм типа &amp;quot;разделяй и властвуй&amp;quot;, который проверяет, существует ли такой индекс i, что A[i] = i&lt;br /&gt;
## за время O(n),&lt;br /&gt;
## * за время O(log n).&lt;br /&gt;
## Какие случаи для вашего алгоритма являются наихудшими и наилучшими? Какого время работы в лучшем и худшем случаях?&lt;br /&gt;
# Дан бесконечный массив A, первые n элементов которого содержат возрастающую последовательность положительных чисел, а дальше стоят -1. Значение n не дано. Постройте алгоритм, который получает на вход целое число x и находит это x в массиве --- или говорит, что там его нет, &lt;br /&gt;
## за время O(n),&lt;br /&gt;
## за время O(log n).&lt;br /&gt;
# Рассмотрим алгоритм вычисления наибольшего общего делителя (НОД) двух положительных чисел, основанный на методе &amp;quot;разделяй и властвуй&amp;quot;.&lt;br /&gt;
## (задание не оценивается) Прочитайте [https://dl.dropboxusercontent.com/u/829163/draft.pdf §1.2.3 Алгоритм Евклида (стр. 23)].&lt;br /&gt;
## * Докажите, что определение НОД-а, приведённое ниже, корректно.&lt;br /&gt;
## Постройте алгоритм, основанный на этом определении.&lt;br /&gt;
## Какой алгоритм будет быстрее для n-битовых чисел a и b при больших значениях n --- ваш или алгоритм Евклида?&lt;br /&gt;
# * Покажите как за время O(n log n) удалить из массива размера n все дубликаты, то есть оставить каждый элемент в одном экземпляре.&lt;br /&gt;
# * Даны два упорядоченных массива размера m и n. Постройте алгоритм, находящий k-й по величине элемент в объединении этих массивов за время O(log(n+m)). &lt;br /&gt;
&lt;br /&gt;
Функция F(n).&lt;br /&gt;
  если n &amp;gt; 1:&lt;br /&gt;
    напечатать &amp;quot;всё ещё работаю&amp;quot;&lt;br /&gt;
    F(n/2)&lt;br /&gt;
    F(n/2)&lt;br /&gt;
&lt;br /&gt;
Определение НОД-а.&lt;br /&gt;
             2НОД(a/2, b/2), если а и b чётны,&lt;br /&gt;
  НОД(a,b) = НОД(a, b/2), если а нечётно, b чётно,&lt;br /&gt;
             НОД((a-b)/2, b), если а и b нечётны.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;lt;nowiki&amp;gt;Задачи взяты из книги &amp;quot;Алгоритмы&amp;quot;, глава 2 (см. список рекомендованной литературы).&amp;lt;/nowiki&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Сложение и умножение (19.01)==&lt;br /&gt;
# Алгоритм сложения, его сложность (§1.1.1 Сложение*)&lt;br /&gt;
# &amp;quot;Школьный&amp;quot; алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Рекурсивный алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Алгоритм умножения, реализующий стратегию &amp;quot;разделяй и властвуй&amp;quot;, анализ сложности (§2.1 Умножение чисел*)&lt;br /&gt;
 * [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать.]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 3 (19.01 - 2.02)===&lt;br /&gt;
* Во всех задачах для простоты можно считать, что n является степенью какого-либо числа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Найдите произведение чисел 10011011 и 10111010 (в двоичной системе счисления), используя алгоритм умножения чисел, основанный на методе «разделяй и властвуй». Необходимо не только дать ответ, но и привести ход решения.&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 3 рекурсивных вызова для подзадач размера n-1 и комбинирует из них решение исходной задачи за О(n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте три верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 10 рекурсивных вызовов для подзадач размера n/2 и комбинирует из них решение исходной задачи за О(5n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте два верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Докажите, что 3m² + m = O(m²).&lt;br /&gt;
# Докажите, что lg m = O(m/1000), где lg m — это логарифм с двоичным основанием.&lt;br /&gt;
# Докажите, что из равенства f(n) = O(g(n)) не следует, что g(n) = O(f(n)).&lt;br /&gt;
# Докажите, что O(m) содержится в O(m²).&lt;br /&gt;
&lt;br /&gt;
==Решение рекуррентных уравнений (22.01)==&lt;br /&gt;
# Примеры решений рекуррентных уравнений (см. [https://www.dropbox.com/s/6a0r410zjm9qwe7/algo-3-recurrences.pdf?dl=0 конспект]).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 4 (до 14.02)===&lt;br /&gt;
* Нельзя использовать утверждение основной теоремы о решении рекуррентных соотношений.&lt;br /&gt;
* &#039;&#039;Можно&#039;&#039; использовать метод построения дерева рекурсии или подстановку (метод с угадыванием ответа).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Какой из трёх приведённых ниже алгоритмов вы бы предпочли? Обоснуйте свой ответ.&lt;br /&gt;
#* Алгоритм A, решая задачу, производит пять рекурсивных вызовов для подзадач вдвое меньшего размера, после чего строит ответ для исходной задачи за линейное время.&lt;br /&gt;
#* Алгоритм B, решая задачу размера n, делает два рекурсивных вызова для задач размера n − 1, после чего находит ответ за время O(1).&lt;br /&gt;
#* Алгоритм C, решая задачу размера n, рекурсивно решает девять задач размера n/3 и строит ответ за время O(n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Найдите T(n) в замкнутой форме для любых 7 из 10 приведённых ниже рекуррентных соотношений:&lt;br /&gt;
## T(n) ≤ 2T(n/3) + 1;&lt;br /&gt;
## T(n) ≤ 7T(n/7) + n;&lt;br /&gt;
## T(n) ≤ 9T(n/3) + n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 8T(n/2) + n&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 49T(n/25) + n&amp;lt;sup&amp;gt;3/2&amp;lt;/sup&amp;gt;log n;&lt;br /&gt;
## T(n) ≤ T(n − 1) + 2;&lt;br /&gt;
## T(n) ≤ T(n − 1) + n&amp;lt;sup&amp;gt;c&amp;lt;/sup&amp;gt;, где c ≥ 1 –– константа;&lt;br /&gt;
## T(n) ≤ T(n − 1) + c&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;, где c &amp;gt; 1 –– константа;&lt;br /&gt;
## T(n) ≤ 2T(n − 1) + 1;&lt;br /&gt;
## T(n) ≤ T(sqrt(n)) + 1.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №1==&lt;br /&gt;
Необходимо реализовать все 6 задач из [https://official.contest.yandex.ru/contest/1002 контеста]. Каждую задачу можно писать на С++ или Python. На выполнение работы отводится две недели. Каждая задача оценивается в 10/6 балла. Оценка &#039;&#039;может&#039;&#039; быть снижена за плохой код, но не более чем на 25%.&lt;br /&gt;
&lt;br /&gt;
==Бинарное дерево поиска (26.01)==&lt;br /&gt;
# Определение. Пример.&lt;br /&gt;
# Не модифицирующие алгоритмы: поиск (рекурсивный и итеративный алгоритмы), поиск минимума, inordered обход (вывод значений узлов в отсортированном порядке), поиск следующего по возрастанию.&lt;br /&gt;
# Модифицирующие алгоритмы: вставка (рекурсивная реализация), удаление (только идея).&lt;br /&gt;
 [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 13, стр. 248]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 5 (до 16.02)===&lt;br /&gt;
* Для получения максимальной оценки можно выполнить или все задачи без звёздочки, или задачу со звёздочкой. Преподаватель понимает, что реализацию БДП сложно не найти в интернете, но от копипасты не будет никакой пользы. Напротив, самостоятельная реализация очень полезна и приветствуется, даже если не получится выполнить всех пунктов задания.&lt;br /&gt;
* Задачи с двумя звёздочками необязательны.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Нарисуйте бинарные деревья поиска высотой 2, 3, 4, 5 и 6 для множества ключей {1, 4, 5, 10, 16, 17, 21}. Корень дерева имеет высоту 0.&lt;br /&gt;
# &#039;&#039;&#039;Сортировка с использованием БДП.&#039;&#039;&#039;&lt;br /&gt;
## Какова асимптотическая сложность алгоритма вставки элемента в дерево высоты d? Почему? Назовите наилучший и наиухдший случаи.&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который строит БДП в узлах которого стоят элементы данной последовательности. Можно использовать функцию Insert. Назовите наилучший и наихудший случаи. Есть теорема о том, что полученный алгоритм будет работать в среднем случае за время O(n * log n).&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который выводит их в порядке возрастания. Используйте бинарное дерево поиска. Какова в среднем случае сложность этого алгоритма? Назовите наилучший и наихудший случаи. Какова сложность в наихудшем случае?&lt;br /&gt;
# Напишите функцию GetRoot, которой на вход подаётся указатель на произвольный узел дерева, а она возвращает указатель на корень.&lt;br /&gt;
# Напишите процедуру PrintLeafs, которой на вход подаётся указатель на корень дерева, и она печатает листья дерева&lt;br /&gt;
## по возрастанию,&lt;br /&gt;
## по убыванию.&lt;br /&gt;
# ** Альтернативный обход в порядке возрастания бинарного дерева поиска с n узлами (или центрированный (inordered) обход) можно осуществить путём поиска минимального элемента дерева с помощью функции Minimum с последующий n-1 вызовом функции Next. Каково время работы такого алгоритма?&lt;br /&gt;
# * Реализуйте на С++ структуру данных бинарное дерево поиска, [https://yadi.sk/i/gi2SEStreFfSb используя заготовку].&lt;br /&gt;
## Нарисуйте бинарное дерево поиска, которое строится в функции getTreeExample.&lt;br /&gt;
## Реализуйте следующие алгоритмы: &lt;br /&gt;
### поиск минимума, &lt;br /&gt;
### inordered обход (вывод значений узлов в отсортированном порядке),&lt;br /&gt;
### поиск следующего по возрастанию,&lt;br /&gt;
### вставка элемента в дерево,&lt;br /&gt;
### сортировка последовательности с использованием БДП (дан вектор чисел, необходимо вывести их по возрастанию),&lt;br /&gt;
### ** удаление.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Карацубы, Штрассена. Быстрая сортировка (29.01)==&lt;br /&gt;
# Алгоритм Карацубы.&lt;br /&gt;
# Алгоритм Штрассена. [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать Дасгупту и др., §2.5 Умножение матриц]&lt;br /&gt;
# Быстрая сортировка и доказательство того, что в среднем случае она работает за О(n * log n). [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 8 Быстрая сортировка, стр. 148]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 6 (до 18.02)===&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Пусть мы хотим найти двоичное представление десятичного числа 10&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;. Будем считать, что n --- степень двойки (n = 2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt;).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Pwr2Bin(n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть 1010&lt;br /&gt;
    z = ...&lt;br /&gt;
    вернуть Multiply(z, z)&amp;lt;/source&amp;gt;&lt;br /&gt;
Multiply --- функция, перемножающая два n-битовых двоичных числа x и y по алгоритму Карацубы за O(n&amp;lt;sup&amp;gt;log&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;3&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Пусть мы хотим перевести произвольное десятичное число x в записи которого n=2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; чисел в двоичную систему счисления.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Dec2Bin(x, n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть binary[x]&lt;br /&gt;
    разделить x на два десятичных числа xl и xr из n/2 цифр.&lt;br /&gt;
    вернуть ...&amp;lt;/source&amp;gt;&lt;br /&gt;
Здесь binary --- это массив, содержащий двоичное представление десятичных цифр.&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Докажите, что математическое ожидание времени работы алгоритма быстрой сортировки (усреднение по всем вариантам выбора опорного элемента) на любом входе размера n удовлетворяет соотношению: T(n) ≤ O(n) + 1/n * &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt; (T(i-1) + T(n-i)).&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Найдите решение соотношения из предыдущего пункта.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Динамическое программирование (ДП). Первые примеры (02.01)==&lt;br /&gt;
# Нахождение самой длинной возрастающей подпоследовательности.&lt;br /&gt;
# Нахождение редакционного расстояния (или редакционной стоимости, расстояния Левенштейна).&lt;br /&gt;
# Нахождение представителя большинства.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 7 (до 20.02)===&lt;br /&gt;
* В этом задании везде, где требуется реализовать алгоритм, необходимо привести код на любом языке программирования.&lt;br /&gt;
* Для получения максимальной оценки нужно решить все задачи без звёздочек. Одна решённая задача со звёздочкой заменяет одну задачу без звёздочки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения редакционного расстояния (алгоритм Вагнера — Фишера). Например, редакционное расстояние между словами &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равно 6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения длины наибольшей общей подстроки. Например, длина наибольшей общей подстроки &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равна 8 (&amp;quot;antholog&amp;quot;). Чем больше это значение, тем схожей строки.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Предположим теперь, что сравниваемые строки состоят из символов A, С, G и T; за удаление или вставку мы платим -5; за замену буквы x на y платим w[x, y], где x, y принадлежат множеству {A, С, G, T}, a w — это матрица весов:&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
!-!! A!! G!! C!! T&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! A&lt;br /&gt;
|10||-1||-3||-4&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
!G&lt;br /&gt;
||-1||7||-5||-3&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! C&lt;br /&gt;
||-3||-5||9||0&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! T&lt;br /&gt;
||-4||-3||0||8&lt;br /&gt;
|}&lt;br /&gt;
Тогда выравнивание:&lt;br /&gt;
 AGACTAGTTAC&lt;br /&gt;
 CGA‒‒‒GACGT&lt;br /&gt;
будет иметь следующую оценку:&lt;br /&gt;
 w[A,C] + w[G,G] + w[A,A] + 3*(-5) + w[G,G] + w[T,A] + w[T,C] + w[A,G] + w[C,T] = -3 + 7 + 10 - 3*5 + 7 + (-4) + 0 + (-1) + 0 = 1.&lt;br /&gt;
&lt;br /&gt;
Напишите алгоритм, который находит максимальную стоимость всех возможных выравниваний. Верно ли, что чем больше это значение, тем непохожей строки?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как давно один народ отделился от другого? Кто похожей — итальянец и китаец или якут и эфиоп? На эти вопросы можно отвечать с разных точек зрения — культурной, исторической, лингвистической, ... В последние же годы человечество научилось секвенировать геном, что позволило исследовать этот вопрос с точки зрения генетики. Секвенирование генома — это процесс записи ДНК в виде нуклеотидной последовательности, которая представляет собой последовательность из четырёх символов — A, С, G и T. Существуют базы, которые хранят генетическую информацию о людях из разных стран и континентов, например, [http://www.mtdb.igp.uu.se/ http://www.mtdb.igp.uu.se/ → Download mtDNA sequences]. Чем больше сходство между геномами, тем сильнее родственные связи между их обладателями. Используя решение предыдущего пункта, выполните задания:&lt;br /&gt;
# Определите, кто похожей — итальянец и китаец или якут и эфиоп?&lt;br /&gt;
# Найдите нескольких похожих и нескольких непохожих народностей.&lt;br /&gt;
# * Выберите одну народность. Найдите самых похожих и самых непохожих на неё.&lt;br /&gt;
# * Найдите самые похожие и самые непохожие народности.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Задача о разрезании стержня (05.01)==&lt;br /&gt;
# Постановка задачи.&lt;br /&gt;
# Решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Решение с нахождением максимума по p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Восходящий алгоритм с запоминанием. Вывод длин кусочков стержня. Оценка сложности.&lt;br /&gt;
# Нисходящий алгоритм с запоминанием. Оценка сложности.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.1 Разрезание стержня, стр. 393]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 8 (до 22.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Решая задачу о разрезании стержня мы вначале построили рекурсивное решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt; для всех 1 ≤ i &amp;lt; n. Его сложность описывалась рекуррентной формулой T(n) = n + &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n-1&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt;(T(i) + T(n-i)), T(1) = 1.&lt;br /&gt;
# Объясните эту формулу.&lt;br /&gt;
# Покажите с помощью метода подстановок, что T(n) ≤ 2&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Покажите с помощью контрпримера, что описанная далее жадная стратегия не всегда определяет оптимальный способ разрезания стержня. Определим плотность стержня длиной i как p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;/i, то есть как стоимость единицы его длины. Жадная стратегия для стержня длиной n отрезает от стержня первую часть длиной i, где 1 ≤ i ≤ n, имеющую максимальную плотность. Затем та же жадная стратегия применяется к оставшейся части длиной n-i.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Рассмотрим модификацию задачи разрезания стержня, в которой в дополнение к цене p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; каждого стержня добавляется фиксированная цена разреза c. Теперь прибыль, связанная с решением, представляет собой сумму цен частей стержня минус стоимость разрезов. Разработайте алгоритм динамического программирования для этой модифицированной задачи.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Непрерывным участком называется группа подряд идущих элементов. Например, для последовательности&lt;br /&gt;
 5, 15, −30, 10, −5, 40, 10&lt;br /&gt;
элементы 15, −30, 10 образуют непрерывный участок, а 5, 15, 40 -- нет. Постройте линейный алгоритм для следующей задачи:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Вход: список чисел a1, a2, ... ‌, an.&lt;br /&gt;
Выход: непрерывный участок с максимальной суммой (сумма участка нулевой длины равна нулю).&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Для приведённого примера ответом будет 10, −5, 40, 10 с суммой 55. Какова сложность алгоритма? Почему?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Надо заплатить v рублей, имея купюры в x1, x2, ‌..., xn рублей (купюр каждого типа сколько угодно). Это не всегда возможно (скажем, купюрами в&lt;br /&gt;
10 и 25 рублей можно заплатить 45 рублей, но не 47 и не 15). Постройте основанный на методе динамического программирования алгоритм со временем работы O(nv), выясняющий, возможна ли уплата.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как решить предыдущую задачу, если каждая купюра имеется в единственном экземпляре? (Например, купюрами в 1, 5, 10, 20 рублей можно заплатить 16 = 1 + 5 + 10 и 31 = 1 + 10 + 20 рублей, но не 40 (не хватит денег). Время работы алгоритма по-прежнему O(nv).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Ещё один вариант той же задачи: купюр каждого типа сколько угодно, но всего разрешается использовать не более k купюр. (Например, если есть купюры в 5 и 10 рублей, а k = 6, то 55 разменять можно, а 65 –– нет).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Перемножение цепочки матриц. Оптимальное бинарное дерево поиска (начало) (09.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о перемножении цепочки матриц. Постановка задачи.Пример. Нисходящий алгоритм.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.2 Перемножение цепочки матриц, стр. 403]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 9 (до 24.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Найдите оптимальную расстановку скобок в произведении последовательности матриц, размерности которых равны 5×10, 10×3, 3×12, 12×5, 5×50, 50×6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Напишите восходящий алгоритм для поиска оптимальной расстановки скобок.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Расстановка пробелов. Оптимальное бинарное дерево поиска (середина) (12.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о расстановке пробелов. Постановка задачи. Решения для трёх случаев: 1. нужно вернуть можно ли разбить текст на слова; 2. вернуть разбивку на слова; 3. слова встречаются не равновероятно, вернуть наиболее вероятную разбивку на слова.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи. Вывод математического ожидания времени поиска.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Праздничное домашнее задание 10 (до 02.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[&amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;,&amp;quot;, &amp;quot;.&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;,&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;.&amp;quot;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Подсказка:&#039;&#039;&#039; разбейте текст на слова из списка и посмотрите на азбуку Морзе.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Способы представления графов в памяти (16.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Разбор ошибок в домашнем задании.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Графы. Способы представления графов в памяти (матрица смежности, список рёбер, список соседей (список смежностей), матрица инцидентности). Зависимость сложности алгоритмов от способа представления.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §22.1 Представление графов, стр. 626]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 11 (до 02.03)===&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача A.]&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача B.]&lt;br /&gt;
# Нарисуйте неориентированный граф с 5 вершинами и 8 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Нарисуйте ориентированный граф с 4 вершинами и 3 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Дан ориентированный граф. &#039;&#039;Исходящая степень вершины v&#039;&#039; --- это количество исходящих из неё рёбер, &#039;&#039;входящая степень v&#039;&#039; --- это количество рёбер входящих в  v. Имеется представление ориентированного графа с использование списка соседей. Как долго будут вычисляться исходящие степени всех вершин графа? А входящие степени?&lt;br /&gt;
# Дан граф G = (V, E). Какие из рассмотренных способов хранения графов используют меньше всего памяти для хранения G и почему? Указание: рассмотрите случаи |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;lt; |E| и |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;gt; |E|.&lt;br /&gt;
# Пусть C --- это матрица смежности графа G.&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
# Пусть B --- это матрица инцидентности ориентированного графа G. Как связаны элементы матрицы BB&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
&lt;br /&gt;
==Реализация поиска в глубину (19.02)==&lt;br /&gt;
# Реализация поиска в глубину и смежных задач.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 12 (до 5.03)===&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Выберите любой способ хранения графа. Реализуйте поиск в глубину.&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Напишите алгоритм, который возвращает данные о том, какие вершины лежат в одной компоненте связности.&lt;br /&gt;
# &#039;&#039;(любой ЯП или псевдокод)&#039;&#039; Напишите алгоритм проверки сильной связности ориентированного графа. Какова его сложность?&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №2==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
Необходимо реализовать 3 задачи из [https://official.contest.yandex.ru/contest/1085 контеста], см. [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing распределение задач]. Каждую задачу можно написать на С++ или Python. На выполнение работы отводится две недели (см. время окончания контеста). [https://official.contest.yandex.ru/contest/1123 Дорешивание.]&lt;br /&gt;
&lt;br /&gt;
==ДП и графы (26.02)==&lt;br /&gt;
==ДП и графы (02.03)==&lt;br /&gt;
==Жадные алгоритмы (12.03)==&lt;br /&gt;
===Домашнее задание 13 (до 23.03)===&lt;br /&gt;
# Вася хочет купить по одной акции каждой компании. Все акции стоят одинаково, но дорожают по-разному. Каждый месяц акция i-ой компании дорожает в r_i раз. В один месяц можно купить только одну акцию.&lt;br /&gt;
## Напишите алгоритм, который выводит оптимальную последовательность покупок (такую, что на покупку всех акций потратится меньше денег).&lt;br /&gt;
## Докажите корректность алгоритма, то есть докажите, что последовательность покупок, которую выводит ваш алгоритм, оптимальна.&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список, очередь (16.03)==&lt;br /&gt;
# Реализация линейного двусвязного списка (С++).&lt;br /&gt;
# Реализация очереди ограниченной длины на базе вектора (С++).&lt;br /&gt;
# Реализация очереди на базе списка (С++).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14 (до 23.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте (на С++) структуру данных Стек. У стека должно быть три операции:&lt;br /&gt;
* push --- положить элемент на вершину стека;&lt;br /&gt;
* pop --- удалить верхний элемент;&lt;br /&gt;
* front --- вернуть значение верхнего элемента.&lt;br /&gt;
Оцените время работы каждой функции.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список (19.03)==&lt;br /&gt;
===Домашнее задание 13* (до 30.03)===&lt;br /&gt;
#Для приведённой реализации класса List (https://yadi.sk/i/c5r_79WdfMyNS).&lt;br /&gt;
## Допишите print, push_back и push_front.&lt;br /&gt;
## В функции insert_after и delete_node вставьте необходимые проверки так, чтобы они работали для крайних случаев.&lt;br /&gt;
## Напишите main в котором&lt;br /&gt;
### создаётся объект класса List, &lt;br /&gt;
### заполняется элементами с помощью функций push_back, push_front и insert_after и&lt;br /&gt;
### удаляется i-ый элемент.&lt;br /&gt;
&lt;br /&gt;
==Повторение (30.03)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Для данных пар функций выясните их связь в терминах O-, o-, Ω-, ω-, Θ-обозначений. Поставьте галочку в клетке с Ω, если f(x) = Ω(g(x)) и прочерк, если равенства нет. [https://ru.wikipedia.org/wiki/«O»_большое_и_«o»_малое#.D0.94.D1.80.D1.83.D0.B3.D0.B8.D0.B5_.D0.BF.D0.BE.D0.B4.D0.BE.D0.B1.D0.BD.D1.8B.D0.B5_.D0.BE.D0.B1.D0.BE.D0.B7.D0.BD.D0.B0.D1.87.D0.B5.D0.BD.D0.B8.D1.8F Википедия]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! f(x)!! g(x)!! O!! o!! Ω!! ω!! Θ&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! 2^100&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n * log(n)&lt;br /&gt;
! 2^100 * n * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n&lt;br /&gt;
! 2^100 * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n!&lt;br /&gt;
! 2^(2015n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n*2^n&lt;br /&gt;
! 3^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 5^n&lt;br /&gt;
! 5^(n+1)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n + n^2 + n^3 + ... + n^1000&lt;br /&gt;
! 7^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм Quickselect нахождения k-ого элемента по возрастанию: http://en.wikipedia.org/wiki/Quickselect&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;На улице стоит ряд домов. В каждом из домов лежит сколько-то денег. Вор хочет обокрасть дома на переулке. Он не может обокрасть два соседних дома, потому что хозяин дома, который он обокрал, сразу предупредит соседей. Нужно найти, какую максимальную сумму вор может украсть с переулка. На вход программы подается массив неотрицательных целых чисел - количество долларов в доме с номером i. Соседние дома в массиве представлены соседними элементами. Например, пусть задан массив { 1, 4, 5 } - тогда вор максимум может украсть $6, обокрав дома 1 и 3. Пусть задан массив { 1, 7, 2 } - тогда вор максимум может украсть $7, обокрав дом 2.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Алфавит из всех маленьких латинских букв и пробела закодирован числами следующим способом:&lt;br /&gt;
  &#039;a&#039; -&amp;gt; 1&lt;br /&gt;
  &#039;b&#039; -&amp;gt; 2&lt;br /&gt;
  &#039;c&#039; -&amp;gt; 3&lt;br /&gt;
  ...&lt;br /&gt;
  &#039;z&#039; -&amp;gt; 26&lt;br /&gt;
  &#039; &#039; -&amp;gt; 27&lt;br /&gt;
На вход программы подается строка из цифр. Нужно посчитать, сколькими способами можно раскодировать эту строку.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Дан граф, заданный матрицей смежности. Вывести пары вершин между которыми нет пути.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Повторение (02.04) ==&lt;br /&gt;
Решали и разбирали первые 4 задачи из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14* (до 11.03)===&lt;br /&gt;
Решите любые две задачи (подпункты НЕ считаются отдельными задачами) с предыдущей пары (Повторение (30.03)).&lt;br /&gt;
&lt;br /&gt;
== Повторение (06.04) ==&lt;br /&gt;
Будем решать вторую половину задач из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 15 (до 16.04)===&lt;br /&gt;
# Приведите пример графа, который содержит отрицательные рёбра, не содержит циклов отрицательного веса и для которого алгоритм Дейкстры возвращает неверный результат.&lt;br /&gt;
# Используется ли в алгоритме Дейкстры то, что веса рёбер неотрицательны? Если &amp;quot;да&amp;quot;, то где именно?&lt;br /&gt;
# Пусть граф содержит рёбра с весами &amp;gt;= -100. Если прибавить к каждому ребру 101 и при помощи алгоритма Дейкстры найти кратчайшие пути. Будут ли эти пути кратчайшими в исходном графе? Почему?&lt;br /&gt;
&lt;br /&gt;
== Повторение (07.04) ==&lt;br /&gt;
&#039;&#039;&#039;Решение рекуррентных соотношений&#039;&#039;&#039;&lt;br /&gt;
# Решите уравнение: T(n) = 4*T(n/2) + O(n^2) с базой T(1) = O(1)&lt;br /&gt;
## Используя основную теорему.&lt;br /&gt;
## Используя дерево рекурсий.&lt;br /&gt;
## Методом подстановки.&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2)) + n является \Theta(n lg n).&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2) + 17) + n является \Theta(n lg n).&lt;br /&gt;
# Решите уравнения, считая, что T(1) = O(1):&lt;br /&gt;
## T(n) = T(n-1) + n&lt;br /&gt;
## T(n) = 2*T(floor(sqrt(n))) + lg n. Указание: попробуйте использовать замену переменных.&lt;br /&gt;
## T(n) = 3*T(sqrt(n)) + lg n&lt;br /&gt;
# Дайте верхнюю и нижнюю оценки функции T(n). Постарайтесь, чтобы оценки были как можно более точные&lt;br /&gt;
## T(n) = 4T(n/3) + n*lg(n)&lt;br /&gt;
## T(n) = 3T(n/3) + n/lg(n)&lt;br /&gt;
## T(n) = 4T(n/2) + n^2*sqrt(n)&lt;br /&gt;
## T(n) = T(n/2) + T(n/4) + T(n/8) + n&lt;br /&gt;
## T(n) = T(n-1) + 1/n&lt;br /&gt;
## T(n) = T(n-2) + 1/lg(n)&lt;br /&gt;
## T(n) = sqrt(n) * T(sqrt(n)) + n&lt;br /&gt;
&#039;&#039;&#039;Анализ и построение алгоритмов&#039;&#039;&#039;&lt;br /&gt;
# Числа Фибоначчи F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; можно выразить через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, используя матрицу: https://yadi.sk/i/Pm_aNzHCforFU. &lt;br /&gt;
## Покажите как вычислить F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;.&lt;br /&gt;
## Как вычислить F&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;n+1&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;?&lt;br /&gt;
## Напишите алгоритм.&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
## Ускорьте его так, чтобы он работал за O(log n).&lt;br /&gt;
# Дана последовательность символов. Какое минимальное количество символов нужно удалить из неё, чтобы получить палиндром?&lt;br /&gt;
## Напишите алгоритм (на псевдокоде или на любом языке программирования).&lt;br /&gt;
## Оцените время работы алгоритма.&lt;br /&gt;
# Какую структуру данных вы бы использовали для реализации упорядоченного множества (http://neerc.ifmo.ru/wiki/index.php?title=Упорядоченное_множество)? Какая будет сложность каждой из операций над множеством?&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 16 (до 20.04)===&lt;br /&gt;
# Решите 6 задач из первой части и 6 из второй. (Укажите какие именно.) Каждый из подпунктов является отдельной задачей.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм и теорема Форда-Фалкерсона (16.04)==&lt;br /&gt;
# Базовые определения (пропускные способности, сток, исток и пр.). Пример. &lt;br /&gt;
# Ограничения на поток (сохранение и что меньше пропускных способностей).&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, пример работы&lt;br /&gt;
# Разрез, определение, пример.&lt;br /&gt;
# Утверждение: максимальный поток &amp;lt;= любого разреза.&lt;br /&gt;
# Теорема Форда-Фалкерсона (с доказательством).&lt;br /&gt;
# Пример на котором алгоритм Форда-Фалкерсонаработает работает очень долго при неудачном выборе путей.&lt;br /&gt;
# Сложность алгоритма Форда-Фалкерсона.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №3==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
В [https://official.contest.yandex.ru/contest/1196 домашнем задании] пять задач. Они разделены на два варианта, помеченные римскими цифрами I и II. Свой вариант нужно узнать [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing здесь на вкладке HW3]. Третья задача — общая для двух вариантов; ее решение необходимо снабдить доказательством корректности алгоритма. На выполнение задания дается примерно 2 недели (см. точное время окончания в контесте). Каждую задачу можно написать на С++ или Python.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Форда-Фалкерсона и Эдмондса-Карпа (20.04)==&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, напоминание: базовые определения, пример работы, пример на котором алгоритм работает долго, сложность.&lt;br /&gt;
# Алгоритм Эдмодса-Карпа. Доказательство асимптотики времени работы.&lt;br /&gt;
&lt;br /&gt;
==(23.04)==&lt;br /&gt;
&lt;br /&gt;
==(11.05) Красно-чёрные деревья==&lt;br /&gt;
[https://ru.wikipedia.org/wiki/Красно-чёрное_дерево Красно-чёрное дерево]&lt;br /&gt;
===Домашнее задание 17 (до 18.05)===&lt;br /&gt;
# Зачем нужны красно-чёрные деревья?&lt;br /&gt;
# Благодаря какому свойству и почему красно-чёрное дерево является сбалансированным?&lt;br /&gt;
# Нарисуйте полное бинарное дерево поиска высотой 3 с ключами {1, 2, ..., 15}. Сделайте из него красно-чёрные деревья высотой 2, 3 и 4.&lt;br /&gt;
# Нарисуйте красно-чёрные деревья, получающиеся последовательной вставкой элементов 12, 10, 29, 30, 31, 32 в [https://ru.wikipedia.org/wiki/Красно-чёрное_дерево#/media/File:Red-black_tree_example.svg данное дерево]. Для вставки используйте алгоритм вставки из Википедии. Укажите какой именно функцией вы воспользовались.&lt;br /&gt;
# Определим &#039;&#039;&#039;ослабленное красно-чёрное дерево&#039;&#039;&#039; как бинарное дерево поиска, которое удовлетворяет красно-чёрным свойствам 1, 3, 4 и 5. Другими словами, корень может быть как чёрным, так и красным. Рассмотрите ослабленное красно-чёрное дерево T, корень которого красный. Если перекрасить корень дерева T в чёрный, будет ли оно красно-чёрным деревом?&lt;br /&gt;
# Покажите, что самый длинный простой нисходящий путь от вершины x к листу красно-черного дерева имеет длину, не более чем в два раза превышающую кратчайший путь от x к листу-потомку.&lt;br /&gt;
# Чему равно наибольшее возможное количество внутренних узлов в красно-чёрном дереве с чёрной высоты k? А наименьшее возможное количество?&lt;br /&gt;
# Нарисуйте красно-чёрные деревья, получающиеся последовательной вставкой ключей 41, 38, 31, 12, 19, 8 в изначально пустое дерево.&lt;br /&gt;
# Покажите какие деревья будут получаться в результате последовательного удаления ключей в порядке 8, 12, 19, 31, 38, 41.&lt;br /&gt;
&lt;br /&gt;
==(14.05) Конкурентный анализ самоорганизующихся циклов==&lt;br /&gt;
[https://vk.com/doc12518218_390369758 Лекция]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 18 (до 21.05)===&lt;br /&gt;
Все вычисления сопроводите подробными объяснениями о том, почему верно то или иное (не)равенство.&lt;br /&gt;
# Пусть имеется n-элементный список и m поисковых запросов к нему. После каждой операции поиска можно переупорядочить список. Обозначим стоимость последовательности поисков через C. Докажите, что в худшем случае C = Ω(mn).&lt;br /&gt;
#  Обозначим через c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; стоимость i-ого поискового запроса с применением эвристики перемещения в начало, которая включает стоимость поиска элемента в списке и стоимость его перемещения в начало списка путём ряда обменов соседних элементов списка. Покажите, что i-ая операция поиска находит элемент x в списке L с применением эвристики перемещения в начало, то c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = 2 * rank&amp;lt;sub&amp;gt;L&amp;lt;/sub&amp;gt;(x) - 1.&lt;br /&gt;
# Покажите, что c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = 2 * rank&amp;lt;sub&amp;gt;L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) - 1.&lt;br /&gt;
# Покажите, что c*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = rank&amp;lt;sub&amp;gt;L*&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) + t&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;.&lt;br /&gt;
# Докажите, что после одного обмена двух соседних элементов потенциал либо увеличивается на 2, либо уменьшается на 2.&lt;br /&gt;
# Докажите, что rank&amp;lt;sub&amp;gt;L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) = |A| + |B| + 1.&lt;br /&gt;
# Докажите, что rank&amp;lt;sub&amp;gt;L*&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) = |A| + |С| + 1.&lt;br /&gt;
# Покажите, что поиск i-ого элемента приводит к изменению потенциала Ф(L&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;) - Ф(L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;) &amp;lt;= 2 (|A| - |B| + t*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;), где t*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; --- это количество обменов при i-ом поиске.&lt;br /&gt;
# Во сколько раз стоимость С&amp;lt;sub&amp;gt;MFT&amp;lt;/sub&amp;gt;(S) превышает C&amp;lt;sub&amp;gt;OPT&amp;lt;/sub&amp;gt;(S)?&lt;br /&gt;
&lt;br /&gt;
== (18.05) Конечные автоматы ==&lt;br /&gt;
=== Задание 19 (до 25.05) ===&lt;br /&gt;
# Постройте автомат для языка над алфавитом Σ = {0, 1} каждое слово которого содержит хотя бы два нуля. Является ли он детерминированным?&lt;br /&gt;
# Постройте автомат над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5. Является ли он детерминированным?&lt;br /&gt;
# Постройте автомат, который допускает пустой язык (язык в котором нет ни одного слова).&lt;br /&gt;
# Постройте автомат, который допускает все слова над алфавитом Σ.&lt;br /&gt;
# Постройте ДКА над алфавитом Σ = {К, Ж, З}, который допускает слова в которых после К идёт З, после З --- Ж, после Ж --- К.&lt;br /&gt;
# * Постройте ДКА над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5, а число нулей на 3.&lt;br /&gt;
# Постройте НКА для языка над алфавитом Σ = {0, 1, 2, 3}, состоящий из слов, в которых хотя бы одна из последних пяти букв является 1.&lt;br /&gt;
# Постройте НКА над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5, а число нулей на 3.&lt;br /&gt;
# Какие языки допускают автоматы https://yadi.sk/d/fNAHbjCZghERG?&lt;br /&gt;
# Для каждого из автоматов https://yadi.sk/d/fNAHbjCZghERG постройте соответствующий ему ДКА.&lt;br /&gt;
&lt;br /&gt;
== (21.05) Регулярные выражения, КА, их эквивалентность. Лемма о накачке  ==&lt;br /&gt;
=== Задание 20 (до 28.05) ===&lt;br /&gt;
&#039;&#039;&#039;I Написать регулярные выражения&#039;&#039;&#039;&lt;br /&gt;
# Напишите регулярное выражение для языка над алфавитом Σ = {0, 1} каждое слово которого содержит хотя бы два нуля.&lt;br /&gt;
# Напишите регулярное выражение над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5.&lt;br /&gt;
# Напишите регулярное выражение, которое допускает пустой язык (язык в котором нет ни одного слова).&lt;br /&gt;
# Напишите регулярное выражение, которое допускает все слова над алфавитом Σ.&lt;br /&gt;
# Напишите регулярное выражение для языка над алфавитом Σ = {0, 1, 2, 3}, состоящий из слов, в которых хотя бы одна из последних пяти букв является 1.&lt;br /&gt;
&#039;&#039;&#039;II КА и регулярные выражения&#039;&#039;&#039;&lt;br /&gt;
# Постройте конечный автомат для языка (111 U 01)&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;1(00 U 11)&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;.&lt;br /&gt;
# Постройте конечный автомат для языка (ab)&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;(a U b)(b U a)&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;(a U bab).&lt;br /&gt;
&#039;&#039;&#039;III Доказать замкнутость относительно различных операций&#039;&#039;&#039;&lt;br /&gt;
# Покажите, что если для языков L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; и L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; существует КА, который их читает, то существует КА и для их объединения L = {w | w ∈ L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; или w ∈ L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;}.&lt;br /&gt;
# Покажите, что если для языка L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; и L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; существует КА, который их читает, то существует КА и для языка L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; = {xy | x ∈ L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, y ∈ L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;}.&lt;br /&gt;
# Покажите, что если для языка L существует КА, который его читает, то существует КА и для &#039;&#039;&#039;замыкания Клини&#039;&#039;&#039; L* = {w&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; w&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; ... w&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;| w&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; ∈ L, w&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; ∈ L, ..., w&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; ∈ L}.&lt;br /&gt;
# Покажите, что если язык L регулярен, то регулярно его дополнение (т.е. язык над тем же алфавитом, которому принадлежит слово тогда и только тогда, когда оно НЕ принадлежит L) .&lt;br /&gt;
# Покажите, что если язык L регулярен, то регулярно его обращение L&amp;lt;sub&amp;gt;R&amp;lt;/sub&amp;gt; = {a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; . . . a&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; | a&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; . . . a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; ∈ L}. (L&amp;lt;sub&amp;gt;R&amp;lt;/sub&amp;gt; --- это язык в котором все слова языка L записаны наоборот.)&lt;br /&gt;
# * Покажите, что если языки L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; и L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; регулярны, то регулярно их пересечение.&lt;br /&gt;
&#039;&#039;&#039;IV Использование леммы о накачке&#039;&#039;&#039; (см. [https://vk.com/doc12518218_392750846 конспект])&lt;br /&gt;
# Докажите, что не существует КА, который бы читал язык {0&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;1&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;2&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;}. (Пояснение: запись 0&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; означает строку из n нулей: 00...0.)&lt;br /&gt;
# Докажите, что не существует КА, который бы читал язык {0&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;1&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;}.&lt;br /&gt;
# Докажите, что не существует КА, который бы читал язык {0&amp;lt;sup&amp;gt;n!&amp;lt;/sup&amp;gt;}.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== (25.05) Автоматный подход ==&lt;br /&gt;
=== Задание 21 (до 01.06) ===&lt;br /&gt;
Реализуйте один из следующих проектов:&lt;br /&gt;
# Программа, которая считывает строку и говорит принадлежит ли она языку 0(123)*(00 U (231)*) U 111.&lt;br /&gt;
# Программа, которая считывает КА и генерирует программу на языке С++, которая говорит принадлежит ли заданное слово языку, описываемому этим КА.&lt;br /&gt;
# Программа, которая считывает регулярное выражение и строку и говорит принадлежит ли слово языку, описываемому этим регулярным выражением.&lt;br /&gt;
# Программа, которая моделирует работу банкомата, автомата с газировкой, лифта... (что-то одно на выбор)&lt;br /&gt;
# Текстовый симулятор студента. Возможные состояния: на паре, дома, есть приглашение прогулять, завтра коллоквиум, сплю и др. Есть два параметра: успеваемость и весёлось. Если хотя бы один из них упадёт ниже критической отметки, студент умрёт. Игрок принимает решение куда идти студенту. Цель: продержаться как можно дольше.&lt;br /&gt;
&lt;br /&gt;
== Большое домашнее задание 4 ==&lt;br /&gt;
[https://official.contest.yandex.ru/contest/1259 Контест]. В домашнем задании четыре задачи. Обязательны первые три. Вместо одной из первых трёх можно сделать последнюю (только для первых 10 решивших 4-ую!). На выполнение задания даётся примерно 2 недели (см. точное время окончания в контесте). Условия ревью определяют семинаристы.&lt;br /&gt;
&lt;br /&gt;
== (01.06) P vs NP ==&lt;br /&gt;
&#039;&#039;&#039;План занятия&#039;&#039;&#039;&lt;br /&gt;
# Напоминание: P; NP; проблема P ?= NP; NPC; сведения; пример сведений.&lt;br /&gt;
&lt;br /&gt;
=== Задание 22 (до 8.06) ===&lt;/div&gt;</summary>
		<author><name>Kassalanche</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=15646</id>
		<title>Алгоритмы и структуры данных. Подгруппа 105-1</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=15646"/>
		<updated>2015-05-26T17:00:51Z</updated>

		<summary type="html">&lt;p&gt;Kassalanche: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==О курсе==&lt;br /&gt;
[[Алгоритмы_и_структуры_данных|План лекций и список рекомендуемой литературы.]]&lt;br /&gt;
&lt;br /&gt;
[[Алгоритмы_и_структуры_данных._Подгруппа_105-1._FAQ|FAQ.]]&lt;br /&gt;
&lt;br /&gt;
[[Reviewboard|Инструкция по использованию Reviewboard.]]&lt;br /&gt;
&lt;br /&gt;
[[Практические_занятия_по_курсу_ОиМП/C++_check|Style guide.]]&lt;br /&gt;
&lt;br /&gt;
==Итоговая оценка за курс==&lt;br /&gt;
Итоговая оценка (ИО) зависит от&lt;br /&gt;
* оценок за пять больших домашних заданий (БДЗ1, БДЗ2, ..., БДЗ5),&lt;br /&gt;
* оценок за домашние задания (ДЗ1, ДЗ2, ...),&lt;br /&gt;
* оценки за контрольную работу (КР),&lt;br /&gt;
* оценки за экзамен (ЭКЗ),&lt;br /&gt;
и может быть вычислена по формуле:&lt;br /&gt;
 ИО = 0.7 * (0.3 * КР + 0.7 *(ИДЗ1 + ИДЗ2 + ИДЗ3 + ИДЗ4 + ИДЗ5)/5) + 0.3 * ЭКЗ =&lt;br /&gt;
    = 0.21*КР + 0.098*ИДЗ1 + 0.098*ИДЗ2 + 0.098*ИДЗ3 + 0.098*ИДЗ4 + 0.098*ИДЗ5 + 0.3*ЭКЗ,&lt;br /&gt;
где&lt;br /&gt;
 ИДЗi = min (10, 0.7 * БДЗi + 0.4 * &amp;lt;cредняя оценка за ДЗj, прошедшие с предыдущего БДЗ по i-ое&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
==Порядок сдачи домашних работ==&lt;br /&gt;
===Большие домашние работы===&lt;br /&gt;
# Получить OK за задачу в контесте.&lt;br /&gt;
# Залить исходный код на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* На каждую задачу создавайте отдельный запрос на ревью. &lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении суток приходят замечания к коду. &#039;&#039;&#039;Если в течении суток замечаний или Ship It не появилось, проверьте, что вы правильно отправили запрос и, если всё сделано правильно, спросите у семинариста получил ли он запрос.&#039;&#039;&#039;&lt;br /&gt;
# Вы их исправляете, проверяете в контесте, что программа по-прежнему проходит все тесты, заливаете новую версию в Review Board. Штрафов за посылки НЕ будет.&lt;br /&gt;
# Процесс повторяется пока остаются замечания к коду или пока не истёк дедлайн. После закрытия контеста будут ещё одни сутки на доработку замечаний в Review Board.&lt;br /&gt;
# Оценивается только последняя версия работы в Review Board.&lt;br /&gt;
&lt;br /&gt;
===Маленькие домашние работы===&lt;br /&gt;
# Залить решение на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* Желаемые форматы: txt, py, cpp, h. Допускаются любые другие.&lt;br /&gt;
#* На каждую домашнюю работу создавайте отдельный запрос на ревью. Обязательно указывайте номер домашней работы.&lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении неопределенного промежутка времени придут оценки по каждому из заданий.&lt;br /&gt;
&lt;br /&gt;
==Оценивание домашних работ==&lt;br /&gt;
* Все задания предполагаются индивидуальными. Запрещены любые заимствования без ссылки на автора.&lt;br /&gt;
* Решения после установленного дедлайна не принимаются. Дедлайн указан в заголовке каждого задания.&lt;br /&gt;
* Везде, где требуется написать алгоритм, можно использовать любой язык программирования или псевдокод.&lt;br /&gt;
* Там, где требуется построить алгоритм с заданной асимптотикой, приведите обоснование, что полученный алгоритм удовлетворяет этому условию.&lt;br /&gt;
* Эти правила не действуют, если в задании явно оговорено иное.&lt;br /&gt;
&lt;br /&gt;
==Мотивация к изучению алгоритмов. Подсчёт числа операций (12.01)==&lt;br /&gt;
# Числа Фибоначчи. Определение. Примитивный рекурсивный алгоритм вычисления i-ого числа. Оценка числа операций. Анализ причин неэффективности. Алгоритм с запоминанием вычисленных ранее значений. Оценка числа операций. Сравнение с предыдущим. (подробнее: глава 0, страницы 8-10 из книги &amp;lt;&amp;lt;Алгоритмы&amp;gt;&amp;gt;, [[Алгоритмы_и_структуры_данных|см. список рекомендованной литературы]])&lt;br /&gt;
# Задача о ханойской башне. Постановка задачи. Рекурсивный алгоритм. Рекуррентная формула для числа перемещений. Замкнутая формула для числа перемещений (+ доказательство). Доказательство того, что эту задачу нельзя решить используя меньшее число перемещений дисков. ([https://www.dropbox.com/s/t8cbs7ttu4iasvj/algo-0-recursion.pdf?dl=0 Разбор задачи о ханойской башне], автор Сергей Объедков)&lt;br /&gt;
# Сортировка пузырьком. Алгоритм. Подсчёт количество операций сравнения и обмена (swap). Анализ наилучшего и наихудшего случаев ([https://ru.wikipedia.org/wiki/Сортировка_пузырьком Википедия])&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 1 (12.01 - 26.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
Во всех задачах, если не оговорено иного, предполагаем, что работаем с целыми неотрицательными числами. Для первых 7 задач необходимо&lt;br /&gt;
* описать что можно считать наилучшим и наихудшим случаями,&lt;br /&gt;
* для каждого из двух случаев подсчитать отдельно количество операций сравнения и swap (если есть).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Даны три числа, требуется вернуть наименьшее.&lt;br /&gt;
# Даны три числа, требуется отсортировать их.&lt;br /&gt;
# Дана последовательность A из n элементов и число x, требуется найти элемент равный x. Примечание: если таких значений i несколько, вернуть любое; если такого элемента нет, функция должна сообщить об этом.&lt;br /&gt;
# * Дана упорядоченная последовательность A из n элементов и число x, требуется найти такое i, что A[i] равно x. Алгоритм должен быть эффективней, чем в предыдущем пункте и использовать то, что последовательность упорядочена.&lt;br /&gt;
# Дана последовательность из 100 000 чисел от 0 до 100. Напишите эффективный алгоритм сортировки, который бы учитывал специфику входных данных.&lt;br /&gt;
# * Дано 32 битное неотрицательное число. Требуется номер первого ненулевого бит. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения, считая, что числа распределены равномерно.&lt;br /&gt;
# * Даны 32 битные неотрицательные числа m и n. Требуется вывести True, если m &amp;lt; n, иначе False. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения битов, считая, что числа распределены равномерно.&lt;br /&gt;
# Напишите рекурсивную функцию, вычисляющую n-ое число Фибоначчи (как на занятии). Подсчитайте количество рекурсивных вызовов.&lt;br /&gt;
# * Напишите функцию, вычисляющую n-ое число Фибоначчи, у которой число операций — полином от n, и которая использует количество памяти, независящее от n.&lt;br /&gt;
&lt;br /&gt;
==O-символика и стратегия &amp;quot;разделяй и властвуй&amp;quot; (15.01)==&lt;br /&gt;
# Сортировка слиянием. Алгоритм, рекуррентное соотношение для времени сортировки, сложность. Подробнее: [https://dl.dropboxusercontent.com/u/829163/draft.pdf §2.3 Сортировка слиянием (стр. 54)].&lt;br /&gt;
# О-символика. [https://dl.dropboxusercontent.com/u/829163/draft.pdf §0.3 О-символика (стр. 10)].&lt;br /&gt;
# Задача о слиянии m упорядоченных массивов по n элементов. Три алгоритма решения: последовательное слияние, слияние &amp;quot;деревом&amp;quot; (обе функции используют Merge из MergeSort), аналог Merge для m массивов. Анализ сложности каждого из них.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 2 (15.01-29.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
* Во всех задачах, если не оговорено иного, для простоты &#039;&#039;можно&#039;&#039; считать, что n является степенью какого-либо числа, например, степенью двойки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Дана функция F, определённая ниже. Сколько строк она напечатает? Указание: для обоих подпунктов рассмотрите два случая: 1. n является степенью двойки, 2. n не является степенью двойки.&lt;br /&gt;
## Запишите рекуррентное соотношение для числа строк.&lt;br /&gt;
## Решите уравнение, полученное в предыдущем пункте, то есть, выведите замкнутую (нерекуррентную формулу). Для простоты можно считать, что n является степенью двойки.&lt;br /&gt;
# В массиве A размера n записана возрастающая последовательность целых чисел. Постройте алгоритм типа &amp;quot;разделяй и властвуй&amp;quot;, который проверяет, существует ли такой индекс i, что A[i] = i&lt;br /&gt;
## за время O(n),&lt;br /&gt;
## * за время O(log n).&lt;br /&gt;
## Какие случаи для вашего алгоритма являются наихудшими и наилучшими? Какого время работы в лучшем и худшем случаях?&lt;br /&gt;
# Дан бесконечный массив A, первые n элементов которого содержат возрастающую последовательность положительных чисел, а дальше стоят -1. Значение n не дано. Постройте алгоритм, который получает на вход целое число x и находит это x в массиве --- или говорит, что там его нет, &lt;br /&gt;
## за время O(n),&lt;br /&gt;
## за время O(log n).&lt;br /&gt;
# Рассмотрим алгоритм вычисления наибольшего общего делителя (НОД) двух положительных чисел, основанный на методе &amp;quot;разделяй и властвуй&amp;quot;.&lt;br /&gt;
## (задание не оценивается) Прочитайте [https://dl.dropboxusercontent.com/u/829163/draft.pdf §1.2.3 Алгоритм Евклида (стр. 23)].&lt;br /&gt;
## * Докажите, что определение НОД-а, приведённое ниже, корректно.&lt;br /&gt;
## Постройте алгоритм, основанный на этом определении.&lt;br /&gt;
## Какой алгоритм будет быстрее для n-битовых чисел a и b при больших значениях n --- ваш или алгоритм Евклида?&lt;br /&gt;
# * Покажите как за время O(n log n) удалить из массива размера n все дубликаты, то есть оставить каждый элемент в одном экземпляре.&lt;br /&gt;
# * Даны два упорядоченных массива размера m и n. Постройте алгоритм, находящий k-й по величине элемент в объединении этих массивов за время O(log(n+m)). &lt;br /&gt;
&lt;br /&gt;
Функция F(n).&lt;br /&gt;
  если n &amp;gt; 1:&lt;br /&gt;
    напечатать &amp;quot;всё ещё работаю&amp;quot;&lt;br /&gt;
    F(n/2)&lt;br /&gt;
    F(n/2)&lt;br /&gt;
&lt;br /&gt;
Определение НОД-а.&lt;br /&gt;
             2НОД(a/2, b/2), если а и b чётны,&lt;br /&gt;
  НОД(a,b) = НОД(a, b/2), если а нечётно, b чётно,&lt;br /&gt;
             НОД((a-b)/2, b), если а и b нечётны.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;lt;nowiki&amp;gt;Задачи взяты из книги &amp;quot;Алгоритмы&amp;quot;, глава 2 (см. список рекомендованной литературы).&amp;lt;/nowiki&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Сложение и умножение (19.01)==&lt;br /&gt;
# Алгоритм сложения, его сложность (§1.1.1 Сложение*)&lt;br /&gt;
# &amp;quot;Школьный&amp;quot; алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Рекурсивный алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Алгоритм умножения, реализующий стратегию &amp;quot;разделяй и властвуй&amp;quot;, анализ сложности (§2.1 Умножение чисел*)&lt;br /&gt;
 * [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать.]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 3 (19.01 - 2.02)===&lt;br /&gt;
* Во всех задачах для простоты можно считать, что n является степенью какого-либо числа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Найдите произведение чисел 10011011 и 10111010 (в двоичной системе счисления), используя алгоритм умножения чисел, основанный на методе «разделяй и властвуй». Необходимо не только дать ответ, но и привести ход решения.&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 3 рекурсивных вызова для подзадач размера n-1 и комбинирует из них решение исходной задачи за О(n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте три верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 10 рекурсивных вызовов для подзадач размера n/2 и комбинирует из них решение исходной задачи за О(5n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте два верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Докажите, что 3m² + m = O(m²).&lt;br /&gt;
# Докажите, что lg m = O(m/1000), где lg m — это логарифм с двоичным основанием.&lt;br /&gt;
# Докажите, что из равенства f(n) = O(g(n)) не следует, что g(n) = O(f(n)).&lt;br /&gt;
# Докажите, что O(m) содержится в O(m²).&lt;br /&gt;
&lt;br /&gt;
==Решение рекуррентных уравнений (22.01)==&lt;br /&gt;
# Примеры решений рекуррентных уравнений (см. [https://www.dropbox.com/s/6a0r410zjm9qwe7/algo-3-recurrences.pdf?dl=0 конспект]).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 4 (до 14.02)===&lt;br /&gt;
* Нельзя использовать утверждение основной теоремы о решении рекуррентных соотношений.&lt;br /&gt;
* &#039;&#039;Можно&#039;&#039; использовать метод построения дерева рекурсии или подстановку (метод с угадыванием ответа).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Какой из трёх приведённых ниже алгоритмов вы бы предпочли? Обоснуйте свой ответ.&lt;br /&gt;
#* Алгоритм A, решая задачу, производит пять рекурсивных вызовов для подзадач вдвое меньшего размера, после чего строит ответ для исходной задачи за линейное время.&lt;br /&gt;
#* Алгоритм B, решая задачу размера n, делает два рекурсивных вызова для задач размера n − 1, после чего находит ответ за время O(1).&lt;br /&gt;
#* Алгоритм C, решая задачу размера n, рекурсивно решает девять задач размера n/3 и строит ответ за время O(n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Найдите T(n) в замкнутой форме для любых 7 из 10 приведённых ниже рекуррентных соотношений:&lt;br /&gt;
## T(n) ≤ 2T(n/3) + 1;&lt;br /&gt;
## T(n) ≤ 7T(n/7) + n;&lt;br /&gt;
## T(n) ≤ 9T(n/3) + n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 8T(n/2) + n&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 49T(n/25) + n&amp;lt;sup&amp;gt;3/2&amp;lt;/sup&amp;gt;log n;&lt;br /&gt;
## T(n) ≤ T(n − 1) + 2;&lt;br /&gt;
## T(n) ≤ T(n − 1) + n&amp;lt;sup&amp;gt;c&amp;lt;/sup&amp;gt;, где c ≥ 1 –– константа;&lt;br /&gt;
## T(n) ≤ T(n − 1) + c&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;, где c &amp;gt; 1 –– константа;&lt;br /&gt;
## T(n) ≤ 2T(n − 1) + 1;&lt;br /&gt;
## T(n) ≤ T(sqrt(n)) + 1.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №1==&lt;br /&gt;
Необходимо реализовать все 6 задач из [https://official.contest.yandex.ru/contest/1002 контеста]. Каждую задачу можно писать на С++ или Python. На выполнение работы отводится две недели. Каждая задача оценивается в 10/6 балла. Оценка &#039;&#039;может&#039;&#039; быть снижена за плохой код, но не более чем на 25%.&lt;br /&gt;
&lt;br /&gt;
==Бинарное дерево поиска (26.01)==&lt;br /&gt;
# Определение. Пример.&lt;br /&gt;
# Не модифицирующие алгоритмы: поиск (рекурсивный и итеративный алгоритмы), поиск минимума, inordered обход (вывод значений узлов в отсортированном порядке), поиск следующего по возрастанию.&lt;br /&gt;
# Модифицирующие алгоритмы: вставка (рекурсивная реализация), удаление (только идея).&lt;br /&gt;
 [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 13, стр. 248]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 5 (до 16.02)===&lt;br /&gt;
* Для получения максимальной оценки можно выполнить или все задачи без звёздочки, или задачу со звёздочкой. Преподаватель понимает, что реализацию БДП сложно не найти в интернете, но от копипасты не будет никакой пользы. Напротив, самостоятельная реализация очень полезна и приветствуется, даже если не получится выполнить всех пунктов задания.&lt;br /&gt;
* Задачи с двумя звёздочками необязательны.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Нарисуйте бинарные деревья поиска высотой 2, 3, 4, 5 и 6 для множества ключей {1, 4, 5, 10, 16, 17, 21}. Корень дерева имеет высоту 0.&lt;br /&gt;
# &#039;&#039;&#039;Сортировка с использованием БДП.&#039;&#039;&#039;&lt;br /&gt;
## Какова асимптотическая сложность алгоритма вставки элемента в дерево высоты d? Почему? Назовите наилучший и наиухдший случаи.&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который строит БДП в узлах которого стоят элементы данной последовательности. Можно использовать функцию Insert. Назовите наилучший и наихудший случаи. Есть теорема о том, что полученный алгоритм будет работать в среднем случае за время O(n * log n).&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который выводит их в порядке возрастания. Используйте бинарное дерево поиска. Какова в среднем случае сложность этого алгоритма? Назовите наилучший и наихудший случаи. Какова сложность в наихудшем случае?&lt;br /&gt;
# Напишите функцию GetRoot, которой на вход подаётся указатель на произвольный узел дерева, а она возвращает указатель на корень.&lt;br /&gt;
# Напишите процедуру PrintLeafs, которой на вход подаётся указатель на корень дерева, и она печатает листья дерева&lt;br /&gt;
## по возрастанию,&lt;br /&gt;
## по убыванию.&lt;br /&gt;
# ** Альтернативный обход в порядке возрастания бинарного дерева поиска с n узлами (или центрированный (inordered) обход) можно осуществить путём поиска минимального элемента дерева с помощью функции Minimum с последующий n-1 вызовом функции Next. Каково время работы такого алгоритма?&lt;br /&gt;
# * Реализуйте на С++ структуру данных бинарное дерево поиска, [https://yadi.sk/i/gi2SEStreFfSb используя заготовку].&lt;br /&gt;
## Нарисуйте бинарное дерево поиска, которое строится в функции getTreeExample.&lt;br /&gt;
## Реализуйте следующие алгоритмы: &lt;br /&gt;
### поиск минимума, &lt;br /&gt;
### inordered обход (вывод значений узлов в отсортированном порядке),&lt;br /&gt;
### поиск следующего по возрастанию,&lt;br /&gt;
### вставка элемента в дерево,&lt;br /&gt;
### сортировка последовательности с использованием БДП (дан вектор чисел, необходимо вывести их по возрастанию),&lt;br /&gt;
### ** удаление.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Карацубы, Штрассена. Быстрая сортировка (29.01)==&lt;br /&gt;
# Алгоритм Карацубы.&lt;br /&gt;
# Алгоритм Штрассена. [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать Дасгупту и др., §2.5 Умножение матриц]&lt;br /&gt;
# Быстрая сортировка и доказательство того, что в среднем случае она работает за О(n * log n). [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 8 Быстрая сортировка, стр. 148]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 6 (до 18.02)===&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Пусть мы хотим найти двоичное представление десятичного числа 10&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;. Будем считать, что n --- степень двойки (n = 2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt;).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Pwr2Bin(n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть 1010&lt;br /&gt;
    z = ...&lt;br /&gt;
    вернуть Multiply(z, z)&amp;lt;/source&amp;gt;&lt;br /&gt;
Multiply --- функция, перемножающая два n-битовых двоичных числа x и y по алгоритму Карацубы за O(n&amp;lt;sup&amp;gt;log&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;3&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Пусть мы хотим перевести произвольное десятичное число x в записи которого n=2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; чисел в двоичную систему счисления.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Dec2Bin(x, n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть binary[x]&lt;br /&gt;
    разделить x на два десятичных числа xl и xr из n/2 цифр.&lt;br /&gt;
    вернуть ...&amp;lt;/source&amp;gt;&lt;br /&gt;
Здесь binary --- это массив, содержащий двоичное представление десятичных цифр.&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Докажите, что математическое ожидание времени работы алгоритма быстрой сортировки (усреднение по всем вариантам выбора опорного элемента) на любом входе размера n удовлетворяет соотношению: T(n) ≤ O(n) + 1/n * &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt; (T(i-1) + T(n-i)).&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Найдите решение соотношения из предыдущего пункта.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Динамическое программирование (ДП). Первые примеры (02.01)==&lt;br /&gt;
# Нахождение самой длинной возрастающей подпоследовательности.&lt;br /&gt;
# Нахождение редакционного расстояния (или редакционной стоимости, расстояния Левенштейна).&lt;br /&gt;
# Нахождение представителя большинства.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 7 (до 20.02)===&lt;br /&gt;
* В этом задании везде, где требуется реализовать алгоритм, необходимо привести код на любом языке программирования.&lt;br /&gt;
* Для получения максимальной оценки нужно решить все задачи без звёздочек. Одна решённая задача со звёздочкой заменяет одну задачу без звёздочки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения редакционного расстояния (алгоритм Вагнера — Фишера). Например, редакционное расстояние между словами &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равно 6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения длины наибольшей общей подстроки. Например, длина наибольшей общей подстроки &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равна 8 (&amp;quot;antholog&amp;quot;). Чем больше это значение, тем схожей строки.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Предположим теперь, что сравниваемые строки состоят из символов A, С, G и T; за удаление или вставку мы платим -5; за замену буквы x на y платим w[x, y], где x, y принадлежат множеству {A, С, G, T}, a w — это матрица весов:&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
!-!! A!! G!! C!! T&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! A&lt;br /&gt;
|10||-1||-3||-4&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
!G&lt;br /&gt;
||-1||7||-5||-3&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! C&lt;br /&gt;
||-3||-5||9||0&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! T&lt;br /&gt;
||-4||-3||0||8&lt;br /&gt;
|}&lt;br /&gt;
Тогда выравнивание:&lt;br /&gt;
 AGACTAGTTAC&lt;br /&gt;
 CGA‒‒‒GACGT&lt;br /&gt;
будет иметь следующую оценку:&lt;br /&gt;
 w[A,C] + w[G,G] + w[A,A] + 3*(-5) + w[G,G] + w[T,A] + w[T,C] + w[A,G] + w[C,T] = -3 + 7 + 10 - 3*5 + 7 + (-4) + 0 + (-1) + 0 = 1.&lt;br /&gt;
&lt;br /&gt;
Напишите алгоритм, который находит максимальную стоимость всех возможных выравниваний. Верно ли, что чем больше это значение, тем непохожей строки?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как давно один народ отделился от другого? Кто похожей — итальянец и китаец или якут и эфиоп? На эти вопросы можно отвечать с разных точек зрения — культурной, исторической, лингвистической, ... В последние же годы человечество научилось секвенировать геном, что позволило исследовать этот вопрос с точки зрения генетики. Секвенирование генома — это процесс записи ДНК в виде нуклеотидной последовательности, которая представляет собой последовательность из четырёх символов — A, С, G и T. Существуют базы, которые хранят генетическую информацию о людях из разных стран и континентов, например, [http://www.mtdb.igp.uu.se/ http://www.mtdb.igp.uu.se/ → Download mtDNA sequences]. Чем больше сходство между геномами, тем сильнее родственные связи между их обладателями. Используя решение предыдущего пункта, выполните задания:&lt;br /&gt;
# Определите, кто похожей — итальянец и китаец или якут и эфиоп?&lt;br /&gt;
# Найдите нескольких похожих и нескольких непохожих народностей.&lt;br /&gt;
# * Выберите одну народность. Найдите самых похожих и самых непохожих на неё.&lt;br /&gt;
# * Найдите самые похожие и самые непохожие народности.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Задача о разрезании стержня (05.01)==&lt;br /&gt;
# Постановка задачи.&lt;br /&gt;
# Решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Решение с нахождением максимума по p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Восходящий алгоритм с запоминанием. Вывод длин кусочков стержня. Оценка сложности.&lt;br /&gt;
# Нисходящий алгоритм с запоминанием. Оценка сложности.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.1 Разрезание стержня, стр. 393]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 8 (до 22.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Решая задачу о разрезании стержня мы вначале построили рекурсивное решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt; для всех 1 ≤ i &amp;lt; n. Его сложность описывалась рекуррентной формулой T(n) = n + &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n-1&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt;(T(i) + T(n-i)), T(1) = 1.&lt;br /&gt;
# Объясните эту формулу.&lt;br /&gt;
# Покажите с помощью метода подстановок, что T(n) ≤ 2&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Покажите с помощью контрпримера, что описанная далее жадная стратегия не всегда определяет оптимальный способ разрезания стержня. Определим плотность стержня длиной i как p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;/i, то есть как стоимость единицы его длины. Жадная стратегия для стержня длиной n отрезает от стержня первую часть длиной i, где 1 ≤ i ≤ n, имеющую максимальную плотность. Затем та же жадная стратегия применяется к оставшейся части длиной n-i.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Рассмотрим модификацию задачи разрезания стержня, в которой в дополнение к цене p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; каждого стержня добавляется фиксированная цена разреза c. Теперь прибыль, связанная с решением, представляет собой сумму цен частей стержня минус стоимость разрезов. Разработайте алгоритм динамического программирования для этой модифицированной задачи.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Непрерывным участком называется группа подряд идущих элементов. Например, для последовательности&lt;br /&gt;
 5, 15, −30, 10, −5, 40, 10&lt;br /&gt;
элементы 15, −30, 10 образуют непрерывный участок, а 5, 15, 40 -- нет. Постройте линейный алгоритм для следующей задачи:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Вход: список чисел a1, a2, ... ‌, an.&lt;br /&gt;
Выход: непрерывный участок с максимальной суммой (сумма участка нулевой длины равна нулю).&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Для приведённого примера ответом будет 10, −5, 40, 10 с суммой 55. Какова сложность алгоритма? Почему?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Надо заплатить v рублей, имея купюры в x1, x2, ‌..., xn рублей (купюр каждого типа сколько угодно). Это не всегда возможно (скажем, купюрами в&lt;br /&gt;
10 и 25 рублей можно заплатить 45 рублей, но не 47 и не 15). Постройте основанный на методе динамического программирования алгоритм со временем работы O(nv), выясняющий, возможна ли уплата.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как решить предыдущую задачу, если каждая купюра имеется в единственном экземпляре? (Например, купюрами в 1, 5, 10, 20 рублей можно заплатить 16 = 1 + 5 + 10 и 31 = 1 + 10 + 20 рублей, но не 40 (не хватит денег). Время работы алгоритма по-прежнему O(nv).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Ещё один вариант той же задачи: купюр каждого типа сколько угодно, но всего разрешается использовать не более k купюр. (Например, если есть купюры в 5 и 10 рублей, а k = 6, то 55 разменять можно, а 65 –– нет).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Перемножение цепочки матриц. Оптимальное бинарное дерево поиска (начало) (09.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о перемножении цепочки матриц. Постановка задачи.Пример. Нисходящий алгоритм.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.2 Перемножение цепочки матриц, стр. 403]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 9 (до 24.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Найдите оптимальную расстановку скобок в произведении последовательности матриц, размерности которых равны 5×10, 10×3, 3×12, 12×5, 5×50, 50×6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Напишите восходящий алгоритм для поиска оптимальной расстановки скобок.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Расстановка пробелов. Оптимальное бинарное дерево поиска (середина) (12.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о расстановке пробелов. Постановка задачи. Решения для трёх случаев: 1. нужно вернуть можно ли разбить текст на слова; 2. вернуть разбивку на слова; 3. слова встречаются не равновероятно, вернуть наиболее вероятную разбивку на слова.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи. Вывод математического ожидания времени поиска.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Праздничное домашнее задание 10 (до 02.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[&amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;,&amp;quot;, &amp;quot;.&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;,&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;.&amp;quot;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Подсказка:&#039;&#039;&#039; разбейте текст на слова из списка и посмотрите на азбуку Морзе.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Способы представления графов в памяти (16.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Разбор ошибок в домашнем задании.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Графы. Способы представления графов в памяти (матрица смежности, список рёбер, список соседей (список смежностей), матрица инцидентности). Зависимость сложности алгоритмов от способа представления.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §22.1 Представление графов, стр. 626]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 11 (до 02.03)===&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача A.]&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача B.]&lt;br /&gt;
# Нарисуйте неориентированный граф с 5 вершинами и 8 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Нарисуйте ориентированный граф с 4 вершинами и 3 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Дан ориентированный граф. &#039;&#039;Исходящая степень вершины v&#039;&#039; --- это количество исходящих из неё рёбер, &#039;&#039;входящая степень v&#039;&#039; --- это количество рёбер входящих в  v. Имеется представление ориентированного графа с использование списка соседей. Как долго будут вычисляться исходящие степени всех вершин графа? А входящие степени?&lt;br /&gt;
# Дан граф G = (V, E). Какие из рассмотренных способов хранения графов используют меньше всего памяти для хранения G и почему? Указание: рассмотрите случаи |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;lt; |E| и |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;gt; |E|.&lt;br /&gt;
# Пусть C --- это матрица смежности графа G.&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
# Пусть B --- это матрица инцидентности ориентированного графа G. Как связаны элементы матрицы BB&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
&lt;br /&gt;
==Реализация поиска в глубину (19.02)==&lt;br /&gt;
# Реализация поиска в глубину и смежных задач.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 12 (до 5.03)===&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Выберите любой способ хранения графа. Реализуйте поиск в глубину.&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Напишите алгоритм, который возвращает данные о том, какие вершины лежат в одной компоненте связности.&lt;br /&gt;
# &#039;&#039;(любой ЯП или псевдокод)&#039;&#039; Напишите алгоритм проверки сильной связности ориентированного графа. Какова его сложность?&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №2==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
Необходимо реализовать 3 задачи из [https://official.contest.yandex.ru/contest/1085 контеста], см. [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing распределение задач]. Каждую задачу можно написать на С++ или Python. На выполнение работы отводится две недели (см. время окончания контеста). [https://official.contest.yandex.ru/contest/1123 Дорешивание.]&lt;br /&gt;
&lt;br /&gt;
==ДП и графы (26.02)==&lt;br /&gt;
==ДП и графы (02.03)==&lt;br /&gt;
==Жадные алгоритмы (12.03)==&lt;br /&gt;
===Домашнее задание 13 (до 23.03)===&lt;br /&gt;
# Вася хочет купить по одной акции каждой компании. Все акции стоят одинаково, но дорожают по-разному. Каждый месяц акция i-ой компании дорожает в r_i раз. В один месяц можно купить только одну акцию.&lt;br /&gt;
## Напишите алгоритм, который выводит оптимальную последовательность покупок (такую, что на покупку всех акций потратится меньше денег).&lt;br /&gt;
## Докажите корректность алгоритма, то есть докажите, что последовательность покупок, которую выводит ваш алгоритм, оптимальна.&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список, очередь (16.03)==&lt;br /&gt;
# Реализация линейного двусвязного списка (С++).&lt;br /&gt;
# Реализация очереди ограниченной длины на базе вектора (С++).&lt;br /&gt;
# Реализация очереди на базе списка (С++).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14 (до 23.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте (на С++) структуру данных Стек. У стека должно быть три операции:&lt;br /&gt;
* push --- положить элемент на вершину стека;&lt;br /&gt;
* pop --- удалить верхний элемент;&lt;br /&gt;
* front --- вернуть значение верхнего элемента.&lt;br /&gt;
Оцените время работы каждой функции.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список (19.03)==&lt;br /&gt;
===Домашнее задание 13* (до 30.03)===&lt;br /&gt;
#Для приведённой реализации класса List (https://yadi.sk/i/c5r_79WdfMyNS).&lt;br /&gt;
## Допишите print, push_back и push_front.&lt;br /&gt;
## В функции insert_after и delete_node вставьте необходимые проверки так, чтобы они работали для крайних случаев.&lt;br /&gt;
## Напишите main в котором&lt;br /&gt;
### создаётся объект класса List, &lt;br /&gt;
### заполняется элементами с помощью функций push_back, push_front и insert_after и&lt;br /&gt;
### удаляется i-ый элемент.&lt;br /&gt;
&lt;br /&gt;
==Повторение (30.03)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Для данных пар функций выясните их связь в терминах O-, o-, Ω-, ω-, Θ-обозначений. Поставьте галочку в клетке с Ω, если f(x) = Ω(g(x)) и прочерк, если равенства нет. [https://ru.wikipedia.org/wiki/«O»_большое_и_«o»_малое#.D0.94.D1.80.D1.83.D0.B3.D0.B8.D0.B5_.D0.BF.D0.BE.D0.B4.D0.BE.D0.B1.D0.BD.D1.8B.D0.B5_.D0.BE.D0.B1.D0.BE.D0.B7.D0.BD.D0.B0.D1.87.D0.B5.D0.BD.D0.B8.D1.8F Википедия]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! f(x)!! g(x)!! O!! o!! Ω!! ω!! Θ&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! 2^100&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n * log(n)&lt;br /&gt;
! 2^100 * n * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n&lt;br /&gt;
! 2^100 * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n!&lt;br /&gt;
! 2^(2015n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n*2^n&lt;br /&gt;
! 3^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 5^n&lt;br /&gt;
! 5^(n+1)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n + n^2 + n^3 + ... + n^1000&lt;br /&gt;
! 7^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм Quickselect нахождения k-ого элемента по возрастанию: http://en.wikipedia.org/wiki/Quickselect&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;На улице стоит ряд домов. В каждом из домов лежит сколько-то денег. Вор хочет обокрасть дома на переулке. Он не может обокрасть два соседних дома, потому что хозяин дома, который он обокрал, сразу предупредит соседей. Нужно найти, какую максимальную сумму вор может украсть с переулка. На вход программы подается массив неотрицательных целых чисел - количество долларов в доме с номером i. Соседние дома в массиве представлены соседними элементами. Например, пусть задан массив { 1, 4, 5 } - тогда вор максимум может украсть $6, обокрав дома 1 и 3. Пусть задан массив { 1, 7, 2 } - тогда вор максимум может украсть $7, обокрав дом 2.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Алфавит из всех маленьких латинских букв и пробела закодирован числами следующим способом:&lt;br /&gt;
  &#039;a&#039; -&amp;gt; 1&lt;br /&gt;
  &#039;b&#039; -&amp;gt; 2&lt;br /&gt;
  &#039;c&#039; -&amp;gt; 3&lt;br /&gt;
  ...&lt;br /&gt;
  &#039;z&#039; -&amp;gt; 26&lt;br /&gt;
  &#039; &#039; -&amp;gt; 27&lt;br /&gt;
На вход программы подается строка из цифр. Нужно посчитать, сколькими способами можно раскодировать эту строку.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Дан граф, заданный матрицей смежности. Вывести пары вершин между которыми нет пути.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Повторение (02.04) ==&lt;br /&gt;
Решали и разбирали первые 4 задачи из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14* (до 11.03)===&lt;br /&gt;
Решите любые две задачи (подпункты НЕ считаются отдельными задачами) с предыдущей пары (Повторение (30.03)).&lt;br /&gt;
&lt;br /&gt;
== Повторение (06.04) ==&lt;br /&gt;
Будем решать вторую половину задач из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 15 (до 16.04)===&lt;br /&gt;
# Приведите пример графа, который содержит отрицательные рёбра, не содержит циклов отрицательного веса и для которого алгоритм Дейкстры возвращает неверный результат.&lt;br /&gt;
# Используется ли в алгоритме Дейкстры то, что веса рёбер неотрицательны? Если &amp;quot;да&amp;quot;, то где именно?&lt;br /&gt;
# Пусть граф содержит рёбра с весами &amp;gt;= -100. Если прибавить к каждому ребру 101 и при помощи алгоритма Дейкстры найти кратчайшие пути. Будут ли эти пути кратчайшими в исходном графе? Почему?&lt;br /&gt;
&lt;br /&gt;
== Повторение (07.04) ==&lt;br /&gt;
&#039;&#039;&#039;Решение рекуррентных соотношений&#039;&#039;&#039;&lt;br /&gt;
# Решите уравнение: T(n) = 4*T(n/2) + O(n^2) с базой T(1) = O(1)&lt;br /&gt;
## Используя основную теорему.&lt;br /&gt;
## Используя дерево рекурсий.&lt;br /&gt;
## Методом подстановки.&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2)) + n является \Theta(n lg n).&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2) + 17) + n является \Theta(n lg n).&lt;br /&gt;
# Решите уравнения, считая, что T(1) = O(1):&lt;br /&gt;
## T(n) = T(n-1) + n&lt;br /&gt;
## T(n) = 2*T(floor(sqrt(n))) + lg n. Указание: попробуйте использовать замену переменных.&lt;br /&gt;
## T(n) = 3*T(sqrt(n)) + lg n&lt;br /&gt;
# Дайте верхнюю и нижнюю оценки функции T(n). Постарайтесь, чтобы оценки были как можно более точные&lt;br /&gt;
## T(n) = 4T(n/3) + n*lg(n)&lt;br /&gt;
## T(n) = 3T(n/3) + n/lg(n)&lt;br /&gt;
## T(n) = 4T(n/2) + n^2*sqrt(n)&lt;br /&gt;
## T(n) = T(n/2) + T(n/4) + T(n/8) + n&lt;br /&gt;
## T(n) = T(n-1) + 1/n&lt;br /&gt;
## T(n) = T(n-2) + 1/lg(n)&lt;br /&gt;
## T(n) = sqrt(n) * T(sqrt(n)) + n&lt;br /&gt;
&#039;&#039;&#039;Анализ и построение алгоритмов&#039;&#039;&#039;&lt;br /&gt;
# Числа Фибоначчи F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; можно выразить через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, используя матрицу: https://yadi.sk/i/Pm_aNzHCforFU. &lt;br /&gt;
## Покажите как вычислить F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;.&lt;br /&gt;
## Как вычислить F&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;n+1&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;?&lt;br /&gt;
## Напишите алгоритм.&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
## Ускорьте его так, чтобы он работал за O(log n).&lt;br /&gt;
# Дана последовательность символов. Какое минимальное количество символов нужно удалить из неё, чтобы получить палиндром?&lt;br /&gt;
## Напишите алгоритм (на псевдокоде или на любом языке программирования).&lt;br /&gt;
## Оцените время работы алгоритма.&lt;br /&gt;
# Какую структуру данных вы бы использовали для реализации упорядоченного множества (http://neerc.ifmo.ru/wiki/index.php?title=Упорядоченное_множество)? Какая будет сложность каждой из операций над множеством?&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 16 (до 20.04)===&lt;br /&gt;
# Решите 6 задач из первой части и 6 из второй. (Укажите какие именно.) Каждый из подпунктов является отдельной задачей.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм и теорема Форда-Фалкерсона (16.04)==&lt;br /&gt;
# Базовые определения (пропускные способности, сток, исток и пр.). Пример. &lt;br /&gt;
# Ограничения на поток (сохранение и что меньше пропускных способностей).&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, пример работы&lt;br /&gt;
# Разрез, определение, пример.&lt;br /&gt;
# Утверждение: максимальный поток &amp;lt;= любого разреза.&lt;br /&gt;
# Теорема Форда-Фалкерсона (с доказательством).&lt;br /&gt;
# Пример на котором алгоритм Форда-Фалкерсонаработает работает очень долго при неудачном выборе путей.&lt;br /&gt;
# Сложность алгоритма Форда-Фалкерсона.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №3==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
В [https://official.contest.yandex.ru/contest/1196 домашнем задании] пять задач. Они разделены на два варианта, помеченные римскими цифрами I и II. Свой вариант нужно узнать [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing здесь на вкладке HW3]. Третья задача — общая для двух вариантов; ее решение необходимо снабдить доказательством корректности алгоритма. На выполнение задания дается примерно 2 недели (см. точное время окончания в контесте). Каждую задачу можно написать на С++ или Python.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Форда-Фалкерсона и Эдмондса-Карпа (20.04)==&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, напоминание: базовые определения, пример работы, пример на котором алгоритм работает долго, сложность.&lt;br /&gt;
# Алгоритм Эдмодса-Карпа. Доказательство асимптотики времени работы.&lt;br /&gt;
&lt;br /&gt;
==(23.04)==&lt;br /&gt;
&lt;br /&gt;
==(11.05) Красно-чёрные деревья==&lt;br /&gt;
[https://ru.wikipedia.org/wiki/Красно-чёрное_дерево Красно-чёрное дерево]&lt;br /&gt;
===Домашнее задание 17 (до 18.05)===&lt;br /&gt;
# Зачем нужны красно-чёрные деревья?&lt;br /&gt;
# Благодаря какому свойству и почему красно-чёрное дерево является сбалансированным?&lt;br /&gt;
# Нарисуйте полное бинарное дерево поиска высотой 3 с ключами {1, 2, ..., 15}. Сделайте из него красно-чёрные деревья высотой 2, 3 и 4.&lt;br /&gt;
# Нарисуйте красно-чёрные деревья, получающиеся последовательной вставкой элементов 12, 10, 29, 30, 31, 32 в [https://ru.wikipedia.org/wiki/Красно-чёрное_дерево#/media/File:Red-black_tree_example.svg данное дерево]. Для вставки используйте алгоритм вставки из Википедии. Укажите какой именно функцией вы воспользовались.&lt;br /&gt;
# Определим &#039;&#039;&#039;ослабленное красно-чёрное дерево&#039;&#039;&#039; как бинарное дерево поиска, которое удовлетворяет красно-чёрным свойствам 1, 3, 4 и 5. Другими словами, корень может быть как чёрным, так и красным. Рассмотрите ослабленное красно-чёрное дерево T, корень которого красный. Если перекрасить корень дерева T в чёрный, будет ли оно красно-чёрным деревом?&lt;br /&gt;
# Покажите, что самый длинный простой нисходящий путь от вершины x к листу красно-черного дерева имеет длину, не более чем в два раза превышающую кратчайший путь от x к листу-потомку.&lt;br /&gt;
# Чему равно наибольшее возможное количество внутренних узлов в красно-чёрном дереве с чёрной высоты k? А наименьшее возможное количество?&lt;br /&gt;
# Нарисуйте красно-чёрные деревья, получающиеся последовательной вставкой ключей 41, 38, 31, 12, 19, 8 в изначально пустое дерево.&lt;br /&gt;
# Покажите какие деревья будут получаться в результате последовательного удаления ключей в порядке 8, 12, 19, 31, 38, 41.&lt;br /&gt;
&lt;br /&gt;
==(14.05) Конкурентный анализ самоорганизующихся циклов==&lt;br /&gt;
[https://vk.com/doc12518218_390369758 Лекция]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 18 (до 21.05)===&lt;br /&gt;
Все вычисления сопроводите подробными объяснениями о том, почему верно то или иное (не)равенство.&lt;br /&gt;
# Пусть имеется n-элементный список и m поисковых запросов к нему. После каждой операции поиска можно переупорядочить список. Обозначим стоимость последовательности поисков через C. Докажите, что в худшем случае C = Ω(mn).&lt;br /&gt;
#  Обозначим через c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; стоимость i-ого поискового запроса с применением эвристики перемещения в начало, которая включает стоимость поиска элемента в списке и стоимость его перемещения в начало списка путём ряда обменов соседних элементов списка. Покажите, что i-ая операция поиска находит элемент x в списке L с применением эвристики перемещения в начало, то c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = 2 * rank&amp;lt;sub&amp;gt;L&amp;lt;/sub&amp;gt;(x) - 1.&lt;br /&gt;
# Покажите, что c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = 2 * rank&amp;lt;sub&amp;gt;L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) - 1.&lt;br /&gt;
# Покажите, что c*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = rank&amp;lt;sub&amp;gt;L*&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) + t&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;.&lt;br /&gt;
# Докажите, что после одного обмена двух соседних элементов потенциал либо увеличивается на 2, либо уменьшается на 2.&lt;br /&gt;
# Докажите, что rank&amp;lt;sub&amp;gt;L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) = |A| + |B| + 1.&lt;br /&gt;
# Докажите, что rank&amp;lt;sub&amp;gt;L*&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) = |A| + |С| + 1.&lt;br /&gt;
# Покажите, что поиск i-ого элемента приводит к изменению потенциала Ф(L&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;) - Ф(L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;) &amp;lt;= 2 (|A| - |B| + t*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;), где t*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; --- это количество обменов при i-ом поиске.&lt;br /&gt;
# Во сколько раз стоимость С&amp;lt;sub&amp;gt;MFT&amp;lt;/sub&amp;gt;(S) превышает C&amp;lt;sub&amp;gt;OPT&amp;lt;/sub&amp;gt;(S)?&lt;br /&gt;
&lt;br /&gt;
== (18.05) Конечные автоматы ==&lt;br /&gt;
=== Задание 19 (до 25.05) ===&lt;br /&gt;
# Постройте автомат для языка над алфавитом Σ = {0, 1} каждое слово которого содержит хотя бы два нуля. Является ли он детерминированным?&lt;br /&gt;
# Постройте автомат над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5. Является ли он детерминированным?&lt;br /&gt;
# Постройте автомат, который допускает пустой язык (язык в котором нет ни одного слова).&lt;br /&gt;
# Постройте автомат, который допускает все слова над алфавитом Σ.&lt;br /&gt;
# Постройте ДКА над алфавитом Σ = {К, Ж, З}, который допускает слова в которых после К идёт З, после З --- Ж, после Ж --- К.&lt;br /&gt;
# * Постройте ДКА над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5, а число нулей на 3.&lt;br /&gt;
# Постройте НКА для языка над алфавитом Σ = {0, 1, 2, 3}, состоящий из слов, в которых хотя бы одна из последних пяти букв является 1.&lt;br /&gt;
# Постройте НКА над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5, а число нулей на 3.&lt;br /&gt;
# Какие языки допускают автоматы https://yadi.sk/d/fNAHbjCZghERG?&lt;br /&gt;
# Для каждого из автоматов https://yadi.sk/d/fNAHbjCZghERG постройте соответствующий ему ДКА.&lt;br /&gt;
&lt;br /&gt;
== (21.05) Регулярные выражения, КА, их эквивалентность. Лемма о накачке  ==&lt;br /&gt;
=== Задание 20 (до 28.05) ===&lt;br /&gt;
&#039;&#039;&#039;I Написать регулярные выражения&#039;&#039;&#039;&lt;br /&gt;
# Напишите регулярное выражение для языка над алфавитом Σ = {0, 1} каждое слово которого содержит хотя бы два нуля.&lt;br /&gt;
# Напишите регулярное выражение над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5.&lt;br /&gt;
# Напишите регулярное выражение, которое допускает пустой язык (язык в котором нет ни одного слова).&lt;br /&gt;
# Напишите регулярное выражение, которое допускает все слова над алфавитом Σ.&lt;br /&gt;
# Напишите регулярное выражение для языка над алфавитом Σ = {0, 1, 2, 3}, состоящий из слов, в которых хотя бы одна из последних пяти букв является 1.&lt;br /&gt;
&#039;&#039;&#039;II КА и регулярные выражения&#039;&#039;&#039;&lt;br /&gt;
# Постройте конечный автомат для языка (111 U 01)&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;1(00 U 11)&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;.&lt;br /&gt;
# Постройте конечный автомат для языка (ab)&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;(a U b)(b U a)&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;(a U bab).&lt;br /&gt;
&#039;&#039;&#039;III Доказать замкнутость относительно различных операций&#039;&#039;&#039;&lt;br /&gt;
# Покажите, что если для языков L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; и L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; существует КА, который их читает, то существует КА и для их объединения L = {w | w ∈ L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; или w ∈ L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;}.&lt;br /&gt;
# Покажите, что если для языка L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; и L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; существует КА, который их читает, то существует КА и для языка L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; = {xy | x ∈ L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, y ∈ L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;}.&lt;br /&gt;
# Покажите, что если для языка L существует КА, который его читает, то существует КА и для &#039;&#039;&#039;замыкания Клини&#039;&#039;&#039; L* = {w&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; w&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; ... w&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;| w&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; ∈ L, w&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; ∈ L, ..., w&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; ∈ L}.&lt;br /&gt;
# Покажите, что если язык L регулярен, то регулярно его дополнение (т.е. язык над тем же алфавитом, которому принадлежит слово тогда и только тогда, когда оно НЕ принадлежит L) .&lt;br /&gt;
# Покажите, что если язык L регулярен, то регулярно его обращение L&amp;lt;sub&amp;gt;R&amp;lt;/sub&amp;gt; = {a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; . . . a&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; | a&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; . . . a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; ∈ L}. (L&amp;lt;sub&amp;gt;R&amp;lt;/sub&amp;gt; --- это язык в котором все слова языка L записаны наоборот.)&lt;br /&gt;
# * Покажите, что если языки L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; и L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; регулярны, то регулярно их пересечение.&lt;br /&gt;
&#039;&#039;&#039;IV Использование леммы о накачке&#039;&#039;&#039; (см. [https://vk.com/doc12518218_392750846 конспект])&lt;br /&gt;
# Докажите, что не существует КА, который бы читал язык {0&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;1&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;2&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;}. (Пояснение: запись 0&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; означает строку из n нулей: 00...0.)&lt;br /&gt;
# Докажите, что не существует КА, который бы читал язык {0&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;1&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;}.&lt;br /&gt;
# Докажите, что не существует КА, который бы читал язык {0&amp;lt;sup&amp;gt;n!&amp;lt;/sup&amp;gt;}.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== (25.05) Автоматный подход ==&lt;br /&gt;
=== Задание 21 (до 01.06) ===&lt;br /&gt;
Реализуйте один из следующих проектов:&lt;br /&gt;
# Программа, которая считывает строку и говорит принадлежит ли она языку 0(123)*(00 U (231)*) U 111.&lt;br /&gt;
# Программа, которая считывает КА и генерирует программу на языке С++, которая говорит принадлежит ли заданное слово языку, описываемому этим КА.&lt;br /&gt;
# Программа, которая считывает регулярное выражение и строку и говорит принадлежит ли слово языку, описываемому этим регулярным выражением.&lt;br /&gt;
# Программа, которая моделирует работу банкомата, автомата с газировкой, лифта... (что-то одно на выбор)&lt;br /&gt;
# Текстовый симулятор студента. Возможные состояния: на паре, дома, есть приглашение прогулять, завтра коллоквиум, сплю и др. Есть два параметра: успеваемость и весёлось. Если хотя бы один из них упадёт ниже критической отметки, студент умрёт. Игрок принимает решение куда идти студенту. Цель: продержаться как можно дольше.&lt;br /&gt;
&lt;br /&gt;
== Большое домашнее задание 4 ==&lt;br /&gt;
[https://official.contest.yandex.ru/contest/1259 Контест]. В домашнем задании четыре задачи. Обязательны первые три. Вместо одной из первых трёх можно сделать последнюю (только для первых 10 решивших 4-ую!). На выполнение задания даётся примерно 2 недели (см. точное время окончания в контесте). Условия ревью определяют семинаристы.&lt;/div&gt;</summary>
		<author><name>Kassalanche</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=15488</id>
		<title>Алгоритмы и структуры данных. Подгруппа 105-1</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=15488"/>
		<updated>2015-05-26T08:39:56Z</updated>

		<summary type="html">&lt;p&gt;Kassalanche: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==О курсе==&lt;br /&gt;
[[Алгоритмы_и_структуры_данных|План лекций и список рекомендуемой литературы.]]&lt;br /&gt;
&lt;br /&gt;
[[Алгоритмы_и_структуры_данных._Подгруппа_105-1._FAQ|FAQ.]]&lt;br /&gt;
&lt;br /&gt;
[[Reviewboard|Инструкция по использованию Reviewboard.]]&lt;br /&gt;
&lt;br /&gt;
[[Практические_занятия_по_курсу_ОиМП/C++_check|Style guide.]]&lt;br /&gt;
&lt;br /&gt;
==Итоговая оценка за курс==&lt;br /&gt;
Итоговая оценка (ИО) зависит от&lt;br /&gt;
* оценок за пять больших домашних заданий (БДЗ1, БДЗ2, ..., БДЗ5),&lt;br /&gt;
* оценок за домашние задания (ДЗ1, ДЗ2, ...),&lt;br /&gt;
* оценки за контрольную работу (КР),&lt;br /&gt;
* оценки за экзамен (ЭКЗ),&lt;br /&gt;
и может быть вычислена по формуле:&lt;br /&gt;
 ИО = 0.7 * (0.3 * КР + 0.7 *(ИДЗ1 + ИДЗ2 + ИДЗ3 + ИДЗ4 + ИДЗ5)/5) + 0.3 * ЭКЗ =&lt;br /&gt;
    = 0.21*КР + 0.098*ИДЗ1 + 0.098*ИДЗ2 + 0.098*ИДЗ3 + 0.098*ИДЗ4 + 0.098*ИДЗ5 + 0.3*ЭКЗ,&lt;br /&gt;
где&lt;br /&gt;
 ИДЗi = min (10, 0.7 * БДЗi + 0.4 * &amp;lt;cредняя оценка за ДЗj, прошедшие с предыдущего БДЗ по i-ое&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
==Порядок сдачи домашних работ==&lt;br /&gt;
===Большие домашние работы===&lt;br /&gt;
# Получить OK за задачу в контесте.&lt;br /&gt;
# Залить исходный код на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* На каждую задачу создавайте отдельный запрос на ревью. &lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении суток приходят замечания к коду. &#039;&#039;&#039;Если в течении суток замечаний или Ship It не появилось, проверьте, что вы правильно отправили запрос и, если всё сделано правильно, спросите у семинариста получил ли он запрос.&#039;&#039;&#039;&lt;br /&gt;
# Вы их исправляете, проверяете в контесте, что программа по-прежнему проходит все тесты, заливаете новую версию в Review Board. Штрафов за посылки НЕ будет.&lt;br /&gt;
# Процесс повторяется пока остаются замечания к коду или пока не истёк дедлайн. После закрытия контеста будут ещё одни сутки на доработку замечаний в Review Board.&lt;br /&gt;
# Оценивается только последняя версия работы в Review Board.&lt;br /&gt;
&lt;br /&gt;
===Маленькие домашние работы===&lt;br /&gt;
# Залить решение на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* Желаемые форматы: txt, py, cpp, h. Допускаются любые другие.&lt;br /&gt;
#* На каждую домашнюю работу создавайте отдельный запрос на ревью. Обязательно указывайте номер домашней работы.&lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении неопределенного промежутка времени придут оценки по каждому из заданий.&lt;br /&gt;
&lt;br /&gt;
==Оценивание домашних работ==&lt;br /&gt;
* Все задания предполагаются индивидуальными. Запрещены любые заимствования без ссылки на автора.&lt;br /&gt;
* Решения после установленного дедлайна не принимаются. Дедлайн указан в заголовке каждого задания.&lt;br /&gt;
* Везде, где требуется написать алгоритм, можно использовать любой язык программирования или псевдокод.&lt;br /&gt;
* Там, где требуется построить алгоритм с заданной асимптотикой, приведите обоснование, что полученный алгоритм удовлетворяет этому условию.&lt;br /&gt;
* Эти правила не действуют, если в задании явно оговорено иное.&lt;br /&gt;
&lt;br /&gt;
==Мотивация к изучению алгоритмов. Подсчёт числа операций (12.01)==&lt;br /&gt;
# Числа Фибоначчи. Определение. Примитивный рекурсивный алгоритм вычисления i-ого числа. Оценка числа операций. Анализ причин неэффективности. Алгоритм с запоминанием вычисленных ранее значений. Оценка числа операций. Сравнение с предыдущим. (подробнее: глава 0, страницы 8-10 из книги &amp;lt;&amp;lt;Алгоритмы&amp;gt;&amp;gt;, [[Алгоритмы_и_структуры_данных|см. список рекомендованной литературы]])&lt;br /&gt;
# Задача о ханойской башне. Постановка задачи. Рекурсивный алгоритм. Рекуррентная формула для числа перемещений. Замкнутая формула для числа перемещений (+ доказательство). Доказательство того, что эту задачу нельзя решить используя меньшее число перемещений дисков. ([https://www.dropbox.com/s/t8cbs7ttu4iasvj/algo-0-recursion.pdf?dl=0 Разбор задачи о ханойской башне], автор Сергей Объедков)&lt;br /&gt;
# Сортировка пузырьком. Алгоритм. Подсчёт количество операций сравнения и обмена (swap). Анализ наилучшего и наихудшего случаев ([https://ru.wikipedia.org/wiki/Сортировка_пузырьком Википедия])&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 1 (12.01 - 26.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
Во всех задачах, если не оговорено иного, предполагаем, что работаем с целыми неотрицательными числами. Для первых 7 задач необходимо&lt;br /&gt;
* описать что можно считать наилучшим и наихудшим случаями,&lt;br /&gt;
* для каждого из двух случаев подсчитать отдельно количество операций сравнения и swap (если есть).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Даны три числа, требуется вернуть наименьшее.&lt;br /&gt;
# Даны три числа, требуется отсортировать их.&lt;br /&gt;
# Дана последовательность A из n элементов и число x, требуется найти элемент равный x. Примечание: если таких значений i несколько, вернуть любое; если такого элемента нет, функция должна сообщить об этом.&lt;br /&gt;
# * Дана упорядоченная последовательность A из n элементов и число x, требуется найти такое i, что A[i] равно x. Алгоритм должен быть эффективней, чем в предыдущем пункте и использовать то, что последовательность упорядочена.&lt;br /&gt;
# Дана последовательность из 100 000 чисел от 0 до 100. Напишите эффективный алгоритм сортировки, который бы учитывал специфику входных данных.&lt;br /&gt;
# * Дано 32 битное неотрицательное число. Требуется номер первого ненулевого бит. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения, считая, что числа распределены равномерно.&lt;br /&gt;
# * Даны 32 битные неотрицательные числа m и n. Требуется вывести True, если m &amp;lt; n, иначе False. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения битов, считая, что числа распределены равномерно.&lt;br /&gt;
# Напишите рекурсивную функцию, вычисляющую n-ое число Фибоначчи (как на занятии). Подсчитайте количество рекурсивных вызовов.&lt;br /&gt;
# * Напишите функцию, вычисляющую n-ое число Фибоначчи, у которой число операций — полином от n, и которая использует количество памяти, независящее от n.&lt;br /&gt;
&lt;br /&gt;
==O-символика и стратегия &amp;quot;разделяй и властвуй&amp;quot; (15.01)==&lt;br /&gt;
# Сортировка слиянием. Алгоритм, рекуррентное соотношение для времени сортировки, сложность. Подробнее: [https://dl.dropboxusercontent.com/u/829163/draft.pdf §2.3 Сортировка слиянием (стр. 54)].&lt;br /&gt;
# О-символика. [https://dl.dropboxusercontent.com/u/829163/draft.pdf §0.3 О-символика (стр. 10)].&lt;br /&gt;
# Задача о слиянии m упорядоченных массивов по n элементов. Три алгоритма решения: последовательное слияние, слияние &amp;quot;деревом&amp;quot; (обе функции используют Merge из MergeSort), аналог Merge для m массивов. Анализ сложности каждого из них.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 2 (15.01-29.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
* Во всех задачах, если не оговорено иного, для простоты &#039;&#039;можно&#039;&#039; считать, что n является степенью какого-либо числа, например, степенью двойки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Дана функция F, определённая ниже. Сколько строк она напечатает? Указание: для обоих подпунктов рассмотрите два случая: 1. n является степенью двойки, 2. n не является степенью двойки.&lt;br /&gt;
## Запишите рекуррентное соотношение для числа строк.&lt;br /&gt;
## Решите уравнение, полученное в предыдущем пункте, то есть, выведите замкнутую (нерекуррентную формулу). Для простоты можно считать, что n является степенью двойки.&lt;br /&gt;
# В массиве A размера n записана возрастающая последовательность целых чисел. Постройте алгоритм типа &amp;quot;разделяй и властвуй&amp;quot;, который проверяет, существует ли такой индекс i, что A[i] = i&lt;br /&gt;
## за время O(n),&lt;br /&gt;
## * за время O(log n).&lt;br /&gt;
## Какие случаи для вашего алгоритма являются наихудшими и наилучшими? Какого время работы в лучшем и худшем случаях?&lt;br /&gt;
# Дан бесконечный массив A, первые n элементов которого содержат возрастающую последовательность положительных чисел, а дальше стоят -1. Значение n не дано. Постройте алгоритм, который получает на вход целое число x и находит это x в массиве --- или говорит, что там его нет, &lt;br /&gt;
## за время O(n),&lt;br /&gt;
## за время O(log n).&lt;br /&gt;
# Рассмотрим алгоритм вычисления наибольшего общего делителя (НОД) двух положительных чисел, основанный на методе &amp;quot;разделяй и властвуй&amp;quot;.&lt;br /&gt;
## (задание не оценивается) Прочитайте [https://dl.dropboxusercontent.com/u/829163/draft.pdf §1.2.3 Алгоритм Евклида (стр. 23)].&lt;br /&gt;
## * Докажите, что определение НОД-а, приведённое ниже, корректно.&lt;br /&gt;
## Постройте алгоритм, основанный на этом определении.&lt;br /&gt;
## Какой алгоритм будет быстрее для n-битовых чисел a и b при больших значениях n --- ваш или алгоритм Евклида?&lt;br /&gt;
# * Покажите как за время O(n log n) удалить из массива размера n все дубликаты, то есть оставить каждый элемент в одном экземпляре.&lt;br /&gt;
# * Даны два упорядоченных массива размера m и n. Постройте алгоритм, находящий k-й по величине элемент в объединении этих массивов за время O(log(n+m)). &lt;br /&gt;
&lt;br /&gt;
Функция F(n).&lt;br /&gt;
  если n &amp;gt; 1:&lt;br /&gt;
    напечатать &amp;quot;всё ещё работаю&amp;quot;&lt;br /&gt;
    F(n/2)&lt;br /&gt;
    F(n/2)&lt;br /&gt;
&lt;br /&gt;
Определение НОД-а.&lt;br /&gt;
             2НОД(a/2, b/2), если а и b чётны,&lt;br /&gt;
  НОД(a,b) = НОД(a, b/2), если а нечётно, b чётно,&lt;br /&gt;
             НОД((a-b)/2, b), если а и b нечётны.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;lt;nowiki&amp;gt;Задачи взяты из книги &amp;quot;Алгоритмы&amp;quot;, глава 2 (см. список рекомендованной литературы).&amp;lt;/nowiki&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Сложение и умножение (19.01)==&lt;br /&gt;
# Алгоритм сложения, его сложность (§1.1.1 Сложение*)&lt;br /&gt;
# &amp;quot;Школьный&amp;quot; алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Рекурсивный алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Алгоритм умножения, реализующий стратегию &amp;quot;разделяй и властвуй&amp;quot;, анализ сложности (§2.1 Умножение чисел*)&lt;br /&gt;
 * [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать.]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 3 (19.01 - 2.02)===&lt;br /&gt;
* Во всех задачах для простоты можно считать, что n является степенью какого-либо числа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Найдите произведение чисел 10011011 и 10111010 (в двоичной системе счисления), используя алгоритм умножения чисел, основанный на методе «разделяй и властвуй». Необходимо не только дать ответ, но и привести ход решения.&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 3 рекурсивных вызова для подзадач размера n-1 и комбинирует из них решение исходной задачи за О(n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте три верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 10 рекурсивных вызовов для подзадач размера n/2 и комбинирует из них решение исходной задачи за О(5n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте два верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Докажите, что 3m² + m = O(m²).&lt;br /&gt;
# Докажите, что lg m = O(m/1000), где lg m — это логарифм с двоичным основанием.&lt;br /&gt;
# Докажите, что из равенства f(n) = O(g(n)) не следует, что g(n) = O(f(n)).&lt;br /&gt;
# Докажите, что O(m) содержится в O(m²).&lt;br /&gt;
&lt;br /&gt;
==Решение рекуррентных уравнений (22.01)==&lt;br /&gt;
# Примеры решений рекуррентных уравнений (см. [https://www.dropbox.com/s/6a0r410zjm9qwe7/algo-3-recurrences.pdf?dl=0 конспект]).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 4 (до 14.02)===&lt;br /&gt;
* Нельзя использовать утверждение основной теоремы о решении рекуррентных соотношений.&lt;br /&gt;
* &#039;&#039;Можно&#039;&#039; использовать метод построения дерева рекурсии или подстановку (метод с угадыванием ответа).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Какой из трёх приведённых ниже алгоритмов вы бы предпочли? Обоснуйте свой ответ.&lt;br /&gt;
#* Алгоритм A, решая задачу, производит пять рекурсивных вызовов для подзадач вдвое меньшего размера, после чего строит ответ для исходной задачи за линейное время.&lt;br /&gt;
#* Алгоритм B, решая задачу размера n, делает два рекурсивных вызова для задач размера n − 1, после чего находит ответ за время O(1).&lt;br /&gt;
#* Алгоритм C, решая задачу размера n, рекурсивно решает девять задач размера n/3 и строит ответ за время O(n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Найдите T(n) в замкнутой форме для любых 7 из 10 приведённых ниже рекуррентных соотношений:&lt;br /&gt;
## T(n) ≤ 2T(n/3) + 1;&lt;br /&gt;
## T(n) ≤ 7T(n/7) + n;&lt;br /&gt;
## T(n) ≤ 9T(n/3) + n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 8T(n/2) + n&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 49T(n/25) + n&amp;lt;sup&amp;gt;3/2&amp;lt;/sup&amp;gt;log n;&lt;br /&gt;
## T(n) ≤ T(n − 1) + 2;&lt;br /&gt;
## T(n) ≤ T(n − 1) + n&amp;lt;sup&amp;gt;c&amp;lt;/sup&amp;gt;, где c ≥ 1 –– константа;&lt;br /&gt;
## T(n) ≤ T(n − 1) + c&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;, где c &amp;gt; 1 –– константа;&lt;br /&gt;
## T(n) ≤ 2T(n − 1) + 1;&lt;br /&gt;
## T(n) ≤ T(sqrt(n)) + 1.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №1==&lt;br /&gt;
Необходимо реализовать все 6 задач из [https://official.contest.yandex.ru/contest/1002 контеста]. Каждую задачу можно писать на С++ или Python. На выполнение работы отводится две недели. Каждая задача оценивается в 10/6 балла. Оценка &#039;&#039;может&#039;&#039; быть снижена за плохой код, но не более чем на 25%.&lt;br /&gt;
&lt;br /&gt;
==Бинарное дерево поиска (26.01)==&lt;br /&gt;
# Определение. Пример.&lt;br /&gt;
# Не модифицирующие алгоритмы: поиск (рекурсивный и итеративный алгоритмы), поиск минимума, inordered обход (вывод значений узлов в отсортированном порядке), поиск следующего по возрастанию.&lt;br /&gt;
# Модифицирующие алгоритмы: вставка (рекурсивная реализация), удаление (только идея).&lt;br /&gt;
 [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 13, стр. 248]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 5 (до 16.02)===&lt;br /&gt;
* Для получения максимальной оценки можно выполнить или все задачи без звёздочки, или задачу со звёздочкой. Преподаватель понимает, что реализацию БДП сложно не найти в интернете, но от копипасты не будет никакой пользы. Напротив, самостоятельная реализация очень полезна и приветствуется, даже если не получится выполнить всех пунктов задания.&lt;br /&gt;
* Задачи с двумя звёздочками необязательны.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Нарисуйте бинарные деревья поиска высотой 2, 3, 4, 5 и 6 для множества ключей {1, 4, 5, 10, 16, 17, 21}. Корень дерева имеет высоту 0.&lt;br /&gt;
# &#039;&#039;&#039;Сортировка с использованием БДП.&#039;&#039;&#039;&lt;br /&gt;
## Какова асимптотическая сложность алгоритма вставки элемента в дерево высоты d? Почему? Назовите наилучший и наиухдший случаи.&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который строит БДП в узлах которого стоят элементы данной последовательности. Можно использовать функцию Insert. Назовите наилучший и наихудший случаи. Есть теорема о том, что полученный алгоритм будет работать в среднем случае за время O(n * log n).&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который выводит их в порядке возрастания. Используйте бинарное дерево поиска. Какова в среднем случае сложность этого алгоритма? Назовите наилучший и наихудший случаи. Какова сложность в наихудшем случае?&lt;br /&gt;
# Напишите функцию GetRoot, которой на вход подаётся указатель на произвольный узел дерева, а она возвращает указатель на корень.&lt;br /&gt;
# Напишите процедуру PrintLeafs, которой на вход подаётся указатель на корень дерева, и она печатает листья дерева&lt;br /&gt;
## по возрастанию,&lt;br /&gt;
## по убыванию.&lt;br /&gt;
# ** Альтернативный обход в порядке возрастания бинарного дерева поиска с n узлами (или центрированный (inordered) обход) можно осуществить путём поиска минимального элемента дерева с помощью функции Minimum с последующий n-1 вызовом функции Next. Каково время работы такого алгоритма?&lt;br /&gt;
# * Реализуйте на С++ структуру данных бинарное дерево поиска, [https://yadi.sk/i/gi2SEStreFfSb используя заготовку].&lt;br /&gt;
## Нарисуйте бинарное дерево поиска, которое строится в функции getTreeExample.&lt;br /&gt;
## Реализуйте следующие алгоритмы: &lt;br /&gt;
### поиск минимума, &lt;br /&gt;
### inordered обход (вывод значений узлов в отсортированном порядке),&lt;br /&gt;
### поиск следующего по возрастанию,&lt;br /&gt;
### вставка элемента в дерево,&lt;br /&gt;
### сортировка последовательности с использованием БДП (дан вектор чисел, необходимо вывести их по возрастанию),&lt;br /&gt;
### ** удаление.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Карацубы, Штрассена. Быстрая сортировка (29.01)==&lt;br /&gt;
# Алгоритм Карацубы.&lt;br /&gt;
# Алгоритм Штрассена. [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать Дасгупту и др., §2.5 Умножение матриц]&lt;br /&gt;
# Быстрая сортировка и доказательство того, что в среднем случае она работает за О(n * log n). [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 8 Быстрая сортировка, стр. 148]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 6 (до 18.02)===&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Пусть мы хотим найти двоичное представление десятичного числа 10&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;. Будем считать, что n --- степень двойки (n = 2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt;).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Pwr2Bin(n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть 1010&lt;br /&gt;
    z = ...&lt;br /&gt;
    вернуть Multiply(z, z)&amp;lt;/source&amp;gt;&lt;br /&gt;
Multiply --- функция, перемножающая два n-битовых двоичных числа x и y по алгоритму Карацубы за O(n&amp;lt;sup&amp;gt;log&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;3&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Пусть мы хотим перевести произвольное десятичное число x в записи которого n=2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; чисел в двоичную систему счисления.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Dec2Bin(x, n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть binary[x]&lt;br /&gt;
    разделить x на два десятичных числа xl и xr из n/2 цифр.&lt;br /&gt;
    вернуть ...&amp;lt;/source&amp;gt;&lt;br /&gt;
Здесь binary --- это массив, содержащий двоичное представление десятичных цифр.&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Докажите, что математическое ожидание времени работы алгоритма быстрой сортировки (усреднение по всем вариантам выбора опорного элемента) на любом входе размера n удовлетворяет соотношению: T(n) ≤ O(n) + 1/n * &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt; (T(i-1) + T(n-i)).&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Найдите решение соотношения из предыдущего пункта.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Динамическое программирование (ДП). Первые примеры (02.01)==&lt;br /&gt;
# Нахождение самой длинной возрастающей подпоследовательности.&lt;br /&gt;
# Нахождение редакционного расстояния (или редакционной стоимости, расстояния Левенштейна).&lt;br /&gt;
# Нахождение представителя большинства.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 7 (до 20.02)===&lt;br /&gt;
* В этом задании везде, где требуется реализовать алгоритм, необходимо привести код на любом языке программирования.&lt;br /&gt;
* Для получения максимальной оценки нужно решить все задачи без звёздочек. Одна решённая задача со звёздочкой заменяет одну задачу без звёздочки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения редакционного расстояния (алгоритм Вагнера — Фишера). Например, редакционное расстояние между словами &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равно 6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения длины наибольшей общей подстроки. Например, длина наибольшей общей подстроки &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равна 8 (&amp;quot;antholog&amp;quot;). Чем больше это значение, тем схожей строки.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Предположим теперь, что сравниваемые строки состоят из символов A, С, G и T; за удаление или вставку мы платим -5; за замену буквы x на y платим w[x, y], где x, y принадлежат множеству {A, С, G, T}, a w — это матрица весов:&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
!-!! A!! G!! C!! T&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! A&lt;br /&gt;
|10||-1||-3||-4&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
!G&lt;br /&gt;
||-1||7||-5||-3&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! C&lt;br /&gt;
||-3||-5||9||0&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! T&lt;br /&gt;
||-4||-3||0||8&lt;br /&gt;
|}&lt;br /&gt;
Тогда выравнивание:&lt;br /&gt;
 AGACTAGTTAC&lt;br /&gt;
 CGA‒‒‒GACGT&lt;br /&gt;
будет иметь следующую оценку:&lt;br /&gt;
 w[A,C] + w[G,G] + w[A,A] + 3*(-5) + w[G,G] + w[T,A] + w[T,C] + w[A,G] + w[C,T] = -3 + 7 + 10 - 3*5 + 7 + (-4) + 0 + (-1) + 0 = 1.&lt;br /&gt;
&lt;br /&gt;
Напишите алгоритм, который находит максимальную стоимость всех возможных выравниваний. Верно ли, что чем больше это значение, тем непохожей строки?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как давно один народ отделился от другого? Кто похожей — итальянец и китаец или якут и эфиоп? На эти вопросы можно отвечать с разных точек зрения — культурной, исторической, лингвистической, ... В последние же годы человечество научилось секвенировать геном, что позволило исследовать этот вопрос с точки зрения генетики. Секвенирование генома — это процесс записи ДНК в виде нуклеотидной последовательности, которая представляет собой последовательность из четырёх символов — A, С, G и T. Существуют базы, которые хранят генетическую информацию о людях из разных стран и континентов, например, [http://www.mtdb.igp.uu.se/ http://www.mtdb.igp.uu.se/ → Download mtDNA sequences]. Чем больше сходство между геномами, тем сильнее родственные связи между их обладателями. Используя решение предыдущего пункта, выполните задания:&lt;br /&gt;
# Определите, кто похожей — итальянец и китаец или якут и эфиоп?&lt;br /&gt;
# Найдите нескольких похожих и нескольких непохожих народностей.&lt;br /&gt;
# * Выберите одну народность. Найдите самых похожих и самых непохожих на неё.&lt;br /&gt;
# * Найдите самые похожие и самые непохожие народности.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Задача о разрезании стержня (05.01)==&lt;br /&gt;
# Постановка задачи.&lt;br /&gt;
# Решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Решение с нахождением максимума по p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Восходящий алгоритм с запоминанием. Вывод длин кусочков стержня. Оценка сложности.&lt;br /&gt;
# Нисходящий алгоритм с запоминанием. Оценка сложности.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.1 Разрезание стержня, стр. 393]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 8 (до 22.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Решая задачу о разрезании стержня мы вначале построили рекурсивное решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt; для всех 1 ≤ i &amp;lt; n. Его сложность описывалась рекуррентной формулой T(n) = n + &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n-1&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt;(T(i) + T(n-i)), T(1) = 1.&lt;br /&gt;
# Объясните эту формулу.&lt;br /&gt;
# Покажите с помощью метода подстановок, что T(n) ≤ 2&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Покажите с помощью контрпримера, что описанная далее жадная стратегия не всегда определяет оптимальный способ разрезания стержня. Определим плотность стержня длиной i как p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;/i, то есть как стоимость единицы его длины. Жадная стратегия для стержня длиной n отрезает от стержня первую часть длиной i, где 1 ≤ i ≤ n, имеющую максимальную плотность. Затем та же жадная стратегия применяется к оставшейся части длиной n-i.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Рассмотрим модификацию задачи разрезания стержня, в которой в дополнение к цене p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; каждого стержня добавляется фиксированная цена разреза c. Теперь прибыль, связанная с решением, представляет собой сумму цен частей стержня минус стоимость разрезов. Разработайте алгоритм динамического программирования для этой модифицированной задачи.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Непрерывным участком называется группа подряд идущих элементов. Например, для последовательности&lt;br /&gt;
 5, 15, −30, 10, −5, 40, 10&lt;br /&gt;
элементы 15, −30, 10 образуют непрерывный участок, а 5, 15, 40 -- нет. Постройте линейный алгоритм для следующей задачи:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Вход: список чисел a1, a2, ... ‌, an.&lt;br /&gt;
Выход: непрерывный участок с максимальной суммой (сумма участка нулевой длины равна нулю).&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Для приведённого примера ответом будет 10, −5, 40, 10 с суммой 55. Какова сложность алгоритма? Почему?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Надо заплатить v рублей, имея купюры в x1, x2, ‌..., xn рублей (купюр каждого типа сколько угодно). Это не всегда возможно (скажем, купюрами в&lt;br /&gt;
10 и 25 рублей можно заплатить 45 рублей, но не 47 и не 15). Постройте основанный на методе динамического программирования алгоритм со временем работы O(nv), выясняющий, возможна ли уплата.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как решить предыдущую задачу, если каждая купюра имеется в единственном экземпляре? (Например, купюрами в 1, 5, 10, 20 рублей можно заплатить 16 = 1 + 5 + 10 и 31 = 1 + 10 + 20 рублей, но не 40 (не хватит денег). Время работы алгоритма по-прежнему O(nv).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Ещё один вариант той же задачи: купюр каждого типа сколько угодно, но всего разрешается использовать не более k купюр. (Например, если есть купюры в 5 и 10 рублей, а k = 6, то 55 разменять можно, а 65 –– нет).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Перемножение цепочки матриц. Оптимальное бинарное дерево поиска (начало) (09.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о перемножении цепочки матриц. Постановка задачи.Пример. Нисходящий алгоритм.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.2 Перемножение цепочки матриц, стр. 403]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 9 (до 24.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Найдите оптимальную расстановку скобок в произведении последовательности матриц, размерности которых равны 5×10, 10×3, 3×12, 12×5, 5×50, 50×6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Напишите восходящий алгоритм для поиска оптимальной расстановки скобок.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Расстановка пробелов. Оптимальное бинарное дерево поиска (середина) (12.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о расстановке пробелов. Постановка задачи. Решения для трёх случаев: 1. нужно вернуть можно ли разбить текст на слова; 2. вернуть разбивку на слова; 3. слова встречаются не равновероятно, вернуть наиболее вероятную разбивку на слова.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи. Вывод математического ожидания времени поиска.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Праздничное домашнее задание 10 (до 02.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[&amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;,&amp;quot;, &amp;quot;.&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;,&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;.&amp;quot;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Подсказка:&#039;&#039;&#039; разбейте текст на слова из списка и посмотрите на азбуку Морзе.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Способы представления графов в памяти (16.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Разбор ошибок в домашнем задании.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Графы. Способы представления графов в памяти (матрица смежности, список рёбер, список соседей (список смежностей), матрица инцидентности). Зависимость сложности алгоритмов от способа представления.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §22.1 Представление графов, стр. 626]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 11 (до 02.03)===&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача A.]&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача B.]&lt;br /&gt;
# Нарисуйте неориентированный граф с 5 вершинами и 8 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Нарисуйте ориентированный граф с 4 вершинами и 3 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Дан ориентированный граф. &#039;&#039;Исходящая степень вершины v&#039;&#039; --- это количество исходящих из неё рёбер, &#039;&#039;входящая степень v&#039;&#039; --- это количество рёбер входящих в  v. Имеется представление ориентированного графа с использование списка соседей. Как долго будут вычисляться исходящие степени всех вершин графа? А входящие степени?&lt;br /&gt;
# Дан граф G = (V, E). Какие из рассмотренных способов хранения графов используют меньше всего памяти для хранения G и почему? Указание: рассмотрите случаи |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;lt; |E| и |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;gt; |E|.&lt;br /&gt;
# Пусть C --- это матрица смежности графа G.&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
# Пусть B --- это матрица инцидентности ориентированного графа G. Как связаны элементы матрицы BB&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
&lt;br /&gt;
==Реализация поиска в глубину (19.02)==&lt;br /&gt;
# Реализация поиска в глубину и смежных задач.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 12 (до 5.03)===&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Выберите любой способ хранения графа. Реализуйте поиск в глубину.&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Напишите алгоритм, который возвращает данные о том, какие вершины лежат в одной компоненте связности.&lt;br /&gt;
# &#039;&#039;(любой ЯП или псевдокод)&#039;&#039; Напишите алгоритм проверки сильной связности ориентированного графа. Какова его сложность?&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №2==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
Необходимо реализовать 3 задачи из [https://official.contest.yandex.ru/contest/1085 контеста], см. [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing распределение задач]. Каждую задачу можно написать на С++ или Python. На выполнение работы отводится две недели (см. время окончания контеста). [https://official.contest.yandex.ru/contest/1123 Дорешивание.]&lt;br /&gt;
&lt;br /&gt;
==ДП и графы (26.02)==&lt;br /&gt;
==ДП и графы (02.03)==&lt;br /&gt;
==Жадные алгоритмы (12.03)==&lt;br /&gt;
===Домашнее задание 13 (до 23.03)===&lt;br /&gt;
# Вася хочет купить по одной акции каждой компании. Все акции стоят одинаково, но дорожают по-разному. Каждый месяц акция i-ой компании дорожает в r_i раз. В один месяц можно купить только одну акцию.&lt;br /&gt;
## Напишите алгоритм, который выводит оптимальную последовательность покупок (такую, что на покупку всех акций потратится меньше денег).&lt;br /&gt;
## Докажите корректность алгоритма, то есть докажите, что последовательность покупок, которую выводит ваш алгоритм, оптимальна.&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список, очередь (16.03)==&lt;br /&gt;
# Реализация линейного двусвязного списка (С++).&lt;br /&gt;
# Реализация очереди ограниченной длины на базе вектора (С++).&lt;br /&gt;
# Реализация очереди на базе списка (С++).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14 (до 23.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте (на С++) структуру данных Стек. У стека должно быть три операции:&lt;br /&gt;
* push --- положить элемент на вершину стека;&lt;br /&gt;
* pop --- удалить верхний элемент;&lt;br /&gt;
* front --- вернуть значение верхнего элемента.&lt;br /&gt;
Оцените время работы каждой функции.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список (19.03)==&lt;br /&gt;
===Домашнее задание 13* (до 30.03)===&lt;br /&gt;
#Для приведённой реализации класса List (https://yadi.sk/i/c5r_79WdfMyNS).&lt;br /&gt;
## Допишите print, push_back и push_front.&lt;br /&gt;
## В функции insert_after и delete_node вставьте необходимые проверки так, чтобы они работали для крайних случаев.&lt;br /&gt;
## Напишите main в котором&lt;br /&gt;
### создаётся объект класса List, &lt;br /&gt;
### заполняется элементами с помощью функций push_back, push_front и insert_after и&lt;br /&gt;
### удаляется i-ый элемент.&lt;br /&gt;
&lt;br /&gt;
==Повторение (30.03)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Для данных пар функций выясните их связь в терминах O-, o-, Ω-, ω-, Θ-обозначений. Поставьте галочку в клетке с Ω, если f(x) = Ω(g(x)) и прочерк, если равенства нет. [https://ru.wikipedia.org/wiki/«O»_большое_и_«o»_малое#.D0.94.D1.80.D1.83.D0.B3.D0.B8.D0.B5_.D0.BF.D0.BE.D0.B4.D0.BE.D0.B1.D0.BD.D1.8B.D0.B5_.D0.BE.D0.B1.D0.BE.D0.B7.D0.BD.D0.B0.D1.87.D0.B5.D0.BD.D0.B8.D1.8F Википедия]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! f(x)!! g(x)!! O!! o!! Ω!! ω!! Θ&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! 2^100&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n * log(n)&lt;br /&gt;
! 2^100 * n * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n&lt;br /&gt;
! 2^100 * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n!&lt;br /&gt;
! 2^(2015n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n*2^n&lt;br /&gt;
! 3^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 5^n&lt;br /&gt;
! 5^(n+1)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n + n^2 + n^3 + ... + n^1000&lt;br /&gt;
! 7^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм Quickselect нахождения k-ого элемента по возрастанию: http://en.wikipedia.org/wiki/Quickselect&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;На улице стоит ряд домов. В каждом из домов лежит сколько-то денег. Вор хочет обокрасть дома на переулке. Он не может обокрасть два соседних дома, потому что хозяин дома, который он обокрал, сразу предупредит соседей. Нужно найти, какую максимальную сумму вор может украсть с переулка. На вход программы подается массив неотрицательных целых чисел - количество долларов в доме с номером i. Соседние дома в массиве представлены соседними элементами. Например, пусть задан массив { 1, 4, 5 } - тогда вор максимум может украсть $6, обокрав дома 1 и 3. Пусть задан массив { 1, 7, 2 } - тогда вор максимум может украсть $7, обокрав дом 2.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Алфавит из всех маленьких латинских букв и пробела закодирован числами следующим способом:&lt;br /&gt;
  &#039;a&#039; -&amp;gt; 1&lt;br /&gt;
  &#039;b&#039; -&amp;gt; 2&lt;br /&gt;
  &#039;c&#039; -&amp;gt; 3&lt;br /&gt;
  ...&lt;br /&gt;
  &#039;z&#039; -&amp;gt; 26&lt;br /&gt;
  &#039; &#039; -&amp;gt; 27&lt;br /&gt;
На вход программы подается строка из цифр. Нужно посчитать, сколькими способами можно раскодировать эту строку.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Дан граф, заданный матрицей смежности. Вывести пары вершин между которыми нет пути.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Повторение (02.04) ==&lt;br /&gt;
Решали и разбирали первые 4 задачи из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14* (до 11.03)===&lt;br /&gt;
Решите любые две задачи (подпункты НЕ считаются отдельными задачами) с предыдущей пары (Повторение (30.03)).&lt;br /&gt;
&lt;br /&gt;
== Повторение (06.04) ==&lt;br /&gt;
Будем решать вторую половину задач из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 15 (до 16.04)===&lt;br /&gt;
# Приведите пример графа, который содержит отрицательные рёбра, не содержит циклов отрицательного веса и для которого алгоритм Дейкстры возвращает неверный результат.&lt;br /&gt;
# Используется ли в алгоритме Дейкстры то, что веса рёбер неотрицательны? Если &amp;quot;да&amp;quot;, то где именно?&lt;br /&gt;
# Пусть граф содержит рёбра с весами &amp;gt;= -100. Если прибавить к каждому ребру 101 и при помощи алгоритма Дейкстры найти кратчайшие пути. Будут ли эти пути кратчайшими в исходном графе? Почему?&lt;br /&gt;
&lt;br /&gt;
== Повторение (07.04) ==&lt;br /&gt;
&#039;&#039;&#039;Решение рекуррентных соотношений&#039;&#039;&#039;&lt;br /&gt;
# Решите уравнение: T(n) = 4*T(n/2) + O(n^2) с базой T(1) = O(1)&lt;br /&gt;
## Используя основную теорему.&lt;br /&gt;
## Используя дерево рекурсий.&lt;br /&gt;
## Методом подстановки.&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2)) + n является \Theta(n lg n).&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2) + 17) + n является \Theta(n lg n).&lt;br /&gt;
# Решите уравнения, считая, что T(1) = O(1):&lt;br /&gt;
## T(n) = T(n-1) + n&lt;br /&gt;
## T(n) = 2*T(floor(sqrt(n))) + lg n. Указание: попробуйте использовать замену переменных.&lt;br /&gt;
## T(n) = 3*T(sqrt(n)) + lg n&lt;br /&gt;
# Дайте верхнюю и нижнюю оценки функции T(n). Постарайтесь, чтобы оценки были как можно более точные&lt;br /&gt;
## T(n) = 4T(n/3) + n*lg(n)&lt;br /&gt;
## T(n) = 3T(n/3) + n/lg(n)&lt;br /&gt;
## T(n) = 4T(n/2) + n^2*sqrt(n)&lt;br /&gt;
## T(n) = T(n/2) + T(n/4) + T(n/8) + n&lt;br /&gt;
## T(n) = T(n-1) + 1/n&lt;br /&gt;
## T(n) = T(n-2) + 1/lg(n)&lt;br /&gt;
## T(n) = sqrt(n) * T(sqrt(n)) + n&lt;br /&gt;
&#039;&#039;&#039;Анализ и построение алгоритмов&#039;&#039;&#039;&lt;br /&gt;
# Числа Фибоначчи F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; можно выразить через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, используя матрицу: https://yadi.sk/i/Pm_aNzHCforFU. &lt;br /&gt;
## Покажите как вычислить F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;.&lt;br /&gt;
## Как вычислить F&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;n+1&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;?&lt;br /&gt;
## Напишите алгоритм.&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
## Ускорьте его так, чтобы он работал за O(log n).&lt;br /&gt;
# Дана последовательность символов. Какое минимальное количество символов нужно удалить из неё, чтобы получить палиндром?&lt;br /&gt;
## Напишите алгоритм (на псевдокоде или на любом языке программирования).&lt;br /&gt;
## Оцените время работы алгоритма.&lt;br /&gt;
# Какую структуру данных вы бы использовали для реализации упорядоченного множества (http://neerc.ifmo.ru/wiki/index.php?title=Упорядоченное_множество)? Какая будет сложность каждой из операций над множеством?&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 16 (до 20.04)===&lt;br /&gt;
# Решите 6 задач из первой части и 6 из второй. (Укажите какие именно.) Каждый из подпунктов является отдельной задачей.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм и теорема Форда-Фалкерсона (16.04)==&lt;br /&gt;
# Базовые определения (пропускные способности, сток, исток и пр.). Пример. &lt;br /&gt;
# Ограничения на поток (сохранение и что меньше пропускных способностей).&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, пример работы&lt;br /&gt;
# Разрез, определение, пример.&lt;br /&gt;
# Утверждение: максимальный поток &amp;lt;= любого разреза.&lt;br /&gt;
# Теорема Форда-Фалкерсона (с доказательством).&lt;br /&gt;
# Пример на котором алгоритм Форда-Фалкерсонаработает работает очень долго при неудачном выборе путей.&lt;br /&gt;
# Сложность алгоритма Форда-Фалкерсона.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №3==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
В [https://official.contest.yandex.ru/contest/1196 домашнем задании] пять задач. Они разделены на два варианта, помеченные римскими цифрами I и II. Свой вариант нужно узнать [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing здесь на вкладке HW3]. Третья задача — общая для двух вариантов; ее решение необходимо снабдить доказательством корректности алгоритма. На выполнение задания дается примерно 2 недели (см. точное время окончания в контесте). Каждую задачу можно написать на С++ или Python.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Форда-Фалкерсона и Эдмондса-Карпа (20.04)==&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, напоминание: базовые определения, пример работы, пример на котором алгоритм работает долго, сложность.&lt;br /&gt;
# Алгоритм Эдмодса-Карпа. Доказательство асимптотики времени работы.&lt;br /&gt;
&lt;br /&gt;
==(23.04)==&lt;br /&gt;
&lt;br /&gt;
==(11.05) Красно-чёрные деревья==&lt;br /&gt;
[https://ru.wikipedia.org/wiki/Красно-чёрное_дерево Красно-чёрное дерево]&lt;br /&gt;
===Домашнее задание 17 (до 18.05)===&lt;br /&gt;
# Зачем нужны красно-чёрные деревья?&lt;br /&gt;
# Благодаря какому свойству и почему красно-чёрное дерево является сбалансированным?&lt;br /&gt;
# Нарисуйте полное бинарное дерево поиска высотой 3 с ключами {1, 2, ..., 15}. Сделайте из него красно-чёрные деревья высотой 2, 3 и 4.&lt;br /&gt;
# Нарисуйте красно-чёрные деревья, получающиеся последовательной вставкой элементов 12, 10, 29, 30, 31, 32 в [https://ru.wikipedia.org/wiki/Красно-чёрное_дерево#/media/File:Red-black_tree_example.svg данное дерево]. Для вставки используйте алгоритм вставки из Википедии. Укажите какой именно функцией вы воспользовались.&lt;br /&gt;
# Определим &#039;&#039;&#039;ослабленное красно-чёрное дерево&#039;&#039;&#039; как бинарное дерево поиска, которое удовлетворяет красно-чёрным свойствам 1, 3, 4 и 5. Другими словами, корень может быть как чёрным, так и красным. Рассмотрите ослабленное красно-чёрное дерево T, корень которого красный. Если перекрасить корень дерева T в чёрный, будет ли оно красно-чёрным деревом?&lt;br /&gt;
# Покажите, что самый длинный простой нисходящий путь от вершины x к листу красно-черного дерева имеет длину, не более чем в два раза превышающую кратчайший путь от x к листу-потомку.&lt;br /&gt;
# Чему равно наибольшее возможное количество внутренних узлов в красно-чёрном дереве с чёрной высоты k? А наименьшее возможное количество?&lt;br /&gt;
# Нарисуйте красно-чёрные деревья, получающиеся последовательной вставкой ключей 41, 38, 31, 12, 19, 8 в изначально пустое дерево.&lt;br /&gt;
# Покажите какие деревья будут получаться в результате последовательного удаления ключей в порядке 8, 12, 19, 31, 38, 41.&lt;br /&gt;
&lt;br /&gt;
==(14.05) Конкурентный анализ самоорганизующихся циклов==&lt;br /&gt;
[https://vk.com/doc12518218_390369758 Лекция]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 18 (до 21.05)===&lt;br /&gt;
Все вычисления сопроводите подробными объяснениями о том, почему верно то или иное (не)равенство.&lt;br /&gt;
# Пусть имеется n-элементный список и m поисковых запросов к нему. После каждой операции поиска можно переупорядочить список. Обозначим стоимость последовательности поисков через C. Докажите, что в худшем случае C = Ω(mn).&lt;br /&gt;
#  Обозначим через c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; стоимость i-ого поискового запроса с применением эвристики перемещения в начало, которая включает стоимость поиска элемента в списке и стоимость его перемещения в начало списка путём ряда обменов соседних элементов списка. Покажите, что i-ая операция поиска находит элемент x в списке L с применением эвристики перемещения в начало, то c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = 2 * rank&amp;lt;sub&amp;gt;L&amp;lt;/sub&amp;gt;(x) - 1.&lt;br /&gt;
# Покажите, что c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = 2 * rank&amp;lt;sub&amp;gt;L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) - 1.&lt;br /&gt;
# Покажите, что c*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = rank&amp;lt;sub&amp;gt;L*&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) + t&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;.&lt;br /&gt;
# Докажите, что после одного обмена двух соседних элементов потенциал либо увеличивается на 2, либо уменьшается на 2.&lt;br /&gt;
# Докажите, что rank&amp;lt;sub&amp;gt;L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) = |A| + |B| + 1.&lt;br /&gt;
# Докажите, что rank&amp;lt;sub&amp;gt;L*&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) = |A| + |С| + 1.&lt;br /&gt;
# Покажите, что поиск i-ого элемента приводит к изменению потенциала Ф(L&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;) - Ф(L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;) &amp;lt;= 2 (|A| - |B| + t*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;), где t*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; --- это количество обменов при i-ом поиске.&lt;br /&gt;
# Во сколько раз стоимость С&amp;lt;sub&amp;gt;MFT&amp;lt;/sub&amp;gt;(S) превышает C&amp;lt;sub&amp;gt;OPT&amp;lt;/sub&amp;gt;(S)?&lt;br /&gt;
&lt;br /&gt;
== (18.05) Конечные автоматы ==&lt;br /&gt;
=== Задание 19 (до 25.05) ===&lt;br /&gt;
# Постройте автомат для языка над алфавитом Σ = {0, 1} каждое слово которого содержит хотя бы два нуля. Является ли он детерминированным?&lt;br /&gt;
# Постройте автомат над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5. Является ли он детерминированным?&lt;br /&gt;
# Постройте автомат, который допускает пустой язык (язык в котором нет ни одного слова).&lt;br /&gt;
# Постройте автомат, который допускает все слова над алфавитом Σ.&lt;br /&gt;
# Постройте ДКА над алфавитом Σ = {К, Ж, З}, который допускает слова в которых после К идёт З, после З --- Ж, после Ж --- К.&lt;br /&gt;
# * Постройте ДКА над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5, а число нулей на 3.&lt;br /&gt;
# Постройте НКА для языка над алфавитом Σ = {0, 1, 2, 3}, состоящий из слов, в которых хотя бы одна из последних пяти букв является 1.&lt;br /&gt;
# Постройте НКА над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5, а число нулей на 3.&lt;br /&gt;
# Какие языки допускают автоматы https://yadi.sk/d/fNAHbjCZghERG?&lt;br /&gt;
# Для каждого из автоматов https://yadi.sk/d/fNAHbjCZghERG постройте соответствующий ему ДКА.&lt;br /&gt;
&lt;br /&gt;
== (21.05) Регулярные выражения, КА, их эквивалентность. Лемма о накачке  ==&lt;br /&gt;
=== Задание 20 (до 28.05) ===&lt;br /&gt;
&#039;&#039;&#039;I Написать регулярные выражения&#039;&#039;&#039;&lt;br /&gt;
# Напишите регулярное выражение для языка над алфавитом Σ = {0, 1} каждое слово которого содержит хотя бы два нуля.&lt;br /&gt;
# Напишите регулярное выражение над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5.&lt;br /&gt;
# Напишите регулярное выражение, которое допускает пустой язык (язык в котором нет ни одного слова).&lt;br /&gt;
# Напишите регулярное выражение, которое допускает все слова над алфавитом Σ.&lt;br /&gt;
# Напишите регулярное выражение для языка над алфавитом Σ = {0, 1, 2, 3}, состоящий из слов, в которых хотя бы одна из последних пяти букв является 1.&lt;br /&gt;
&#039;&#039;&#039;II КА и регулярные выражения&#039;&#039;&#039;&lt;br /&gt;
# Постройте конечный автомат для языка (111 U 01)&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;1(00 U 11)&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;.&lt;br /&gt;
# Постройте конечный автомат для языка (ab)&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;(a U b)(b U a)&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;(a U bab).&lt;br /&gt;
&#039;&#039;&#039;III Доказать замкнутость относительно различных операций&#039;&#039;&#039;&lt;br /&gt;
# Покажите, что если для языков L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; и L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; существует КА, который их читает, то существует КА и для их объединения L = {w | w ∈ L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; или w ∈ L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;}.&lt;br /&gt;
# Покажите, что если для языка L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; и L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; существует КА, который их читает, то существует КА и для языка L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; = {xy | x ∈ L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, y ∈ L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;}.&lt;br /&gt;
# Покажите, что если для языка L существует КА, который его читает, то существует КА и для &#039;&#039;&#039;замыкания Клини&#039;&#039;&#039; L* = {w&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; w&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; ... w&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;| w&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; ∈ L, w&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; ∈ L, ..., w&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; ∈ L}.&lt;br /&gt;
# Покажите, что если язык L регулярен, то регулярно его дополнение (т.е. язык над тем же алфавитом, которому принадлежит слово тогда и только тогда, когда оно НЕ принадлежит L) .&lt;br /&gt;
# Покажите, что если язык L регулярен, то регулярно его обращение L&amp;lt;sub&amp;gt;R&amp;lt;/sub&amp;gt; = {a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; . . . a&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; | a&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; . . . a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; ∈ L}. (L&amp;lt;sub&amp;gt;R&amp;lt;/sub&amp;gt; --- это язык в котором все слова языка L записаны наоборот.)&lt;br /&gt;
# * Покажите, что если языки L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; и L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; регулярны, то регулярно их пересечение.&lt;br /&gt;
&#039;&#039;&#039;IV Использование леммы о накачке&#039;&#039;&#039; (см. [https://vk.com/doc12518218_392750846 конспект])&lt;br /&gt;
# Докажите, что не существует КА, который бы читал язык {0&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;1&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;2&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;}. (Пояснение: запись 0&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; означает строку из n нулей: 00...0.)&lt;br /&gt;
# Докажите, что не существует КА, который бы читал язык {0&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;1&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;}.&lt;br /&gt;
# Докажите, что не существует КА, который бы читал язык {0&amp;lt;sup&amp;gt;n!&amp;lt;/sup&amp;gt;}.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== (25.05) Автоматный подход ==&lt;br /&gt;
=== Задание 21 (до 01.06) ===&lt;br /&gt;
Реализуйте один из следующих проектов:&lt;br /&gt;
# Программа, которая считывает строку и говорит принадлежит ли она языку 0(123)*(00 U (231)*) U 111.&lt;br /&gt;
# Программа, которая считывает КА и генерирует программу на языке С++, которая говорит принадлежит ли заданное слово языку, описываемому этим КА.&lt;br /&gt;
# Программа, которая считывает регулярное выражение и строку и говорит принадлежит ли слово языку, описываемому этим регулярным выражением.&lt;br /&gt;
# Программа, которая моделирует работу банкомата, автомата с газировкой, лифта... (что-то одно на выбор)&lt;br /&gt;
# Текстовый симулятор студента. Возможные состояния: на паре, дома, есть приглашение прогулять, завтра коллоквиум, сплю и др. Есть два параметра: успеваемость и весёлось. Если хотя бы один из них упадёт ниже критической отметки, студент умрёт. Игрок принимает решение куда идти студенту. Цель: продержаться как можно дольше.&lt;br /&gt;
&lt;br /&gt;
=== Большое домашнее задание 4 ===&lt;br /&gt;
[https://official.contest.yandex.ru/contest/1259 Контест]. В домашнем задании четыре задачи. Обязательны первые три. Вместо одной из первых трёх можно сделать последнюю (только для первых 10 решивших 4-ую!). На выполнение задания даётся примерно 2 недели (см. точное время окончания в контесте). Условия ревью определяют семинаристы.&lt;/div&gt;</summary>
		<author><name>Kassalanche</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2016&amp;diff=15487</id>
		<title>Алгоритмы и структуры данных 2016</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2016&amp;diff=15487"/>
		<updated>2015-05-26T08:38:55Z</updated>

		<summary type="html">&lt;p&gt;Kassalanche: /* Домашние задания */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== О курсе ===&lt;br /&gt;
Лектор: Объедков Сергей Александрович&lt;br /&gt;
&lt;br /&gt;
== Лекции ==&lt;br /&gt;
[http://t-arxiv.appspot.com/ &#039;&#039;&#039;Конспект Ярослава Сергиенко.&#039;&#039;&#039;]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;13 января:&#039;&#039;&#039; Сортировка вставкой и слиянием. Использование инварианта цикла при доказательстве корректности сортировки вставкой.  Θ- и &#039;&#039;O&#039;&#039;-обозначения. Оценка сложности алгоритмов. Рекуррентные соотношения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;16 января:&#039;&#039;&#039; &#039;&#039;О&#039;&#039;-, &#039;&#039;o&#039;&#039;-, Ω-, ω-, Θ-обозначения. Быстрая сортировка, время работы в худшем, лучшем и среднем случаях. Оптимальность сортировки слиянием. Сортировка при помощи двоичного дерева поиска и ее связь с быстрой сортировкой.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;20 января:&#039;&#039;&#039; Примеры решения рекуррентных соотношений: решение с использованием дерева рекурсии и методом подстановки. Формулировка и интуитивное объяснение основной теоремы. [https://www.dropbox.com/s/6a0r410zjm9qwe7/algo-3-recurrences.pdf?dl=0 (Конспект.)]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;23 января:&#039;&#039;&#039; Выбор порядковой статистики за время &#039;&#039;O&#039;&#039;(&#039;&#039;n&#039;&#039;): [http://en.wikipedia.org/wiki/Quickselect рандомизированный] и [http://en.wikipedia.org/wiki/Median_of_medians детерминированный] алгоритмы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;27 января:&#039;&#039;&#039; Быстрое возведение в степень по модулю. Алгоритм Карацубы для умножения целых чисел. Алгоритм Штрассена для умножения матриц.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;30 января:&#039;&#039;&#039; [http://en.wikipedia.org/wiki/Closest_pair_of_points_problem#Planar_case Поиск ближайшей пары точек] за время &#039;&#039;O&#039;&#039;(&#039;&#039;n&#039;&#039;log &#039;&#039;n&#039;&#039;). Задача о планировании взвешенных интервалов: рекурсивное решение.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3 февраля:&#039;&#039;&#039; Динамическое программирование. Задача о планировании взвешенных интервалов: рекурсивное решение с мемоизацией и итеративное решение. Свойства задач, эффективно решаемых при помощи динамического программирования: наличие полиномиального числа подзадач, выразимость исходной задачи в терминах подзадач, сводимость больших подзадач к полиномиальному числу меньших подзадач. Выравнивание абзаца по ширине: рекурсивное решение с мемоизацией.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6 февраля:&#039;&#039;&#039; Лекция отменяется из-за болезни преподавателя, но будет компенсирована 11 апреля.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;10 февраля:&#039;&#039;&#039; [https://www.dropbox.com/s/1fa95j4om3kykh6/algo-alignment.pdf?dl=0 Вычисление редакционного расстояния и выравнивание последовательностей].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;12 февраля:&#039;&#039;&#039; Графы: обход в глубину и в ширину, поиск компонент связности в неориентированных графах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;17 февраля:&#039;&#039;&#039; Способы представления графов: матрица смежности и списки смежности. Оценка сложности алгоритмов поиска в ширину и глубину, поиска компонент связности в неориентированных графах. Связность в ориентированных графах, алгоритм проверки сильной связности ориентированного графа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;20 февраля:&#039;&#039;&#039; Топологическая сортировка. Вычисление компонент сильной связности в ориентированном графе.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;24 февраля:&#039;&#039;&#039; Поиск кратчайших путей во взвешенном графе: алгоритмы [http://en.wikipedia.org/wiki/Bellman–Ford_algorithm Беллмана – Форда] и [http://en.wikipedia.org/wiki/Floyd–Warshall_algorithm Флойда – Уоршелла].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;27 февраля:&#039;&#039;&#039; Выполнимость 2-КНФ и [http://en.wikipedia.org/wiki/2-satisfiability#Strongly_connected_components компоненты сильной связности]. Перемножение матриц, поиск пути через промежуточную точку и алгоритм Флойда – Уоршелла.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3 марта:&#039;&#039;&#039; Лекция переносится на 11 апреля.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6 марта:&#039;&#039;&#039; Жадные алгоритмы. Примеры: (1) выбор максимального подмножества непересекающихся интервалов; (2) разбиение множества интервалов на минимальное число подмножеств непересекающихся интервалов; (3) составление плана работ с заданными продолжительностями и крайними сроками выполнения, минимизирующего максимальную задержку. Различные методы доказательства корректности жадных алгоритмов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;10 марта:&#039;&#039;&#039; Алгоритм Дейкстры.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;13 марта:&#039;&#039;&#039; Структуры данных. Массив с операциями инициализации, чтения и  записи, выполняемыми за время O(1). Три подхода к амортизационному анализу: групповой анализ, банковский метод и метод потенциалов (на примере двоичного счетчика).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;17 марта:&#039;&#039;&#039; Реализация приоритетной очереди при помощи двоичной кучи.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;20 марта:&#039;&#039;&#039; Минимальные основные деревья. Алгоритмы Крускала, Прима и Reverse-Delete.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;31 марта:&#039;&#039;&#039; Система непересекающихся множеств.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3 апреля:&#039;&#039;&#039; Сжатие путей в системе непересекающихся множеств. Кластеризация и алгоритм Крускала.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;7 апреля:&#039;&#039;&#039; Жадный алгоритм на матроиде.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;10 апреля:&#039;&#039;&#039; Максимальный поток. Алгоритм Форда – Фалкерсона.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;11 апреля:&#039;&#039;&#039; Алгоритм Эдмондса – Карпа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;14 апреля:&#039;&#039;&#039; Двойственность задач о максимальном потоке и минимальном разрезе. Сведение задачи о максимальном паросочетании в двудольном графе к задаче о максимальном потоке.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;17 апреля:&#039;&#039;&#039; Задача о назначениях (поиск совершенного паросочетания с минимальным весом во взвешенном двудольном графе). Алгоритм, последовательно находящий самые дешевые увеличивающие пути.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;21 апреля:&#039;&#039;&#039; Рандомизированный алгоритм поиска минимального разреза (алгоритм Каргера). Простой рандомизированный алгоритм для вычисления означивания переменных, максимизирующего число истинных дизъюнктов в 3-КНФ: случайное означивание гарантирует истинность 7/8 всех дизъюнктов в среднем.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;24 апреля:&#039;&#039;&#039; Хеш-таблицы. Разрешение коллизий при помощи цепочек. Открытая адресация.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;28 апреля:&#039;&#039;&#039; Сбалансированные деревья поиска. Красно-черные деревья.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;12 мая:&#039;&#039;&#039; Самоорганизующиеся списки и конкурентный анализ онлайн-алгоритмов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;15 мая:&#039;&#039;&#039; Конечные автоматы. Регулярные языки. Эквивалентность детерминированных и недетерминированных автоматов. Замкнутость регулярных языков относительно регулярных операций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;19 мая:&#039;&#039;&#039; Регулярные выражения. Эквивалентность регулярных выражений и конечных автоматов. Нерегулярные языки. Лемма о накачке.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;22 мая:&#039;&#039;&#039; Доказательство леммы о накачке и ее использование для доказательства нерегулярности языков. Полиномиальные сведения. Задачи о вершинном покрытии графа, покрытии множества и независимом множестве.&lt;br /&gt;
&lt;br /&gt;
== Домашние задания ==&lt;br /&gt;
&lt;br /&gt;
=== Задание 1 ===&lt;br /&gt;
&lt;br /&gt;
Необходимо сдать все 6 задач в данном [https://official.contest.yandex.ru/contest/1002 контесте]. На выполнение задания даётся 2 недели (см. точное время окончания в контесте). Условия ревью определяют семинаристы.&lt;br /&gt;
&lt;br /&gt;
=== Задание 2 ===&lt;br /&gt;
&lt;br /&gt;
[https://official.contest.yandex.ru/contest/1085 Контест]. В домашнем задании пять задач, из которых нужно решить три, назначенные преподавателем, ведущим семинарские занятия в вашей группе. На выполнение задания даётся примерно 2 недели (см. точное время окончания в контесте). Условия ревью определяют семинаристы. [https://official.contest.yandex.ru/contest/1123 Дорешивание.]&lt;br /&gt;
&lt;br /&gt;
=== Задание 3 ===&lt;br /&gt;
&lt;br /&gt;
[https://official.contest.yandex.ru/contest/1196 Контест]. В домашнем задании пять задач. Они разделены на два варианта, помеченные римскими цифрами I и II. Свой вариант нужно узнать у семинариста. Третья задача — общая для двух вариантов; ее решение необходимо снабдить доказательством корректности алгоритма. На выполнение задания даётся примерно 2 недели (см. точное время окончания в контесте). Условия ревью определяют семинаристы.&lt;br /&gt;
&lt;br /&gt;
=== Задание 4 ===&lt;br /&gt;
&lt;br /&gt;
[https://official.contest.yandex.ru/contest/1259 Контест]. В домашнем задании четыре задачи. Обязательны первые три. Вместо одной из первых трёх можно сделать последнюю (только для первых 10 решивших 4-ую!). На выполнение задания даётся примерно 2 недели (см. точное время окончания в контесте). Условия ревью определяют семинаристы.&lt;br /&gt;
&lt;br /&gt;
== Контрольная работа ==&lt;br /&gt;
&lt;br /&gt;
Контрольная работа состоится 11 апреля в 13:40 – 15:00 в ауд. 622. [https://www.dropbox.com/s/uj2m9xdueq57y9o/sample.pdf?dl=0 Примеры задач] (и [https://www.dropbox.com/s/szdymvchx74b731/sample-solved.pdf?dl=0 решений])].&lt;br /&gt;
&lt;br /&gt;
== Семинары ==&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппа 101-1|Подгруппа 101-1.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппа 101-2|Подгруппа 101-2.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппы 102-1, 102-2, 107-2|Подгруппа 102-1.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппы 102-1, 102-2, 107-2|Подгруппа 102-2.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппа 103-1|Подгруппа 103-1.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппа 105-1|Подгруппа 105-1.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппа 106-1|Подгруппа 106-1.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппа 106-2|Подгруппа 106-2.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппа 107-1|Подгруппа 107-1.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппы 102-1, 102-2, 107-2|Подгруппа 107-2.]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Рекомендуемая литература ==&lt;br /&gt;
# Кормен, Лейзерсон, Ривест, Штайн. Алгоритмы: построение и анализ ([https://vk.com/doc4262442_326131655?hash=9d6945b570241aa338&amp;amp;dl=681b57216bf37463e9 3-е изд.], [http://librarun.org/book/4121/1 2-е изд.], [http://e-maxx.ru/bookz/files/cormen.pdf  1-е изд.])&lt;br /&gt;
# [https://dl.dropboxusercontent.com/u/829163/draft.pdf Дасгупта, Пападимитриу, Вазирани. Алгоритмы] ([http://beust.com/algorithms.pdf оригинал] | [http://biblio.mccme.ru/node/5066/shop купить])&lt;br /&gt;
&lt;br /&gt;
== Полезные ссылки ==&lt;br /&gt;
# [[Reviewboard|Инструкция по использованию Review Board.]]&lt;/div&gt;</summary>
		<author><name>Kassalanche</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=15364</id>
		<title>Алгоритмы и структуры данных. Подгруппа 105-1</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=15364"/>
		<updated>2015-05-25T15:47:22Z</updated>

		<summary type="html">&lt;p&gt;Kassalanche: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==О курсе==&lt;br /&gt;
[[Алгоритмы_и_структуры_данных|План лекций и список рекомендуемой литературы.]]&lt;br /&gt;
&lt;br /&gt;
[[Алгоритмы_и_структуры_данных._Подгруппа_105-1._FAQ|FAQ.]]&lt;br /&gt;
&lt;br /&gt;
[[Reviewboard|Инструкция по использованию Reviewboard.]]&lt;br /&gt;
&lt;br /&gt;
[[Практические_занятия_по_курсу_ОиМП/C++_check|Style guide.]]&lt;br /&gt;
&lt;br /&gt;
==Итоговая оценка за курс==&lt;br /&gt;
Итоговая оценка (ИО) зависит от&lt;br /&gt;
* оценок за пять больших домашних заданий (БДЗ1, БДЗ2, ..., БДЗ5),&lt;br /&gt;
* оценок за домашние задания (ДЗ1, ДЗ2, ...),&lt;br /&gt;
* оценки за контрольную работу (КР),&lt;br /&gt;
* оценки за экзамен (ЭКЗ),&lt;br /&gt;
и может быть вычислена по формуле:&lt;br /&gt;
 ИО = 0.7 * (0.3 * КР + 0.7 *(ИДЗ1 + ИДЗ2 + ИДЗ3 + ИДЗ4 + ИДЗ5)/5) + 0.3 * ЭКЗ =&lt;br /&gt;
    = 0.21*КР + 0.098*ИДЗ1 + 0.098*ИДЗ2 + 0.098*ИДЗ3 + 0.098*ИДЗ4 + 0.098*ИДЗ5 + 0.3*ЭКЗ,&lt;br /&gt;
где&lt;br /&gt;
 ИДЗi = min (10, 0.7 * БДЗi + 0.4 * &amp;lt;cредняя оценка за ДЗj, прошедшие с предыдущего БДЗ по i-ое&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
==Порядок сдачи домашних работ==&lt;br /&gt;
===Большие домашние работы===&lt;br /&gt;
# Получить OK за задачу в контесте.&lt;br /&gt;
# Залить исходный код на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* На каждую задачу создавайте отдельный запрос на ревью. &lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении суток приходят замечания к коду. &#039;&#039;&#039;Если в течении суток замечаний или Ship It не появилось, проверьте, что вы правильно отправили запрос и, если всё сделано правильно, спросите у семинариста получил ли он запрос.&#039;&#039;&#039;&lt;br /&gt;
# Вы их исправляете, проверяете в контесте, что программа по-прежнему проходит все тесты, заливаете новую версию в Review Board. Штрафов за посылки НЕ будет.&lt;br /&gt;
# Процесс повторяется пока остаются замечания к коду или пока не истёк дедлайн. После закрытия контеста будут ещё одни сутки на доработку замечаний в Review Board.&lt;br /&gt;
# Оценивается только последняя версия работы в Review Board.&lt;br /&gt;
&lt;br /&gt;
===Маленькие домашние работы===&lt;br /&gt;
# Залить решение на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* Желаемые форматы: txt, py, cpp, h. Допускаются любые другие.&lt;br /&gt;
#* На каждую домашнюю работу создавайте отдельный запрос на ревью. Обязательно указывайте номер домашней работы.&lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении неопределенного промежутка времени придут оценки по каждому из заданий.&lt;br /&gt;
&lt;br /&gt;
==Оценивание домашних работ==&lt;br /&gt;
* Все задания предполагаются индивидуальными. Запрещены любые заимствования без ссылки на автора.&lt;br /&gt;
* Решения после установленного дедлайна не принимаются. Дедлайн указан в заголовке каждого задания.&lt;br /&gt;
* Везде, где требуется написать алгоритм, можно использовать любой язык программирования или псевдокод.&lt;br /&gt;
* Там, где требуется построить алгоритм с заданной асимптотикой, приведите обоснование, что полученный алгоритм удовлетворяет этому условию.&lt;br /&gt;
* Эти правила не действуют, если в задании явно оговорено иное.&lt;br /&gt;
&lt;br /&gt;
==Мотивация к изучению алгоритмов. Подсчёт числа операций (12.01)==&lt;br /&gt;
# Числа Фибоначчи. Определение. Примитивный рекурсивный алгоритм вычисления i-ого числа. Оценка числа операций. Анализ причин неэффективности. Алгоритм с запоминанием вычисленных ранее значений. Оценка числа операций. Сравнение с предыдущим. (подробнее: глава 0, страницы 8-10 из книги &amp;lt;&amp;lt;Алгоритмы&amp;gt;&amp;gt;, [[Алгоритмы_и_структуры_данных|см. список рекомендованной литературы]])&lt;br /&gt;
# Задача о ханойской башне. Постановка задачи. Рекурсивный алгоритм. Рекуррентная формула для числа перемещений. Замкнутая формула для числа перемещений (+ доказательство). Доказательство того, что эту задачу нельзя решить используя меньшее число перемещений дисков. ([https://www.dropbox.com/s/t8cbs7ttu4iasvj/algo-0-recursion.pdf?dl=0 Разбор задачи о ханойской башне], автор Сергей Объедков)&lt;br /&gt;
# Сортировка пузырьком. Алгоритм. Подсчёт количество операций сравнения и обмена (swap). Анализ наилучшего и наихудшего случаев ([https://ru.wikipedia.org/wiki/Сортировка_пузырьком Википедия])&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 1 (12.01 - 26.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
Во всех задачах, если не оговорено иного, предполагаем, что работаем с целыми неотрицательными числами. Для первых 7 задач необходимо&lt;br /&gt;
* описать что можно считать наилучшим и наихудшим случаями,&lt;br /&gt;
* для каждого из двух случаев подсчитать отдельно количество операций сравнения и swap (если есть).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Даны три числа, требуется вернуть наименьшее.&lt;br /&gt;
# Даны три числа, требуется отсортировать их.&lt;br /&gt;
# Дана последовательность A из n элементов и число x, требуется найти элемент равный x. Примечание: если таких значений i несколько, вернуть любое; если такого элемента нет, функция должна сообщить об этом.&lt;br /&gt;
# * Дана упорядоченная последовательность A из n элементов и число x, требуется найти такое i, что A[i] равно x. Алгоритм должен быть эффективней, чем в предыдущем пункте и использовать то, что последовательность упорядочена.&lt;br /&gt;
# Дана последовательность из 100 000 чисел от 0 до 100. Напишите эффективный алгоритм сортировки, который бы учитывал специфику входных данных.&lt;br /&gt;
# * Дано 32 битное неотрицательное число. Требуется номер первого ненулевого бит. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения, считая, что числа распределены равномерно.&lt;br /&gt;
# * Даны 32 битные неотрицательные числа m и n. Требуется вывести True, если m &amp;lt; n, иначе False. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения битов, считая, что числа распределены равномерно.&lt;br /&gt;
# Напишите рекурсивную функцию, вычисляющую n-ое число Фибоначчи (как на занятии). Подсчитайте количество рекурсивных вызовов.&lt;br /&gt;
# * Напишите функцию, вычисляющую n-ое число Фибоначчи, у которой число операций — полином от n, и которая использует количество памяти, независящее от n.&lt;br /&gt;
&lt;br /&gt;
==O-символика и стратегия &amp;quot;разделяй и властвуй&amp;quot; (15.01)==&lt;br /&gt;
# Сортировка слиянием. Алгоритм, рекуррентное соотношение для времени сортировки, сложность. Подробнее: [https://dl.dropboxusercontent.com/u/829163/draft.pdf §2.3 Сортировка слиянием (стр. 54)].&lt;br /&gt;
# О-символика. [https://dl.dropboxusercontent.com/u/829163/draft.pdf §0.3 О-символика (стр. 10)].&lt;br /&gt;
# Задача о слиянии m упорядоченных массивов по n элементов. Три алгоритма решения: последовательное слияние, слияние &amp;quot;деревом&amp;quot; (обе функции используют Merge из MergeSort), аналог Merge для m массивов. Анализ сложности каждого из них.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 2 (15.01-29.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
* Во всех задачах, если не оговорено иного, для простоты &#039;&#039;можно&#039;&#039; считать, что n является степенью какого-либо числа, например, степенью двойки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Дана функция F, определённая ниже. Сколько строк она напечатает? Указание: для обоих подпунктов рассмотрите два случая: 1. n является степенью двойки, 2. n не является степенью двойки.&lt;br /&gt;
## Запишите рекуррентное соотношение для числа строк.&lt;br /&gt;
## Решите уравнение, полученное в предыдущем пункте, то есть, выведите замкнутую (нерекуррентную формулу). Для простоты можно считать, что n является степенью двойки.&lt;br /&gt;
# В массиве A размера n записана возрастающая последовательность целых чисел. Постройте алгоритм типа &amp;quot;разделяй и властвуй&amp;quot;, который проверяет, существует ли такой индекс i, что A[i] = i&lt;br /&gt;
## за время O(n),&lt;br /&gt;
## * за время O(log n).&lt;br /&gt;
## Какие случаи для вашего алгоритма являются наихудшими и наилучшими? Какого время работы в лучшем и худшем случаях?&lt;br /&gt;
# Дан бесконечный массив A, первые n элементов которого содержат возрастающую последовательность положительных чисел, а дальше стоят -1. Значение n не дано. Постройте алгоритм, который получает на вход целое число x и находит это x в массиве --- или говорит, что там его нет, &lt;br /&gt;
## за время O(n),&lt;br /&gt;
## за время O(log n).&lt;br /&gt;
# Рассмотрим алгоритм вычисления наибольшего общего делителя (НОД) двух положительных чисел, основанный на методе &amp;quot;разделяй и властвуй&amp;quot;.&lt;br /&gt;
## (задание не оценивается) Прочитайте [https://dl.dropboxusercontent.com/u/829163/draft.pdf §1.2.3 Алгоритм Евклида (стр. 23)].&lt;br /&gt;
## * Докажите, что определение НОД-а, приведённое ниже, корректно.&lt;br /&gt;
## Постройте алгоритм, основанный на этом определении.&lt;br /&gt;
## Какой алгоритм будет быстрее для n-битовых чисел a и b при больших значениях n --- ваш или алгоритм Евклида?&lt;br /&gt;
# * Покажите как за время O(n log n) удалить из массива размера n все дубликаты, то есть оставить каждый элемент в одном экземпляре.&lt;br /&gt;
# * Даны два упорядоченных массива размера m и n. Постройте алгоритм, находящий k-й по величине элемент в объединении этих массивов за время O(log(n+m)). &lt;br /&gt;
&lt;br /&gt;
Функция F(n).&lt;br /&gt;
  если n &amp;gt; 1:&lt;br /&gt;
    напечатать &amp;quot;всё ещё работаю&amp;quot;&lt;br /&gt;
    F(n/2)&lt;br /&gt;
    F(n/2)&lt;br /&gt;
&lt;br /&gt;
Определение НОД-а.&lt;br /&gt;
             2НОД(a/2, b/2), если а и b чётны,&lt;br /&gt;
  НОД(a,b) = НОД(a, b/2), если а нечётно, b чётно,&lt;br /&gt;
             НОД((a-b)/2, b), если а и b нечётны.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;lt;nowiki&amp;gt;Задачи взяты из книги &amp;quot;Алгоритмы&amp;quot;, глава 2 (см. список рекомендованной литературы).&amp;lt;/nowiki&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Сложение и умножение (19.01)==&lt;br /&gt;
# Алгоритм сложения, его сложность (§1.1.1 Сложение*)&lt;br /&gt;
# &amp;quot;Школьный&amp;quot; алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Рекурсивный алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Алгоритм умножения, реализующий стратегию &amp;quot;разделяй и властвуй&amp;quot;, анализ сложности (§2.1 Умножение чисел*)&lt;br /&gt;
 * [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать.]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 3 (19.01 - 2.02)===&lt;br /&gt;
* Во всех задачах для простоты можно считать, что n является степенью какого-либо числа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Найдите произведение чисел 10011011 и 10111010 (в двоичной системе счисления), используя алгоритм умножения чисел, основанный на методе «разделяй и властвуй». Необходимо не только дать ответ, но и привести ход решения.&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 3 рекурсивных вызова для подзадач размера n-1 и комбинирует из них решение исходной задачи за О(n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте три верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 10 рекурсивных вызовов для подзадач размера n/2 и комбинирует из них решение исходной задачи за О(5n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте два верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Докажите, что 3m² + m = O(m²).&lt;br /&gt;
# Докажите, что lg m = O(m/1000), где lg m — это логарифм с двоичным основанием.&lt;br /&gt;
# Докажите, что из равенства f(n) = O(g(n)) не следует, что g(n) = O(f(n)).&lt;br /&gt;
# Докажите, что O(m) содержится в O(m²).&lt;br /&gt;
&lt;br /&gt;
==Решение рекуррентных уравнений (22.01)==&lt;br /&gt;
# Примеры решений рекуррентных уравнений (см. [https://www.dropbox.com/s/6a0r410zjm9qwe7/algo-3-recurrences.pdf?dl=0 конспект]).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 4 (до 14.02)===&lt;br /&gt;
* Нельзя использовать утверждение основной теоремы о решении рекуррентных соотношений.&lt;br /&gt;
* &#039;&#039;Можно&#039;&#039; использовать метод построения дерева рекурсии или подстановку (метод с угадыванием ответа).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Какой из трёх приведённых ниже алгоритмов вы бы предпочли? Обоснуйте свой ответ.&lt;br /&gt;
#* Алгоритм A, решая задачу, производит пять рекурсивных вызовов для подзадач вдвое меньшего размера, после чего строит ответ для исходной задачи за линейное время.&lt;br /&gt;
#* Алгоритм B, решая задачу размера n, делает два рекурсивных вызова для задач размера n − 1, после чего находит ответ за время O(1).&lt;br /&gt;
#* Алгоритм C, решая задачу размера n, рекурсивно решает девять задач размера n/3 и строит ответ за время O(n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Найдите T(n) в замкнутой форме для любых 7 из 10 приведённых ниже рекуррентных соотношений:&lt;br /&gt;
## T(n) ≤ 2T(n/3) + 1;&lt;br /&gt;
## T(n) ≤ 7T(n/7) + n;&lt;br /&gt;
## T(n) ≤ 9T(n/3) + n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 8T(n/2) + n&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 49T(n/25) + n&amp;lt;sup&amp;gt;3/2&amp;lt;/sup&amp;gt;log n;&lt;br /&gt;
## T(n) ≤ T(n − 1) + 2;&lt;br /&gt;
## T(n) ≤ T(n − 1) + n&amp;lt;sup&amp;gt;c&amp;lt;/sup&amp;gt;, где c ≥ 1 –– константа;&lt;br /&gt;
## T(n) ≤ T(n − 1) + c&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;, где c &amp;gt; 1 –– константа;&lt;br /&gt;
## T(n) ≤ 2T(n − 1) + 1;&lt;br /&gt;
## T(n) ≤ T(sqrt(n)) + 1.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №1==&lt;br /&gt;
Необходимо реализовать все 6 задач из [https://official.contest.yandex.ru/contest/1002 контеста]. Каждую задачу можно писать на С++ или Python. На выполнение работы отводится две недели. Каждая задача оценивается в 10/6 балла. Оценка &#039;&#039;может&#039;&#039; быть снижена за плохой код, но не более чем на 25%.&lt;br /&gt;
&lt;br /&gt;
==Бинарное дерево поиска (26.01)==&lt;br /&gt;
# Определение. Пример.&lt;br /&gt;
# Не модифицирующие алгоритмы: поиск (рекурсивный и итеративный алгоритмы), поиск минимума, inordered обход (вывод значений узлов в отсортированном порядке), поиск следующего по возрастанию.&lt;br /&gt;
# Модифицирующие алгоритмы: вставка (рекурсивная реализация), удаление (только идея).&lt;br /&gt;
 [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 13, стр. 248]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 5 (до 16.02)===&lt;br /&gt;
* Для получения максимальной оценки можно выполнить или все задачи без звёздочки, или задачу со звёздочкой. Преподаватель понимает, что реализацию БДП сложно не найти в интернете, но от копипасты не будет никакой пользы. Напротив, самостоятельная реализация очень полезна и приветствуется, даже если не получится выполнить всех пунктов задания.&lt;br /&gt;
* Задачи с двумя звёздочками необязательны.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Нарисуйте бинарные деревья поиска высотой 2, 3, 4, 5 и 6 для множества ключей {1, 4, 5, 10, 16, 17, 21}. Корень дерева имеет высоту 0.&lt;br /&gt;
# &#039;&#039;&#039;Сортировка с использованием БДП.&#039;&#039;&#039;&lt;br /&gt;
## Какова асимптотическая сложность алгоритма вставки элемента в дерево высоты d? Почему? Назовите наилучший и наиухдший случаи.&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который строит БДП в узлах которого стоят элементы данной последовательности. Можно использовать функцию Insert. Назовите наилучший и наихудший случаи. Есть теорема о том, что полученный алгоритм будет работать в среднем случае за время O(n * log n).&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который выводит их в порядке возрастания. Используйте бинарное дерево поиска. Какова в среднем случае сложность этого алгоритма? Назовите наилучший и наихудший случаи. Какова сложность в наихудшем случае?&lt;br /&gt;
# Напишите функцию GetRoot, которой на вход подаётся указатель на произвольный узел дерева, а она возвращает указатель на корень.&lt;br /&gt;
# Напишите процедуру PrintLeafs, которой на вход подаётся указатель на корень дерева, и она печатает листья дерева&lt;br /&gt;
## по возрастанию,&lt;br /&gt;
## по убыванию.&lt;br /&gt;
# ** Альтернативный обход в порядке возрастания бинарного дерева поиска с n узлами (или центрированный (inordered) обход) можно осуществить путём поиска минимального элемента дерева с помощью функции Minimum с последующий n-1 вызовом функции Next. Каково время работы такого алгоритма?&lt;br /&gt;
# * Реализуйте на С++ структуру данных бинарное дерево поиска, [https://yadi.sk/i/gi2SEStreFfSb используя заготовку].&lt;br /&gt;
## Нарисуйте бинарное дерево поиска, которое строится в функции getTreeExample.&lt;br /&gt;
## Реализуйте следующие алгоритмы: &lt;br /&gt;
### поиск минимума, &lt;br /&gt;
### inordered обход (вывод значений узлов в отсортированном порядке),&lt;br /&gt;
### поиск следующего по возрастанию,&lt;br /&gt;
### вставка элемента в дерево,&lt;br /&gt;
### сортировка последовательности с использованием БДП (дан вектор чисел, необходимо вывести их по возрастанию),&lt;br /&gt;
### ** удаление.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Карацубы, Штрассена. Быстрая сортировка (29.01)==&lt;br /&gt;
# Алгоритм Карацубы.&lt;br /&gt;
# Алгоритм Штрассена. [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать Дасгупту и др., §2.5 Умножение матриц]&lt;br /&gt;
# Быстрая сортировка и доказательство того, что в среднем случае она работает за О(n * log n). [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 8 Быстрая сортировка, стр. 148]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 6 (до 18.02)===&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Пусть мы хотим найти двоичное представление десятичного числа 10&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;. Будем считать, что n --- степень двойки (n = 2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt;).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Pwr2Bin(n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть 1010&lt;br /&gt;
    z = ...&lt;br /&gt;
    вернуть Multiply(z, z)&amp;lt;/source&amp;gt;&lt;br /&gt;
Multiply --- функция, перемножающая два n-битовых двоичных числа x и y по алгоритму Карацубы за O(n&amp;lt;sup&amp;gt;log&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;3&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Пусть мы хотим перевести произвольное десятичное число x в записи которого n=2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; чисел в двоичную систему счисления.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Dec2Bin(x, n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть binary[x]&lt;br /&gt;
    разделить x на два десятичных числа xl и xr из n/2 цифр.&lt;br /&gt;
    вернуть ...&amp;lt;/source&amp;gt;&lt;br /&gt;
Здесь binary --- это массив, содержащий двоичное представление десятичных цифр.&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Докажите, что математическое ожидание времени работы алгоритма быстрой сортировки (усреднение по всем вариантам выбора опорного элемента) на любом входе размера n удовлетворяет соотношению: T(n) ≤ O(n) + 1/n * &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt; (T(i-1) + T(n-i)).&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Найдите решение соотношения из предыдущего пункта.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Динамическое программирование (ДП). Первые примеры (02.01)==&lt;br /&gt;
# Нахождение самой длинной возрастающей подпоследовательности.&lt;br /&gt;
# Нахождение редакционного расстояния (или редакционной стоимости, расстояния Левенштейна).&lt;br /&gt;
# Нахождение представителя большинства.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 7 (до 20.02)===&lt;br /&gt;
* В этом задании везде, где требуется реализовать алгоритм, необходимо привести код на любом языке программирования.&lt;br /&gt;
* Для получения максимальной оценки нужно решить все задачи без звёздочек. Одна решённая задача со звёздочкой заменяет одну задачу без звёздочки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения редакционного расстояния (алгоритм Вагнера — Фишера). Например, редакционное расстояние между словами &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равно 6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения длины наибольшей общей подстроки. Например, длина наибольшей общей подстроки &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равна 8 (&amp;quot;antholog&amp;quot;). Чем больше это значение, тем схожей строки.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Предположим теперь, что сравниваемые строки состоят из символов A, С, G и T; за удаление или вставку мы платим -5; за замену буквы x на y платим w[x, y], где x, y принадлежат множеству {A, С, G, T}, a w — это матрица весов:&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
!-!! A!! G!! C!! T&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! A&lt;br /&gt;
|10||-1||-3||-4&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
!G&lt;br /&gt;
||-1||7||-5||-3&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! C&lt;br /&gt;
||-3||-5||9||0&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! T&lt;br /&gt;
||-4||-3||0||8&lt;br /&gt;
|}&lt;br /&gt;
Тогда выравнивание:&lt;br /&gt;
 AGACTAGTTAC&lt;br /&gt;
 CGA‒‒‒GACGT&lt;br /&gt;
будет иметь следующую оценку:&lt;br /&gt;
 w[A,C] + w[G,G] + w[A,A] + 3*(-5) + w[G,G] + w[T,A] + w[T,C] + w[A,G] + w[C,T] = -3 + 7 + 10 - 3*5 + 7 + (-4) + 0 + (-1) + 0 = 1.&lt;br /&gt;
&lt;br /&gt;
Напишите алгоритм, который находит максимальную стоимость всех возможных выравниваний. Верно ли, что чем больше это значение, тем непохожей строки?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как давно один народ отделился от другого? Кто похожей — итальянец и китаец или якут и эфиоп? На эти вопросы можно отвечать с разных точек зрения — культурной, исторической, лингвистической, ... В последние же годы человечество научилось секвенировать геном, что позволило исследовать этот вопрос с точки зрения генетики. Секвенирование генома — это процесс записи ДНК в виде нуклеотидной последовательности, которая представляет собой последовательность из четырёх символов — A, С, G и T. Существуют базы, которые хранят генетическую информацию о людях из разных стран и континентов, например, [http://www.mtdb.igp.uu.se/ http://www.mtdb.igp.uu.se/ → Download mtDNA sequences]. Чем больше сходство между геномами, тем сильнее родственные связи между их обладателями. Используя решение предыдущего пункта, выполните задания:&lt;br /&gt;
# Определите, кто похожей — итальянец и китаец или якут и эфиоп?&lt;br /&gt;
# Найдите нескольких похожих и нескольких непохожих народностей.&lt;br /&gt;
# * Выберите одну народность. Найдите самых похожих и самых непохожих на неё.&lt;br /&gt;
# * Найдите самые похожие и самые непохожие народности.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Задача о разрезании стержня (05.01)==&lt;br /&gt;
# Постановка задачи.&lt;br /&gt;
# Решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Решение с нахождением максимума по p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Восходящий алгоритм с запоминанием. Вывод длин кусочков стержня. Оценка сложности.&lt;br /&gt;
# Нисходящий алгоритм с запоминанием. Оценка сложности.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.1 Разрезание стержня, стр. 393]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 8 (до 22.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Решая задачу о разрезании стержня мы вначале построили рекурсивное решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt; для всех 1 ≤ i &amp;lt; n. Его сложность описывалась рекуррентной формулой T(n) = n + &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n-1&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt;(T(i) + T(n-i)), T(1) = 1.&lt;br /&gt;
# Объясните эту формулу.&lt;br /&gt;
# Покажите с помощью метода подстановок, что T(n) ≤ 2&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Покажите с помощью контрпримера, что описанная далее жадная стратегия не всегда определяет оптимальный способ разрезания стержня. Определим плотность стержня длиной i как p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;/i, то есть как стоимость единицы его длины. Жадная стратегия для стержня длиной n отрезает от стержня первую часть длиной i, где 1 ≤ i ≤ n, имеющую максимальную плотность. Затем та же жадная стратегия применяется к оставшейся части длиной n-i.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Рассмотрим модификацию задачи разрезания стержня, в которой в дополнение к цене p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; каждого стержня добавляется фиксированная цена разреза c. Теперь прибыль, связанная с решением, представляет собой сумму цен частей стержня минус стоимость разрезов. Разработайте алгоритм динамического программирования для этой модифицированной задачи.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Непрерывным участком называется группа подряд идущих элементов. Например, для последовательности&lt;br /&gt;
 5, 15, −30, 10, −5, 40, 10&lt;br /&gt;
элементы 15, −30, 10 образуют непрерывный участок, а 5, 15, 40 -- нет. Постройте линейный алгоритм для следующей задачи:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Вход: список чисел a1, a2, ... ‌, an.&lt;br /&gt;
Выход: непрерывный участок с максимальной суммой (сумма участка нулевой длины равна нулю).&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Для приведённого примера ответом будет 10, −5, 40, 10 с суммой 55. Какова сложность алгоритма? Почему?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Надо заплатить v рублей, имея купюры в x1, x2, ‌..., xn рублей (купюр каждого типа сколько угодно). Это не всегда возможно (скажем, купюрами в&lt;br /&gt;
10 и 25 рублей можно заплатить 45 рублей, но не 47 и не 15). Постройте основанный на методе динамического программирования алгоритм со временем работы O(nv), выясняющий, возможна ли уплата.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как решить предыдущую задачу, если каждая купюра имеется в единственном экземпляре? (Например, купюрами в 1, 5, 10, 20 рублей можно заплатить 16 = 1 + 5 + 10 и 31 = 1 + 10 + 20 рублей, но не 40 (не хватит денег). Время работы алгоритма по-прежнему O(nv).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Ещё один вариант той же задачи: купюр каждого типа сколько угодно, но всего разрешается использовать не более k купюр. (Например, если есть купюры в 5 и 10 рублей, а k = 6, то 55 разменять можно, а 65 –– нет).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Перемножение цепочки матриц. Оптимальное бинарное дерево поиска (начало) (09.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о перемножении цепочки матриц. Постановка задачи.Пример. Нисходящий алгоритм.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.2 Перемножение цепочки матриц, стр. 403]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 9 (до 24.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Найдите оптимальную расстановку скобок в произведении последовательности матриц, размерности которых равны 5×10, 10×3, 3×12, 12×5, 5×50, 50×6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Напишите восходящий алгоритм для поиска оптимальной расстановки скобок.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Расстановка пробелов. Оптимальное бинарное дерево поиска (середина) (12.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о расстановке пробелов. Постановка задачи. Решения для трёх случаев: 1. нужно вернуть можно ли разбить текст на слова; 2. вернуть разбивку на слова; 3. слова встречаются не равновероятно, вернуть наиболее вероятную разбивку на слова.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи. Вывод математического ожидания времени поиска.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Праздничное домашнее задание 10 (до 02.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[&amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;,&amp;quot;, &amp;quot;.&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;,&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;.&amp;quot;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Подсказка:&#039;&#039;&#039; разбейте текст на слова из списка и посмотрите на азбуку Морзе.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Способы представления графов в памяти (16.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Разбор ошибок в домашнем задании.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Графы. Способы представления графов в памяти (матрица смежности, список рёбер, список соседей (список смежностей), матрица инцидентности). Зависимость сложности алгоритмов от способа представления.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §22.1 Представление графов, стр. 626]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 11 (до 02.03)===&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача A.]&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача B.]&lt;br /&gt;
# Нарисуйте неориентированный граф с 5 вершинами и 8 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Нарисуйте ориентированный граф с 4 вершинами и 3 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Дан ориентированный граф. &#039;&#039;Исходящая степень вершины v&#039;&#039; --- это количество исходящих из неё рёбер, &#039;&#039;входящая степень v&#039;&#039; --- это количество рёбер входящих в  v. Имеется представление ориентированного графа с использование списка соседей. Как долго будут вычисляться исходящие степени всех вершин графа? А входящие степени?&lt;br /&gt;
# Дан граф G = (V, E). Какие из рассмотренных способов хранения графов используют меньше всего памяти для хранения G и почему? Указание: рассмотрите случаи |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;lt; |E| и |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;gt; |E|.&lt;br /&gt;
# Пусть C --- это матрица смежности графа G.&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
# Пусть B --- это матрица инцидентности ориентированного графа G. Как связаны элементы матрицы BB&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
&lt;br /&gt;
==Реализация поиска в глубину (19.02)==&lt;br /&gt;
# Реализация поиска в глубину и смежных задач.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 12 (до 5.03)===&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Выберите любой способ хранения графа. Реализуйте поиск в глубину.&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Напишите алгоритм, который возвращает данные о том, какие вершины лежат в одной компоненте связности.&lt;br /&gt;
# &#039;&#039;(любой ЯП или псевдокод)&#039;&#039; Напишите алгоритм проверки сильной связности ориентированного графа. Какова его сложность?&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №2==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
Необходимо реализовать 3 задачи из [https://official.contest.yandex.ru/contest/1085 контеста], см. [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing распределение задач]. Каждую задачу можно написать на С++ или Python. На выполнение работы отводится две недели (см. время окончания контеста). [https://official.contest.yandex.ru/contest/1123 Дорешивание.]&lt;br /&gt;
&lt;br /&gt;
==ДП и графы (26.02)==&lt;br /&gt;
==ДП и графы (02.03)==&lt;br /&gt;
==Жадные алгоритмы (12.03)==&lt;br /&gt;
===Домашнее задание 13 (до 23.03)===&lt;br /&gt;
# Вася хочет купить по одной акции каждой компании. Все акции стоят одинаково, но дорожают по-разному. Каждый месяц акция i-ой компании дорожает в r_i раз. В один месяц можно купить только одну акцию.&lt;br /&gt;
## Напишите алгоритм, который выводит оптимальную последовательность покупок (такую, что на покупку всех акций потратится меньше денег).&lt;br /&gt;
## Докажите корректность алгоритма, то есть докажите, что последовательность покупок, которую выводит ваш алгоритм, оптимальна.&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список, очередь (16.03)==&lt;br /&gt;
# Реализация линейного двусвязного списка (С++).&lt;br /&gt;
# Реализация очереди ограниченной длины на базе вектора (С++).&lt;br /&gt;
# Реализация очереди на базе списка (С++).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14 (до 23.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте (на С++) структуру данных Стек. У стека должно быть три операции:&lt;br /&gt;
* push --- положить элемент на вершину стека;&lt;br /&gt;
* pop --- удалить верхний элемент;&lt;br /&gt;
* front --- вернуть значение верхнего элемента.&lt;br /&gt;
Оцените время работы каждой функции.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список (19.03)==&lt;br /&gt;
===Домашнее задание 13* (до 30.03)===&lt;br /&gt;
#Для приведённой реализации класса List (https://yadi.sk/i/c5r_79WdfMyNS).&lt;br /&gt;
## Допишите print, push_back и push_front.&lt;br /&gt;
## В функции insert_after и delete_node вставьте необходимые проверки так, чтобы они работали для крайних случаев.&lt;br /&gt;
## Напишите main в котором&lt;br /&gt;
### создаётся объект класса List, &lt;br /&gt;
### заполняется элементами с помощью функций push_back, push_front и insert_after и&lt;br /&gt;
### удаляется i-ый элемент.&lt;br /&gt;
&lt;br /&gt;
==Повторение (30.03)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Для данных пар функций выясните их связь в терминах O-, o-, Ω-, ω-, Θ-обозначений. Поставьте галочку в клетке с Ω, если f(x) = Ω(g(x)) и прочерк, если равенства нет. [https://ru.wikipedia.org/wiki/«O»_большое_и_«o»_малое#.D0.94.D1.80.D1.83.D0.B3.D0.B8.D0.B5_.D0.BF.D0.BE.D0.B4.D0.BE.D0.B1.D0.BD.D1.8B.D0.B5_.D0.BE.D0.B1.D0.BE.D0.B7.D0.BD.D0.B0.D1.87.D0.B5.D0.BD.D0.B8.D1.8F Википедия]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! f(x)!! g(x)!! O!! o!! Ω!! ω!! Θ&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! 2^100&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n * log(n)&lt;br /&gt;
! 2^100 * n * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n&lt;br /&gt;
! 2^100 * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n!&lt;br /&gt;
! 2^(2015n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n*2^n&lt;br /&gt;
! 3^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 5^n&lt;br /&gt;
! 5^(n+1)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n + n^2 + n^3 + ... + n^1000&lt;br /&gt;
! 7^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм Quickselect нахождения k-ого элемента по возрастанию: http://en.wikipedia.org/wiki/Quickselect&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;На улице стоит ряд домов. В каждом из домов лежит сколько-то денег. Вор хочет обокрасть дома на переулке. Он не может обокрасть два соседних дома, потому что хозяин дома, который он обокрал, сразу предупредит соседей. Нужно найти, какую максимальную сумму вор может украсть с переулка. На вход программы подается массив неотрицательных целых чисел - количество долларов в доме с номером i. Соседние дома в массиве представлены соседними элементами. Например, пусть задан массив { 1, 4, 5 } - тогда вор максимум может украсть $6, обокрав дома 1 и 3. Пусть задан массив { 1, 7, 2 } - тогда вор максимум может украсть $7, обокрав дом 2.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Алфавит из всех маленьких латинских букв и пробела закодирован числами следующим способом:&lt;br /&gt;
  &#039;a&#039; -&amp;gt; 1&lt;br /&gt;
  &#039;b&#039; -&amp;gt; 2&lt;br /&gt;
  &#039;c&#039; -&amp;gt; 3&lt;br /&gt;
  ...&lt;br /&gt;
  &#039;z&#039; -&amp;gt; 26&lt;br /&gt;
  &#039; &#039; -&amp;gt; 27&lt;br /&gt;
На вход программы подается строка из цифр. Нужно посчитать, сколькими способами можно раскодировать эту строку.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Дан граф, заданный матрицей смежности. Вывести пары вершин между которыми нет пути.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Повторение (02.04) ==&lt;br /&gt;
Решали и разбирали первые 4 задачи из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14* (до 11.03)===&lt;br /&gt;
Решите любые две задачи (подпункты НЕ считаются отдельными задачами) с предыдущей пары (Повторение (30.03)).&lt;br /&gt;
&lt;br /&gt;
== Повторение (06.04) ==&lt;br /&gt;
Будем решать вторую половину задач из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 15 (до 16.04)===&lt;br /&gt;
# Приведите пример графа, который содержит отрицательные рёбра, не содержит циклов отрицательного веса и для которого алгоритм Дейкстры возвращает неверный результат.&lt;br /&gt;
# Используется ли в алгоритме Дейкстры то, что веса рёбер неотрицательны? Если &amp;quot;да&amp;quot;, то где именно?&lt;br /&gt;
# Пусть граф содержит рёбра с весами &amp;gt;= -100. Если прибавить к каждому ребру 101 и при помощи алгоритма Дейкстры найти кратчайшие пути. Будут ли эти пути кратчайшими в исходном графе? Почему?&lt;br /&gt;
&lt;br /&gt;
== Повторение (07.04) ==&lt;br /&gt;
&#039;&#039;&#039;Решение рекуррентных соотношений&#039;&#039;&#039;&lt;br /&gt;
# Решите уравнение: T(n) = 4*T(n/2) + O(n^2) с базой T(1) = O(1)&lt;br /&gt;
## Используя основную теорему.&lt;br /&gt;
## Используя дерево рекурсий.&lt;br /&gt;
## Методом подстановки.&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2)) + n является \Theta(n lg n).&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2) + 17) + n является \Theta(n lg n).&lt;br /&gt;
# Решите уравнения, считая, что T(1) = O(1):&lt;br /&gt;
## T(n) = T(n-1) + n&lt;br /&gt;
## T(n) = 2*T(floor(sqrt(n))) + lg n. Указание: попробуйте использовать замену переменных.&lt;br /&gt;
## T(n) = 3*T(sqrt(n)) + lg n&lt;br /&gt;
# Дайте верхнюю и нижнюю оценки функции T(n). Постарайтесь, чтобы оценки были как можно более точные&lt;br /&gt;
## T(n) = 4T(n/3) + n*lg(n)&lt;br /&gt;
## T(n) = 3T(n/3) + n/lg(n)&lt;br /&gt;
## T(n) = 4T(n/2) + n^2*sqrt(n)&lt;br /&gt;
## T(n) = T(n/2) + T(n/4) + T(n/8) + n&lt;br /&gt;
## T(n) = T(n-1) + 1/n&lt;br /&gt;
## T(n) = T(n-2) + 1/lg(n)&lt;br /&gt;
## T(n) = sqrt(n) * T(sqrt(n)) + n&lt;br /&gt;
&#039;&#039;&#039;Анализ и построение алгоритмов&#039;&#039;&#039;&lt;br /&gt;
# Числа Фибоначчи F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; можно выразить через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, используя матрицу: https://yadi.sk/i/Pm_aNzHCforFU. &lt;br /&gt;
## Покажите как вычислить F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;.&lt;br /&gt;
## Как вычислить F&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;n+1&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;?&lt;br /&gt;
## Напишите алгоритм.&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
## Ускорьте его так, чтобы он работал за O(log n).&lt;br /&gt;
# Дана последовательность символов. Какое минимальное количество символов нужно удалить из неё, чтобы получить палиндром?&lt;br /&gt;
## Напишите алгоритм (на псевдокоде или на любом языке программирования).&lt;br /&gt;
## Оцените время работы алгоритма.&lt;br /&gt;
# Какую структуру данных вы бы использовали для реализации упорядоченного множества (http://neerc.ifmo.ru/wiki/index.php?title=Упорядоченное_множество)? Какая будет сложность каждой из операций над множеством?&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 16 (до 20.04)===&lt;br /&gt;
# Решите 6 задач из первой части и 6 из второй. (Укажите какие именно.) Каждый из подпунктов является отдельной задачей.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм и теорема Форда-Фалкерсона (16.04)==&lt;br /&gt;
# Базовые определения (пропускные способности, сток, исток и пр.). Пример. &lt;br /&gt;
# Ограничения на поток (сохранение и что меньше пропускных способностей).&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, пример работы&lt;br /&gt;
# Разрез, определение, пример.&lt;br /&gt;
# Утверждение: максимальный поток &amp;lt;= любого разреза.&lt;br /&gt;
# Теорема Форда-Фалкерсона (с доказательством).&lt;br /&gt;
# Пример на котором алгоритм Форда-Фалкерсонаработает работает очень долго при неудачном выборе путей.&lt;br /&gt;
# Сложность алгоритма Форда-Фалкерсона.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №3==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
В [https://official.contest.yandex.ru/contest/1196 домашнем задании] пять задач. Они разделены на два варианта, помеченные римскими цифрами I и II. Свой вариант нужно узнать [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing здесь на вкладке HW3]. Третья задача — общая для двух вариантов; ее решение необходимо снабдить доказательством корректности алгоритма. На выполнение задания дается примерно 2 недели (см. точное время окончания в контесте). Каждую задачу можно написать на С++ или Python.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Форда-Фалкерсона и Эдмондса-Карпа (20.04)==&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, напоминание: базовые определения, пример работы, пример на котором алгоритм работает долго, сложность.&lt;br /&gt;
# Алгоритм Эдмодса-Карпа. Доказательство асимптотики времени работы.&lt;br /&gt;
&lt;br /&gt;
==(23.04)==&lt;br /&gt;
&lt;br /&gt;
==(11.05) Красно-чёрные деревья==&lt;br /&gt;
[https://ru.wikipedia.org/wiki/Красно-чёрное_дерево Красно-чёрное дерево]&lt;br /&gt;
===Домашнее задание 17 (до 18.05)===&lt;br /&gt;
# Зачем нужны красно-чёрные деревья?&lt;br /&gt;
# Благодаря какому свойству и почему красно-чёрное дерево является сбалансированным?&lt;br /&gt;
# Нарисуйте полное бинарное дерево поиска высотой 3 с ключами {1, 2, ..., 15}. Сделайте из него красно-чёрные деревья высотой 2, 3 и 4.&lt;br /&gt;
# Нарисуйте красно-чёрные деревья, получающиеся последовательной вставкой элементов 12, 10, 29, 30, 31, 32 в [https://ru.wikipedia.org/wiki/Красно-чёрное_дерево#/media/File:Red-black_tree_example.svg данное дерево]. Для вставки используйте алгоритм вставки из Википедии. Укажите какой именно функцией вы воспользовались.&lt;br /&gt;
# Определим &#039;&#039;&#039;ослабленное красно-чёрное дерево&#039;&#039;&#039; как бинарное дерево поиска, которое удовлетворяет красно-чёрным свойствам 1, 3, 4 и 5. Другими словами, корень может быть как чёрным, так и красным. Рассмотрите ослабленное красно-чёрное дерево T, корень которого красный. Если перекрасить корень дерева T в чёрный, будет ли оно красно-чёрным деревом?&lt;br /&gt;
# Покажите, что самый длинный простой нисходящий путь от вершины x к листу красно-черного дерева имеет длину, не более чем в два раза превышающую кратчайший путь от x к листу-потомку.&lt;br /&gt;
# Чему равно наибольшее возможное количество внутренних узлов в красно-чёрном дереве с чёрной высоты k? А наименьшее возможное количество?&lt;br /&gt;
# Нарисуйте красно-чёрные деревья, получающиеся последовательной вставкой ключей 41, 38, 31, 12, 19, 8 в изначально пустое дерево.&lt;br /&gt;
# Покажите какие деревья будут получаться в результате последовательного удаления ключей в порядке 8, 12, 19, 31, 38, 41.&lt;br /&gt;
&lt;br /&gt;
==(14.05) Конкурентный анализ самоорганизующихся циклов==&lt;br /&gt;
[https://vk.com/doc12518218_390369758 Лекция]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 18 (до 21.05)===&lt;br /&gt;
Все вычисления сопроводите подробными объяснениями о том, почему верно то или иное (не)равенство.&lt;br /&gt;
# Пусть имеется n-элементный список и m поисковых запросов к нему. После каждой операции поиска можно переупорядочить список. Обозначим стоимость последовательности поисков через C. Докажите, что в худшем случае C = Ω(mn).&lt;br /&gt;
#  Обозначим через c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; стоимость i-ого поискового запроса с применением эвристики перемещения в начало, которая включает стоимость поиска элемента в списке и стоимость его перемещения в начало списка путём ряда обменов соседних элементов списка. Покажите, что i-ая операция поиска находит элемент x в списке L с применением эвристики перемещения в начало, то c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = 2 * rank&amp;lt;sub&amp;gt;L&amp;lt;/sub&amp;gt;(x) - 1.&lt;br /&gt;
# Покажите, что c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = 2 * rank&amp;lt;sub&amp;gt;L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) - 1.&lt;br /&gt;
# Покажите, что c*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = rank&amp;lt;sub&amp;gt;L*&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) + t&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;.&lt;br /&gt;
# Докажите, что после одного обмена двух соседних элементов потенциал либо увеличивается на 2, либо уменьшается на 2.&lt;br /&gt;
# Докажите, что rank&amp;lt;sub&amp;gt;L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) = |A| + |B| + 1.&lt;br /&gt;
# Докажите, что rank&amp;lt;sub&amp;gt;L*&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) = |A| + |С| + 1.&lt;br /&gt;
# Покажите, что поиск i-ого элемента приводит к изменению потенциала Ф(L&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;) - Ф(L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;) &amp;lt;= 2 (|A| - |B| + t*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;), где t*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; --- это количество обменов при i-ом поиске.&lt;br /&gt;
# Во сколько раз стоимость С&amp;lt;sub&amp;gt;MFT&amp;lt;/sub&amp;gt;(S) превышает C&amp;lt;sub&amp;gt;OPT&amp;lt;/sub&amp;gt;(S)?&lt;br /&gt;
&lt;br /&gt;
== (18.05) Конечные автоматы ==&lt;br /&gt;
=== Задание 19 (до 25.05) ===&lt;br /&gt;
# Постройте автомат для языка над алфавитом Σ = {0, 1} каждое слово которого содержит хотя бы два нуля. Является ли он детерминированным?&lt;br /&gt;
# Постройте автомат над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5. Является ли он детерминированным?&lt;br /&gt;
# Постройте автомат, который допускает пустой язык (язык в котором нет ни одного слова).&lt;br /&gt;
# Постройте автомат, который допускает все слова над алфавитом Σ.&lt;br /&gt;
# Постройте ДКА над алфавитом Σ = {К, Ж, З}, который допускает слова в которых после К идёт З, после З --- Ж, после Ж --- К.&lt;br /&gt;
# * Постройте ДКА над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5, а число нулей на 3.&lt;br /&gt;
# Постройте НКА для языка над алфавитом Σ = {0, 1, 2, 3}, состоящий из слов, в которых хотя бы одна из последних пяти букв является 1.&lt;br /&gt;
# Постройте НКА над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5, а число нулей на 3.&lt;br /&gt;
# Какие языки допускают автоматы https://yadi.sk/d/fNAHbjCZghERG?&lt;br /&gt;
# Для каждого из автоматов https://yadi.sk/d/fNAHbjCZghERG постройте соответствующий ему ДКА.&lt;br /&gt;
&lt;br /&gt;
== (21.05) Регулярные выражения, КА, их эквивалентность. Лемма о накачке  ==&lt;br /&gt;
=== Задание 20 (до 28.05) ===&lt;br /&gt;
&#039;&#039;&#039;I Написать регулярные выражения&#039;&#039;&#039;&lt;br /&gt;
# Напишите регулярное выражение для языка над алфавитом Σ = {0, 1} каждое слово которого содержит хотя бы два нуля.&lt;br /&gt;
# Напишите регулярное выражение над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5.&lt;br /&gt;
# Напишите регулярное выражение, которое допускает пустой язык (язык в котором нет ни одного слова).&lt;br /&gt;
# Напишите регулярное выражение, которое допускает все слова над алфавитом Σ.&lt;br /&gt;
# Напишите регулярное выражение для языка над алфавитом Σ = {0, 1, 2, 3}, состоящий из слов, в которых хотя бы одна из последних пяти букв является 1.&lt;br /&gt;
&#039;&#039;&#039;II КА и регулярные выражения&#039;&#039;&#039;&lt;br /&gt;
# Постройте конечный автомат для языка (111 U 01)&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;1(00 U 11)&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;.&lt;br /&gt;
# Постройте конечный автомат для языка (ab)&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;(a U b)(b U a)&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;(a U bab).&lt;br /&gt;
&#039;&#039;&#039;III Доказать замкнутость относительно различных операций&#039;&#039;&#039;&lt;br /&gt;
# Покажите, что если для языков L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; и L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; существует КА, который их читает, то существует КА и для их объединения L = {w | w ∈ L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; или w ∈ L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;}.&lt;br /&gt;
# Покажите, что если для языка L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; и L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; существует КА, который их читает, то существует КА и для языка L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; = {xy | x ∈ L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, y ∈ L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;}.&lt;br /&gt;
# Покажите, что если для языка L существует КА, который его читает, то существует КА и для &#039;&#039;&#039;замыкания Клини&#039;&#039;&#039; L* = {w&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; w&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; ... w&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;| w&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; ∈ L, w&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; ∈ L, ..., w&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; ∈ L}.&lt;br /&gt;
# Покажите, что если язык L регулярен, то регулярно его дополнение (т.е. язык над тем же алфавитом, которому принадлежит слово тогда и только тогда, когда оно НЕ принадлежит L) .&lt;br /&gt;
# Покажите, что если язык L регулярен, то регулярно его обращение L&amp;lt;sub&amp;gt;R&amp;lt;/sub&amp;gt; = {a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; . . . a&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; | a&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; . . . a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; ∈ L}. (L&amp;lt;sub&amp;gt;R&amp;lt;/sub&amp;gt; --- это язык в котором все слова языка L записаны наоборот.)&lt;br /&gt;
# * Покажите, что если языки L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; и L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; регулярны, то регулярно их пересечение.&lt;br /&gt;
&#039;&#039;&#039;IV Использование леммы о накачке&#039;&#039;&#039; (см. [https://vk.com/doc12518218_392750846 конспект])&lt;br /&gt;
# Докажите, что не существует КА, который бы читал язык {0&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;1&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;2&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;}. (Пояснение: запись 0&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; означает строку из n нулей: 00...0.)&lt;br /&gt;
# Докажите, что не существует КА, который бы читал язык {0&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;1&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;}.&lt;br /&gt;
# Докажите, что не существует КА, который бы читал язык {0&amp;lt;sup&amp;gt;n!&amp;lt;/sup&amp;gt;}.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== (25.05) Автоматный подход ==&lt;br /&gt;
=== Задание 21 (до 01.06) ===&lt;br /&gt;
Реализуйте один из следующих проектов:&lt;br /&gt;
# Программа, которая считывает строку и говорит принадлежит ли она языку 0(123)*(00 U (231)*) U 111.&lt;br /&gt;
# Программа, которая считывает КА и генерирует программу на языке С++, которая говорит принадлежит ли заданное слово языку, описываемому этим КА.&lt;br /&gt;
# Программа, которая считывает регулярное выражение и строку и говорит принадлежит ли слово языку, описываемому этим регулярным выражением.&lt;br /&gt;
# Программа, которая моделирует работу банкомата, автомата с газировкой, лифта... (что-то одно на выбор)&lt;br /&gt;
# Текстовый симулятор студента. Возможные состояния: на паре, дома, есть приглашение прогулять, завтра коллоквиум, сплю и др. Есть два параметра: успеваемость и весёлось. Если хотя бы один из них упадёт ниже критической отметки, студент умрёт. Игрок принимает решение куда идти студенту. Цель: продержаться как можно дольше.&lt;/div&gt;</summary>
		<author><name>Kassalanche</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=15362</id>
		<title>Алгоритмы и структуры данных. Подгруппа 105-1</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=15362"/>
		<updated>2015-05-25T15:33:58Z</updated>

		<summary type="html">&lt;p&gt;Kassalanche: /* Задание 21 (до 01.06) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==О курсе==&lt;br /&gt;
[[Алгоритмы_и_структуры_данных|План лекций и список рекомендуемой литературы.]]&lt;br /&gt;
&lt;br /&gt;
[[Алгоритмы_и_структуры_данных._Подгруппа_105-1._FAQ|FAQ.]]&lt;br /&gt;
&lt;br /&gt;
[[Reviewboard|Инструкция по использованию Reviewboard.]]&lt;br /&gt;
&lt;br /&gt;
[[Практические_занятия_по_курсу_ОиМП/C++_check|Style guide.]]&lt;br /&gt;
&lt;br /&gt;
==Итоговая оценка за курс==&lt;br /&gt;
Итоговая оценка (ИО) зависит от&lt;br /&gt;
* оценок за пять больших домашних заданий (БДЗ1, БДЗ2, ..., БДЗ5),&lt;br /&gt;
* оценок за домашние задания (ДЗ1, ДЗ2, ...),&lt;br /&gt;
* оценки за контрольную работу (КР),&lt;br /&gt;
* оценки за экзамен (ЭКЗ),&lt;br /&gt;
и может быть вычислена по формуле:&lt;br /&gt;
 ИО = 0.7 * (0.3 * КР + 0.7 *(ИДЗ1 + ИДЗ2 + ИДЗ3 + ИДЗ4 + ИДЗ5)/5) + 0.3 * ЭКЗ =&lt;br /&gt;
    = 0.21*КР + 0.098*ИДЗ1 + 0.098*ИДЗ2 + 0.098*ИДЗ3 + 0.098*ИДЗ4 + 0.098*ИДЗ5 + 0.3*ЭКЗ,&lt;br /&gt;
где&lt;br /&gt;
 ИДЗi = min (10, 0.7 * БДЗi + 0.4 * &amp;lt;cредняя оценка за ДЗj, прошедшие с предыдущего БДЗ по i-ое&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
==Порядок сдачи домашних работ==&lt;br /&gt;
===Большие домашние работы===&lt;br /&gt;
# Получить OK за задачу в контесте.&lt;br /&gt;
# Залить исходный код на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* На каждую задачу создавайте отдельный запрос на ревью. &lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении суток приходят замечания к коду. &#039;&#039;&#039;Если в течении суток замечаний или Ship It не появилось, проверьте, что вы правильно отправили запрос и, если всё сделано правильно, спросите у семинариста получил ли он запрос.&#039;&#039;&#039;&lt;br /&gt;
# Вы их исправляете, проверяете в контесте, что программа по-прежнему проходит все тесты, заливаете новую версию в Review Board. Штрафов за посылки НЕ будет.&lt;br /&gt;
# Процесс повторяется пока остаются замечания к коду или пока не истёк дедлайн. После закрытия контеста будут ещё одни сутки на доработку замечаний в Review Board.&lt;br /&gt;
# Оценивается только последняя версия работы в Review Board.&lt;br /&gt;
&lt;br /&gt;
===Маленькие домашние работы===&lt;br /&gt;
# Залить решение на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* Желаемые форматы: txt, py, cpp, h. Допускаются любые другие.&lt;br /&gt;
#* На каждую домашнюю работу создавайте отдельный запрос на ревью. Обязательно указывайте номер домашней работы.&lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении неопределенного промежутка времени придут оценки по каждому из заданий.&lt;br /&gt;
&lt;br /&gt;
==Оценивание домашних работ==&lt;br /&gt;
* Все задания предполагаются индивидуальными. Запрещены любые заимствования без ссылки на автора.&lt;br /&gt;
* Решения после установленного дедлайна не принимаются. Дедлайн указан в заголовке каждого задания.&lt;br /&gt;
* Везде, где требуется написать алгоритм, можно использовать любой язык программирования или псевдокод.&lt;br /&gt;
* Там, где требуется построить алгоритм с заданной асимптотикой, приведите обоснование, что полученный алгоритм удовлетворяет этому условию.&lt;br /&gt;
* Эти правила не действуют, если в задании явно оговорено иное.&lt;br /&gt;
&lt;br /&gt;
==Мотивация к изучению алгоритмов. Подсчёт числа операций (12.01)==&lt;br /&gt;
# Числа Фибоначчи. Определение. Примитивный рекурсивный алгоритм вычисления i-ого числа. Оценка числа операций. Анализ причин неэффективности. Алгоритм с запоминанием вычисленных ранее значений. Оценка числа операций. Сравнение с предыдущим. (подробнее: глава 0, страницы 8-10 из книги &amp;lt;&amp;lt;Алгоритмы&amp;gt;&amp;gt;, [[Алгоритмы_и_структуры_данных|см. список рекомендованной литературы]])&lt;br /&gt;
# Задача о ханойской башне. Постановка задачи. Рекурсивный алгоритм. Рекуррентная формула для числа перемещений. Замкнутая формула для числа перемещений (+ доказательство). Доказательство того, что эту задачу нельзя решить используя меньшее число перемещений дисков. ([https://www.dropbox.com/s/t8cbs7ttu4iasvj/algo-0-recursion.pdf?dl=0 Разбор задачи о ханойской башне], автор Сергей Объедков)&lt;br /&gt;
# Сортировка пузырьком. Алгоритм. Подсчёт количество операций сравнения и обмена (swap). Анализ наилучшего и наихудшего случаев ([https://ru.wikipedia.org/wiki/Сортировка_пузырьком Википедия])&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 1 (12.01 - 26.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
Во всех задачах, если не оговорено иного, предполагаем, что работаем с целыми неотрицательными числами. Для первых 7 задач необходимо&lt;br /&gt;
* описать что можно считать наилучшим и наихудшим случаями,&lt;br /&gt;
* для каждого из двух случаев подсчитать отдельно количество операций сравнения и swap (если есть).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Даны три числа, требуется вернуть наименьшее.&lt;br /&gt;
# Даны три числа, требуется отсортировать их.&lt;br /&gt;
# Дана последовательность A из n элементов и число x, требуется найти элемент равный x. Примечание: если таких значений i несколько, вернуть любое; если такого элемента нет, функция должна сообщить об этом.&lt;br /&gt;
# * Дана упорядоченная последовательность A из n элементов и число x, требуется найти такое i, что A[i] равно x. Алгоритм должен быть эффективней, чем в предыдущем пункте и использовать то, что последовательность упорядочена.&lt;br /&gt;
# Дана последовательность из 100 000 чисел от 0 до 100. Напишите эффективный алгоритм сортировки, который бы учитывал специфику входных данных.&lt;br /&gt;
# * Дано 32 битное неотрицательное число. Требуется номер первого ненулевого бит. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения, считая, что числа распределены равномерно.&lt;br /&gt;
# * Даны 32 битные неотрицательные числа m и n. Требуется вывести True, если m &amp;lt; n, иначе False. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения битов, считая, что числа распределены равномерно.&lt;br /&gt;
# Напишите рекурсивную функцию, вычисляющую n-ое число Фибоначчи (как на занятии). Подсчитайте количество рекурсивных вызовов.&lt;br /&gt;
# * Напишите функцию, вычисляющую n-ое число Фибоначчи, у которой число операций — полином от n, и которая использует количество памяти, независящее от n.&lt;br /&gt;
&lt;br /&gt;
==O-символика и стратегия &amp;quot;разделяй и властвуй&amp;quot; (15.01)==&lt;br /&gt;
# Сортировка слиянием. Алгоритм, рекуррентное соотношение для времени сортировки, сложность. Подробнее: [https://dl.dropboxusercontent.com/u/829163/draft.pdf §2.3 Сортировка слиянием (стр. 54)].&lt;br /&gt;
# О-символика. [https://dl.dropboxusercontent.com/u/829163/draft.pdf §0.3 О-символика (стр. 10)].&lt;br /&gt;
# Задача о слиянии m упорядоченных массивов по n элементов. Три алгоритма решения: последовательное слияние, слияние &amp;quot;деревом&amp;quot; (обе функции используют Merge из MergeSort), аналог Merge для m массивов. Анализ сложности каждого из них.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 2 (15.01-29.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
* Во всех задачах, если не оговорено иного, для простоты &#039;&#039;можно&#039;&#039; считать, что n является степенью какого-либо числа, например, степенью двойки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Дана функция F, определённая ниже. Сколько строк она напечатает? Указание: для обоих подпунктов рассмотрите два случая: 1. n является степенью двойки, 2. n не является степенью двойки.&lt;br /&gt;
## Запишите рекуррентное соотношение для числа строк.&lt;br /&gt;
## Решите уравнение, полученное в предыдущем пункте, то есть, выведите замкнутую (нерекуррентную формулу). Для простоты можно считать, что n является степенью двойки.&lt;br /&gt;
# В массиве A размера n записана возрастающая последовательность целых чисел. Постройте алгоритм типа &amp;quot;разделяй и властвуй&amp;quot;, который проверяет, существует ли такой индекс i, что A[i] = i&lt;br /&gt;
## за время O(n),&lt;br /&gt;
## * за время O(log n).&lt;br /&gt;
## Какие случаи для вашего алгоритма являются наихудшими и наилучшими? Какого время работы в лучшем и худшем случаях?&lt;br /&gt;
# Дан бесконечный массив A, первые n элементов которого содержат возрастающую последовательность положительных чисел, а дальше стоят -1. Значение n не дано. Постройте алгоритм, который получает на вход целое число x и находит это x в массиве --- или говорит, что там его нет, &lt;br /&gt;
## за время O(n),&lt;br /&gt;
## за время O(log n).&lt;br /&gt;
# Рассмотрим алгоритм вычисления наибольшего общего делителя (НОД) двух положительных чисел, основанный на методе &amp;quot;разделяй и властвуй&amp;quot;.&lt;br /&gt;
## (задание не оценивается) Прочитайте [https://dl.dropboxusercontent.com/u/829163/draft.pdf §1.2.3 Алгоритм Евклида (стр. 23)].&lt;br /&gt;
## * Докажите, что определение НОД-а, приведённое ниже, корректно.&lt;br /&gt;
## Постройте алгоритм, основанный на этом определении.&lt;br /&gt;
## Какой алгоритм будет быстрее для n-битовых чисел a и b при больших значениях n --- ваш или алгоритм Евклида?&lt;br /&gt;
# * Покажите как за время O(n log n) удалить из массива размера n все дубликаты, то есть оставить каждый элемент в одном экземпляре.&lt;br /&gt;
# * Даны два упорядоченных массива размера m и n. Постройте алгоритм, находящий k-й по величине элемент в объединении этих массивов за время O(log(n+m)). &lt;br /&gt;
&lt;br /&gt;
Функция F(n).&lt;br /&gt;
  если n &amp;gt; 1:&lt;br /&gt;
    напечатать &amp;quot;всё ещё работаю&amp;quot;&lt;br /&gt;
    F(n/2)&lt;br /&gt;
    F(n/2)&lt;br /&gt;
&lt;br /&gt;
Определение НОД-а.&lt;br /&gt;
             2НОД(a/2, b/2), если а и b чётны,&lt;br /&gt;
  НОД(a,b) = НОД(a, b/2), если а нечётно, b чётно,&lt;br /&gt;
             НОД((a-b)/2, b), если а и b нечётны.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;lt;nowiki&amp;gt;Задачи взяты из книги &amp;quot;Алгоритмы&amp;quot;, глава 2 (см. список рекомендованной литературы).&amp;lt;/nowiki&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Сложение и умножение (19.01)==&lt;br /&gt;
# Алгоритм сложения, его сложность (§1.1.1 Сложение*)&lt;br /&gt;
# &amp;quot;Школьный&amp;quot; алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Рекурсивный алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Алгоритм умножения, реализующий стратегию &amp;quot;разделяй и властвуй&amp;quot;, анализ сложности (§2.1 Умножение чисел*)&lt;br /&gt;
 * [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать.]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 3 (19.01 - 2.02)===&lt;br /&gt;
* Во всех задачах для простоты можно считать, что n является степенью какого-либо числа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Найдите произведение чисел 10011011 и 10111010 (в двоичной системе счисления), используя алгоритм умножения чисел, основанный на методе «разделяй и властвуй». Необходимо не только дать ответ, но и привести ход решения.&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 3 рекурсивных вызова для подзадач размера n-1 и комбинирует из них решение исходной задачи за О(n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте три верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 10 рекурсивных вызовов для подзадач размера n/2 и комбинирует из них решение исходной задачи за О(5n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте два верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Докажите, что 3m² + m = O(m²).&lt;br /&gt;
# Докажите, что lg m = O(m/1000), где lg m — это логарифм с двоичным основанием.&lt;br /&gt;
# Докажите, что из равенства f(n) = O(g(n)) не следует, что g(n) = O(f(n)).&lt;br /&gt;
# Докажите, что O(m) содержится в O(m²).&lt;br /&gt;
&lt;br /&gt;
==Решение рекуррентных уравнений (22.01)==&lt;br /&gt;
# Примеры решений рекуррентных уравнений (см. [https://www.dropbox.com/s/6a0r410zjm9qwe7/algo-3-recurrences.pdf?dl=0 конспект]).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 4 (до 14.02)===&lt;br /&gt;
* Нельзя использовать утверждение основной теоремы о решении рекуррентных соотношений.&lt;br /&gt;
* &#039;&#039;Можно&#039;&#039; использовать метод построения дерева рекурсии или подстановку (метод с угадыванием ответа).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Какой из трёх приведённых ниже алгоритмов вы бы предпочли? Обоснуйте свой ответ.&lt;br /&gt;
#* Алгоритм A, решая задачу, производит пять рекурсивных вызовов для подзадач вдвое меньшего размера, после чего строит ответ для исходной задачи за линейное время.&lt;br /&gt;
#* Алгоритм B, решая задачу размера n, делает два рекурсивных вызова для задач размера n − 1, после чего находит ответ за время O(1).&lt;br /&gt;
#* Алгоритм C, решая задачу размера n, рекурсивно решает девять задач размера n/3 и строит ответ за время O(n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Найдите T(n) в замкнутой форме для любых 7 из 10 приведённых ниже рекуррентных соотношений:&lt;br /&gt;
## T(n) ≤ 2T(n/3) + 1;&lt;br /&gt;
## T(n) ≤ 7T(n/7) + n;&lt;br /&gt;
## T(n) ≤ 9T(n/3) + n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 8T(n/2) + n&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 49T(n/25) + n&amp;lt;sup&amp;gt;3/2&amp;lt;/sup&amp;gt;log n;&lt;br /&gt;
## T(n) ≤ T(n − 1) + 2;&lt;br /&gt;
## T(n) ≤ T(n − 1) + n&amp;lt;sup&amp;gt;c&amp;lt;/sup&amp;gt;, где c ≥ 1 –– константа;&lt;br /&gt;
## T(n) ≤ T(n − 1) + c&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;, где c &amp;gt; 1 –– константа;&lt;br /&gt;
## T(n) ≤ 2T(n − 1) + 1;&lt;br /&gt;
## T(n) ≤ T(sqrt(n)) + 1.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №1==&lt;br /&gt;
Необходимо реализовать все 6 задач из [https://official.contest.yandex.ru/contest/1002 контеста]. Каждую задачу можно писать на С++ или Python. На выполнение работы отводится две недели. Каждая задача оценивается в 10/6 балла. Оценка &#039;&#039;может&#039;&#039; быть снижена за плохой код, но не более чем на 25%.&lt;br /&gt;
&lt;br /&gt;
==Бинарное дерево поиска (26.01)==&lt;br /&gt;
# Определение. Пример.&lt;br /&gt;
# Не модифицирующие алгоритмы: поиск (рекурсивный и итеративный алгоритмы), поиск минимума, inordered обход (вывод значений узлов в отсортированном порядке), поиск следующего по возрастанию.&lt;br /&gt;
# Модифицирующие алгоритмы: вставка (рекурсивная реализация), удаление (только идея).&lt;br /&gt;
 [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 13, стр. 248]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 5 (до 16.02)===&lt;br /&gt;
* Для получения максимальной оценки можно выполнить или все задачи без звёздочки, или задачу со звёздочкой. Преподаватель понимает, что реализацию БДП сложно не найти в интернете, но от копипасты не будет никакой пользы. Напротив, самостоятельная реализация очень полезна и приветствуется, даже если не получится выполнить всех пунктов задания.&lt;br /&gt;
* Задачи с двумя звёздочками необязательны.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Нарисуйте бинарные деревья поиска высотой 2, 3, 4, 5 и 6 для множества ключей {1, 4, 5, 10, 16, 17, 21}. Корень дерева имеет высоту 0.&lt;br /&gt;
# &#039;&#039;&#039;Сортировка с использованием БДП.&#039;&#039;&#039;&lt;br /&gt;
## Какова асимптотическая сложность алгоритма вставки элемента в дерево высоты d? Почему? Назовите наилучший и наиухдший случаи.&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который строит БДП в узлах которого стоят элементы данной последовательности. Можно использовать функцию Insert. Назовите наилучший и наихудший случаи. Есть теорема о том, что полученный алгоритм будет работать в среднем случае за время O(n * log n).&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который выводит их в порядке возрастания. Используйте бинарное дерево поиска. Какова в среднем случае сложность этого алгоритма? Назовите наилучший и наихудший случаи. Какова сложность в наихудшем случае?&lt;br /&gt;
# Напишите функцию GetRoot, которой на вход подаётся указатель на произвольный узел дерева, а она возвращает указатель на корень.&lt;br /&gt;
# Напишите процедуру PrintLeafs, которой на вход подаётся указатель на корень дерева, и она печатает листья дерева&lt;br /&gt;
## по возрастанию,&lt;br /&gt;
## по убыванию.&lt;br /&gt;
# ** Альтернативный обход в порядке возрастания бинарного дерева поиска с n узлами (или центрированный (inordered) обход) можно осуществить путём поиска минимального элемента дерева с помощью функции Minimum с последующий n-1 вызовом функции Next. Каково время работы такого алгоритма?&lt;br /&gt;
# * Реализуйте на С++ структуру данных бинарное дерево поиска, [https://yadi.sk/i/gi2SEStreFfSb используя заготовку].&lt;br /&gt;
## Нарисуйте бинарное дерево поиска, которое строится в функции getTreeExample.&lt;br /&gt;
## Реализуйте следующие алгоритмы: &lt;br /&gt;
### поиск минимума, &lt;br /&gt;
### inordered обход (вывод значений узлов в отсортированном порядке),&lt;br /&gt;
### поиск следующего по возрастанию,&lt;br /&gt;
### вставка элемента в дерево,&lt;br /&gt;
### сортировка последовательности с использованием БДП (дан вектор чисел, необходимо вывести их по возрастанию),&lt;br /&gt;
### ** удаление.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Карацубы, Штрассена. Быстрая сортировка (29.01)==&lt;br /&gt;
# Алгоритм Карацубы.&lt;br /&gt;
# Алгоритм Штрассена. [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать Дасгупту и др., §2.5 Умножение матриц]&lt;br /&gt;
# Быстрая сортировка и доказательство того, что в среднем случае она работает за О(n * log n). [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 8 Быстрая сортировка, стр. 148]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 6 (до 18.02)===&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Пусть мы хотим найти двоичное представление десятичного числа 10&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;. Будем считать, что n --- степень двойки (n = 2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt;).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Pwr2Bin(n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть 1010&lt;br /&gt;
    z = ...&lt;br /&gt;
    вернуть Multiply(z, z)&amp;lt;/source&amp;gt;&lt;br /&gt;
Multiply --- функция, перемножающая два n-битовых двоичных числа x и y по алгоритму Карацубы за O(n&amp;lt;sup&amp;gt;log&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;3&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Пусть мы хотим перевести произвольное десятичное число x в записи которого n=2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; чисел в двоичную систему счисления.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Dec2Bin(x, n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть binary[x]&lt;br /&gt;
    разделить x на два десятичных числа xl и xr из n/2 цифр.&lt;br /&gt;
    вернуть ...&amp;lt;/source&amp;gt;&lt;br /&gt;
Здесь binary --- это массив, содержащий двоичное представление десятичных цифр.&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Докажите, что математическое ожидание времени работы алгоритма быстрой сортировки (усреднение по всем вариантам выбора опорного элемента) на любом входе размера n удовлетворяет соотношению: T(n) ≤ O(n) + 1/n * &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt; (T(i-1) + T(n-i)).&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Найдите решение соотношения из предыдущего пункта.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Динамическое программирование (ДП). Первые примеры (02.01)==&lt;br /&gt;
# Нахождение самой длинной возрастающей подпоследовательности.&lt;br /&gt;
# Нахождение редакционного расстояния (или редакционной стоимости, расстояния Левенштейна).&lt;br /&gt;
# Нахождение представителя большинства.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 7 (до 20.02)===&lt;br /&gt;
* В этом задании везде, где требуется реализовать алгоритм, необходимо привести код на любом языке программирования.&lt;br /&gt;
* Для получения максимальной оценки нужно решить все задачи без звёздочек. Одна решённая задача со звёздочкой заменяет одну задачу без звёздочки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения редакционного расстояния (алгоритм Вагнера — Фишера). Например, редакционное расстояние между словами &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равно 6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения длины наибольшей общей подстроки. Например, длина наибольшей общей подстроки &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равна 8 (&amp;quot;antholog&amp;quot;). Чем больше это значение, тем схожей строки.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Предположим теперь, что сравниваемые строки состоят из символов A, С, G и T; за удаление или вставку мы платим -5; за замену буквы x на y платим w[x, y], где x, y принадлежат множеству {A, С, G, T}, a w — это матрица весов:&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
!-!! A!! G!! C!! T&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! A&lt;br /&gt;
|10||-1||-3||-4&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
!G&lt;br /&gt;
||-1||7||-5||-3&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! C&lt;br /&gt;
||-3||-5||9||0&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! T&lt;br /&gt;
||-4||-3||0||8&lt;br /&gt;
|}&lt;br /&gt;
Тогда выравнивание:&lt;br /&gt;
 AGACTAGTTAC&lt;br /&gt;
 CGA‒‒‒GACGT&lt;br /&gt;
будет иметь следующую оценку:&lt;br /&gt;
 w[A,C] + w[G,G] + w[A,A] + 3*(-5) + w[G,G] + w[T,A] + w[T,C] + w[A,G] + w[C,T] = -3 + 7 + 10 - 3*5 + 7 + (-4) + 0 + (-1) + 0 = 1.&lt;br /&gt;
&lt;br /&gt;
Напишите алгоритм, который находит максимальную стоимость всех возможных выравниваний. Верно ли, что чем больше это значение, тем непохожей строки?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как давно один народ отделился от другого? Кто похожей — итальянец и китаец или якут и эфиоп? На эти вопросы можно отвечать с разных точек зрения — культурной, исторической, лингвистической, ... В последние же годы человечество научилось секвенировать геном, что позволило исследовать этот вопрос с точки зрения генетики. Секвенирование генома — это процесс записи ДНК в виде нуклеотидной последовательности, которая представляет собой последовательность из четырёх символов — A, С, G и T. Существуют базы, которые хранят генетическую информацию о людях из разных стран и континентов, например, [http://www.mtdb.igp.uu.se/ http://www.mtdb.igp.uu.se/ → Download mtDNA sequences]. Чем больше сходство между геномами, тем сильнее родственные связи между их обладателями. Используя решение предыдущего пункта, выполните задания:&lt;br /&gt;
# Определите, кто похожей — итальянец и китаец или якут и эфиоп?&lt;br /&gt;
# Найдите нескольких похожих и нескольких непохожих народностей.&lt;br /&gt;
# * Выберите одну народность. Найдите самых похожих и самых непохожих на неё.&lt;br /&gt;
# * Найдите самые похожие и самые непохожие народности.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Задача о разрезании стержня (05.01)==&lt;br /&gt;
# Постановка задачи.&lt;br /&gt;
# Решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Решение с нахождением максимума по p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Восходящий алгоритм с запоминанием. Вывод длин кусочков стержня. Оценка сложности.&lt;br /&gt;
# Нисходящий алгоритм с запоминанием. Оценка сложности.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.1 Разрезание стержня, стр. 393]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 8 (до 22.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Решая задачу о разрезании стержня мы вначале построили рекурсивное решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt; для всех 1 ≤ i &amp;lt; n. Его сложность описывалась рекуррентной формулой T(n) = n + &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n-1&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt;(T(i) + T(n-i)), T(1) = 1.&lt;br /&gt;
# Объясните эту формулу.&lt;br /&gt;
# Покажите с помощью метода подстановок, что T(n) ≤ 2&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Покажите с помощью контрпримера, что описанная далее жадная стратегия не всегда определяет оптимальный способ разрезания стержня. Определим плотность стержня длиной i как p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;/i, то есть как стоимость единицы его длины. Жадная стратегия для стержня длиной n отрезает от стержня первую часть длиной i, где 1 ≤ i ≤ n, имеющую максимальную плотность. Затем та же жадная стратегия применяется к оставшейся части длиной n-i.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Рассмотрим модификацию задачи разрезания стержня, в которой в дополнение к цене p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; каждого стержня добавляется фиксированная цена разреза c. Теперь прибыль, связанная с решением, представляет собой сумму цен частей стержня минус стоимость разрезов. Разработайте алгоритм динамического программирования для этой модифицированной задачи.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Непрерывным участком называется группа подряд идущих элементов. Например, для последовательности&lt;br /&gt;
 5, 15, −30, 10, −5, 40, 10&lt;br /&gt;
элементы 15, −30, 10 образуют непрерывный участок, а 5, 15, 40 -- нет. Постройте линейный алгоритм для следующей задачи:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Вход: список чисел a1, a2, ... ‌, an.&lt;br /&gt;
Выход: непрерывный участок с максимальной суммой (сумма участка нулевой длины равна нулю).&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Для приведённого примера ответом будет 10, −5, 40, 10 с суммой 55. Какова сложность алгоритма? Почему?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Надо заплатить v рублей, имея купюры в x1, x2, ‌..., xn рублей (купюр каждого типа сколько угодно). Это не всегда возможно (скажем, купюрами в&lt;br /&gt;
10 и 25 рублей можно заплатить 45 рублей, но не 47 и не 15). Постройте основанный на методе динамического программирования алгоритм со временем работы O(nv), выясняющий, возможна ли уплата.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как решить предыдущую задачу, если каждая купюра имеется в единственном экземпляре? (Например, купюрами в 1, 5, 10, 20 рублей можно заплатить 16 = 1 + 5 + 10 и 31 = 1 + 10 + 20 рублей, но не 40 (не хватит денег). Время работы алгоритма по-прежнему O(nv).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Ещё один вариант той же задачи: купюр каждого типа сколько угодно, но всего разрешается использовать не более k купюр. (Например, если есть купюры в 5 и 10 рублей, а k = 6, то 55 разменять можно, а 65 –– нет).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Перемножение цепочки матриц. Оптимальное бинарное дерево поиска (начало) (09.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о перемножении цепочки матриц. Постановка задачи.Пример. Нисходящий алгоритм.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.2 Перемножение цепочки матриц, стр. 403]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 9 (до 24.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Найдите оптимальную расстановку скобок в произведении последовательности матриц, размерности которых равны 5×10, 10×3, 3×12, 12×5, 5×50, 50×6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Напишите восходящий алгоритм для поиска оптимальной расстановки скобок.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Расстановка пробелов. Оптимальное бинарное дерево поиска (середина) (12.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о расстановке пробелов. Постановка задачи. Решения для трёх случаев: 1. нужно вернуть можно ли разбить текст на слова; 2. вернуть разбивку на слова; 3. слова встречаются не равновероятно, вернуть наиболее вероятную разбивку на слова.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи. Вывод математического ожидания времени поиска.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Праздничное домашнее задание 10 (до 02.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[&amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;,&amp;quot;, &amp;quot;.&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;,&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;.&amp;quot;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Подсказка:&#039;&#039;&#039; разбейте текст на слова из списка и посмотрите на азбуку Морзе.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Способы представления графов в памяти (16.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Разбор ошибок в домашнем задании.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Графы. Способы представления графов в памяти (матрица смежности, список рёбер, список соседей (список смежностей), матрица инцидентности). Зависимость сложности алгоритмов от способа представления.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §22.1 Представление графов, стр. 626]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 11 (до 02.03)===&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача A.]&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача B.]&lt;br /&gt;
# Нарисуйте неориентированный граф с 5 вершинами и 8 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Нарисуйте ориентированный граф с 4 вершинами и 3 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Дан ориентированный граф. &#039;&#039;Исходящая степень вершины v&#039;&#039; --- это количество исходящих из неё рёбер, &#039;&#039;входящая степень v&#039;&#039; --- это количество рёбер входящих в  v. Имеется представление ориентированного графа с использование списка соседей. Как долго будут вычисляться исходящие степени всех вершин графа? А входящие степени?&lt;br /&gt;
# Дан граф G = (V, E). Какие из рассмотренных способов хранения графов используют меньше всего памяти для хранения G и почему? Указание: рассмотрите случаи |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;lt; |E| и |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;gt; |E|.&lt;br /&gt;
# Пусть C --- это матрица смежности графа G.&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
# Пусть B --- это матрица инцидентности ориентированного графа G. Как связаны элементы матрицы BB&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
&lt;br /&gt;
==Реализация поиска в глубину (19.02)==&lt;br /&gt;
# Реализация поиска в глубину и смежных задач.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 12 (до 5.03)===&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Выберите любой способ хранения графа. Реализуйте поиск в глубину.&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Напишите алгоритм, который возвращает данные о том, какие вершины лежат в одной компоненте связности.&lt;br /&gt;
# &#039;&#039;(любой ЯП или псевдокод)&#039;&#039; Напишите алгоритм проверки сильной связности ориентированного графа. Какова его сложность?&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №2==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
Необходимо реализовать 3 задачи из [https://official.contest.yandex.ru/contest/1085 контеста], см. [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing распределение задач]. Каждую задачу можно написать на С++ или Python. На выполнение работы отводится две недели (см. время окончания контеста). [https://official.contest.yandex.ru/contest/1123 Дорешивание.]&lt;br /&gt;
&lt;br /&gt;
==ДП и графы (26.02)==&lt;br /&gt;
==ДП и графы (02.03)==&lt;br /&gt;
==Жадные алгоритмы (12.03)==&lt;br /&gt;
===Домашнее задание 13 (до 23.03)===&lt;br /&gt;
# Вася хочет купить по одной акции каждой компании. Все акции стоят одинаково, но дорожают по-разному. Каждый месяц акция i-ой компании дорожает в r_i раз. В один месяц можно купить только одну акцию.&lt;br /&gt;
## Напишите алгоритм, который выводит оптимальную последовательность покупок (такую, что на покупку всех акций потратится меньше денег).&lt;br /&gt;
## Докажите корректность алгоритма, то есть докажите, что последовательность покупок, которую выводит ваш алгоритм, оптимальна.&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список, очередь (16.03)==&lt;br /&gt;
# Реализация линейного двусвязного списка (С++).&lt;br /&gt;
# Реализация очереди ограниченной длины на базе вектора (С++).&lt;br /&gt;
# Реализация очереди на базе списка (С++).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14 (до 23.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте (на С++) структуру данных Стек. У стека должно быть три операции:&lt;br /&gt;
* push --- положить элемент на вершину стека;&lt;br /&gt;
* pop --- удалить верхний элемент;&lt;br /&gt;
* front --- вернуть значение верхнего элемента.&lt;br /&gt;
Оцените время работы каждой функции.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список (19.03)==&lt;br /&gt;
===Домашнее задание 13* (до 30.03)===&lt;br /&gt;
#Для приведённой реализации класса List (https://yadi.sk/i/c5r_79WdfMyNS).&lt;br /&gt;
## Допишите print, push_back и push_front.&lt;br /&gt;
## В функции insert_after и delete_node вставьте необходимые проверки так, чтобы они работали для крайних случаев.&lt;br /&gt;
## Напишите main в котором&lt;br /&gt;
### создаётся объект класса List, &lt;br /&gt;
### заполняется элементами с помощью функций push_back, push_front и insert_after и&lt;br /&gt;
### удаляется i-ый элемент.&lt;br /&gt;
&lt;br /&gt;
==Повторение (30.03)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Для данных пар функций выясните их связь в терминах O-, o-, Ω-, ω-, Θ-обозначений. Поставьте галочку в клетке с Ω, если f(x) = Ω(g(x)) и прочерк, если равенства нет. [https://ru.wikipedia.org/wiki/«O»_большое_и_«o»_малое#.D0.94.D1.80.D1.83.D0.B3.D0.B8.D0.B5_.D0.BF.D0.BE.D0.B4.D0.BE.D0.B1.D0.BD.D1.8B.D0.B5_.D0.BE.D0.B1.D0.BE.D0.B7.D0.BD.D0.B0.D1.87.D0.B5.D0.BD.D0.B8.D1.8F Википедия]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! f(x)!! g(x)!! O!! o!! Ω!! ω!! Θ&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! 2^100&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n * log(n)&lt;br /&gt;
! 2^100 * n * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n&lt;br /&gt;
! 2^100 * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n!&lt;br /&gt;
! 2^(2015n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n*2^n&lt;br /&gt;
! 3^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 5^n&lt;br /&gt;
! 5^(n+1)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n + n^2 + n^3 + ... + n^1000&lt;br /&gt;
! 7^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм Quickselect нахождения k-ого элемента по возрастанию: http://en.wikipedia.org/wiki/Quickselect&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;На улице стоит ряд домов. В каждом из домов лежит сколько-то денег. Вор хочет обокрасть дома на переулке. Он не может обокрасть два соседних дома, потому что хозяин дома, который он обокрал, сразу предупредит соседей. Нужно найти, какую максимальную сумму вор может украсть с переулка. На вход программы подается массив неотрицательных целых чисел - количество долларов в доме с номером i. Соседние дома в массиве представлены соседними элементами. Например, пусть задан массив { 1, 4, 5 } - тогда вор максимум может украсть $6, обокрав дома 1 и 3. Пусть задан массив { 1, 7, 2 } - тогда вор максимум может украсть $7, обокрав дом 2.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Алфавит из всех маленьких латинских букв и пробела закодирован числами следующим способом:&lt;br /&gt;
  &#039;a&#039; -&amp;gt; 1&lt;br /&gt;
  &#039;b&#039; -&amp;gt; 2&lt;br /&gt;
  &#039;c&#039; -&amp;gt; 3&lt;br /&gt;
  ...&lt;br /&gt;
  &#039;z&#039; -&amp;gt; 26&lt;br /&gt;
  &#039; &#039; -&amp;gt; 27&lt;br /&gt;
На вход программы подается строка из цифр. Нужно посчитать, сколькими способами можно раскодировать эту строку.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Дан граф, заданный матрицей смежности. Вывести пары вершин между которыми нет пути.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Повторение (02.04) ==&lt;br /&gt;
Решали и разбирали первые 4 задачи из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14* (до 11.03)===&lt;br /&gt;
Решите любые две задачи (подпункты НЕ считаются отдельными задачами) с предыдущей пары (Повторение (30.03)).&lt;br /&gt;
&lt;br /&gt;
== Повторение (06.04) ==&lt;br /&gt;
Будем решать вторую половину задач из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 15 (до 16.04)===&lt;br /&gt;
# Приведите пример графа, который содержит отрицательные рёбра, не содержит циклов отрицательного веса и для которого алгоритм Дейкстры возвращает неверный результат.&lt;br /&gt;
# Используется ли в алгоритме Дейкстры то, что веса рёбер неотрицательны? Если &amp;quot;да&amp;quot;, то где именно?&lt;br /&gt;
# Пусть граф содержит рёбра с весами &amp;gt;= -100. Если прибавить к каждому ребру 101 и при помощи алгоритма Дейкстры найти кратчайшие пути. Будут ли эти пути кратчайшими в исходном графе? Почему?&lt;br /&gt;
&lt;br /&gt;
== Повторение (07.04) ==&lt;br /&gt;
&#039;&#039;&#039;Решение рекуррентных соотношений&#039;&#039;&#039;&lt;br /&gt;
# Решите уравнение: T(n) = 4*T(n/2) + O(n^2) с базой T(1) = O(1)&lt;br /&gt;
## Используя основную теорему.&lt;br /&gt;
## Используя дерево рекурсий.&lt;br /&gt;
## Методом подстановки.&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2)) + n является \Theta(n lg n).&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2) + 17) + n является \Theta(n lg n).&lt;br /&gt;
# Решите уравнения, считая, что T(1) = O(1):&lt;br /&gt;
## T(n) = T(n-1) + n&lt;br /&gt;
## T(n) = 2*T(floor(sqrt(n))) + lg n. Указание: попробуйте использовать замену переменных.&lt;br /&gt;
## T(n) = 3*T(sqrt(n)) + lg n&lt;br /&gt;
# Дайте верхнюю и нижнюю оценки функции T(n). Постарайтесь, чтобы оценки были как можно более точные&lt;br /&gt;
## T(n) = 4T(n/3) + n*lg(n)&lt;br /&gt;
## T(n) = 3T(n/3) + n/lg(n)&lt;br /&gt;
## T(n) = 4T(n/2) + n^2*sqrt(n)&lt;br /&gt;
## T(n) = T(n/2) + T(n/4) + T(n/8) + n&lt;br /&gt;
## T(n) = T(n-1) + 1/n&lt;br /&gt;
## T(n) = T(n-2) + 1/lg(n)&lt;br /&gt;
## T(n) = sqrt(n) * T(sqrt(n)) + n&lt;br /&gt;
&#039;&#039;&#039;Анализ и построение алгоритмов&#039;&#039;&#039;&lt;br /&gt;
# Числа Фибоначчи F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; можно выразить через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, используя матрицу: https://yadi.sk/i/Pm_aNzHCforFU. &lt;br /&gt;
## Покажите как вычислить F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;.&lt;br /&gt;
## Как вычислить F&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;n+1&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;?&lt;br /&gt;
## Напишите алгоритм.&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
## Ускорьте его так, чтобы он работал за O(log n).&lt;br /&gt;
# Дана последовательность символов. Какое минимальное количество символов нужно удалить из неё, чтобы получить палиндром?&lt;br /&gt;
## Напишите алгоритм (на псевдокоде или на любом языке программирования).&lt;br /&gt;
## Оцените время работы алгоритма.&lt;br /&gt;
# Какую структуру данных вы бы использовали для реализации упорядоченного множества (http://neerc.ifmo.ru/wiki/index.php?title=Упорядоченное_множество)? Какая будет сложность каждой из операций над множеством?&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 16 (до 20.04)===&lt;br /&gt;
# Решите 6 задач из первой части и 6 из второй. (Укажите какие именно.) Каждый из подпунктов является отдельной задачей.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм и теорема Форда-Фалкерсона (16.04)==&lt;br /&gt;
# Базовые определения (пропускные способности, сток, исток и пр.). Пример. &lt;br /&gt;
# Ограничения на поток (сохранение и что меньше пропускных способностей).&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, пример работы&lt;br /&gt;
# Разрез, определение, пример.&lt;br /&gt;
# Утверждение: максимальный поток &amp;lt;= любого разреза.&lt;br /&gt;
# Теорема Форда-Фалкерсона (с доказательством).&lt;br /&gt;
# Пример на котором алгоритм Форда-Фалкерсонаработает работает очень долго при неудачном выборе путей.&lt;br /&gt;
# Сложность алгоритма Форда-Фалкерсона.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №3==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
В [https://official.contest.yandex.ru/contest/1196 домашнем задании] пять задач. Они разделены на два варианта, помеченные римскими цифрами I и II. Свой вариант нужно узнать [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing здесь на вкладке HW3]. Третья задача — общая для двух вариантов; ее решение необходимо снабдить доказательством корректности алгоритма. На выполнение задания дается примерно 2 недели (см. точное время окончания в контесте). Каждую задачу можно написать на С++ или Python.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Форда-Фалкерсона и Эдмондса-Карпа (20.04)==&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, напоминание: базовые определения, пример работы, пример на котором алгоритм работает долго, сложность.&lt;br /&gt;
# Алгоритм Эдмодса-Карпа. Доказательство асимптотики времени работы.&lt;br /&gt;
&lt;br /&gt;
==(23.04)==&lt;br /&gt;
&lt;br /&gt;
==(11.05) Красно-чёрные деревья==&lt;br /&gt;
[https://ru.wikipedia.org/wiki/Красно-чёрное_дерево Красно-чёрное дерево]&lt;br /&gt;
===Домашнее задание 17 (до 18.05)===&lt;br /&gt;
# Зачем нужны красно-чёрные деревья?&lt;br /&gt;
# Благодаря какому свойству и почему красно-чёрное дерево является сбалансированным?&lt;br /&gt;
# Нарисуйте полное бинарное дерево поиска высотой 3 с ключами {1, 2, ..., 15}. Сделайте из него красно-чёрные деревья высотой 2, 3 и 4.&lt;br /&gt;
# Нарисуйте красно-чёрные деревья, получающиеся последовательной вставкой элементов 12, 10, 29, 30, 31, 32 в [https://ru.wikipedia.org/wiki/Красно-чёрное_дерево#/media/File:Red-black_tree_example.svg данное дерево]. Для вставки используйте алгоритм вставки из Википедии. Укажите какой именно функцией вы воспользовались.&lt;br /&gt;
# Определим &#039;&#039;&#039;ослабленное красно-чёрное дерево&#039;&#039;&#039; как бинарное дерево поиска, которое удовлетворяет красно-чёрным свойствам 1, 3, 4 и 5. Другими словами, корень может быть как чёрным, так и красным. Рассмотрите ослабленное красно-чёрное дерево T, корень которого красный. Если перекрасить корень дерева T в чёрный, будет ли оно красно-чёрным деревом?&lt;br /&gt;
# Покажите, что самый длинный простой нисходящий путь от вершины x к листу красно-черного дерева имеет длину, не более чем в два раза превышающую кратчайший путь от x к листу-потомку.&lt;br /&gt;
# Чему равно наибольшее возможное количество внутренних узлов в красно-чёрном дереве с чёрной высоты k? А наименьшее возможное количество?&lt;br /&gt;
# Нарисуйте красно-чёрные деревья, получающиеся последовательной вставкой ключей 41, 38, 31, 12, 19, 8 в изначально пустое дерево.&lt;br /&gt;
# Покажите какие деревья будут получаться в результате последовательного удаления ключей в порядке 8, 12, 19, 31, 38, 41.&lt;br /&gt;
&lt;br /&gt;
==(14.05) Конкурентный анализ самоорганизующихся циклов==&lt;br /&gt;
[https://vk.com/doc12518218_390369758 Лекция]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 18 (до 21.05)===&lt;br /&gt;
Все вычисления сопроводите подробными объяснениями о том, почему верно то или иное (не)равенство.&lt;br /&gt;
# Пусть имеется n-элементный список и m поисковых запросов к нему. После каждой операции поиска можно переупорядочить список. Обозначим стоимость последовательности поисков через C. Докажите, что в худшем случае C = Ω(mn).&lt;br /&gt;
#  Обозначим через c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; стоимость i-ого поискового запроса с применением эвристики перемещения в начало, которая включает стоимость поиска элемента в списке и стоимость его перемещения в начало списка путём ряда обменов соседних элементов списка. Покажите, что i-ая операция поиска находит элемент x в списке L с применением эвристики перемещения в начало, то c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = 2 * rank&amp;lt;sub&amp;gt;L&amp;lt;/sub&amp;gt;(x) - 1.&lt;br /&gt;
# Покажите, что c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = 2 * rank&amp;lt;sub&amp;gt;L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) - 1.&lt;br /&gt;
# Покажите, что c*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = rank&amp;lt;sub&amp;gt;L*&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) + t&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;.&lt;br /&gt;
# Докажите, что после одного обмена двух соседних элементов потенциал либо увеличивается на 2, либо уменьшается на 2.&lt;br /&gt;
# Докажите, что rank&amp;lt;sub&amp;gt;L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) = |A| + |B| + 1.&lt;br /&gt;
# Докажите, что rank&amp;lt;sub&amp;gt;L*&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) = |A| + |С| + 1.&lt;br /&gt;
# Покажите, что поиск i-ого элемента приводит к изменению потенциала Ф(L&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;) - Ф(L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;) &amp;lt;= 2 (|A| - |B| + t*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;), где t*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; --- это количество обменов при i-ом поиске.&lt;br /&gt;
# Во сколько раз стоимость С&amp;lt;sub&amp;gt;MFT&amp;lt;/sub&amp;gt;(S) превышает C&amp;lt;sub&amp;gt;OPT&amp;lt;/sub&amp;gt;(S)?&lt;br /&gt;
&lt;br /&gt;
== (18.05) Конечные автоматы ==&lt;br /&gt;
=== Задание 19 (до 25.05) ===&lt;br /&gt;
# Постройте автомат для языка над алфавитом Σ = {0, 1} каждое слово которого содержит хотя бы два нуля. Является ли он детерминированным?&lt;br /&gt;
# Постройте автомат над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5. Является ли он детерминированным?&lt;br /&gt;
# Постройте автомат, который допускает пустой язык (язык в котором нет ни одного слова).&lt;br /&gt;
# Постройте автомат, который допускает все слова над алфавитом Σ.&lt;br /&gt;
# Постройте ДКА над алфавитом Σ = {К, Ж, З}, который допускает слова в которых после К идёт З, после З --- Ж, после Ж --- К.&lt;br /&gt;
# * Постройте ДКА над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5, а число нулей на 3.&lt;br /&gt;
# Постройте НКА для языка над алфавитом Σ = {0, 1, 2, 3}, состоящий из слов, в которых хотя бы одна из последних пяти букв является 1.&lt;br /&gt;
# Постройте НКА над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5, а число нулей на 3.&lt;br /&gt;
# Какие языки допускают автоматы https://yadi.sk/d/fNAHbjCZghERG?&lt;br /&gt;
# Для каждого из автоматов https://yadi.sk/d/fNAHbjCZghERG постройте соответствующий ему ДКА.&lt;br /&gt;
&lt;br /&gt;
== (21.05) Регулярные выражения, КА, их эквивалентность. Лемма о накачке  ==&lt;br /&gt;
=== Задание 20 (до 28.05) ===&lt;br /&gt;
&#039;&#039;&#039;I Написать регулярные выражения&#039;&#039;&#039;&lt;br /&gt;
# Напишите регулярное выражение для языка над алфавитом Σ = {0, 1} каждое слово которого содержит хотя бы два нуля.&lt;br /&gt;
# Напишите регулярное выражение над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5.&lt;br /&gt;
# Напишите регулярное выражение, которое допускает пустой язык (язык в котором нет ни одного слова).&lt;br /&gt;
# Напишите регулярное выражение, которое допускает все слова над алфавитом Σ.&lt;br /&gt;
# Напишите регулярное выражение для языка над алфавитом Σ = {0, 1, 2, 3}, состоящий из слов, в которых хотя бы одна из последних пяти букв является 1.&lt;br /&gt;
&#039;&#039;&#039;II КА и регулярные выражения&#039;&#039;&#039;&lt;br /&gt;
# Постройте конечный автомат для языка (111 U 01)&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;1(00 U 11)&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;.&lt;br /&gt;
# Постройте конечный автомат для языка (ab)&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;(a U b)(b U a)&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;(a U bab).&lt;br /&gt;
&#039;&#039;&#039;III Доказать замкнутость относительно различных операций&#039;&#039;&#039;&lt;br /&gt;
# Покажите, что если для языков L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; и L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; существует КА, который их читает, то существует КА и для их объединения L = {w | w ∈ L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; или w ∈ L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;}.&lt;br /&gt;
# Покажите, что если для языка L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; и L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; существует КА, который их читает, то существует КА и для языка L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; = {xy | x ∈ L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, y ∈ L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;}.&lt;br /&gt;
# Покажите, что если для языка L существует КА, который его читает, то существует КА и для &#039;&#039;&#039;замыкания Клини&#039;&#039;&#039; L* = {w&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; w&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; ... w&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;| w&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; ∈ L, w&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; ∈ L, ..., w&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; ∈ L}.&lt;br /&gt;
# Покажите, что если язык L регулярен, то регулярно его дополнение (т.е. язык над тем же алфавитом, которому принадлежит слово тогда и только тогда, когда оно НЕ принадлежит L) .&lt;br /&gt;
# Покажите, что если язык L регулярен, то регулярно его обращение L&amp;lt;sub&amp;gt;R&amp;lt;/sub&amp;gt; = {a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; . . . a&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; | a&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; . . . a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; ∈ L}. (L&amp;lt;sub&amp;gt;R&amp;lt;/sub&amp;gt; --- это язык в котором все слова языка L записаны наоборот.)&lt;br /&gt;
# * Покажите, что если языки L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; и L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; регулярны, то регулярно их пересечение.&lt;br /&gt;
&#039;&#039;&#039;IV Использование леммы о накачке&#039;&#039;&#039; (см. [https://vk.com/doc12518218_392750846 конспект])&lt;br /&gt;
# Докажите, что не существует КА, который бы читал язык {0&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;1&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;2&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;}. (Пояснение: запись 0&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; означает строку из n нулей: 00...0.)&lt;br /&gt;
# Докажите, что не существует КА, который бы читал язык {0&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;1&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;}.&lt;br /&gt;
# Докажите, что не существует КА, который бы читал язык {0&amp;lt;sup&amp;gt;n!&amp;lt;/sup&amp;gt;}.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== (25.05) Автоматный подход ==&lt;br /&gt;
=== Задание 21 (до 01.06) ===&lt;br /&gt;
Реализуйте один из следующих проектов:&lt;br /&gt;
# Программа, которая считывает строку и говорит принадлежит ли она языку 0(123)*(00 U (231)*) U 111.&lt;br /&gt;
# Программа, которая считывает КА и генерирует программу на языке С++, которая говорит принадлежит ли заданное слово языку, описываемому этим КА.&lt;br /&gt;
# Программа, которая считывает регулярное выражение и строку и говорит принадлежит ли слово языку, описываемому этим регулярным выражением.&lt;br /&gt;
# Программа, которая моделирует работу банкомата, автомата с газировкой, лифта... (что-то одно на выбор)&lt;br /&gt;
# Текстовый симулятор студента. Возможные состояния: на паре, дома, есть приглашение прогулять, завтра коллоквиум, сплю и др. Есть два параметра: успеваемость и весёлось. Если хотя бы один из них упадёт нижу критической отметки, студент умрёт. Игрок принимает решение куда идти студенту. Цель: продержаться как можно дольше.&lt;/div&gt;</summary>
		<author><name>Kassalanche</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=14994</id>
		<title>Алгоритмы и структуры данных. Подгруппа 105-1</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=14994"/>
		<updated>2015-05-25T06:14:09Z</updated>

		<summary type="html">&lt;p&gt;Kassalanche: /* (21.05) Регулярные выражения, КА, их эквивалентность. Лемма о накачке */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==О курсе==&lt;br /&gt;
[[Алгоритмы_и_структуры_данных|План лекций и список рекомендуемой литературы.]]&lt;br /&gt;
&lt;br /&gt;
[[Алгоритмы_и_структуры_данных._Подгруппа_105-1._FAQ|FAQ.]]&lt;br /&gt;
&lt;br /&gt;
[[Reviewboard|Инструкция по использованию Reviewboard.]]&lt;br /&gt;
&lt;br /&gt;
[[Практические_занятия_по_курсу_ОиМП/C++_check|Style guide.]]&lt;br /&gt;
&lt;br /&gt;
==Итоговая оценка за курс==&lt;br /&gt;
Итоговая оценка (ИО) зависит от&lt;br /&gt;
* оценок за пять больших домашних заданий (БДЗ1, БДЗ2, ..., БДЗ5),&lt;br /&gt;
* оценок за домашние задания (ДЗ1, ДЗ2, ...),&lt;br /&gt;
* оценки за контрольную работу (КР),&lt;br /&gt;
* оценки за экзамен (ЭКЗ),&lt;br /&gt;
и может быть вычислена по формуле:&lt;br /&gt;
 ИО = 0.7 * (0.3 * КР + 0.7 *(ИДЗ1 + ИДЗ2 + ИДЗ3 + ИДЗ4 + ИДЗ5)/5) + 0.3 * ЭКЗ =&lt;br /&gt;
    = 0.21*КР + 0.098*ИДЗ1 + 0.098*ИДЗ2 + 0.098*ИДЗ3 + 0.098*ИДЗ4 + 0.098*ИДЗ5 + 0.3*ЭКЗ,&lt;br /&gt;
где&lt;br /&gt;
 ИДЗi = min (10, 0.7 * БДЗi + 0.4 * &amp;lt;cредняя оценка за ДЗj, прошедшие с предыдущего БДЗ по i-ое&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
==Порядок сдачи домашних работ==&lt;br /&gt;
===Большие домашние работы===&lt;br /&gt;
# Получить OK за задачу в контесте.&lt;br /&gt;
# Залить исходный код на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* На каждую задачу создавайте отдельный запрос на ревью. &lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении суток приходят замечания к коду. &#039;&#039;&#039;Если в течении суток замечаний или Ship It не появилось, проверьте, что вы правильно отправили запрос и, если всё сделано правильно, спросите у семинариста получил ли он запрос.&#039;&#039;&#039;&lt;br /&gt;
# Вы их исправляете, проверяете в контесте, что программа по-прежнему проходит все тесты, заливаете новую версию в Review Board. Штрафов за посылки НЕ будет.&lt;br /&gt;
# Процесс повторяется пока остаются замечания к коду или пока не истёк дедлайн. После закрытия контеста будут ещё одни сутки на доработку замечаний в Review Board.&lt;br /&gt;
# Оценивается только последняя версия работы в Review Board.&lt;br /&gt;
&lt;br /&gt;
===Маленькие домашние работы===&lt;br /&gt;
# Залить решение на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* Желаемые форматы: txt, py, cpp, h. Допускаются любые другие.&lt;br /&gt;
#* На каждую домашнюю работу создавайте отдельный запрос на ревью. Обязательно указывайте номер домашней работы.&lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении неопределенного промежутка времени придут оценки по каждому из заданий.&lt;br /&gt;
&lt;br /&gt;
==Оценивание домашних работ==&lt;br /&gt;
* Все задания предполагаются индивидуальными. Запрещены любые заимствования без ссылки на автора.&lt;br /&gt;
* Решения после установленного дедлайна не принимаются. Дедлайн указан в заголовке каждого задания.&lt;br /&gt;
* Везде, где требуется написать алгоритм, можно использовать любой язык программирования или псевдокод.&lt;br /&gt;
* Там, где требуется построить алгоритм с заданной асимптотикой, приведите обоснование, что полученный алгоритм удовлетворяет этому условию.&lt;br /&gt;
* Эти правила не действуют, если в задании явно оговорено иное.&lt;br /&gt;
&lt;br /&gt;
==Мотивация к изучению алгоритмов. Подсчёт числа операций (12.01)==&lt;br /&gt;
# Числа Фибоначчи. Определение. Примитивный рекурсивный алгоритм вычисления i-ого числа. Оценка числа операций. Анализ причин неэффективности. Алгоритм с запоминанием вычисленных ранее значений. Оценка числа операций. Сравнение с предыдущим. (подробнее: глава 0, страницы 8-10 из книги &amp;lt;&amp;lt;Алгоритмы&amp;gt;&amp;gt;, [[Алгоритмы_и_структуры_данных|см. список рекомендованной литературы]])&lt;br /&gt;
# Задача о ханойской башне. Постановка задачи. Рекурсивный алгоритм. Рекуррентная формула для числа перемещений. Замкнутая формула для числа перемещений (+ доказательство). Доказательство того, что эту задачу нельзя решить используя меньшее число перемещений дисков. ([https://www.dropbox.com/s/t8cbs7ttu4iasvj/algo-0-recursion.pdf?dl=0 Разбор задачи о ханойской башне], автор Сергей Объедков)&lt;br /&gt;
# Сортировка пузырьком. Алгоритм. Подсчёт количество операций сравнения и обмена (swap). Анализ наилучшего и наихудшего случаев ([https://ru.wikipedia.org/wiki/Сортировка_пузырьком Википедия])&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 1 (12.01 - 26.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
Во всех задачах, если не оговорено иного, предполагаем, что работаем с целыми неотрицательными числами. Для первых 7 задач необходимо&lt;br /&gt;
* описать что можно считать наилучшим и наихудшим случаями,&lt;br /&gt;
* для каждого из двух случаев подсчитать отдельно количество операций сравнения и swap (если есть).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Даны три числа, требуется вернуть наименьшее.&lt;br /&gt;
# Даны три числа, требуется отсортировать их.&lt;br /&gt;
# Дана последовательность A из n элементов и число x, требуется найти элемент равный x. Примечание: если таких значений i несколько, вернуть любое; если такого элемента нет, функция должна сообщить об этом.&lt;br /&gt;
# * Дана упорядоченная последовательность A из n элементов и число x, требуется найти такое i, что A[i] равно x. Алгоритм должен быть эффективней, чем в предыдущем пункте и использовать то, что последовательность упорядочена.&lt;br /&gt;
# Дана последовательность из 100 000 чисел от 0 до 100. Напишите эффективный алгоритм сортировки, который бы учитывал специфику входных данных.&lt;br /&gt;
# * Дано 32 битное неотрицательное число. Требуется номер первого ненулевого бит. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения, считая, что числа распределены равномерно.&lt;br /&gt;
# * Даны 32 битные неотрицательные числа m и n. Требуется вывести True, если m &amp;lt; n, иначе False. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения битов, считая, что числа распределены равномерно.&lt;br /&gt;
# Напишите рекурсивную функцию, вычисляющую n-ое число Фибоначчи (как на занятии). Подсчитайте количество рекурсивных вызовов.&lt;br /&gt;
# * Напишите функцию, вычисляющую n-ое число Фибоначчи, у которой число операций — полином от n, и которая использует количество памяти, независящее от n.&lt;br /&gt;
&lt;br /&gt;
==O-символика и стратегия &amp;quot;разделяй и властвуй&amp;quot; (15.01)==&lt;br /&gt;
# Сортировка слиянием. Алгоритм, рекуррентное соотношение для времени сортировки, сложность. Подробнее: [https://dl.dropboxusercontent.com/u/829163/draft.pdf §2.3 Сортировка слиянием (стр. 54)].&lt;br /&gt;
# О-символика. [https://dl.dropboxusercontent.com/u/829163/draft.pdf §0.3 О-символика (стр. 10)].&lt;br /&gt;
# Задача о слиянии m упорядоченных массивов по n элементов. Три алгоритма решения: последовательное слияние, слияние &amp;quot;деревом&amp;quot; (обе функции используют Merge из MergeSort), аналог Merge для m массивов. Анализ сложности каждого из них.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 2 (15.01-29.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
* Во всех задачах, если не оговорено иного, для простоты &#039;&#039;можно&#039;&#039; считать, что n является степенью какого-либо числа, например, степенью двойки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Дана функция F, определённая ниже. Сколько строк она напечатает? Указание: для обоих подпунктов рассмотрите два случая: 1. n является степенью двойки, 2. n не является степенью двойки.&lt;br /&gt;
## Запишите рекуррентное соотношение для числа строк.&lt;br /&gt;
## Решите уравнение, полученное в предыдущем пункте, то есть, выведите замкнутую (нерекуррентную формулу). Для простоты можно считать, что n является степенью двойки.&lt;br /&gt;
# В массиве A размера n записана возрастающая последовательность целых чисел. Постройте алгоритм типа &amp;quot;разделяй и властвуй&amp;quot;, который проверяет, существует ли такой индекс i, что A[i] = i&lt;br /&gt;
## за время O(n),&lt;br /&gt;
## * за время O(log n).&lt;br /&gt;
## Какие случаи для вашего алгоритма являются наихудшими и наилучшими? Какого время работы в лучшем и худшем случаях?&lt;br /&gt;
# Дан бесконечный массив A, первые n элементов которого содержат возрастающую последовательность положительных чисел, а дальше стоят -1. Значение n не дано. Постройте алгоритм, который получает на вход целое число x и находит это x в массиве --- или говорит, что там его нет, &lt;br /&gt;
## за время O(n),&lt;br /&gt;
## за время O(log n).&lt;br /&gt;
# Рассмотрим алгоритм вычисления наибольшего общего делителя (НОД) двух положительных чисел, основанный на методе &amp;quot;разделяй и властвуй&amp;quot;.&lt;br /&gt;
## (задание не оценивается) Прочитайте [https://dl.dropboxusercontent.com/u/829163/draft.pdf §1.2.3 Алгоритм Евклида (стр. 23)].&lt;br /&gt;
## * Докажите, что определение НОД-а, приведённое ниже, корректно.&lt;br /&gt;
## Постройте алгоритм, основанный на этом определении.&lt;br /&gt;
## Какой алгоритм будет быстрее для n-битовых чисел a и b при больших значениях n --- ваш или алгоритм Евклида?&lt;br /&gt;
# * Покажите как за время O(n log n) удалить из массива размера n все дубликаты, то есть оставить каждый элемент в одном экземпляре.&lt;br /&gt;
# * Даны два упорядоченных массива размера m и n. Постройте алгоритм, находящий k-й по величине элемент в объединении этих массивов за время O(log(n+m)). &lt;br /&gt;
&lt;br /&gt;
Функция F(n).&lt;br /&gt;
  если n &amp;gt; 1:&lt;br /&gt;
    напечатать &amp;quot;всё ещё работаю&amp;quot;&lt;br /&gt;
    F(n/2)&lt;br /&gt;
    F(n/2)&lt;br /&gt;
&lt;br /&gt;
Определение НОД-а.&lt;br /&gt;
             2НОД(a/2, b/2), если а и b чётны,&lt;br /&gt;
  НОД(a,b) = НОД(a, b/2), если а нечётно, b чётно,&lt;br /&gt;
             НОД((a-b)/2, b), если а и b нечётны.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;lt;nowiki&amp;gt;Задачи взяты из книги &amp;quot;Алгоритмы&amp;quot;, глава 2 (см. список рекомендованной литературы).&amp;lt;/nowiki&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Сложение и умножение (19.01)==&lt;br /&gt;
# Алгоритм сложения, его сложность (§1.1.1 Сложение*)&lt;br /&gt;
# &amp;quot;Школьный&amp;quot; алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Рекурсивный алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Алгоритм умножения, реализующий стратегию &amp;quot;разделяй и властвуй&amp;quot;, анализ сложности (§2.1 Умножение чисел*)&lt;br /&gt;
 * [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать.]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 3 (19.01 - 2.02)===&lt;br /&gt;
* Во всех задачах для простоты можно считать, что n является степенью какого-либо числа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Найдите произведение чисел 10011011 и 10111010 (в двоичной системе счисления), используя алгоритм умножения чисел, основанный на методе «разделяй и властвуй». Необходимо не только дать ответ, но и привести ход решения.&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 3 рекурсивных вызова для подзадач размера n-1 и комбинирует из них решение исходной задачи за О(n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте три верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 10 рекурсивных вызовов для подзадач размера n/2 и комбинирует из них решение исходной задачи за О(5n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте два верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Докажите, что 3m² + m = O(m²).&lt;br /&gt;
# Докажите, что lg m = O(m/1000), где lg m — это логарифм с двоичным основанием.&lt;br /&gt;
# Докажите, что из равенства f(n) = O(g(n)) не следует, что g(n) = O(f(n)).&lt;br /&gt;
# Докажите, что O(m) содержится в O(m²).&lt;br /&gt;
&lt;br /&gt;
==Решение рекуррентных уравнений (22.01)==&lt;br /&gt;
# Примеры решений рекуррентных уравнений (см. [https://www.dropbox.com/s/6a0r410zjm9qwe7/algo-3-recurrences.pdf?dl=0 конспект]).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 4 (до 14.02)===&lt;br /&gt;
* Нельзя использовать утверждение основной теоремы о решении рекуррентных соотношений.&lt;br /&gt;
* &#039;&#039;Можно&#039;&#039; использовать метод построения дерева рекурсии или подстановку (метод с угадыванием ответа).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Какой из трёх приведённых ниже алгоритмов вы бы предпочли? Обоснуйте свой ответ.&lt;br /&gt;
#* Алгоритм A, решая задачу, производит пять рекурсивных вызовов для подзадач вдвое меньшего размера, после чего строит ответ для исходной задачи за линейное время.&lt;br /&gt;
#* Алгоритм B, решая задачу размера n, делает два рекурсивных вызова для задач размера n − 1, после чего находит ответ за время O(1).&lt;br /&gt;
#* Алгоритм C, решая задачу размера n, рекурсивно решает девять задач размера n/3 и строит ответ за время O(n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Найдите T(n) в замкнутой форме для любых 7 из 10 приведённых ниже рекуррентных соотношений:&lt;br /&gt;
## T(n) ≤ 2T(n/3) + 1;&lt;br /&gt;
## T(n) ≤ 7T(n/7) + n;&lt;br /&gt;
## T(n) ≤ 9T(n/3) + n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 8T(n/2) + n&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 49T(n/25) + n&amp;lt;sup&amp;gt;3/2&amp;lt;/sup&amp;gt;log n;&lt;br /&gt;
## T(n) ≤ T(n − 1) + 2;&lt;br /&gt;
## T(n) ≤ T(n − 1) + n&amp;lt;sup&amp;gt;c&amp;lt;/sup&amp;gt;, где c ≥ 1 –– константа;&lt;br /&gt;
## T(n) ≤ T(n − 1) + c&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;, где c &amp;gt; 1 –– константа;&lt;br /&gt;
## T(n) ≤ 2T(n − 1) + 1;&lt;br /&gt;
## T(n) ≤ T(sqrt(n)) + 1.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №1==&lt;br /&gt;
Необходимо реализовать все 6 задач из [https://official.contest.yandex.ru/contest/1002 контеста]. Каждую задачу можно писать на С++ или Python. На выполнение работы отводится две недели. Каждая задача оценивается в 10/6 балла. Оценка &#039;&#039;может&#039;&#039; быть снижена за плохой код, но не более чем на 25%.&lt;br /&gt;
&lt;br /&gt;
==Бинарное дерево поиска (26.01)==&lt;br /&gt;
# Определение. Пример.&lt;br /&gt;
# Не модифицирующие алгоритмы: поиск (рекурсивный и итеративный алгоритмы), поиск минимума, inordered обход (вывод значений узлов в отсортированном порядке), поиск следующего по возрастанию.&lt;br /&gt;
# Модифицирующие алгоритмы: вставка (рекурсивная реализация), удаление (только идея).&lt;br /&gt;
 [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 13, стр. 248]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 5 (до 16.02)===&lt;br /&gt;
* Для получения максимальной оценки можно выполнить или все задачи без звёздочки, или задачу со звёздочкой. Преподаватель понимает, что реализацию БДП сложно не найти в интернете, но от копипасты не будет никакой пользы. Напротив, самостоятельная реализация очень полезна и приветствуется, даже если не получится выполнить всех пунктов задания.&lt;br /&gt;
* Задачи с двумя звёздочками необязательны.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Нарисуйте бинарные деревья поиска высотой 2, 3, 4, 5 и 6 для множества ключей {1, 4, 5, 10, 16, 17, 21}. Корень дерева имеет высоту 0.&lt;br /&gt;
# &#039;&#039;&#039;Сортировка с использованием БДП.&#039;&#039;&#039;&lt;br /&gt;
## Какова асимптотическая сложность алгоритма вставки элемента в дерево высоты d? Почему? Назовите наилучший и наиухдший случаи.&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который строит БДП в узлах которого стоят элементы данной последовательности. Можно использовать функцию Insert. Назовите наилучший и наихудший случаи. Есть теорема о том, что полученный алгоритм будет работать в среднем случае за время O(n * log n).&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который выводит их в порядке возрастания. Используйте бинарное дерево поиска. Какова в среднем случае сложность этого алгоритма? Назовите наилучший и наихудший случаи. Какова сложность в наихудшем случае?&lt;br /&gt;
# Напишите функцию GetRoot, которой на вход подаётся указатель на произвольный узел дерева, а она возвращает указатель на корень.&lt;br /&gt;
# Напишите процедуру PrintLeafs, которой на вход подаётся указатель на корень дерева, и она печатает листья дерева&lt;br /&gt;
## по возрастанию,&lt;br /&gt;
## по убыванию.&lt;br /&gt;
# ** Альтернативный обход в порядке возрастания бинарного дерева поиска с n узлами (или центрированный (inordered) обход) можно осуществить путём поиска минимального элемента дерева с помощью функции Minimum с последующий n-1 вызовом функции Next. Каково время работы такого алгоритма?&lt;br /&gt;
# * Реализуйте на С++ структуру данных бинарное дерево поиска, [https://yadi.sk/i/gi2SEStreFfSb используя заготовку].&lt;br /&gt;
## Нарисуйте бинарное дерево поиска, которое строится в функции getTreeExample.&lt;br /&gt;
## Реализуйте следующие алгоритмы: &lt;br /&gt;
### поиск минимума, &lt;br /&gt;
### inordered обход (вывод значений узлов в отсортированном порядке),&lt;br /&gt;
### поиск следующего по возрастанию,&lt;br /&gt;
### вставка элемента в дерево,&lt;br /&gt;
### сортировка последовательности с использованием БДП (дан вектор чисел, необходимо вывести их по возрастанию),&lt;br /&gt;
### ** удаление.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Карацубы, Штрассена. Быстрая сортировка (29.01)==&lt;br /&gt;
# Алгоритм Карацубы.&lt;br /&gt;
# Алгоритм Штрассена. [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать Дасгупту и др., §2.5 Умножение матриц]&lt;br /&gt;
# Быстрая сортировка и доказательство того, что в среднем случае она работает за О(n * log n). [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 8 Быстрая сортировка, стр. 148]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 6 (до 18.02)===&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Пусть мы хотим найти двоичное представление десятичного числа 10&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;. Будем считать, что n --- степень двойки (n = 2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt;).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Pwr2Bin(n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть 1010&lt;br /&gt;
    z = ...&lt;br /&gt;
    вернуть Multiply(z, z)&amp;lt;/source&amp;gt;&lt;br /&gt;
Multiply --- функция, перемножающая два n-битовых двоичных числа x и y по алгоритму Карацубы за O(n&amp;lt;sup&amp;gt;log&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;3&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Пусть мы хотим перевести произвольное десятичное число x в записи которого n=2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; чисел в двоичную систему счисления.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Dec2Bin(x, n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть binary[x]&lt;br /&gt;
    разделить x на два десятичных числа xl и xr из n/2 цифр.&lt;br /&gt;
    вернуть ...&amp;lt;/source&amp;gt;&lt;br /&gt;
Здесь binary --- это массив, содержащий двоичное представление десятичных цифр.&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Докажите, что математическое ожидание времени работы алгоритма быстрой сортировки (усреднение по всем вариантам выбора опорного элемента) на любом входе размера n удовлетворяет соотношению: T(n) ≤ O(n) + 1/n * &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt; (T(i-1) + T(n-i)).&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Найдите решение соотношения из предыдущего пункта.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Динамическое программирование (ДП). Первые примеры (02.01)==&lt;br /&gt;
# Нахождение самой длинной возрастающей подпоследовательности.&lt;br /&gt;
# Нахождение редакционного расстояния (или редакционной стоимости, расстояния Левенштейна).&lt;br /&gt;
# Нахождение представителя большинства.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 7 (до 20.02)===&lt;br /&gt;
* В этом задании везде, где требуется реализовать алгоритм, необходимо привести код на любом языке программирования.&lt;br /&gt;
* Для получения максимальной оценки нужно решить все задачи без звёздочек. Одна решённая задача со звёздочкой заменяет одну задачу без звёздочки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения редакционного расстояния (алгоритм Вагнера — Фишера). Например, редакционное расстояние между словами &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равно 6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения длины наибольшей общей подстроки. Например, длина наибольшей общей подстроки &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равна 8 (&amp;quot;antholog&amp;quot;). Чем больше это значение, тем схожей строки.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Предположим теперь, что сравниваемые строки состоят из символов A, С, G и T; за удаление или вставку мы платим -5; за замену буквы x на y платим w[x, y], где x, y принадлежат множеству {A, С, G, T}, a w — это матрица весов:&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
!-!! A!! G!! C!! T&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! A&lt;br /&gt;
|10||-1||-3||-4&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
!G&lt;br /&gt;
||-1||7||-5||-3&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! C&lt;br /&gt;
||-3||-5||9||0&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! T&lt;br /&gt;
||-4||-3||0||8&lt;br /&gt;
|}&lt;br /&gt;
Тогда выравнивание:&lt;br /&gt;
 AGACTAGTTAC&lt;br /&gt;
 CGA‒‒‒GACGT&lt;br /&gt;
будет иметь следующую оценку:&lt;br /&gt;
 w[A,C] + w[G,G] + w[A,A] + 3*(-5) + w[G,G] + w[T,A] + w[T,C] + w[A,G] + w[C,T] = -3 + 7 + 10 - 3*5 + 7 + (-4) + 0 + (-1) + 0 = 1.&lt;br /&gt;
&lt;br /&gt;
Напишите алгоритм, который находит максимальную стоимость всех возможных выравниваний. Верно ли, что чем больше это значение, тем непохожей строки?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как давно один народ отделился от другого? Кто похожей — итальянец и китаец или якут и эфиоп? На эти вопросы можно отвечать с разных точек зрения — культурной, исторической, лингвистической, ... В последние же годы человечество научилось секвенировать геном, что позволило исследовать этот вопрос с точки зрения генетики. Секвенирование генома — это процесс записи ДНК в виде нуклеотидной последовательности, которая представляет собой последовательность из четырёх символов — A, С, G и T. Существуют базы, которые хранят генетическую информацию о людях из разных стран и континентов, например, [http://www.mtdb.igp.uu.se/ http://www.mtdb.igp.uu.se/ → Download mtDNA sequences]. Чем больше сходство между геномами, тем сильнее родственные связи между их обладателями. Используя решение предыдущего пункта, выполните задания:&lt;br /&gt;
# Определите, кто похожей — итальянец и китаец или якут и эфиоп?&lt;br /&gt;
# Найдите нескольких похожих и нескольких непохожих народностей.&lt;br /&gt;
# * Выберите одну народность. Найдите самых похожих и самых непохожих на неё.&lt;br /&gt;
# * Найдите самые похожие и самые непохожие народности.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Задача о разрезании стержня (05.01)==&lt;br /&gt;
# Постановка задачи.&lt;br /&gt;
# Решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Решение с нахождением максимума по p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Восходящий алгоритм с запоминанием. Вывод длин кусочков стержня. Оценка сложности.&lt;br /&gt;
# Нисходящий алгоритм с запоминанием. Оценка сложности.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.1 Разрезание стержня, стр. 393]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 8 (до 22.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Решая задачу о разрезании стержня мы вначале построили рекурсивное решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt; для всех 1 ≤ i &amp;lt; n. Его сложность описывалась рекуррентной формулой T(n) = n + &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n-1&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt;(T(i) + T(n-i)), T(1) = 1.&lt;br /&gt;
# Объясните эту формулу.&lt;br /&gt;
# Покажите с помощью метода подстановок, что T(n) ≤ 2&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Покажите с помощью контрпримера, что описанная далее жадная стратегия не всегда определяет оптимальный способ разрезания стержня. Определим плотность стержня длиной i как p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;/i, то есть как стоимость единицы его длины. Жадная стратегия для стержня длиной n отрезает от стержня первую часть длиной i, где 1 ≤ i ≤ n, имеющую максимальную плотность. Затем та же жадная стратегия применяется к оставшейся части длиной n-i.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Рассмотрим модификацию задачи разрезания стержня, в которой в дополнение к цене p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; каждого стержня добавляется фиксированная цена разреза c. Теперь прибыль, связанная с решением, представляет собой сумму цен частей стержня минус стоимость разрезов. Разработайте алгоритм динамического программирования для этой модифицированной задачи.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Непрерывным участком называется группа подряд идущих элементов. Например, для последовательности&lt;br /&gt;
 5, 15, −30, 10, −5, 40, 10&lt;br /&gt;
элементы 15, −30, 10 образуют непрерывный участок, а 5, 15, 40 -- нет. Постройте линейный алгоритм для следующей задачи:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Вход: список чисел a1, a2, ... ‌, an.&lt;br /&gt;
Выход: непрерывный участок с максимальной суммой (сумма участка нулевой длины равна нулю).&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Для приведённого примера ответом будет 10, −5, 40, 10 с суммой 55. Какова сложность алгоритма? Почему?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Надо заплатить v рублей, имея купюры в x1, x2, ‌..., xn рублей (купюр каждого типа сколько угодно). Это не всегда возможно (скажем, купюрами в&lt;br /&gt;
10 и 25 рублей можно заплатить 45 рублей, но не 47 и не 15). Постройте основанный на методе динамического программирования алгоритм со временем работы O(nv), выясняющий, возможна ли уплата.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как решить предыдущую задачу, если каждая купюра имеется в единственном экземпляре? (Например, купюрами в 1, 5, 10, 20 рублей можно заплатить 16 = 1 + 5 + 10 и 31 = 1 + 10 + 20 рублей, но не 40 (не хватит денег). Время работы алгоритма по-прежнему O(nv).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Ещё один вариант той же задачи: купюр каждого типа сколько угодно, но всего разрешается использовать не более k купюр. (Например, если есть купюры в 5 и 10 рублей, а k = 6, то 55 разменять можно, а 65 –– нет).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Перемножение цепочки матриц. Оптимальное бинарное дерево поиска (начало) (09.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о перемножении цепочки матриц. Постановка задачи.Пример. Нисходящий алгоритм.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.2 Перемножение цепочки матриц, стр. 403]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 9 (до 24.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Найдите оптимальную расстановку скобок в произведении последовательности матриц, размерности которых равны 5×10, 10×3, 3×12, 12×5, 5×50, 50×6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Напишите восходящий алгоритм для поиска оптимальной расстановки скобок.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Расстановка пробелов. Оптимальное бинарное дерево поиска (середина) (12.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о расстановке пробелов. Постановка задачи. Решения для трёх случаев: 1. нужно вернуть можно ли разбить текст на слова; 2. вернуть разбивку на слова; 3. слова встречаются не равновероятно, вернуть наиболее вероятную разбивку на слова.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи. Вывод математического ожидания времени поиска.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Праздничное домашнее задание 10 (до 02.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[&amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;,&amp;quot;, &amp;quot;.&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;,&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;.&amp;quot;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Подсказка:&#039;&#039;&#039; разбейте текст на слова из списка и посмотрите на азбуку Морзе.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Способы представления графов в памяти (16.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Разбор ошибок в домашнем задании.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Графы. Способы представления графов в памяти (матрица смежности, список рёбер, список соседей (список смежностей), матрица инцидентности). Зависимость сложности алгоритмов от способа представления.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §22.1 Представление графов, стр. 626]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 11 (до 02.03)===&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача A.]&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача B.]&lt;br /&gt;
# Нарисуйте неориентированный граф с 5 вершинами и 8 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Нарисуйте ориентированный граф с 4 вершинами и 3 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Дан ориентированный граф. &#039;&#039;Исходящая степень вершины v&#039;&#039; --- это количество исходящих из неё рёбер, &#039;&#039;входящая степень v&#039;&#039; --- это количество рёбер входящих в  v. Имеется представление ориентированного графа с использование списка соседей. Как долго будут вычисляться исходящие степени всех вершин графа? А входящие степени?&lt;br /&gt;
# Дан граф G = (V, E). Какие из рассмотренных способов хранения графов используют меньше всего памяти для хранения G и почему? Указание: рассмотрите случаи |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;lt; |E| и |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;gt; |E|.&lt;br /&gt;
# Пусть C --- это матрица смежности графа G.&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
# Пусть B --- это матрица инцидентности ориентированного графа G. Как связаны элементы матрицы BB&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
&lt;br /&gt;
==Реализация поиска в глубину (19.02)==&lt;br /&gt;
# Реализация поиска в глубину и смежных задач.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 12 (до 5.03)===&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Выберите любой способ хранения графа. Реализуйте поиск в глубину.&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Напишите алгоритм, который возвращает данные о том, какие вершины лежат в одной компоненте связности.&lt;br /&gt;
# &#039;&#039;(любой ЯП или псевдокод)&#039;&#039; Напишите алгоритм проверки сильной связности ориентированного графа. Какова его сложность?&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №2==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
Необходимо реализовать 3 задачи из [https://official.contest.yandex.ru/contest/1085 контеста], см. [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing распределение задач]. Каждую задачу можно написать на С++ или Python. На выполнение работы отводится две недели (см. время окончания контеста). [https://official.contest.yandex.ru/contest/1123 Дорешивание.]&lt;br /&gt;
&lt;br /&gt;
==ДП и графы (26.02)==&lt;br /&gt;
==ДП и графы (02.03)==&lt;br /&gt;
==Жадные алгоритмы (12.03)==&lt;br /&gt;
===Домашнее задание 13 (до 23.03)===&lt;br /&gt;
# Вася хочет купить по одной акции каждой компании. Все акции стоят одинаково, но дорожают по-разному. Каждый месяц акция i-ой компании дорожает в r_i раз. В один месяц можно купить только одну акцию.&lt;br /&gt;
## Напишите алгоритм, который выводит оптимальную последовательность покупок (такую, что на покупку всех акций потратится меньше денег).&lt;br /&gt;
## Докажите корректность алгоритма, то есть докажите, что последовательность покупок, которую выводит ваш алгоритм, оптимальна.&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список, очередь (16.03)==&lt;br /&gt;
# Реализация линейного двусвязного списка (С++).&lt;br /&gt;
# Реализация очереди ограниченной длины на базе вектора (С++).&lt;br /&gt;
# Реализация очереди на базе списка (С++).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14 (до 23.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте (на С++) структуру данных Стек. У стека должно быть три операции:&lt;br /&gt;
* push --- положить элемент на вершину стека;&lt;br /&gt;
* pop --- удалить верхний элемент;&lt;br /&gt;
* front --- вернуть значение верхнего элемента.&lt;br /&gt;
Оцените время работы каждой функции.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список (19.03)==&lt;br /&gt;
===Домашнее задание 13* (до 30.03)===&lt;br /&gt;
#Для приведённой реализации класса List (https://yadi.sk/i/c5r_79WdfMyNS).&lt;br /&gt;
## Допишите print, push_back и push_front.&lt;br /&gt;
## В функции insert_after и delete_node вставьте необходимые проверки так, чтобы они работали для крайних случаев.&lt;br /&gt;
## Напишите main в котором&lt;br /&gt;
### создаётся объект класса List, &lt;br /&gt;
### заполняется элементами с помощью функций push_back, push_front и insert_after и&lt;br /&gt;
### удаляется i-ый элемент.&lt;br /&gt;
&lt;br /&gt;
==Повторение (30.03)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Для данных пар функций выясните их связь в терминах O-, o-, Ω-, ω-, Θ-обозначений. Поставьте галочку в клетке с Ω, если f(x) = Ω(g(x)) и прочерк, если равенства нет. [https://ru.wikipedia.org/wiki/«O»_большое_и_«o»_малое#.D0.94.D1.80.D1.83.D0.B3.D0.B8.D0.B5_.D0.BF.D0.BE.D0.B4.D0.BE.D0.B1.D0.BD.D1.8B.D0.B5_.D0.BE.D0.B1.D0.BE.D0.B7.D0.BD.D0.B0.D1.87.D0.B5.D0.BD.D0.B8.D1.8F Википедия]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! f(x)!! g(x)!! O!! o!! Ω!! ω!! Θ&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! 2^100&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n * log(n)&lt;br /&gt;
! 2^100 * n * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n&lt;br /&gt;
! 2^100 * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n!&lt;br /&gt;
! 2^(2015n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n*2^n&lt;br /&gt;
! 3^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 5^n&lt;br /&gt;
! 5^(n+1)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n + n^2 + n^3 + ... + n^1000&lt;br /&gt;
! 7^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм Quickselect нахождения k-ого элемента по возрастанию: http://en.wikipedia.org/wiki/Quickselect&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;На улице стоит ряд домов. В каждом из домов лежит сколько-то денег. Вор хочет обокрасть дома на переулке. Он не может обокрасть два соседних дома, потому что хозяин дома, который он обокрал, сразу предупредит соседей. Нужно найти, какую максимальную сумму вор может украсть с переулка. На вход программы подается массив неотрицательных целых чисел - количество долларов в доме с номером i. Соседние дома в массиве представлены соседними элементами. Например, пусть задан массив { 1, 4, 5 } - тогда вор максимум может украсть $6, обокрав дома 1 и 3. Пусть задан массив { 1, 7, 2 } - тогда вор максимум может украсть $7, обокрав дом 2.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Алфавит из всех маленьких латинских букв и пробела закодирован числами следующим способом:&lt;br /&gt;
  &#039;a&#039; -&amp;gt; 1&lt;br /&gt;
  &#039;b&#039; -&amp;gt; 2&lt;br /&gt;
  &#039;c&#039; -&amp;gt; 3&lt;br /&gt;
  ...&lt;br /&gt;
  &#039;z&#039; -&amp;gt; 26&lt;br /&gt;
  &#039; &#039; -&amp;gt; 27&lt;br /&gt;
На вход программы подается строка из цифр. Нужно посчитать, сколькими способами можно раскодировать эту строку.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Дан граф, заданный матрицей смежности. Вывести пары вершин между которыми нет пути.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Повторение (02.04) ==&lt;br /&gt;
Решали и разбирали первые 4 задачи из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14* (до 11.03)===&lt;br /&gt;
Решите любые две задачи (подпункты НЕ считаются отдельными задачами) с предыдущей пары (Повторение (30.03)).&lt;br /&gt;
&lt;br /&gt;
== Повторение (06.04) ==&lt;br /&gt;
Будем решать вторую половину задач из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 15 (до 16.04)===&lt;br /&gt;
# Приведите пример графа, который содержит отрицательные рёбра, не содержит циклов отрицательного веса и для которого алгоритм Дейкстры возвращает неверный результат.&lt;br /&gt;
# Используется ли в алгоритме Дейкстры то, что веса рёбер неотрицательны? Если &amp;quot;да&amp;quot;, то где именно?&lt;br /&gt;
# Пусть граф содержит рёбра с весами &amp;gt;= -100. Если прибавить к каждому ребру 101 и при помощи алгоритма Дейкстры найти кратчайшие пути. Будут ли эти пути кратчайшими в исходном графе? Почему?&lt;br /&gt;
&lt;br /&gt;
== Повторение (07.04) ==&lt;br /&gt;
&#039;&#039;&#039;Решение рекуррентных соотношений&#039;&#039;&#039;&lt;br /&gt;
# Решите уравнение: T(n) = 4*T(n/2) + O(n^2) с базой T(1) = O(1)&lt;br /&gt;
## Используя основную теорему.&lt;br /&gt;
## Используя дерево рекурсий.&lt;br /&gt;
## Методом подстановки.&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2)) + n является \Theta(n lg n).&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2) + 17) + n является \Theta(n lg n).&lt;br /&gt;
# Решите уравнения, считая, что T(1) = O(1):&lt;br /&gt;
## T(n) = T(n-1) + n&lt;br /&gt;
## T(n) = 2*T(floor(sqrt(n))) + lg n. Указание: попробуйте использовать замену переменных.&lt;br /&gt;
## T(n) = 3*T(sqrt(n)) + lg n&lt;br /&gt;
# Дайте верхнюю и нижнюю оценки функции T(n). Постарайтесь, чтобы оценки были как можно более точные&lt;br /&gt;
## T(n) = 4T(n/3) + n*lg(n)&lt;br /&gt;
## T(n) = 3T(n/3) + n/lg(n)&lt;br /&gt;
## T(n) = 4T(n/2) + n^2*sqrt(n)&lt;br /&gt;
## T(n) = T(n/2) + T(n/4) + T(n/8) + n&lt;br /&gt;
## T(n) = T(n-1) + 1/n&lt;br /&gt;
## T(n) = T(n-2) + 1/lg(n)&lt;br /&gt;
## T(n) = sqrt(n) * T(sqrt(n)) + n&lt;br /&gt;
&#039;&#039;&#039;Анализ и построение алгоритмов&#039;&#039;&#039;&lt;br /&gt;
# Числа Фибоначчи F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; можно выразить через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, используя матрицу: https://yadi.sk/i/Pm_aNzHCforFU. &lt;br /&gt;
## Покажите как вычислить F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;.&lt;br /&gt;
## Как вычислить F&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;n+1&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;?&lt;br /&gt;
## Напишите алгоритм.&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
## Ускорьте его так, чтобы он работал за O(log n).&lt;br /&gt;
# Дана последовательность символов. Какое минимальное количество символов нужно удалить из неё, чтобы получить палиндром?&lt;br /&gt;
## Напишите алгоритм (на псевдокоде или на любом языке программирования).&lt;br /&gt;
## Оцените время работы алгоритма.&lt;br /&gt;
# Какую структуру данных вы бы использовали для реализации упорядоченного множества (http://neerc.ifmo.ru/wiki/index.php?title=Упорядоченное_множество)? Какая будет сложность каждой из операций над множеством?&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 16 (до 20.04)===&lt;br /&gt;
# Решите 6 задач из первой части и 6 из второй. (Укажите какие именно.) Каждый из подпунктов является отдельной задачей.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм и теорема Форда-Фалкерсона (16.04)==&lt;br /&gt;
# Базовые определения (пропускные способности, сток, исток и пр.). Пример. &lt;br /&gt;
# Ограничения на поток (сохранение и что меньше пропускных способностей).&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, пример работы&lt;br /&gt;
# Разрез, определение, пример.&lt;br /&gt;
# Утверждение: максимальный поток &amp;lt;= любого разреза.&lt;br /&gt;
# Теорема Форда-Фалкерсона (с доказательством).&lt;br /&gt;
# Пример на котором алгоритм Форда-Фалкерсонаработает работает очень долго при неудачном выборе путей.&lt;br /&gt;
# Сложность алгоритма Форда-Фалкерсона.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №3==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
В [https://official.contest.yandex.ru/contest/1196 домашнем задании] пять задач. Они разделены на два варианта, помеченные римскими цифрами I и II. Свой вариант нужно узнать [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing здесь на вкладке HW3]. Третья задача — общая для двух вариантов; ее решение необходимо снабдить доказательством корректности алгоритма. На выполнение задания дается примерно 2 недели (см. точное время окончания в контесте). Каждую задачу можно написать на С++ или Python.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Форда-Фалкерсона и Эдмондса-Карпа (20.04)==&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, напоминание: базовые определения, пример работы, пример на котором алгоритм работает долго, сложность.&lt;br /&gt;
# Алгоритм Эдмодса-Карпа. Доказательство асимптотики времени работы.&lt;br /&gt;
&lt;br /&gt;
==(23.04)==&lt;br /&gt;
&lt;br /&gt;
==(11.05) Красно-чёрные деревья==&lt;br /&gt;
[https://ru.wikipedia.org/wiki/Красно-чёрное_дерево Красно-чёрное дерево]&lt;br /&gt;
===Домашнее задание 17 (до 18.05)===&lt;br /&gt;
# Зачем нужны красно-чёрные деревья?&lt;br /&gt;
# Благодаря какому свойству и почему красно-чёрное дерево является сбалансированным?&lt;br /&gt;
# Нарисуйте полное бинарное дерево поиска высотой 3 с ключами {1, 2, ..., 15}. Сделайте из него красно-чёрные деревья высотой 2, 3 и 4.&lt;br /&gt;
# Нарисуйте красно-чёрные деревья, получающиеся последовательной вставкой элементов 12, 10, 29, 30, 31, 32 в [https://ru.wikipedia.org/wiki/Красно-чёрное_дерево#/media/File:Red-black_tree_example.svg данное дерево]. Для вставки используйте алгоритм вставки из Википедии. Укажите какой именно функцией вы воспользовались.&lt;br /&gt;
# Определим &#039;&#039;&#039;ослабленное красно-чёрное дерево&#039;&#039;&#039; как бинарное дерево поиска, которое удовлетворяет красно-чёрным свойствам 1, 3, 4 и 5. Другими словами, корень может быть как чёрным, так и красным. Рассмотрите ослабленное красно-чёрное дерево T, корень которого красный. Если перекрасить корень дерева T в чёрный, будет ли оно красно-чёрным деревом?&lt;br /&gt;
# Покажите, что самый длинный простой нисходящий путь от вершины x к листу красно-черного дерева имеет длину, не более чем в два раза превышающую кратчайший путь от x к листу-потомку.&lt;br /&gt;
# Чему равно наибольшее возможное количество внутренних узлов в красно-чёрном дереве с чёрной высоты k? А наименьшее возможное количество?&lt;br /&gt;
# Нарисуйте красно-чёрные деревья, получающиеся последовательной вставкой ключей 41, 38, 31, 12, 19, 8 в изначально пустое дерево.&lt;br /&gt;
# Покажите какие деревья будут получаться в результате последовательного удаления ключей в порядке 8, 12, 19, 31, 38, 41.&lt;br /&gt;
&lt;br /&gt;
==(14.05) Конкурентный анализ самоорганизующихся циклов==&lt;br /&gt;
[https://vk.com/doc12518218_390369758 Лекция]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 18 (до 21.05)===&lt;br /&gt;
Все вычисления сопроводите подробными объяснениями о том, почему верно то или иное (не)равенство.&lt;br /&gt;
# Пусть имеется n-элементный список и m поисковых запросов к нему. После каждой операции поиска можно переупорядочить список. Обозначим стоимость последовательности поисков через C. Докажите, что в худшем случае C = Ω(mn).&lt;br /&gt;
#  Обозначим через c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; стоимость i-ого поискового запроса с применением эвристики перемещения в начало, которая включает стоимость поиска элемента в списке и стоимость его перемещения в начало списка путём ряда обменов соседних элементов списка. Покажите, что i-ая операция поиска находит элемент x в списке L с применением эвристики перемещения в начало, то c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = 2 * rank&amp;lt;sub&amp;gt;L&amp;lt;/sub&amp;gt;(x) - 1.&lt;br /&gt;
# Покажите, что c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = 2 * rank&amp;lt;sub&amp;gt;L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) - 1.&lt;br /&gt;
# Покажите, что c*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = rank&amp;lt;sub&amp;gt;L*&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) + t&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;.&lt;br /&gt;
# Докажите, что после одного обмена двух соседних элементов потенциал либо увеличивается на 2, либо уменьшается на 2.&lt;br /&gt;
# Докажите, что rank&amp;lt;sub&amp;gt;L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) = |A| + |B| + 1.&lt;br /&gt;
# Докажите, что rank&amp;lt;sub&amp;gt;L*&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) = |A| + |С| + 1.&lt;br /&gt;
# Покажите, что поиск i-ого элемента приводит к изменению потенциала Ф(L&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;) - Ф(L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;) &amp;lt;= 2 (|A| - |B| + t*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;), где t*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; --- это количество обменов при i-ом поиске.&lt;br /&gt;
# Во сколько раз стоимость С&amp;lt;sub&amp;gt;MFT&amp;lt;/sub&amp;gt;(S) превышает C&amp;lt;sub&amp;gt;OPT&amp;lt;/sub&amp;gt;(S)?&lt;br /&gt;
&lt;br /&gt;
== (18.05) Конечные автоматы ==&lt;br /&gt;
=== Задание 19 (до 25.05) ===&lt;br /&gt;
# Постройте автомат для языка над алфавитом Σ = {0, 1} каждое слово которого содержит хотя бы два нуля. Является ли он детерминированным?&lt;br /&gt;
# Постройте автомат над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5. Является ли он детерминированным?&lt;br /&gt;
# Постройте автомат, который допускает пустой язык (язык в котором нет ни одного слова).&lt;br /&gt;
# Постройте автомат, который допускает все слова над алфавитом Σ.&lt;br /&gt;
# Постройте ДКА над алфавитом Σ = {К, Ж, З}, который допускает слова в которых после К идёт З, после З --- Ж, после Ж --- К.&lt;br /&gt;
# * Постройте ДКА над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5, а число нулей на 3.&lt;br /&gt;
# Постройте НКА для языка над алфавитом Σ = {0, 1, 2, 3}, состоящий из слов, в которых хотя бы одна из последних пяти букв является 1.&lt;br /&gt;
# Постройте НКА над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5, а число нулей на 3.&lt;br /&gt;
# Какие языки допускают автоматы https://yadi.sk/d/fNAHbjCZghERG?&lt;br /&gt;
# Для каждого из автоматов https://yadi.sk/d/fNAHbjCZghERG постройте соответствующий ему ДКА.&lt;br /&gt;
&lt;br /&gt;
== (21.05) Регулярные выражения, КА, их эквивалентность. Лемма о накачке  ==&lt;br /&gt;
=== Задание 20 (до 28.05) ===&lt;br /&gt;
&#039;&#039;&#039;I Написать регулярные выражения&#039;&#039;&#039;&lt;br /&gt;
# Напишите регулярное выражение для языка над алфавитом Σ = {0, 1} каждое слово которого содержит хотя бы два нуля.&lt;br /&gt;
# Напишите регулярное выражение над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5.&lt;br /&gt;
# Напишите регулярное выражение, которое допускает пустой язык (язык в котором нет ни одного слова).&lt;br /&gt;
# Напишите регулярное выражение, которое допускает все слова над алфавитом Σ.&lt;br /&gt;
# Напишите регулярное выражение для языка над алфавитом Σ = {0, 1, 2, 3}, состоящий из слов, в которых хотя бы одна из последних пяти букв является 1.&lt;br /&gt;
&#039;&#039;&#039;II КА и регулярные выражения&#039;&#039;&#039;&lt;br /&gt;
# Постройте конечный автомат для языка (111 U 01)&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;1(00 U 11)&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;.&lt;br /&gt;
# Постройте конечный автомат для языка (ab)&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;(a U b)(b U a)&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;(a U bab).&lt;br /&gt;
&#039;&#039;&#039;III Доказать замкнутость относительно различных операций&#039;&#039;&#039;&lt;br /&gt;
# Покажите, что если для языков L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; и L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; существует КА, который их читает, то существует КА и для их объединения L = {w | w ∈ L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; или w ∈ L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;}.&lt;br /&gt;
# Покажите, что если для языка L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; и L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; существует КА, который их читает, то существует КА и для языка L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; = {xy | x ∈ L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, y ∈ L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;}.&lt;br /&gt;
# Покажите, что если для языка L существует КА, который его читает, то существует КА и для &#039;&#039;&#039;замыкания Клини&#039;&#039;&#039; L* = {w&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; w&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; ... w&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;| w&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; ∈ L, w&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; ∈ L, ..., w&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; ∈ L}.&lt;br /&gt;
# Покажите, что если язык L регулярен, то регулярно его дополнение (т.е. язык над тем же алфавитом, которому принадлежит слово тогда и только тогда, когда оно НЕ принадлежит L) .&lt;br /&gt;
# Покажите, что если язык L регулярен, то регулярно его обращение L&amp;lt;sub&amp;gt;R&amp;lt;/sub&amp;gt; = {a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; . . . a&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; | a&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; . . . a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; ∈ L}. (L&amp;lt;sub&amp;gt;R&amp;lt;/sub&amp;gt; --- это язык в котором все слова языка L записаны наоборот.)&lt;br /&gt;
# * Покажите, что если языки L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; и L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; регулярны, то регулярно их пересечение.&lt;br /&gt;
&#039;&#039;&#039;IV Использование леммы о накачке&#039;&#039;&#039; (см. [https://vk.com/doc12518218_392750846 конспект])&lt;br /&gt;
# Докажите, что не существует КА, который бы читал язык {0&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;1&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;2&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;}. (Пояснение: запись 0&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; означает строку из n нулей: 00...0.)&lt;br /&gt;
# Докажите, что не существует КА, который бы читал язык {0&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;1&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;}.&lt;br /&gt;
# Докажите, что не существует КА, который бы читал язык {0&amp;lt;sup&amp;gt;n!&amp;lt;/sup&amp;gt;}.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== (25.05) Автоматный подход ==&lt;br /&gt;
=== Задание 21 (до 01.06) ===&lt;br /&gt;
Реализуйте один из следующих проектов:&lt;br /&gt;
# Программа, которая считывает строку и говорит принадлежит ли она языку 0(123)*(00 U (1 U 231)*) U 111.&lt;br /&gt;
# Программа, которая считывает КА и генерирует программу на языке С++, которая говорит принадлежит ли заданное слово языку, описываемому этим КА.&lt;br /&gt;
# Программа, которая считывает регулярное выражение и строку и говорит принадлежит ли слово языку, описываемому этим регулярным выражением.&lt;br /&gt;
# Программа, которая моделирует работу банкомата, автомата с газировкой, лифта...&lt;br /&gt;
# Текстовый симулятор студента. Возможные состояния: на паре, дома, есть приглашение прогулять, завтра коллоквиум, сплю и др. Есть два параметра: успеваемость и весёлось. Если хотя бы один из них упадёт нижу критической отметки, студент умрёт. Игрок принимает решение куда идти студенту. Цель: продержаться как можно дольше.&lt;/div&gt;</summary>
		<author><name>Kassalanche</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=14784</id>
		<title>Алгоритмы и структуры данных. Подгруппа 105-1</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=14784"/>
		<updated>2015-05-23T22:16:13Z</updated>

		<summary type="html">&lt;p&gt;Kassalanche: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==О курсе==&lt;br /&gt;
[[Алгоритмы_и_структуры_данных|План лекций и список рекомендуемой литературы.]]&lt;br /&gt;
&lt;br /&gt;
[[Алгоритмы_и_структуры_данных._Подгруппа_105-1._FAQ|FAQ.]]&lt;br /&gt;
&lt;br /&gt;
[[Reviewboard|Инструкция по использованию Reviewboard.]]&lt;br /&gt;
&lt;br /&gt;
[[Практические_занятия_по_курсу_ОиМП/C++_check|Style guide.]]&lt;br /&gt;
&lt;br /&gt;
==Итоговая оценка за курс==&lt;br /&gt;
Итоговая оценка (ИО) зависит от&lt;br /&gt;
* оценок за пять больших домашних заданий (БДЗ1, БДЗ2, ..., БДЗ5),&lt;br /&gt;
* оценок за домашние задания (ДЗ1, ДЗ2, ...),&lt;br /&gt;
* оценки за контрольную работу (КР),&lt;br /&gt;
* оценки за экзамен (ЭКЗ),&lt;br /&gt;
и может быть вычислена по формуле:&lt;br /&gt;
 ИО = 0.7 * (0.3 * КР + 0.7 *(ИДЗ1 + ИДЗ2 + ИДЗ3 + ИДЗ4 + ИДЗ5)/5) + 0.3 * ЭКЗ =&lt;br /&gt;
    = 0.21*КР + 0.098*ИДЗ1 + 0.098*ИДЗ2 + 0.098*ИДЗ3 + 0.098*ИДЗ4 + 0.098*ИДЗ5 + 0.3*ЭКЗ,&lt;br /&gt;
где&lt;br /&gt;
 ИДЗi = min (10, 0.7 * БДЗi + 0.4 * &amp;lt;cредняя оценка за ДЗj, прошедшие с предыдущего БДЗ по i-ое&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
==Порядок сдачи домашних работ==&lt;br /&gt;
===Большие домашние работы===&lt;br /&gt;
# Получить OK за задачу в контесте.&lt;br /&gt;
# Залить исходный код на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* На каждую задачу создавайте отдельный запрос на ревью. &lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении суток приходят замечания к коду. &#039;&#039;&#039;Если в течении суток замечаний или Ship It не появилось, проверьте, что вы правильно отправили запрос и, если всё сделано правильно, спросите у семинариста получил ли он запрос.&#039;&#039;&#039;&lt;br /&gt;
# Вы их исправляете, проверяете в контесте, что программа по-прежнему проходит все тесты, заливаете новую версию в Review Board. Штрафов за посылки НЕ будет.&lt;br /&gt;
# Процесс повторяется пока остаются замечания к коду или пока не истёк дедлайн. После закрытия контеста будут ещё одни сутки на доработку замечаний в Review Board.&lt;br /&gt;
# Оценивается только последняя версия работы в Review Board.&lt;br /&gt;
&lt;br /&gt;
===Маленькие домашние работы===&lt;br /&gt;
# Залить решение на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* Желаемые форматы: txt, py, cpp, h. Допускаются любые другие.&lt;br /&gt;
#* На каждую домашнюю работу создавайте отдельный запрос на ревью. Обязательно указывайте номер домашней работы.&lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении неопределенного промежутка времени придут оценки по каждому из заданий.&lt;br /&gt;
&lt;br /&gt;
==Оценивание домашних работ==&lt;br /&gt;
* Все задания предполагаются индивидуальными. Запрещены любые заимствования без ссылки на автора.&lt;br /&gt;
* Решения после установленного дедлайна не принимаются. Дедлайн указан в заголовке каждого задания.&lt;br /&gt;
* Везде, где требуется написать алгоритм, можно использовать любой язык программирования или псевдокод.&lt;br /&gt;
* Там, где требуется построить алгоритм с заданной асимптотикой, приведите обоснование, что полученный алгоритм удовлетворяет этому условию.&lt;br /&gt;
* Эти правила не действуют, если в задании явно оговорено иное.&lt;br /&gt;
&lt;br /&gt;
==Мотивация к изучению алгоритмов. Подсчёт числа операций (12.01)==&lt;br /&gt;
# Числа Фибоначчи. Определение. Примитивный рекурсивный алгоритм вычисления i-ого числа. Оценка числа операций. Анализ причин неэффективности. Алгоритм с запоминанием вычисленных ранее значений. Оценка числа операций. Сравнение с предыдущим. (подробнее: глава 0, страницы 8-10 из книги &amp;lt;&amp;lt;Алгоритмы&amp;gt;&amp;gt;, [[Алгоритмы_и_структуры_данных|см. список рекомендованной литературы]])&lt;br /&gt;
# Задача о ханойской башне. Постановка задачи. Рекурсивный алгоритм. Рекуррентная формула для числа перемещений. Замкнутая формула для числа перемещений (+ доказательство). Доказательство того, что эту задачу нельзя решить используя меньшее число перемещений дисков. ([https://www.dropbox.com/s/t8cbs7ttu4iasvj/algo-0-recursion.pdf?dl=0 Разбор задачи о ханойской башне], автор Сергей Объедков)&lt;br /&gt;
# Сортировка пузырьком. Алгоритм. Подсчёт количество операций сравнения и обмена (swap). Анализ наилучшего и наихудшего случаев ([https://ru.wikipedia.org/wiki/Сортировка_пузырьком Википедия])&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 1 (12.01 - 26.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
Во всех задачах, если не оговорено иного, предполагаем, что работаем с целыми неотрицательными числами. Для первых 7 задач необходимо&lt;br /&gt;
* описать что можно считать наилучшим и наихудшим случаями,&lt;br /&gt;
* для каждого из двух случаев подсчитать отдельно количество операций сравнения и swap (если есть).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Даны три числа, требуется вернуть наименьшее.&lt;br /&gt;
# Даны три числа, требуется отсортировать их.&lt;br /&gt;
# Дана последовательность A из n элементов и число x, требуется найти элемент равный x. Примечание: если таких значений i несколько, вернуть любое; если такого элемента нет, функция должна сообщить об этом.&lt;br /&gt;
# * Дана упорядоченная последовательность A из n элементов и число x, требуется найти такое i, что A[i] равно x. Алгоритм должен быть эффективней, чем в предыдущем пункте и использовать то, что последовательность упорядочена.&lt;br /&gt;
# Дана последовательность из 100 000 чисел от 0 до 100. Напишите эффективный алгоритм сортировки, который бы учитывал специфику входных данных.&lt;br /&gt;
# * Дано 32 битное неотрицательное число. Требуется номер первого ненулевого бит. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения, считая, что числа распределены равномерно.&lt;br /&gt;
# * Даны 32 битные неотрицательные числа m и n. Требуется вывести True, если m &amp;lt; n, иначе False. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения битов, считая, что числа распределены равномерно.&lt;br /&gt;
# Напишите рекурсивную функцию, вычисляющую n-ое число Фибоначчи (как на занятии). Подсчитайте количество рекурсивных вызовов.&lt;br /&gt;
# * Напишите функцию, вычисляющую n-ое число Фибоначчи, у которой число операций — полином от n, и которая использует количество памяти, независящее от n.&lt;br /&gt;
&lt;br /&gt;
==O-символика и стратегия &amp;quot;разделяй и властвуй&amp;quot; (15.01)==&lt;br /&gt;
# Сортировка слиянием. Алгоритм, рекуррентное соотношение для времени сортировки, сложность. Подробнее: [https://dl.dropboxusercontent.com/u/829163/draft.pdf §2.3 Сортировка слиянием (стр. 54)].&lt;br /&gt;
# О-символика. [https://dl.dropboxusercontent.com/u/829163/draft.pdf §0.3 О-символика (стр. 10)].&lt;br /&gt;
# Задача о слиянии m упорядоченных массивов по n элементов. Три алгоритма решения: последовательное слияние, слияние &amp;quot;деревом&amp;quot; (обе функции используют Merge из MergeSort), аналог Merge для m массивов. Анализ сложности каждого из них.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 2 (15.01-29.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
* Во всех задачах, если не оговорено иного, для простоты &#039;&#039;можно&#039;&#039; считать, что n является степенью какого-либо числа, например, степенью двойки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Дана функция F, определённая ниже. Сколько строк она напечатает? Указание: для обоих подпунктов рассмотрите два случая: 1. n является степенью двойки, 2. n не является степенью двойки.&lt;br /&gt;
## Запишите рекуррентное соотношение для числа строк.&lt;br /&gt;
## Решите уравнение, полученное в предыдущем пункте, то есть, выведите замкнутую (нерекуррентную формулу). Для простоты можно считать, что n является степенью двойки.&lt;br /&gt;
# В массиве A размера n записана возрастающая последовательность целых чисел. Постройте алгоритм типа &amp;quot;разделяй и властвуй&amp;quot;, который проверяет, существует ли такой индекс i, что A[i] = i&lt;br /&gt;
## за время O(n),&lt;br /&gt;
## * за время O(log n).&lt;br /&gt;
## Какие случаи для вашего алгоритма являются наихудшими и наилучшими? Какого время работы в лучшем и худшем случаях?&lt;br /&gt;
# Дан бесконечный массив A, первые n элементов которого содержат возрастающую последовательность положительных чисел, а дальше стоят -1. Значение n не дано. Постройте алгоритм, который получает на вход целое число x и находит это x в массиве --- или говорит, что там его нет, &lt;br /&gt;
## за время O(n),&lt;br /&gt;
## за время O(log n).&lt;br /&gt;
# Рассмотрим алгоритм вычисления наибольшего общего делителя (НОД) двух положительных чисел, основанный на методе &amp;quot;разделяй и властвуй&amp;quot;.&lt;br /&gt;
## (задание не оценивается) Прочитайте [https://dl.dropboxusercontent.com/u/829163/draft.pdf §1.2.3 Алгоритм Евклида (стр. 23)].&lt;br /&gt;
## * Докажите, что определение НОД-а, приведённое ниже, корректно.&lt;br /&gt;
## Постройте алгоритм, основанный на этом определении.&lt;br /&gt;
## Какой алгоритм будет быстрее для n-битовых чисел a и b при больших значениях n --- ваш или алгоритм Евклида?&lt;br /&gt;
# * Покажите как за время O(n log n) удалить из массива размера n все дубликаты, то есть оставить каждый элемент в одном экземпляре.&lt;br /&gt;
# * Даны два упорядоченных массива размера m и n. Постройте алгоритм, находящий k-й по величине элемент в объединении этих массивов за время O(log(n+m)). &lt;br /&gt;
&lt;br /&gt;
Функция F(n).&lt;br /&gt;
  если n &amp;gt; 1:&lt;br /&gt;
    напечатать &amp;quot;всё ещё работаю&amp;quot;&lt;br /&gt;
    F(n/2)&lt;br /&gt;
    F(n/2)&lt;br /&gt;
&lt;br /&gt;
Определение НОД-а.&lt;br /&gt;
             2НОД(a/2, b/2), если а и b чётны,&lt;br /&gt;
  НОД(a,b) = НОД(a, b/2), если а нечётно, b чётно,&lt;br /&gt;
             НОД((a-b)/2, b), если а и b нечётны.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;lt;nowiki&amp;gt;Задачи взяты из книги &amp;quot;Алгоритмы&amp;quot;, глава 2 (см. список рекомендованной литературы).&amp;lt;/nowiki&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Сложение и умножение (19.01)==&lt;br /&gt;
# Алгоритм сложения, его сложность (§1.1.1 Сложение*)&lt;br /&gt;
# &amp;quot;Школьный&amp;quot; алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Рекурсивный алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Алгоритм умножения, реализующий стратегию &amp;quot;разделяй и властвуй&amp;quot;, анализ сложности (§2.1 Умножение чисел*)&lt;br /&gt;
 * [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать.]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 3 (19.01 - 2.02)===&lt;br /&gt;
* Во всех задачах для простоты можно считать, что n является степенью какого-либо числа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Найдите произведение чисел 10011011 и 10111010 (в двоичной системе счисления), используя алгоритм умножения чисел, основанный на методе «разделяй и властвуй». Необходимо не только дать ответ, но и привести ход решения.&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 3 рекурсивных вызова для подзадач размера n-1 и комбинирует из них решение исходной задачи за О(n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте три верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 10 рекурсивных вызовов для подзадач размера n/2 и комбинирует из них решение исходной задачи за О(5n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте два верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Докажите, что 3m² + m = O(m²).&lt;br /&gt;
# Докажите, что lg m = O(m/1000), где lg m — это логарифм с двоичным основанием.&lt;br /&gt;
# Докажите, что из равенства f(n) = O(g(n)) не следует, что g(n) = O(f(n)).&lt;br /&gt;
# Докажите, что O(m) содержится в O(m²).&lt;br /&gt;
&lt;br /&gt;
==Решение рекуррентных уравнений (22.01)==&lt;br /&gt;
# Примеры решений рекуррентных уравнений (см. [https://www.dropbox.com/s/6a0r410zjm9qwe7/algo-3-recurrences.pdf?dl=0 конспект]).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 4 (до 14.02)===&lt;br /&gt;
* Нельзя использовать утверждение основной теоремы о решении рекуррентных соотношений.&lt;br /&gt;
* &#039;&#039;Можно&#039;&#039; использовать метод построения дерева рекурсии или подстановку (метод с угадыванием ответа).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Какой из трёх приведённых ниже алгоритмов вы бы предпочли? Обоснуйте свой ответ.&lt;br /&gt;
#* Алгоритм A, решая задачу, производит пять рекурсивных вызовов для подзадач вдвое меньшего размера, после чего строит ответ для исходной задачи за линейное время.&lt;br /&gt;
#* Алгоритм B, решая задачу размера n, делает два рекурсивных вызова для задач размера n − 1, после чего находит ответ за время O(1).&lt;br /&gt;
#* Алгоритм C, решая задачу размера n, рекурсивно решает девять задач размера n/3 и строит ответ за время O(n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Найдите T(n) в замкнутой форме для любых 7 из 10 приведённых ниже рекуррентных соотношений:&lt;br /&gt;
## T(n) ≤ 2T(n/3) + 1;&lt;br /&gt;
## T(n) ≤ 7T(n/7) + n;&lt;br /&gt;
## T(n) ≤ 9T(n/3) + n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 8T(n/2) + n&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 49T(n/25) + n&amp;lt;sup&amp;gt;3/2&amp;lt;/sup&amp;gt;log n;&lt;br /&gt;
## T(n) ≤ T(n − 1) + 2;&lt;br /&gt;
## T(n) ≤ T(n − 1) + n&amp;lt;sup&amp;gt;c&amp;lt;/sup&amp;gt;, где c ≥ 1 –– константа;&lt;br /&gt;
## T(n) ≤ T(n − 1) + c&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;, где c &amp;gt; 1 –– константа;&lt;br /&gt;
## T(n) ≤ 2T(n − 1) + 1;&lt;br /&gt;
## T(n) ≤ T(sqrt(n)) + 1.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №1==&lt;br /&gt;
Необходимо реализовать все 6 задач из [https://official.contest.yandex.ru/contest/1002 контеста]. Каждую задачу можно писать на С++ или Python. На выполнение работы отводится две недели. Каждая задача оценивается в 10/6 балла. Оценка &#039;&#039;может&#039;&#039; быть снижена за плохой код, но не более чем на 25%.&lt;br /&gt;
&lt;br /&gt;
==Бинарное дерево поиска (26.01)==&lt;br /&gt;
# Определение. Пример.&lt;br /&gt;
# Не модифицирующие алгоритмы: поиск (рекурсивный и итеративный алгоритмы), поиск минимума, inordered обход (вывод значений узлов в отсортированном порядке), поиск следующего по возрастанию.&lt;br /&gt;
# Модифицирующие алгоритмы: вставка (рекурсивная реализация), удаление (только идея).&lt;br /&gt;
 [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 13, стр. 248]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 5 (до 16.02)===&lt;br /&gt;
* Для получения максимальной оценки можно выполнить или все задачи без звёздочки, или задачу со звёздочкой. Преподаватель понимает, что реализацию БДП сложно не найти в интернете, но от копипасты не будет никакой пользы. Напротив, самостоятельная реализация очень полезна и приветствуется, даже если не получится выполнить всех пунктов задания.&lt;br /&gt;
* Задачи с двумя звёздочками необязательны.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Нарисуйте бинарные деревья поиска высотой 2, 3, 4, 5 и 6 для множества ключей {1, 4, 5, 10, 16, 17, 21}. Корень дерева имеет высоту 0.&lt;br /&gt;
# &#039;&#039;&#039;Сортировка с использованием БДП.&#039;&#039;&#039;&lt;br /&gt;
## Какова асимптотическая сложность алгоритма вставки элемента в дерево высоты d? Почему? Назовите наилучший и наиухдший случаи.&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который строит БДП в узлах которого стоят элементы данной последовательности. Можно использовать функцию Insert. Назовите наилучший и наихудший случаи. Есть теорема о том, что полученный алгоритм будет работать в среднем случае за время O(n * log n).&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который выводит их в порядке возрастания. Используйте бинарное дерево поиска. Какова в среднем случае сложность этого алгоритма? Назовите наилучший и наихудший случаи. Какова сложность в наихудшем случае?&lt;br /&gt;
# Напишите функцию GetRoot, которой на вход подаётся указатель на произвольный узел дерева, а она возвращает указатель на корень.&lt;br /&gt;
# Напишите процедуру PrintLeafs, которой на вход подаётся указатель на корень дерева, и она печатает листья дерева&lt;br /&gt;
## по возрастанию,&lt;br /&gt;
## по убыванию.&lt;br /&gt;
# ** Альтернативный обход в порядке возрастания бинарного дерева поиска с n узлами (или центрированный (inordered) обход) можно осуществить путём поиска минимального элемента дерева с помощью функции Minimum с последующий n-1 вызовом функции Next. Каково время работы такого алгоритма?&lt;br /&gt;
# * Реализуйте на С++ структуру данных бинарное дерево поиска, [https://yadi.sk/i/gi2SEStreFfSb используя заготовку].&lt;br /&gt;
## Нарисуйте бинарное дерево поиска, которое строится в функции getTreeExample.&lt;br /&gt;
## Реализуйте следующие алгоритмы: &lt;br /&gt;
### поиск минимума, &lt;br /&gt;
### inordered обход (вывод значений узлов в отсортированном порядке),&lt;br /&gt;
### поиск следующего по возрастанию,&lt;br /&gt;
### вставка элемента в дерево,&lt;br /&gt;
### сортировка последовательности с использованием БДП (дан вектор чисел, необходимо вывести их по возрастанию),&lt;br /&gt;
### ** удаление.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Карацубы, Штрассена. Быстрая сортировка (29.01)==&lt;br /&gt;
# Алгоритм Карацубы.&lt;br /&gt;
# Алгоритм Штрассена. [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать Дасгупту и др., §2.5 Умножение матриц]&lt;br /&gt;
# Быстрая сортировка и доказательство того, что в среднем случае она работает за О(n * log n). [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 8 Быстрая сортировка, стр. 148]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 6 (до 18.02)===&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Пусть мы хотим найти двоичное представление десятичного числа 10&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;. Будем считать, что n --- степень двойки (n = 2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt;).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Pwr2Bin(n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть 1010&lt;br /&gt;
    z = ...&lt;br /&gt;
    вернуть Multiply(z, z)&amp;lt;/source&amp;gt;&lt;br /&gt;
Multiply --- функция, перемножающая два n-битовых двоичных числа x и y по алгоритму Карацубы за O(n&amp;lt;sup&amp;gt;log&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;3&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Пусть мы хотим перевести произвольное десятичное число x в записи которого n=2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; чисел в двоичную систему счисления.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Dec2Bin(x, n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть binary[x]&lt;br /&gt;
    разделить x на два десятичных числа xl и xr из n/2 цифр.&lt;br /&gt;
    вернуть ...&amp;lt;/source&amp;gt;&lt;br /&gt;
Здесь binary --- это массив, содержащий двоичное представление десятичных цифр.&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Докажите, что математическое ожидание времени работы алгоритма быстрой сортировки (усреднение по всем вариантам выбора опорного элемента) на любом входе размера n удовлетворяет соотношению: T(n) ≤ O(n) + 1/n * &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt; (T(i-1) + T(n-i)).&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Найдите решение соотношения из предыдущего пункта.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Динамическое программирование (ДП). Первые примеры (02.01)==&lt;br /&gt;
# Нахождение самой длинной возрастающей подпоследовательности.&lt;br /&gt;
# Нахождение редакционного расстояния (или редакционной стоимости, расстояния Левенштейна).&lt;br /&gt;
# Нахождение представителя большинства.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 7 (до 20.02)===&lt;br /&gt;
* В этом задании везде, где требуется реализовать алгоритм, необходимо привести код на любом языке программирования.&lt;br /&gt;
* Для получения максимальной оценки нужно решить все задачи без звёздочек. Одна решённая задача со звёздочкой заменяет одну задачу без звёздочки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения редакционного расстояния (алгоритм Вагнера — Фишера). Например, редакционное расстояние между словами &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равно 6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения длины наибольшей общей подстроки. Например, длина наибольшей общей подстроки &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равна 8 (&amp;quot;antholog&amp;quot;). Чем больше это значение, тем схожей строки.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Предположим теперь, что сравниваемые строки состоят из символов A, С, G и T; за удаление или вставку мы платим -5; за замену буквы x на y платим w[x, y], где x, y принадлежат множеству {A, С, G, T}, a w — это матрица весов:&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
!-!! A!! G!! C!! T&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! A&lt;br /&gt;
|10||-1||-3||-4&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
!G&lt;br /&gt;
||-1||7||-5||-3&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! C&lt;br /&gt;
||-3||-5||9||0&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! T&lt;br /&gt;
||-4||-3||0||8&lt;br /&gt;
|}&lt;br /&gt;
Тогда выравнивание:&lt;br /&gt;
 AGACTAGTTAC&lt;br /&gt;
 CGA‒‒‒GACGT&lt;br /&gt;
будет иметь следующую оценку:&lt;br /&gt;
 w[A,C] + w[G,G] + w[A,A] + 3*(-5) + w[G,G] + w[T,A] + w[T,C] + w[A,G] + w[C,T] = -3 + 7 + 10 - 3*5 + 7 + (-4) + 0 + (-1) + 0 = 1.&lt;br /&gt;
&lt;br /&gt;
Напишите алгоритм, который находит максимальную стоимость всех возможных выравниваний. Верно ли, что чем больше это значение, тем непохожей строки?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как давно один народ отделился от другого? Кто похожей — итальянец и китаец или якут и эфиоп? На эти вопросы можно отвечать с разных точек зрения — культурной, исторической, лингвистической, ... В последние же годы человечество научилось секвенировать геном, что позволило исследовать этот вопрос с точки зрения генетики. Секвенирование генома — это процесс записи ДНК в виде нуклеотидной последовательности, которая представляет собой последовательность из четырёх символов — A, С, G и T. Существуют базы, которые хранят генетическую информацию о людях из разных стран и континентов, например, [http://www.mtdb.igp.uu.se/ http://www.mtdb.igp.uu.se/ → Download mtDNA sequences]. Чем больше сходство между геномами, тем сильнее родственные связи между их обладателями. Используя решение предыдущего пункта, выполните задания:&lt;br /&gt;
# Определите, кто похожей — итальянец и китаец или якут и эфиоп?&lt;br /&gt;
# Найдите нескольких похожих и нескольких непохожих народностей.&lt;br /&gt;
# * Выберите одну народность. Найдите самых похожих и самых непохожих на неё.&lt;br /&gt;
# * Найдите самые похожие и самые непохожие народности.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Задача о разрезании стержня (05.01)==&lt;br /&gt;
# Постановка задачи.&lt;br /&gt;
# Решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Решение с нахождением максимума по p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Восходящий алгоритм с запоминанием. Вывод длин кусочков стержня. Оценка сложности.&lt;br /&gt;
# Нисходящий алгоритм с запоминанием. Оценка сложности.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.1 Разрезание стержня, стр. 393]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 8 (до 22.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Решая задачу о разрезании стержня мы вначале построили рекурсивное решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt; для всех 1 ≤ i &amp;lt; n. Его сложность описывалась рекуррентной формулой T(n) = n + &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n-1&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt;(T(i) + T(n-i)), T(1) = 1.&lt;br /&gt;
# Объясните эту формулу.&lt;br /&gt;
# Покажите с помощью метода подстановок, что T(n) ≤ 2&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Покажите с помощью контрпримера, что описанная далее жадная стратегия не всегда определяет оптимальный способ разрезания стержня. Определим плотность стержня длиной i как p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;/i, то есть как стоимость единицы его длины. Жадная стратегия для стержня длиной n отрезает от стержня первую часть длиной i, где 1 ≤ i ≤ n, имеющую максимальную плотность. Затем та же жадная стратегия применяется к оставшейся части длиной n-i.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Рассмотрим модификацию задачи разрезания стержня, в которой в дополнение к цене p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; каждого стержня добавляется фиксированная цена разреза c. Теперь прибыль, связанная с решением, представляет собой сумму цен частей стержня минус стоимость разрезов. Разработайте алгоритм динамического программирования для этой модифицированной задачи.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Непрерывным участком называется группа подряд идущих элементов. Например, для последовательности&lt;br /&gt;
 5, 15, −30, 10, −5, 40, 10&lt;br /&gt;
элементы 15, −30, 10 образуют непрерывный участок, а 5, 15, 40 -- нет. Постройте линейный алгоритм для следующей задачи:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Вход: список чисел a1, a2, ... ‌, an.&lt;br /&gt;
Выход: непрерывный участок с максимальной суммой (сумма участка нулевой длины равна нулю).&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Для приведённого примера ответом будет 10, −5, 40, 10 с суммой 55. Какова сложность алгоритма? Почему?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Надо заплатить v рублей, имея купюры в x1, x2, ‌..., xn рублей (купюр каждого типа сколько угодно). Это не всегда возможно (скажем, купюрами в&lt;br /&gt;
10 и 25 рублей можно заплатить 45 рублей, но не 47 и не 15). Постройте основанный на методе динамического программирования алгоритм со временем работы O(nv), выясняющий, возможна ли уплата.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как решить предыдущую задачу, если каждая купюра имеется в единственном экземпляре? (Например, купюрами в 1, 5, 10, 20 рублей можно заплатить 16 = 1 + 5 + 10 и 31 = 1 + 10 + 20 рублей, но не 40 (не хватит денег). Время работы алгоритма по-прежнему O(nv).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Ещё один вариант той же задачи: купюр каждого типа сколько угодно, но всего разрешается использовать не более k купюр. (Например, если есть купюры в 5 и 10 рублей, а k = 6, то 55 разменять можно, а 65 –– нет).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Перемножение цепочки матриц. Оптимальное бинарное дерево поиска (начало) (09.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о перемножении цепочки матриц. Постановка задачи.Пример. Нисходящий алгоритм.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.2 Перемножение цепочки матриц, стр. 403]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 9 (до 24.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Найдите оптимальную расстановку скобок в произведении последовательности матриц, размерности которых равны 5×10, 10×3, 3×12, 12×5, 5×50, 50×6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Напишите восходящий алгоритм для поиска оптимальной расстановки скобок.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Расстановка пробелов. Оптимальное бинарное дерево поиска (середина) (12.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о расстановке пробелов. Постановка задачи. Решения для трёх случаев: 1. нужно вернуть можно ли разбить текст на слова; 2. вернуть разбивку на слова; 3. слова встречаются не равновероятно, вернуть наиболее вероятную разбивку на слова.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи. Вывод математического ожидания времени поиска.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Праздничное домашнее задание 10 (до 02.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[&amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;,&amp;quot;, &amp;quot;.&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;,&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;.&amp;quot;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Подсказка:&#039;&#039;&#039; разбейте текст на слова из списка и посмотрите на азбуку Морзе.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Способы представления графов в памяти (16.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Разбор ошибок в домашнем задании.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Графы. Способы представления графов в памяти (матрица смежности, список рёбер, список соседей (список смежностей), матрица инцидентности). Зависимость сложности алгоритмов от способа представления.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §22.1 Представление графов, стр. 626]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 11 (до 02.03)===&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача A.]&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача B.]&lt;br /&gt;
# Нарисуйте неориентированный граф с 5 вершинами и 8 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Нарисуйте ориентированный граф с 4 вершинами и 3 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Дан ориентированный граф. &#039;&#039;Исходящая степень вершины v&#039;&#039; --- это количество исходящих из неё рёбер, &#039;&#039;входящая степень v&#039;&#039; --- это количество рёбер входящих в  v. Имеется представление ориентированного графа с использование списка соседей. Как долго будут вычисляться исходящие степени всех вершин графа? А входящие степени?&lt;br /&gt;
# Дан граф G = (V, E). Какие из рассмотренных способов хранения графов используют меньше всего памяти для хранения G и почему? Указание: рассмотрите случаи |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;lt; |E| и |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;gt; |E|.&lt;br /&gt;
# Пусть C --- это матрица смежности графа G.&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
# Пусть B --- это матрица инцидентности ориентированного графа G. Как связаны элементы матрицы BB&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
&lt;br /&gt;
==Реализация поиска в глубину (19.02)==&lt;br /&gt;
# Реализация поиска в глубину и смежных задач.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 12 (до 5.03)===&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Выберите любой способ хранения графа. Реализуйте поиск в глубину.&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Напишите алгоритм, который возвращает данные о том, какие вершины лежат в одной компоненте связности.&lt;br /&gt;
# &#039;&#039;(любой ЯП или псевдокод)&#039;&#039; Напишите алгоритм проверки сильной связности ориентированного графа. Какова его сложность?&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №2==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
Необходимо реализовать 3 задачи из [https://official.contest.yandex.ru/contest/1085 контеста], см. [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing распределение задач]. Каждую задачу можно написать на С++ или Python. На выполнение работы отводится две недели (см. время окончания контеста). [https://official.contest.yandex.ru/contest/1123 Дорешивание.]&lt;br /&gt;
&lt;br /&gt;
==ДП и графы (26.02)==&lt;br /&gt;
==ДП и графы (02.03)==&lt;br /&gt;
==Жадные алгоритмы (12.03)==&lt;br /&gt;
===Домашнее задание 13 (до 23.03)===&lt;br /&gt;
# Вася хочет купить по одной акции каждой компании. Все акции стоят одинаково, но дорожают по-разному. Каждый месяц акция i-ой компании дорожает в r_i раз. В один месяц можно купить только одну акцию.&lt;br /&gt;
## Напишите алгоритм, который выводит оптимальную последовательность покупок (такую, что на покупку всех акций потратится меньше денег).&lt;br /&gt;
## Докажите корректность алгоритма, то есть докажите, что последовательность покупок, которую выводит ваш алгоритм, оптимальна.&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список, очередь (16.03)==&lt;br /&gt;
# Реализация линейного двусвязного списка (С++).&lt;br /&gt;
# Реализация очереди ограниченной длины на базе вектора (С++).&lt;br /&gt;
# Реализация очереди на базе списка (С++).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14 (до 23.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте (на С++) структуру данных Стек. У стека должно быть три операции:&lt;br /&gt;
* push --- положить элемент на вершину стека;&lt;br /&gt;
* pop --- удалить верхний элемент;&lt;br /&gt;
* front --- вернуть значение верхнего элемента.&lt;br /&gt;
Оцените время работы каждой функции.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список (19.03)==&lt;br /&gt;
===Домашнее задание 13* (до 30.03)===&lt;br /&gt;
#Для приведённой реализации класса List (https://yadi.sk/i/c5r_79WdfMyNS).&lt;br /&gt;
## Допишите print, push_back и push_front.&lt;br /&gt;
## В функции insert_after и delete_node вставьте необходимые проверки так, чтобы они работали для крайних случаев.&lt;br /&gt;
## Напишите main в котором&lt;br /&gt;
### создаётся объект класса List, &lt;br /&gt;
### заполняется элементами с помощью функций push_back, push_front и insert_after и&lt;br /&gt;
### удаляется i-ый элемент.&lt;br /&gt;
&lt;br /&gt;
==Повторение (30.03)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Для данных пар функций выясните их связь в терминах O-, o-, Ω-, ω-, Θ-обозначений. Поставьте галочку в клетке с Ω, если f(x) = Ω(g(x)) и прочерк, если равенства нет. [https://ru.wikipedia.org/wiki/«O»_большое_и_«o»_малое#.D0.94.D1.80.D1.83.D0.B3.D0.B8.D0.B5_.D0.BF.D0.BE.D0.B4.D0.BE.D0.B1.D0.BD.D1.8B.D0.B5_.D0.BE.D0.B1.D0.BE.D0.B7.D0.BD.D0.B0.D1.87.D0.B5.D0.BD.D0.B8.D1.8F Википедия]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! f(x)!! g(x)!! O!! o!! Ω!! ω!! Θ&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! 2^100&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n * log(n)&lt;br /&gt;
! 2^100 * n * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n&lt;br /&gt;
! 2^100 * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n!&lt;br /&gt;
! 2^(2015n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n*2^n&lt;br /&gt;
! 3^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 5^n&lt;br /&gt;
! 5^(n+1)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n + n^2 + n^3 + ... + n^1000&lt;br /&gt;
! 7^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм Quickselect нахождения k-ого элемента по возрастанию: http://en.wikipedia.org/wiki/Quickselect&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;На улице стоит ряд домов. В каждом из домов лежит сколько-то денег. Вор хочет обокрасть дома на переулке. Он не может обокрасть два соседних дома, потому что хозяин дома, который он обокрал, сразу предупредит соседей. Нужно найти, какую максимальную сумму вор может украсть с переулка. На вход программы подается массив неотрицательных целых чисел - количество долларов в доме с номером i. Соседние дома в массиве представлены соседними элементами. Например, пусть задан массив { 1, 4, 5 } - тогда вор максимум может украсть $6, обокрав дома 1 и 3. Пусть задан массив { 1, 7, 2 } - тогда вор максимум может украсть $7, обокрав дом 2.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Алфавит из всех маленьких латинских букв и пробела закодирован числами следующим способом:&lt;br /&gt;
  &#039;a&#039; -&amp;gt; 1&lt;br /&gt;
  &#039;b&#039; -&amp;gt; 2&lt;br /&gt;
  &#039;c&#039; -&amp;gt; 3&lt;br /&gt;
  ...&lt;br /&gt;
  &#039;z&#039; -&amp;gt; 26&lt;br /&gt;
  &#039; &#039; -&amp;gt; 27&lt;br /&gt;
На вход программы подается строка из цифр. Нужно посчитать, сколькими способами можно раскодировать эту строку.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Дан граф, заданный матрицей смежности. Вывести пары вершин между которыми нет пути.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Повторение (02.04) ==&lt;br /&gt;
Решали и разбирали первые 4 задачи из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14* (до 11.03)===&lt;br /&gt;
Решите любые две задачи (подпункты НЕ считаются отдельными задачами) с предыдущей пары (Повторение (30.03)).&lt;br /&gt;
&lt;br /&gt;
== Повторение (06.04) ==&lt;br /&gt;
Будем решать вторую половину задач из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 15 (до 16.04)===&lt;br /&gt;
# Приведите пример графа, который содержит отрицательные рёбра, не содержит циклов отрицательного веса и для которого алгоритм Дейкстры возвращает неверный результат.&lt;br /&gt;
# Используется ли в алгоритме Дейкстры то, что веса рёбер неотрицательны? Если &amp;quot;да&amp;quot;, то где именно?&lt;br /&gt;
# Пусть граф содержит рёбра с весами &amp;gt;= -100. Если прибавить к каждому ребру 101 и при помощи алгоритма Дейкстры найти кратчайшие пути. Будут ли эти пути кратчайшими в исходном графе? Почему?&lt;br /&gt;
&lt;br /&gt;
== Повторение (07.04) ==&lt;br /&gt;
&#039;&#039;&#039;Решение рекуррентных соотношений&#039;&#039;&#039;&lt;br /&gt;
# Решите уравнение: T(n) = 4*T(n/2) + O(n^2) с базой T(1) = O(1)&lt;br /&gt;
## Используя основную теорему.&lt;br /&gt;
## Используя дерево рекурсий.&lt;br /&gt;
## Методом подстановки.&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2)) + n является \Theta(n lg n).&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2) + 17) + n является \Theta(n lg n).&lt;br /&gt;
# Решите уравнения, считая, что T(1) = O(1):&lt;br /&gt;
## T(n) = T(n-1) + n&lt;br /&gt;
## T(n) = 2*T(floor(sqrt(n))) + lg n. Указание: попробуйте использовать замену переменных.&lt;br /&gt;
## T(n) = 3*T(sqrt(n)) + lg n&lt;br /&gt;
# Дайте верхнюю и нижнюю оценки функции T(n). Постарайтесь, чтобы оценки были как можно более точные&lt;br /&gt;
## T(n) = 4T(n/3) + n*lg(n)&lt;br /&gt;
## T(n) = 3T(n/3) + n/lg(n)&lt;br /&gt;
## T(n) = 4T(n/2) + n^2*sqrt(n)&lt;br /&gt;
## T(n) = T(n/2) + T(n/4) + T(n/8) + n&lt;br /&gt;
## T(n) = T(n-1) + 1/n&lt;br /&gt;
## T(n) = T(n-2) + 1/lg(n)&lt;br /&gt;
## T(n) = sqrt(n) * T(sqrt(n)) + n&lt;br /&gt;
&#039;&#039;&#039;Анализ и построение алгоритмов&#039;&#039;&#039;&lt;br /&gt;
# Числа Фибоначчи F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; можно выразить через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, используя матрицу: https://yadi.sk/i/Pm_aNzHCforFU. &lt;br /&gt;
## Покажите как вычислить F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;.&lt;br /&gt;
## Как вычислить F&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;n+1&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;?&lt;br /&gt;
## Напишите алгоритм.&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
## Ускорьте его так, чтобы он работал за O(log n).&lt;br /&gt;
# Дана последовательность символов. Какое минимальное количество символов нужно удалить из неё, чтобы получить палиндром?&lt;br /&gt;
## Напишите алгоритм (на псевдокоде или на любом языке программирования).&lt;br /&gt;
## Оцените время работы алгоритма.&lt;br /&gt;
# Какую структуру данных вы бы использовали для реализации упорядоченного множества (http://neerc.ifmo.ru/wiki/index.php?title=Упорядоченное_множество)? Какая будет сложность каждой из операций над множеством?&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 16 (до 20.04)===&lt;br /&gt;
# Решите 6 задач из первой части и 6 из второй. (Укажите какие именно.) Каждый из подпунктов является отдельной задачей.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм и теорема Форда-Фалкерсона (16.04)==&lt;br /&gt;
# Базовые определения (пропускные способности, сток, исток и пр.). Пример. &lt;br /&gt;
# Ограничения на поток (сохранение и что меньше пропускных способностей).&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, пример работы&lt;br /&gt;
# Разрез, определение, пример.&lt;br /&gt;
# Утверждение: максимальный поток &amp;lt;= любого разреза.&lt;br /&gt;
# Теорема Форда-Фалкерсона (с доказательством).&lt;br /&gt;
# Пример на котором алгоритм Форда-Фалкерсонаработает работает очень долго при неудачном выборе путей.&lt;br /&gt;
# Сложность алгоритма Форда-Фалкерсона.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №3==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
В [https://official.contest.yandex.ru/contest/1196 домашнем задании] пять задач. Они разделены на два варианта, помеченные римскими цифрами I и II. Свой вариант нужно узнать [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing здесь на вкладке HW3]. Третья задача — общая для двух вариантов; ее решение необходимо снабдить доказательством корректности алгоритма. На выполнение задания дается примерно 2 недели (см. точное время окончания в контесте). Каждую задачу можно написать на С++ или Python.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Форда-Фалкерсона и Эдмондса-Карпа (20.04)==&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, напоминание: базовые определения, пример работы, пример на котором алгоритм работает долго, сложность.&lt;br /&gt;
# Алгоритм Эдмодса-Карпа. Доказательство асимптотики времени работы.&lt;br /&gt;
&lt;br /&gt;
==(23.04)==&lt;br /&gt;
&lt;br /&gt;
==(11.05) Красно-чёрные деревья==&lt;br /&gt;
[https://ru.wikipedia.org/wiki/Красно-чёрное_дерево Красно-чёрное дерево]&lt;br /&gt;
===Домашнее задание 17 (до 18.05)===&lt;br /&gt;
# Зачем нужны красно-чёрные деревья?&lt;br /&gt;
# Благодаря какому свойству и почему красно-чёрное дерево является сбалансированным?&lt;br /&gt;
# Нарисуйте полное бинарное дерево поиска высотой 3 с ключами {1, 2, ..., 15}. Сделайте из него красно-чёрные деревья высотой 2, 3 и 4.&lt;br /&gt;
# Нарисуйте красно-чёрные деревья, получающиеся последовательной вставкой элементов 12, 10, 29, 30, 31, 32 в [https://ru.wikipedia.org/wiki/Красно-чёрное_дерево#/media/File:Red-black_tree_example.svg данное дерево]. Для вставки используйте алгоритм вставки из Википедии. Укажите какой именно функцией вы воспользовались.&lt;br /&gt;
# Определим &#039;&#039;&#039;ослабленное красно-чёрное дерево&#039;&#039;&#039; как бинарное дерево поиска, которое удовлетворяет красно-чёрным свойствам 1, 3, 4 и 5. Другими словами, корень может быть как чёрным, так и красным. Рассмотрите ослабленное красно-чёрное дерево T, корень которого красный. Если перекрасить корень дерева T в чёрный, будет ли оно красно-чёрным деревом?&lt;br /&gt;
# Покажите, что самый длинный простой нисходящий путь от вершины x к листу красно-черного дерева имеет длину, не более чем в два раза превышающую кратчайший путь от x к листу-потомку.&lt;br /&gt;
# Чему равно наибольшее возможное количество внутренних узлов в красно-чёрном дереве с чёрной высоты k? А наименьшее возможное количество?&lt;br /&gt;
# Нарисуйте красно-чёрные деревья, получающиеся последовательной вставкой ключей 41, 38, 31, 12, 19, 8 в изначально пустое дерево.&lt;br /&gt;
# Покажите какие деревья будут получаться в результате последовательного удаления ключей в порядке 8, 12, 19, 31, 38, 41.&lt;br /&gt;
&lt;br /&gt;
==(14.05) Конкурентный анализ самоорганизующихся циклов==&lt;br /&gt;
[https://vk.com/doc12518218_390369758 Лекция]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 18 (до 21.05)===&lt;br /&gt;
Все вычисления сопроводите подробными объяснениями о том, почему верно то или иное (не)равенство.&lt;br /&gt;
# Пусть имеется n-элементный список и m поисковых запросов к нему. После каждой операции поиска можно переупорядочить список. Обозначим стоимость последовательности поисков через C. Докажите, что в худшем случае C = Ω(mn).&lt;br /&gt;
#  Обозначим через c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; стоимость i-ого поискового запроса с применением эвристики перемещения в начало, которая включает стоимость поиска элемента в списке и стоимость его перемещения в начало списка путём ряда обменов соседних элементов списка. Покажите, что i-ая операция поиска находит элемент x в списке L с применением эвристики перемещения в начало, то c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = 2 * rank&amp;lt;sub&amp;gt;L&amp;lt;/sub&amp;gt;(x) - 1.&lt;br /&gt;
# Покажите, что c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = 2 * rank&amp;lt;sub&amp;gt;L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) - 1.&lt;br /&gt;
# Покажите, что c*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = rank&amp;lt;sub&amp;gt;L*&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) + t&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;.&lt;br /&gt;
# Докажите, что после одного обмена двух соседних элементов потенциал либо увеличивается на 2, либо уменьшается на 2.&lt;br /&gt;
# Докажите, что rank&amp;lt;sub&amp;gt;L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) = |A| + |B| + 1.&lt;br /&gt;
# Докажите, что rank&amp;lt;sub&amp;gt;L*&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) = |A| + |С| + 1.&lt;br /&gt;
# Покажите, что поиск i-ого элемента приводит к изменению потенциала Ф(L&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;) - Ф(L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;) &amp;lt;= 2 (|A| - |B| + t*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;), где t*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; --- это количество обменов при i-ом поиске.&lt;br /&gt;
# Во сколько раз стоимость С&amp;lt;sub&amp;gt;MFT&amp;lt;/sub&amp;gt;(S) превышает C&amp;lt;sub&amp;gt;OPT&amp;lt;/sub&amp;gt;(S)?&lt;br /&gt;
&lt;br /&gt;
== (18.05) Конечные автоматы ==&lt;br /&gt;
=== Задание 19 (до 25.05) ===&lt;br /&gt;
# Постройте автомат для языка над алфавитом Σ = {0, 1} каждое слово которого содержит хотя бы два нуля. Является ли он детерминированным?&lt;br /&gt;
# Постройте автомат над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5. Является ли он детерминированным?&lt;br /&gt;
# Постройте автомат, который допускает пустой язык (язык в котором нет ни одного слова).&lt;br /&gt;
# Постройте автомат, который допускает все слова над алфавитом Σ.&lt;br /&gt;
# Постройте ДКА над алфавитом Σ = {К, Ж, З}, который допускает слова в которых после К идёт З, после З --- Ж, после Ж --- К.&lt;br /&gt;
# * Постройте ДКА над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5, а число нулей на 3.&lt;br /&gt;
# Постройте НКА для языка над алфавитом Σ = {0, 1, 2, 3}, состоящий из слов, в которых хотя бы одна из последних пяти букв является 1.&lt;br /&gt;
# Постройте НКА над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5, а число нулей на 3.&lt;br /&gt;
# Какие языки допускают автоматы https://yadi.sk/d/fNAHbjCZghERG?&lt;br /&gt;
# Для каждого из автоматов https://yadi.sk/d/fNAHbjCZghERG постройте соответствующий ему ДКА.&lt;br /&gt;
&lt;br /&gt;
== (21.05) Регулярные выражения, КА, их эквивалентность. Лемма о накачке  ==&lt;br /&gt;
=== Задание 20 (до 28.05) ===&lt;br /&gt;
&#039;&#039;&#039;I Написать регулярные выражения&#039;&#039;&#039;&lt;br /&gt;
# Напишите регулярное выражение для языка над алфавитом Σ = {0, 1} каждое слово которого содержит хотя бы два нуля.&lt;br /&gt;
# Напишите регулярное выражение над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5.&lt;br /&gt;
# Напишите регулярное выражение, которое допускает пустой язык (язык в котором нет ни одного слова).&lt;br /&gt;
# Напишите регулярное выражение, которое допускает все слова над алфавитом Σ.&lt;br /&gt;
# Напишите регулярное выражение для языка над алфавитом Σ = {0, 1, 2, 3}, состоящий из слов, в которых хотя бы одна из последних пяти букв является 1.&lt;br /&gt;
&#039;&#039;&#039;II КА и регулярные выражения&#039;&#039;&#039;&lt;br /&gt;
# Постройте конечный автомат для языка (111 + 01)&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;1(00 + 11)&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;.&lt;br /&gt;
# Постройте конечный автомат для языка (ab)&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;(a + b)(b + a)&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;(a + bab).&lt;br /&gt;
&#039;&#039;&#039;III Доказать замкнутость относительно различных операций&#039;&#039;&#039;&lt;br /&gt;
# Покажите, что если для языков L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; и L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; существует КА, который их читает, то существует КА и для их объединения L = {w | w ∈ L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; или w ∈ L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;}.&lt;br /&gt;
# Покажите, что если для языка L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; и L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; существует КА, который их читает, то существует КА и для языка L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; = {xy | x ∈ L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, y ∈ L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;}.&lt;br /&gt;
# Покажите, что если для языка L существует КА, который его читает, то существует КА и для &#039;&#039;&#039;замыкания Клини&#039;&#039;&#039; L* = {w&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; w&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; ... w&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;| w&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; ∈ L, w&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; ∈ L, ..., w&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; ∈ L}.&lt;br /&gt;
# Покажите, что если язык L регулярен, то регулярно его дополнение (т.е. язык над тем же алфавитом, которому принадлежит слово тогда и только тогда, когда оно НЕ принадлежит L) .&lt;br /&gt;
# Покажите, что если язык L регулярен, то регулярно его обращение L&amp;lt;sub&amp;gt;R&amp;lt;/sub&amp;gt; = {a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; . . . a&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; | a&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; . . . a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; ∈ L}. (L&amp;lt;sub&amp;gt;R&amp;lt;/sub&amp;gt; --- это язык в котором все слова языка L записаны наоборот.)&lt;br /&gt;
# * Покажите, что если языки L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; и L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; регулярны, то регулярно их пересечение.&lt;br /&gt;
&#039;&#039;&#039;IV Использование леммы о накачке&#039;&#039;&#039; (см. [https://vk.com/doc12518218_392750846 конспект])&lt;br /&gt;
# Докажите, что не существует КА, который бы читал язык {0&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;1&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;2&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;}. (Пояснение: запись 0&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; означает строку из n нулей: 00...0.)&lt;br /&gt;
# Докажите, что не существует КА, который бы читал язык {0&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;1&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;}.&lt;br /&gt;
# Докажите, что не существует КА, который бы читал язык {0&amp;lt;sup&amp;gt;n!&amp;lt;/sup&amp;gt;}.&lt;/div&gt;</summary>
		<author><name>Kassalanche</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=13896</id>
		<title>Алгоритмы и структуры данных. Подгруппа 105-1</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=13896"/>
		<updated>2015-05-21T04:56:47Z</updated>

		<summary type="html">&lt;p&gt;Kassalanche: /* Задание 20 (до 28.05) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==О курсе==&lt;br /&gt;
[[Алгоритмы_и_структуры_данных|План лекций и список рекомендуемой литературы.]]&lt;br /&gt;
&lt;br /&gt;
[[Алгоритмы_и_структуры_данных._Подгруппа_105-1._FAQ|FAQ.]]&lt;br /&gt;
&lt;br /&gt;
[[Reviewboard|Инструкция по использованию Reviewboard.]]&lt;br /&gt;
&lt;br /&gt;
[[Практические_занятия_по_курсу_ОиМП/C++_check|Style guide.]]&lt;br /&gt;
&lt;br /&gt;
==Итоговая оценка за курс==&lt;br /&gt;
Итоговая оценка (ИО) зависит от&lt;br /&gt;
* оценок за пять больших домашних заданий (БДЗ1, БДЗ2, ..., БДЗ5),&lt;br /&gt;
* оценок за домашние задания (ДЗ1, ДЗ2, ...),&lt;br /&gt;
* оценки за контрольную работу (КР),&lt;br /&gt;
* оценки за экзамен (ЭКЗ),&lt;br /&gt;
и может быть вычислена по формуле:&lt;br /&gt;
 ИО = 0.7 * (0.3 * КР + 0.7 *(ИДЗ1 + ИДЗ2 + ИДЗ3 + ИДЗ4 + ИДЗ5)/5) + 0.3 * ЭКЗ =&lt;br /&gt;
    = 0.21*КР + 0.98*ИДЗ1 + 0.98*ИДЗ2 + 0.98*ИДЗ3 + 0.98*ИДЗ4 + 0.98*ИДЗ5 + 0.3*ЭКЗ,&lt;br /&gt;
где&lt;br /&gt;
 ИДЗi = min (10, 0.7 * БДЗi + 0.4 * &amp;lt;cредняя оценка за ДЗj, прошедшие с предыдущего БДЗ по i-ое&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
==Порядок сдачи домашних работ==&lt;br /&gt;
===Большие домашние работы===&lt;br /&gt;
# Получить OK за задачу в контесте.&lt;br /&gt;
# Залить исходный код на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* На каждую задачу создавайте отдельный запрос на ревью. &lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении суток приходят замечания к коду. &#039;&#039;&#039;Если в течении суток замечаний или Ship It не появилось, проверьте, что вы правильно отправили запрос и, если всё сделано правильно, спросите у семинариста получил ли он запрос.&#039;&#039;&#039;&lt;br /&gt;
# Вы их исправляете, проверяете в контесте, что программа по-прежнему проходит все тесты, заливаете новую версию в Review Board. Штрафов за посылки НЕ будет.&lt;br /&gt;
# Процесс повторяется пока остаются замечания к коду или пока не истёк дедлайн. После закрытия контеста будут ещё одни сутки на доработку замечаний в Review Board.&lt;br /&gt;
# Оценивается только последняя версия работы в Review Board.&lt;br /&gt;
&lt;br /&gt;
===Маленькие домашние работы===&lt;br /&gt;
# Залить решение на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* Желаемые форматы: txt, py, cpp, h. Допускаются любые другие.&lt;br /&gt;
#* На каждую домашнюю работу создавайте отдельный запрос на ревью. Обязательно указывайте номер домашней работы.&lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении неопределенного промежутка времени придут оценки по каждому из заданий.&lt;br /&gt;
&lt;br /&gt;
==Оценивание домашних работ==&lt;br /&gt;
* Все задания предполагаются индивидуальными. Запрещены любые заимствования без ссылки на автора.&lt;br /&gt;
* Решения после установленного дедлайна не принимаются. Дедлайн указан в заголовке каждого задания.&lt;br /&gt;
* Везде, где требуется написать алгоритм, можно использовать любой язык программирования или псевдокод.&lt;br /&gt;
* Там, где требуется построить алгоритм с заданной асимптотикой, приведите обоснование, что полученный алгоритм удовлетворяет этому условию.&lt;br /&gt;
* Эти правила не действуют, если в задании явно оговорено иное.&lt;br /&gt;
&lt;br /&gt;
==Мотивация к изучению алгоритмов. Подсчёт числа операций (12.01)==&lt;br /&gt;
# Числа Фибоначчи. Определение. Примитивный рекурсивный алгоритм вычисления i-ого числа. Оценка числа операций. Анализ причин неэффективности. Алгоритм с запоминанием вычисленных ранее значений. Оценка числа операций. Сравнение с предыдущим. (подробнее: глава 0, страницы 8-10 из книги &amp;lt;&amp;lt;Алгоритмы&amp;gt;&amp;gt;, [[Алгоритмы_и_структуры_данных|см. список рекомендованной литературы]])&lt;br /&gt;
# Задача о ханойской башне. Постановка задачи. Рекурсивный алгоритм. Рекуррентная формула для числа перемещений. Замкнутая формула для числа перемещений (+ доказательство). Доказательство того, что эту задачу нельзя решить используя меньшее число перемещений дисков. ([https://www.dropbox.com/s/t8cbs7ttu4iasvj/algo-0-recursion.pdf?dl=0 Разбор задачи о ханойской башне], автор Сергей Объедков)&lt;br /&gt;
# Сортировка пузырьком. Алгоритм. Подсчёт количество операций сравнения и обмена (swap). Анализ наилучшего и наихудшего случаев ([https://ru.wikipedia.org/wiki/Сортировка_пузырьком Википедия])&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 1 (12.01 - 26.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
Во всех задачах, если не оговорено иного, предполагаем, что работаем с целыми неотрицательными числами. Для первых 7 задач необходимо&lt;br /&gt;
* описать что можно считать наилучшим и наихудшим случаями,&lt;br /&gt;
* для каждого из двух случаев подсчитать отдельно количество операций сравнения и swap (если есть).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Даны три числа, требуется вернуть наименьшее.&lt;br /&gt;
# Даны три числа, требуется отсортировать их.&lt;br /&gt;
# Дана последовательность A из n элементов и число x, требуется найти элемент равный x. Примечание: если таких значений i несколько, вернуть любое; если такого элемента нет, функция должна сообщить об этом.&lt;br /&gt;
# * Дана упорядоченная последовательность A из n элементов и число x, требуется найти такое i, что A[i] равно x. Алгоритм должен быть эффективней, чем в предыдущем пункте и использовать то, что последовательность упорядочена.&lt;br /&gt;
# Дана последовательность из 100 000 чисел от 0 до 100. Напишите эффективный алгоритм сортировки, который бы учитывал специфику входных данных.&lt;br /&gt;
# * Дано 32 битное неотрицательное число. Требуется номер первого ненулевого бит. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения, считая, что числа распределены равномерно.&lt;br /&gt;
# * Даны 32 битные неотрицательные числа m и n. Требуется вывести True, если m &amp;lt; n, иначе False. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения битов, считая, что числа распределены равномерно.&lt;br /&gt;
# Напишите рекурсивную функцию, вычисляющую n-ое число Фибоначчи (как на занятии). Подсчитайте количество рекурсивных вызовов.&lt;br /&gt;
# * Напишите функцию, вычисляющую n-ое число Фибоначчи, у которой число операций — полином от n, и которая использует количество памяти, независящее от n.&lt;br /&gt;
&lt;br /&gt;
==O-символика и стратегия &amp;quot;разделяй и властвуй&amp;quot; (15.01)==&lt;br /&gt;
# Сортировка слиянием. Алгоритм, рекуррентное соотношение для времени сортировки, сложность. Подробнее: [https://dl.dropboxusercontent.com/u/829163/draft.pdf §2.3 Сортировка слиянием (стр. 54)].&lt;br /&gt;
# О-символика. [https://dl.dropboxusercontent.com/u/829163/draft.pdf §0.3 О-символика (стр. 10)].&lt;br /&gt;
# Задача о слиянии m упорядоченных массивов по n элементов. Три алгоритма решения: последовательное слияние, слияние &amp;quot;деревом&amp;quot; (обе функции используют Merge из MergeSort), аналог Merge для m массивов. Анализ сложности каждого из них.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 2 (15.01-29.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
* Во всех задачах, если не оговорено иного, для простоты &#039;&#039;можно&#039;&#039; считать, что n является степенью какого-либо числа, например, степенью двойки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Дана функция F, определённая ниже. Сколько строк она напечатает? Указание: для обоих подпунктов рассмотрите два случая: 1. n является степенью двойки, 2. n не является степенью двойки.&lt;br /&gt;
## Запишите рекуррентное соотношение для числа строк.&lt;br /&gt;
## Решите уравнение, полученное в предыдущем пункте, то есть, выведите замкнутую (нерекуррентную формулу). Для простоты можно считать, что n является степенью двойки.&lt;br /&gt;
# В массиве A размера n записана возрастающая последовательность целых чисел. Постройте алгоритм типа &amp;quot;разделяй и властвуй&amp;quot;, который проверяет, существует ли такой индекс i, что A[i] = i&lt;br /&gt;
## за время O(n),&lt;br /&gt;
## * за время O(log n).&lt;br /&gt;
## Какие случаи для вашего алгоритма являются наихудшими и наилучшими? Какого время работы в лучшем и худшем случаях?&lt;br /&gt;
# Дан бесконечный массив A, первые n элементов которого содержат возрастающую последовательность положительных чисел, а дальше стоят -1. Значение n не дано. Постройте алгоритм, который получает на вход целое число x и находит это x в массиве --- или говорит, что там его нет, &lt;br /&gt;
## за время O(n),&lt;br /&gt;
## за время O(log n).&lt;br /&gt;
# Рассмотрим алгоритм вычисления наибольшего общего делителя (НОД) двух положительных чисел, основанный на методе &amp;quot;разделяй и властвуй&amp;quot;.&lt;br /&gt;
## (задание не оценивается) Прочитайте [https://dl.dropboxusercontent.com/u/829163/draft.pdf §1.2.3 Алгоритм Евклида (стр. 23)].&lt;br /&gt;
## * Докажите, что определение НОД-а, приведённое ниже, корректно.&lt;br /&gt;
## Постройте алгоритм, основанный на этом определении.&lt;br /&gt;
## Какой алгоритм будет быстрее для n-битовых чисел a и b при больших значениях n --- ваш или алгоритм Евклида?&lt;br /&gt;
# * Покажите как за время O(n log n) удалить из массива размера n все дубликаты, то есть оставить каждый элемент в одном экземпляре.&lt;br /&gt;
# * Даны два упорядоченных массива размера m и n. Постройте алгоритм, находящий k-й по величине элемент в объединении этих массивов за время O(log(n+m)). &lt;br /&gt;
&lt;br /&gt;
Функция F(n).&lt;br /&gt;
  если n &amp;gt; 1:&lt;br /&gt;
    напечатать &amp;quot;всё ещё работаю&amp;quot;&lt;br /&gt;
    F(n/2)&lt;br /&gt;
    F(n/2)&lt;br /&gt;
&lt;br /&gt;
Определение НОД-а.&lt;br /&gt;
             2НОД(a/2, b/2), если а и b чётны,&lt;br /&gt;
  НОД(a,b) = НОД(a, b/2), если а нечётно, b чётно,&lt;br /&gt;
             НОД((a-b)/2, b), если а и b нечётны.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;lt;nowiki&amp;gt;Задачи взяты из книги &amp;quot;Алгоритмы&amp;quot;, глава 2 (см. список рекомендованной литературы).&amp;lt;/nowiki&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Сложение и умножение (19.01)==&lt;br /&gt;
# Алгоритм сложения, его сложность (§1.1.1 Сложение*)&lt;br /&gt;
# &amp;quot;Школьный&amp;quot; алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Рекурсивный алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Алгоритм умножения, реализующий стратегию &amp;quot;разделяй и властвуй&amp;quot;, анализ сложности (§2.1 Умножение чисел*)&lt;br /&gt;
 * [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать.]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 3 (19.01 - 2.02)===&lt;br /&gt;
* Во всех задачах для простоты можно считать, что n является степенью какого-либо числа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Найдите произведение чисел 10011011 и 10111010 (в двоичной системе счисления), используя алгоритм умножения чисел, основанный на методе «разделяй и властвуй». Необходимо не только дать ответ, но и привести ход решения.&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 3 рекурсивных вызова для подзадач размера n-1 и комбинирует из них решение исходной задачи за О(n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте три верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 10 рекурсивных вызовов для подзадач размера n/2 и комбинирует из них решение исходной задачи за О(5n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте два верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Докажите, что 3m² + m = O(m²).&lt;br /&gt;
# Докажите, что lg m = O(m/1000), где lg m — это логарифм с двоичным основанием.&lt;br /&gt;
# Докажите, что из равенства f(n) = O(g(n)) не следует, что g(n) = O(f(n)).&lt;br /&gt;
# Докажите, что O(m) содержится в O(m²).&lt;br /&gt;
&lt;br /&gt;
==Решение рекуррентных уравнений (22.01)==&lt;br /&gt;
# Примеры решений рекуррентных уравнений (см. [https://www.dropbox.com/s/6a0r410zjm9qwe7/algo-3-recurrences.pdf?dl=0 конспект]).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 4 (до 14.02)===&lt;br /&gt;
* Нельзя использовать утверждение основной теоремы о решении рекуррентных соотношений.&lt;br /&gt;
* &#039;&#039;Можно&#039;&#039; использовать метод построения дерева рекурсии или подстановку (метод с угадыванием ответа).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Какой из трёх приведённых ниже алгоритмов вы бы предпочли? Обоснуйте свой ответ.&lt;br /&gt;
#* Алгоритм A, решая задачу, производит пять рекурсивных вызовов для подзадач вдвое меньшего размера, после чего строит ответ для исходной задачи за линейное время.&lt;br /&gt;
#* Алгоритм B, решая задачу размера n, делает два рекурсивных вызова для задач размера n − 1, после чего находит ответ за время O(1).&lt;br /&gt;
#* Алгоритм C, решая задачу размера n, рекурсивно решает девять задач размера n/3 и строит ответ за время O(n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Найдите T(n) в замкнутой форме для любых 7 из 10 приведённых ниже рекуррентных соотношений:&lt;br /&gt;
## T(n) ≤ 2T(n/3) + 1;&lt;br /&gt;
## T(n) ≤ 7T(n/7) + n;&lt;br /&gt;
## T(n) ≤ 9T(n/3) + n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 8T(n/2) + n&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 49T(n/25) + n&amp;lt;sup&amp;gt;3/2&amp;lt;/sup&amp;gt;log n;&lt;br /&gt;
## T(n) ≤ T(n − 1) + 2;&lt;br /&gt;
## T(n) ≤ T(n − 1) + n&amp;lt;sup&amp;gt;c&amp;lt;/sup&amp;gt;, где c ≥ 1 –– константа;&lt;br /&gt;
## T(n) ≤ T(n − 1) + c&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;, где c &amp;gt; 1 –– константа;&lt;br /&gt;
## T(n) ≤ 2T(n − 1) + 1;&lt;br /&gt;
## T(n) ≤ T(sqrt(n)) + 1.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №1==&lt;br /&gt;
Необходимо реализовать все 6 задач из [https://official.contest.yandex.ru/contest/1002 контеста]. Каждую задачу можно писать на С++ или Python. На выполнение работы отводится две недели. Каждая задача оценивается в 10/6 балла. Оценка &#039;&#039;может&#039;&#039; быть снижена за плохой код, но не более чем на 25%.&lt;br /&gt;
&lt;br /&gt;
==Бинарное дерево поиска (26.01)==&lt;br /&gt;
# Определение. Пример.&lt;br /&gt;
# Не модифицирующие алгоритмы: поиск (рекурсивный и итеративный алгоритмы), поиск минимума, inordered обход (вывод значений узлов в отсортированном порядке), поиск следующего по возрастанию.&lt;br /&gt;
# Модифицирующие алгоритмы: вставка (рекурсивная реализация), удаление (только идея).&lt;br /&gt;
 [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 13, стр. 248]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 5 (до 16.02)===&lt;br /&gt;
* Для получения максимальной оценки можно выполнить или все задачи без звёздочки, или задачу со звёздочкой. Преподаватель понимает, что реализацию БДП сложно не найти в интернете, но от копипасты не будет никакой пользы. Напротив, самостоятельная реализация очень полезна и приветствуется, даже если не получится выполнить всех пунктов задания.&lt;br /&gt;
* Задачи с двумя звёздочками необязательны.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Нарисуйте бинарные деревья поиска высотой 2, 3, 4, 5 и 6 для множества ключей {1, 4, 5, 10, 16, 17, 21}. Корень дерева имеет высоту 0.&lt;br /&gt;
# &#039;&#039;&#039;Сортировка с использованием БДП.&#039;&#039;&#039;&lt;br /&gt;
## Какова асимптотическая сложность алгоритма вставки элемента в дерево высоты d? Почему? Назовите наилучший и наиухдший случаи.&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который строит БДП в узлах которого стоят элементы данной последовательности. Можно использовать функцию Insert. Назовите наилучший и наихудший случаи. Есть теорема о том, что полученный алгоритм будет работать в среднем случае за время O(n * log n).&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который выводит их в порядке возрастания. Используйте бинарное дерево поиска. Какова в среднем случае сложность этого алгоритма? Назовите наилучший и наихудший случаи. Какова сложность в наихудшем случае?&lt;br /&gt;
# Напишите функцию GetRoot, которой на вход подаётся указатель на произвольный узел дерева, а она возвращает указатель на корень.&lt;br /&gt;
# Напишите процедуру PrintLeafs, которой на вход подаётся указатель на корень дерева, и она печатает листья дерева&lt;br /&gt;
## по возрастанию,&lt;br /&gt;
## по убыванию.&lt;br /&gt;
# ** Альтернативный обход в порядке возрастания бинарного дерева поиска с n узлами (или центрированный (inordered) обход) можно осуществить путём поиска минимального элемента дерева с помощью функции Minimum с последующий n-1 вызовом функции Next. Каково время работы такого алгоритма?&lt;br /&gt;
# * Реализуйте на С++ структуру данных бинарное дерево поиска, [https://yadi.sk/i/gi2SEStreFfSb используя заготовку].&lt;br /&gt;
## Нарисуйте бинарное дерево поиска, которое строится в функции getTreeExample.&lt;br /&gt;
## Реализуйте следующие алгоритмы: &lt;br /&gt;
### поиск минимума, &lt;br /&gt;
### inordered обход (вывод значений узлов в отсортированном порядке),&lt;br /&gt;
### поиск следующего по возрастанию,&lt;br /&gt;
### вставка элемента в дерево,&lt;br /&gt;
### сортировка последовательности с использованием БДП (дан вектор чисел, необходимо вывести их по возрастанию),&lt;br /&gt;
### ** удаление.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Карацубы, Штрассена. Быстрая сортировка (29.01)==&lt;br /&gt;
# Алгоритм Карацубы.&lt;br /&gt;
# Алгоритм Штрассена. [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать Дасгупту и др., §2.5 Умножение матриц]&lt;br /&gt;
# Быстрая сортировка и доказательство того, что в среднем случае она работает за О(n * log n). [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 8 Быстрая сортировка, стр. 148]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 6 (до 18.02)===&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Пусть мы хотим найти двоичное представление десятичного числа 10&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;. Будем считать, что n --- степень двойки (n = 2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt;).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Pwr2Bin(n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть 1010&lt;br /&gt;
    z = ...&lt;br /&gt;
    вернуть Multiply(z, z)&amp;lt;/source&amp;gt;&lt;br /&gt;
Multiply --- функция, перемножающая два n-битовых двоичных числа x и y по алгоритму Карацубы за O(n&amp;lt;sup&amp;gt;log&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;3&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Пусть мы хотим перевести произвольное десятичное число x в записи которого n=2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; чисел в двоичную систему счисления.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Dec2Bin(x, n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть binary[x]&lt;br /&gt;
    разделить x на два десятичных числа xl и xr из n/2 цифр.&lt;br /&gt;
    вернуть ...&amp;lt;/source&amp;gt;&lt;br /&gt;
Здесь binary --- это массив, содержащий двоичное представление десятичных цифр.&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Докажите, что математическое ожидание времени работы алгоритма быстрой сортировки (усреднение по всем вариантам выбора опорного элемента) на любом входе размера n удовлетворяет соотношению: T(n) ≤ O(n) + 1/n * &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt; (T(i-1) + T(n-i)).&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Найдите решение соотношения из предыдущего пункта.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Динамическое программирование (ДП). Первые примеры (02.01)==&lt;br /&gt;
# Нахождение самой длинной возрастающей подпоследовательности.&lt;br /&gt;
# Нахождение редакционного расстояния (или редакционной стоимости, расстояния Левенштейна).&lt;br /&gt;
# Нахождение представителя большинства.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 7 (до 20.02)===&lt;br /&gt;
* В этом задании везде, где требуется реализовать алгоритм, необходимо привести код на любом языке программирования.&lt;br /&gt;
* Для получения максимальной оценки нужно решить все задачи без звёздочек. Одна решённая задача со звёздочкой заменяет одну задачу без звёздочки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения редакционного расстояния (алгоритм Вагнера — Фишера). Например, редакционное расстояние между словами &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равно 6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения длины наибольшей общей подстроки. Например, длина наибольшей общей подстроки &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равна 8 (&amp;quot;antholog&amp;quot;). Чем больше это значение, тем схожей строки.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Предположим теперь, что сравниваемые строки состоят из символов A, С, G и T; за удаление или вставку мы платим -5; за замену буквы x на y платим w[x, y], где x, y принадлежат множеству {A, С, G, T}, a w — это матрица весов:&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
!-!! A!! G!! C!! T&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! A&lt;br /&gt;
|10||-1||-3||-4&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
!G&lt;br /&gt;
||-1||7||-5||-3&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! C&lt;br /&gt;
||-3||-5||9||0&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! T&lt;br /&gt;
||-4||-3||0||8&lt;br /&gt;
|}&lt;br /&gt;
Тогда выравнивание:&lt;br /&gt;
 AGACTAGTTAC&lt;br /&gt;
 CGA‒‒‒GACGT&lt;br /&gt;
будет иметь следующую оценку:&lt;br /&gt;
 w[A,C] + w[G,G] + w[A,A] + 3*(-5) + w[G,G] + w[T,A] + w[T,C] + w[A,G] + w[C,T] = -3 + 7 + 10 - 3*5 + 7 + (-4) + 0 + (-1) + 0 = 1.&lt;br /&gt;
&lt;br /&gt;
Напишите алгоритм, который находит максимальную стоимость всех возможных выравниваний. Верно ли, что чем больше это значение, тем непохожей строки?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как давно один народ отделился от другого? Кто похожей — итальянец и китаец или якут и эфиоп? На эти вопросы можно отвечать с разных точек зрения — культурной, исторической, лингвистической, ... В последние же годы человечество научилось секвенировать геном, что позволило исследовать этот вопрос с точки зрения генетики. Секвенирование генома — это процесс записи ДНК в виде нуклеотидной последовательности, которая представляет собой последовательность из четырёх символов — A, С, G и T. Существуют базы, которые хранят генетическую информацию о людях из разных стран и континентов, например, [http://www.mtdb.igp.uu.se/ http://www.mtdb.igp.uu.se/ → Download mtDNA sequences]. Чем больше сходство между геномами, тем сильнее родственные связи между их обладателями. Используя решение предыдущего пункта, выполните задания:&lt;br /&gt;
# Определите, кто похожей — итальянец и китаец или якут и эфиоп?&lt;br /&gt;
# Найдите нескольких похожих и нескольких непохожих народностей.&lt;br /&gt;
# * Выберите одну народность. Найдите самых похожих и самых непохожих на неё.&lt;br /&gt;
# * Найдите самые похожие и самые непохожие народности.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Задача о разрезании стержня (05.01)==&lt;br /&gt;
# Постановка задачи.&lt;br /&gt;
# Решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Решение с нахождением максимума по p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Восходящий алгоритм с запоминанием. Вывод длин кусочков стержня. Оценка сложности.&lt;br /&gt;
# Нисходящий алгоритм с запоминанием. Оценка сложности.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.1 Разрезание стержня, стр. 393]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 8 (до 22.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Решая задачу о разрезании стержня мы вначале построили рекурсивное решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt; для всех 1 ≤ i &amp;lt; n. Его сложность описывалась рекуррентной формулой T(n) = n + &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n-1&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt;(T(i) + T(n-i)), T(1) = 1.&lt;br /&gt;
# Объясните эту формулу.&lt;br /&gt;
# Покажите с помощью метода подстановок, что T(n) ≤ 2&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Покажите с помощью контрпримера, что описанная далее жадная стратегия не всегда определяет оптимальный способ разрезания стержня. Определим плотность стержня длиной i как p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;/i, то есть как стоимость единицы его длины. Жадная стратегия для стержня длиной n отрезает от стержня первую часть длиной i, где 1 ≤ i ≤ n, имеющую максимальную плотность. Затем та же жадная стратегия применяется к оставшейся части длиной n-i.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Рассмотрим модификацию задачи разрезания стержня, в которой в дополнение к цене p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; каждого стержня добавляется фиксированная цена разреза c. Теперь прибыль, связанная с решением, представляет собой сумму цен частей стержня минус стоимость разрезов. Разработайте алгоритм динамического программирования для этой модифицированной задачи.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Непрерывным участком называется группа подряд идущих элементов. Например, для последовательности&lt;br /&gt;
 5, 15, −30, 10, −5, 40, 10&lt;br /&gt;
элементы 15, −30, 10 образуют непрерывный участок, а 5, 15, 40 -- нет. Постройте линейный алгоритм для следующей задачи:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Вход: список чисел a1, a2, ... ‌, an.&lt;br /&gt;
Выход: непрерывный участок с максимальной суммой (сумма участка нулевой длины равна нулю).&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Для приведённого примера ответом будет 10, −5, 40, 10 с суммой 55. Какова сложность алгоритма? Почему?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Надо заплатить v рублей, имея купюры в x1, x2, ‌..., xn рублей (купюр каждого типа сколько угодно). Это не всегда возможно (скажем, купюрами в&lt;br /&gt;
10 и 25 рублей можно заплатить 45 рублей, но не 47 и не 15). Постройте основанный на методе динамического программирования алгоритм со временем работы O(nv), выясняющий, возможна ли уплата.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как решить предыдущую задачу, если каждая купюра имеется в единственном экземпляре? (Например, купюрами в 1, 5, 10, 20 рублей можно заплатить 16 = 1 + 5 + 10 и 31 = 1 + 10 + 20 рублей, но не 40 (не хватит денег). Время работы алгоритма по-прежнему O(nv).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Ещё один вариант той же задачи: купюр каждого типа сколько угодно, но всего разрешается использовать не более k купюр. (Например, если есть купюры в 5 и 10 рублей, а k = 6, то 55 разменять можно, а 65 –– нет).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Перемножение цепочки матриц. Оптимальное бинарное дерево поиска (начало) (09.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о перемножении цепочки матриц. Постановка задачи.Пример. Нисходящий алгоритм.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.2 Перемножение цепочки матриц, стр. 403]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 9 (до 24.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Найдите оптимальную расстановку скобок в произведении последовательности матриц, размерности которых равны 5×10, 10×3, 3×12, 12×5, 5×50, 50×6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Напишите восходящий алгоритм для поиска оптимальной расстановки скобок.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Расстановка пробелов. Оптимальное бинарное дерево поиска (середина) (12.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о расстановке пробелов. Постановка задачи. Решения для трёх случаев: 1. нужно вернуть можно ли разбить текст на слова; 2. вернуть разбивку на слова; 3. слова встречаются не равновероятно, вернуть наиболее вероятную разбивку на слова.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи. Вывод математического ожидания времени поиска.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Праздничное домашнее задание 10 (до 02.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[&amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;,&amp;quot;, &amp;quot;.&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;,&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;.&amp;quot;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Подсказка:&#039;&#039;&#039; разбейте текст на слова из списка и посмотрите на азбуку Морзе.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Способы представления графов в памяти (16.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Разбор ошибок в домашнем задании.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Графы. Способы представления графов в памяти (матрица смежности, список рёбер, список соседей (список смежностей), матрица инцидентности). Зависимость сложности алгоритмов от способа представления.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §22.1 Представление графов, стр. 626]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 11 (до 02.03)===&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача A.]&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача B.]&lt;br /&gt;
# Нарисуйте неориентированный граф с 5 вершинами и 8 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Нарисуйте ориентированный граф с 4 вершинами и 3 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Дан ориентированный граф. &#039;&#039;Исходящая степень вершины v&#039;&#039; --- это количество исходящих из неё рёбер, &#039;&#039;входящая степень v&#039;&#039; --- это количество рёбер входящих в  v. Имеется представление ориентированного графа с использование списка соседей. Как долго будут вычисляться исходящие степени всех вершин графа? А входящие степени?&lt;br /&gt;
# Дан граф G = (V, E). Какие из рассмотренных способов хранения графов используют меньше всего памяти для хранения G и почему? Указание: рассмотрите случаи |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;lt; |E| и |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;gt; |E|.&lt;br /&gt;
# Пусть C --- это матрица смежности графа G.&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
# Пусть B --- это матрица инцидентности ориентированного графа G. Как связаны элементы матрицы BB&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
&lt;br /&gt;
==Реализация поиска в глубину (19.02)==&lt;br /&gt;
# Реализация поиска в глубину и смежных задач.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 12 (до 5.03)===&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Выберите любой способ хранения графа. Реализуйте поиск в глубину.&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Напишите алгоритм, который возвращает данные о том, какие вершины лежат в одной компоненте связности.&lt;br /&gt;
# &#039;&#039;(любой ЯП или псевдокод)&#039;&#039; Напишите алгоритм проверки сильной связности ориентированного графа. Какова его сложность?&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №2==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
Необходимо реализовать 3 задачи из [https://official.contest.yandex.ru/contest/1085 контеста], см. [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing распределение задач]. Каждую задачу можно написать на С++ или Python. На выполнение работы отводится две недели (см. время окончания контеста). [https://official.contest.yandex.ru/contest/1123 Дорешивание.]&lt;br /&gt;
&lt;br /&gt;
==ДП и графы (26.02)==&lt;br /&gt;
==ДП и графы (02.03)==&lt;br /&gt;
==Жадные алгоритмы (12.03)==&lt;br /&gt;
===Домашнее задание 13 (до 23.03)===&lt;br /&gt;
# Вася хочет купить по одной акции каждой компании. Все акции стоят одинаково, но дорожают по-разному. Каждый месяц акция i-ой компании дорожает в r_i раз. В один месяц можно купить только одну акцию.&lt;br /&gt;
## Напишите алгоритм, который выводит оптимальную последовательность покупок (такую, что на покупку всех акций потратится меньше денег).&lt;br /&gt;
## Докажите корректность алгоритма, то есть докажите, что последовательность покупок, которую выводит ваш алгоритм, оптимальна.&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список, очередь (16.03)==&lt;br /&gt;
# Реализация линейного двусвязного списка (С++).&lt;br /&gt;
# Реализация очереди ограниченной длины на базе вектора (С++).&lt;br /&gt;
# Реализация очереди на базе списка (С++).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14 (до 23.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте (на С++) структуру данных Стек. У стека должно быть три операции:&lt;br /&gt;
* push --- положить элемент на вершину стека;&lt;br /&gt;
* pop --- удалить верхний элемент;&lt;br /&gt;
* front --- вернуть значение верхнего элемента.&lt;br /&gt;
Оцените время работы каждой функции.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список (19.03)==&lt;br /&gt;
===Домашнее задание 13* (до 30.03)===&lt;br /&gt;
#Для приведённой реализации класса List (https://yadi.sk/i/c5r_79WdfMyNS).&lt;br /&gt;
## Допишите print, push_back и push_front.&lt;br /&gt;
## В функции insert_after и delete_node вставьте необходимые проверки так, чтобы они работали для крайних случаев.&lt;br /&gt;
## Напишите main в котором&lt;br /&gt;
### создаётся объект класса List, &lt;br /&gt;
### заполняется элементами с помощью функций push_back, push_front и insert_after и&lt;br /&gt;
### удаляется i-ый элемент.&lt;br /&gt;
&lt;br /&gt;
==Повторение (30.03)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Для данных пар функций выясните их связь в терминах O-, o-, Ω-, ω-, Θ-обозначений. Поставьте галочку в клетке с Ω, если f(x) = Ω(g(x)) и прочерк, если равенства нет. [https://ru.wikipedia.org/wiki/«O»_большое_и_«o»_малое#.D0.94.D1.80.D1.83.D0.B3.D0.B8.D0.B5_.D0.BF.D0.BE.D0.B4.D0.BE.D0.B1.D0.BD.D1.8B.D0.B5_.D0.BE.D0.B1.D0.BE.D0.B7.D0.BD.D0.B0.D1.87.D0.B5.D0.BD.D0.B8.D1.8F Википедия]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! f(x)!! g(x)!! O!! o!! Ω!! ω!! Θ&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! 2^100&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n * log(n)&lt;br /&gt;
! 2^100 * n * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n&lt;br /&gt;
! 2^100 * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n!&lt;br /&gt;
! 2^(2015n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n*2^n&lt;br /&gt;
! 3^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 5^n&lt;br /&gt;
! 5^(n+1)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n + n^2 + n^3 + ... + n^1000&lt;br /&gt;
! 7^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм Quickselect нахождения k-ого элемента по возрастанию: http://en.wikipedia.org/wiki/Quickselect&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;На улице стоит ряд домов. В каждом из домов лежит сколько-то денег. Вор хочет обокрасть дома на переулке. Он не может обокрасть два соседних дома, потому что хозяин дома, который он обокрал, сразу предупредит соседей. Нужно найти, какую максимальную сумму вор может украсть с переулка. На вход программы подается массив неотрицательных целых чисел - количество долларов в доме с номером i. Соседние дома в массиве представлены соседними элементами. Например, пусть задан массив { 1, 4, 5 } - тогда вор максимум может украсть $6, обокрав дома 1 и 3. Пусть задан массив { 1, 7, 2 } - тогда вор максимум может украсть $7, обокрав дом 2.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Алфавит из всех маленьких латинских букв и пробела закодирован числами следующим способом:&lt;br /&gt;
  &#039;a&#039; -&amp;gt; 1&lt;br /&gt;
  &#039;b&#039; -&amp;gt; 2&lt;br /&gt;
  &#039;c&#039; -&amp;gt; 3&lt;br /&gt;
  ...&lt;br /&gt;
  &#039;z&#039; -&amp;gt; 26&lt;br /&gt;
  &#039; &#039; -&amp;gt; 27&lt;br /&gt;
На вход программы подается строка из цифр. Нужно посчитать, сколькими способами можно раскодировать эту строку.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Дан граф, заданный матрицей смежности. Вывести пары вершин между которыми нет пути.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Повторение (02.04) ==&lt;br /&gt;
Решали и разбирали первые 4 задачи из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14* (до 11.03)===&lt;br /&gt;
Решите любые две задачи (подпункты НЕ считаются отдельными задачами) с предыдущей пары (Повторение (30.03)).&lt;br /&gt;
&lt;br /&gt;
== Повторение (06.04) ==&lt;br /&gt;
Будем решать вторую половину задач из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 15 (до 16.04)===&lt;br /&gt;
# Приведите пример графа, который содержит отрицательные рёбра, не содержит циклов отрицательного веса и для которого алгоритм Дейкстры возвращает неверный результат.&lt;br /&gt;
# Используется ли в алгоритме Дейкстры то, что веса рёбер неотрицательны? Если &amp;quot;да&amp;quot;, то где именно?&lt;br /&gt;
# Пусть граф содержит рёбра с весами &amp;gt;= -100. Если прибавить к каждому ребру 101 и при помощи алгоритма Дейкстры найти кратчайшие пути. Будут ли эти пути кратчайшими в исходном графе? Почему?&lt;br /&gt;
&lt;br /&gt;
== Повторение (07.04) ==&lt;br /&gt;
&#039;&#039;&#039;Решение рекуррентных соотношений&#039;&#039;&#039;&lt;br /&gt;
# Решите уравнение: T(n) = 4*T(n/2) + O(n^2) с базой T(1) = O(1)&lt;br /&gt;
## Используя основную теорему.&lt;br /&gt;
## Используя дерево рекурсий.&lt;br /&gt;
## Методом подстановки.&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2)) + n является \Theta(n lg n).&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2) + 17) + n является \Theta(n lg n).&lt;br /&gt;
# Решите уравнения, считая, что T(1) = O(1):&lt;br /&gt;
## T(n) = T(n-1) + n&lt;br /&gt;
## T(n) = 2*T(floor(sqrt(n))) + lg n. Указание: попробуйте использовать замену переменных.&lt;br /&gt;
## T(n) = 3*T(sqrt(n)) + lg n&lt;br /&gt;
# Дайте верхнюю и нижнюю оценки функции T(n). Постарайтесь, чтобы оценки были как можно более точные&lt;br /&gt;
## T(n) = 4T(n/3) + n*lg(n)&lt;br /&gt;
## T(n) = 3T(n/3) + n/lg(n)&lt;br /&gt;
## T(n) = 4T(n/2) + n^2*sqrt(n)&lt;br /&gt;
## T(n) = T(n/2) + T(n/4) + T(n/8) + n&lt;br /&gt;
## T(n) = T(n-1) + 1/n&lt;br /&gt;
## T(n) = T(n-2) + 1/lg(n)&lt;br /&gt;
## T(n) = sqrt(n) * T(sqrt(n)) + n&lt;br /&gt;
&#039;&#039;&#039;Анализ и построение алгоритмов&#039;&#039;&#039;&lt;br /&gt;
# Числа Фибоначчи F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; можно выразить через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, используя матрицу: https://yadi.sk/i/Pm_aNzHCforFU. &lt;br /&gt;
## Покажите как вычислить F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;.&lt;br /&gt;
## Как вычислить F&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;n+1&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;?&lt;br /&gt;
## Напишите алгоритм.&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
## Ускорьте его так, чтобы он работал за O(log n).&lt;br /&gt;
# Дана последовательность символов. Какое минимальное количество символов нужно удалить из неё, чтобы получить палиндром?&lt;br /&gt;
## Напишите алгоритм (на псевдокоде или на любом языке программирования).&lt;br /&gt;
## Оцените время работы алгоритма.&lt;br /&gt;
# Какую структуру данных вы бы использовали для реализации упорядоченного множества (http://neerc.ifmo.ru/wiki/index.php?title=Упорядоченное_множество)? Какая будет сложность каждой из операций над множеством?&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 16 (до 20.04)===&lt;br /&gt;
# Решите 6 задач из первой части и 6 из второй. (Укажите какие именно.) Каждый из подпунктов является отдельной задачей.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм и теорема Форда-Фалкерсона (16.04)==&lt;br /&gt;
# Базовые определения (пропускные способности, сток, исток и пр.). Пример. &lt;br /&gt;
# Ограничения на поток (сохранение и что меньше пропускных способностей).&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, пример работы&lt;br /&gt;
# Разрез, определение, пример.&lt;br /&gt;
# Утверждение: максимальный поток &amp;lt;= любого разреза.&lt;br /&gt;
# Теорема Форда-Фалкерсона (с доказательством).&lt;br /&gt;
# Пример на котором алгоритм Форда-Фалкерсонаработает работает очень долго при неудачном выборе путей.&lt;br /&gt;
# Сложность алгоритма Форда-Фалкерсона.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №3==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
В [https://official.contest.yandex.ru/contest/1196 домашнем задании] пять задач. Они разделены на два варианта, помеченные римскими цифрами I и II. Свой вариант нужно узнать [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing здесь на вкладке HW3]. Третья задача — общая для двух вариантов; ее решение необходимо снабдить доказательством корректности алгоритма. На выполнение задания дается примерно 2 недели (см. точное время окончания в контесте). Каждую задачу можно написать на С++ или Python.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Форда-Фалкерсона и Эдмондса-Карпа (20.04)==&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, напоминание: базовые определения, пример работы, пример на котором алгоритм работает долго, сложность.&lt;br /&gt;
# Алгоритм Эдмодса-Карпа. Доказательство асимптотики времени работы.&lt;br /&gt;
&lt;br /&gt;
==(23.04)==&lt;br /&gt;
&lt;br /&gt;
==(11.05) Красно-чёрные деревья==&lt;br /&gt;
[https://ru.wikipedia.org/wiki/Красно-чёрное_дерево Красно-чёрное дерево]&lt;br /&gt;
===Домашнее задание 17 (до 18.05)===&lt;br /&gt;
# Зачем нужны красно-чёрные деревья?&lt;br /&gt;
# Благодаря какому свойству и почему красно-чёрное дерево является сбалансированным?&lt;br /&gt;
# Нарисуйте полное бинарное дерево поиска высотой 3 с ключами {1, 2, ..., 15}. Сделайте из него красно-чёрные деревья высотой 2, 3 и 4.&lt;br /&gt;
# Нарисуйте красно-чёрные деревья, получающиеся последовательной вставкой элементов 12, 10, 29, 30, 31, 32 в [https://ru.wikipedia.org/wiki/Красно-чёрное_дерево#/media/File:Red-black_tree_example.svg данное дерево]. Для вставки используйте алгоритм вставки из Википедии. Укажите какой именно функцией вы воспользовались.&lt;br /&gt;
# Определим &#039;&#039;&#039;ослабленное красно-чёрное дерево&#039;&#039;&#039; как бинарное дерево поиска, которое удовлетворяет красно-чёрным свойствам 1, 3, 4 и 5. Другими словами, корень может быть как чёрным, так и красным. Рассмотрите ослабленное красно-чёрное дерево T, корень которого красный. Если перекрасить корень дерева T в чёрный, будет ли оно красно-чёрным деревом?&lt;br /&gt;
# Покажите, что самый длинный простой нисходящий путь от вершины x к листу красно-черного дерева имеет длину, не более чем в два раза превышающую кратчайший путь от x к листу-потомку.&lt;br /&gt;
# Чему равно наибольшее возможное количество внутренних узлов в красно-чёрном дереве с чёрной высоты k? А наименьшее возможное количество?&lt;br /&gt;
# Нарисуйте красно-чёрные деревья, получающиеся последовательной вставкой ключей 41, 38, 31, 12, 19, 8 в изначально пустое дерево.&lt;br /&gt;
# Покажите какие деревья будут получаться в результате последовательного удаления ключей в порядке 8, 12, 19, 31, 38, 41.&lt;br /&gt;
&lt;br /&gt;
==(14.05) Конкурентный анализ самоорганизующихся циклов==&lt;br /&gt;
[https://vk.com/doc12518218_390369758 Лекция]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 18 (до 21.05)===&lt;br /&gt;
Все вычисления сопроводите подробными объяснениями о том, почему верно то или иное (не)равенство.&lt;br /&gt;
# Пусть имеется n-элементный список и m поисковых запросов к нему. После каждой операции поиска можно переупорядочить список. Обозначим стоимость последовательности поисков через C. Докажите, что в худшем случае C = Ω(mn).&lt;br /&gt;
#  Обозначим через c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; стоимость i-ого поискового запроса с применением эвристики перемещения в начало, которая включает стоимость поиска элемента в списке и стоимость его перемещения в начало списка путём ряда обменов соседних элементов списка. Покажите, что i-ая операция поиска находит элемент x в списке L с применением эвристики перемещения в начало, то c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = 2 * rank&amp;lt;sub&amp;gt;L&amp;lt;/sub&amp;gt;(x) - 1.&lt;br /&gt;
# Покажите, что c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = 2 * rank&amp;lt;sub&amp;gt;L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) - 1.&lt;br /&gt;
# Покажите, что c*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = rank&amp;lt;sub&amp;gt;L*&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) + t&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;.&lt;br /&gt;
# Докажите, что после одного обмена двух соседних элементов потенциал либо увеличивается на 2, либо уменьшается на 2.&lt;br /&gt;
# Докажите, что rank&amp;lt;sub&amp;gt;L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) = |A| + |B| + 1.&lt;br /&gt;
# Докажите, что rank&amp;lt;sub&amp;gt;L*&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) = |A| + |С| + 1.&lt;br /&gt;
# Покажите, что поиск i-ого элемента приводит к изменению потенциала Ф(L&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;) - Ф(L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;) &amp;lt;= 2 (|A| - |B| + t*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;), где t*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; --- это количество обменов при i-ом поиске.&lt;br /&gt;
# Во сколько раз стоимость С&amp;lt;sub&amp;gt;MFT&amp;lt;/sub&amp;gt;(S) превышает C&amp;lt;sub&amp;gt;OPT&amp;lt;/sub&amp;gt;(S)?&lt;br /&gt;
&lt;br /&gt;
== (18.05) Конечные автоматы ==&lt;br /&gt;
=== Задание 19 (до 25.05) ===&lt;br /&gt;
# Постройте автомат для языка над алфавитом Σ = {0, 1} каждое слово которого содержит хотя бы два нуля. Является ли он детерминированным?&lt;br /&gt;
# Постройте автомат над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5. Является ли он детерминированным?&lt;br /&gt;
# Постройте автомат, который допускает пустой язык (язык в котором нет ни одного слова).&lt;br /&gt;
# Постройте автомат, который допускает все слова над алфавитом Σ.&lt;br /&gt;
# Постройте ДКА над алфавитом Σ = {К, Ж, З}, который допускает слова в которых после К идёт З, после З --- Ж, после Ж --- К.&lt;br /&gt;
# * Постройте ДКА над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5, а число нулей на 3.&lt;br /&gt;
# Постройте НКА для языка над алфавитом Σ = {0, 1, 2, 3}, состоящий из слов, в которых хотя бы одна из последних пяти букв является 1.&lt;br /&gt;
# Постройте НКА над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5, а число нулей на 3.&lt;br /&gt;
# Какие языки допускают автоматы https://yadi.sk/d/fNAHbjCZghERG?&lt;br /&gt;
# Для каждого из автоматов https://yadi.sk/d/fNAHbjCZghERG постройте соответствующий ему ДКА.&lt;br /&gt;
&lt;br /&gt;
== (21.05) Регулярные выражения, КА, их эквивалентность. Лемма о накачке  ==&lt;br /&gt;
=== Задание 20 (до 28.05) ===&lt;br /&gt;
&#039;&#039;&#039;I Написать регулярные выражения&#039;&#039;&#039;&lt;br /&gt;
# Напишите регулярное выражение для языка над алфавитом Σ = {0, 1} каждое слово которого содержит хотя бы два нуля.&lt;br /&gt;
# Напишите регулярное выражение над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5.&lt;br /&gt;
# Напишите регулярное выражение, которое допускает пустой язык (язык в котором нет ни одного слова).&lt;br /&gt;
# Напишите регулярное выражение, которое допускает все слова над алфавитом Σ.&lt;br /&gt;
# Напишите регулярное выражение для языка над алфавитом Σ = {0, 1, 2, 3}, состоящий из слов, в которых хотя бы одна из последних пяти букв является 1.&lt;br /&gt;
&#039;&#039;&#039;II КА и регулярные выражения&#039;&#039;&#039;&lt;br /&gt;
# Постройте конечный автомат для языка (111 + 01)&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;1(00 + 11)&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;.&lt;br /&gt;
# Постройте конечный автомат для языка (ab)&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;(a + b)(b + a)&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;(a + bab).&lt;br /&gt;
&#039;&#039;&#039;III Доказать замкнутость относительно различных операций&#039;&#039;&#039;&lt;br /&gt;
# Покажите, что если для языков L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; и L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; существует КА, который их читает, то существует КА и для их объединения L = {w | w ∈ L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; или w ∈ L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;}.&lt;br /&gt;
# Покажите, что если для языка L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; и L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; существует КА, который их читает, то существует КА и для языка L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; = {xy | x ∈ L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, y ∈ L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;}.&lt;br /&gt;
# Покажите, что если для языка L существует КА, который его читает, то существует КА и для &#039;&#039;&#039;замыкания Клини&#039;&#039;&#039; L* = {w&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; w&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; ... w&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;| w&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; ∈ L, w&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; ∈ L, ..., w&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; ∈ L}.&lt;br /&gt;
# Покажите, что если язык L регулярен, то регулярно его дополнение (т.е. язык над тем же алфавитом, которому принадлежит слово тогда и только тогда, когда оно НЕ принадлежит L) .&lt;br /&gt;
# Покажите, что если язык L регулярен, то регулярно его обращение L&amp;lt;sub&amp;gt;R&amp;lt;/sub&amp;gt; = {a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; . . . a&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; | a&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; . . . a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; ∈ L}. (L&amp;lt;sub&amp;gt;R&amp;lt;/sub&amp;gt; --- это язык в котором все слова языка L записаны наоборот.)&lt;br /&gt;
# * Покажите, что если языки L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; и L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; регулярны, то регулярно их пересечение.&lt;br /&gt;
&#039;&#039;&#039;IV Использование леммы о накачке&#039;&#039;&#039; (см. [https://vk.com/doc12518218_392750846 конспект])&lt;br /&gt;
# Докажите, что не существует КА, который бы читал язык {0&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;1&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;2&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;}. (Пояснение: запись 0&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; означает строку из n нулей: 00...0.)&lt;br /&gt;
# Докажите, что не существует КА, который бы читал язык {0&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;1&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;}.&lt;br /&gt;
# Докажите, что не существует КА, который бы читал язык {0&amp;lt;sup&amp;gt;n!&amp;lt;/sup&amp;gt;}.&lt;/div&gt;</summary>
		<author><name>Kassalanche</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=13894</id>
		<title>Алгоритмы и структуры данных. Подгруппа 105-1</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=13894"/>
		<updated>2015-05-21T04:54:49Z</updated>

		<summary type="html">&lt;p&gt;Kassalanche: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==О курсе==&lt;br /&gt;
[[Алгоритмы_и_структуры_данных|План лекций и список рекомендуемой литературы.]]&lt;br /&gt;
&lt;br /&gt;
[[Алгоритмы_и_структуры_данных._Подгруппа_105-1._FAQ|FAQ.]]&lt;br /&gt;
&lt;br /&gt;
[[Reviewboard|Инструкция по использованию Reviewboard.]]&lt;br /&gt;
&lt;br /&gt;
[[Практические_занятия_по_курсу_ОиМП/C++_check|Style guide.]]&lt;br /&gt;
&lt;br /&gt;
==Итоговая оценка за курс==&lt;br /&gt;
Итоговая оценка (ИО) зависит от&lt;br /&gt;
* оценок за пять больших домашних заданий (БДЗ1, БДЗ2, ..., БДЗ5),&lt;br /&gt;
* оценок за домашние задания (ДЗ1, ДЗ2, ...),&lt;br /&gt;
* оценки за контрольную работу (КР),&lt;br /&gt;
* оценки за экзамен (ЭКЗ),&lt;br /&gt;
и может быть вычислена по формуле:&lt;br /&gt;
 ИО = 0.7 * (0.3 * КР + 0.7 *(ИДЗ1 + ИДЗ2 + ИДЗ3 + ИДЗ4 + ИДЗ5)/5) + 0.3 * ЭКЗ =&lt;br /&gt;
    = 0.21*КР + 0.98*ИДЗ1 + 0.98*ИДЗ2 + 0.98*ИДЗ3 + 0.98*ИДЗ4 + 0.98*ИДЗ5 + 0.3*ЭКЗ,&lt;br /&gt;
где&lt;br /&gt;
 ИДЗi = min (10, 0.7 * БДЗi + 0.4 * &amp;lt;cредняя оценка за ДЗj, прошедшие с предыдущего БДЗ по i-ое&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
==Порядок сдачи домашних работ==&lt;br /&gt;
===Большие домашние работы===&lt;br /&gt;
# Получить OK за задачу в контесте.&lt;br /&gt;
# Залить исходный код на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* На каждую задачу создавайте отдельный запрос на ревью. &lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении суток приходят замечания к коду. &#039;&#039;&#039;Если в течении суток замечаний или Ship It не появилось, проверьте, что вы правильно отправили запрос и, если всё сделано правильно, спросите у семинариста получил ли он запрос.&#039;&#039;&#039;&lt;br /&gt;
# Вы их исправляете, проверяете в контесте, что программа по-прежнему проходит все тесты, заливаете новую версию в Review Board. Штрафов за посылки НЕ будет.&lt;br /&gt;
# Процесс повторяется пока остаются замечания к коду или пока не истёк дедлайн. После закрытия контеста будут ещё одни сутки на доработку замечаний в Review Board.&lt;br /&gt;
# Оценивается только последняя версия работы в Review Board.&lt;br /&gt;
&lt;br /&gt;
===Маленькие домашние работы===&lt;br /&gt;
# Залить решение на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* Желаемые форматы: txt, py, cpp, h. Допускаются любые другие.&lt;br /&gt;
#* На каждую домашнюю работу создавайте отдельный запрос на ревью. Обязательно указывайте номер домашней работы.&lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении неопределенного промежутка времени придут оценки по каждому из заданий.&lt;br /&gt;
&lt;br /&gt;
==Оценивание домашних работ==&lt;br /&gt;
* Все задания предполагаются индивидуальными. Запрещены любые заимствования без ссылки на автора.&lt;br /&gt;
* Решения после установленного дедлайна не принимаются. Дедлайн указан в заголовке каждого задания.&lt;br /&gt;
* Везде, где требуется написать алгоритм, можно использовать любой язык программирования или псевдокод.&lt;br /&gt;
* Там, где требуется построить алгоритм с заданной асимптотикой, приведите обоснование, что полученный алгоритм удовлетворяет этому условию.&lt;br /&gt;
* Эти правила не действуют, если в задании явно оговорено иное.&lt;br /&gt;
&lt;br /&gt;
==Мотивация к изучению алгоритмов. Подсчёт числа операций (12.01)==&lt;br /&gt;
# Числа Фибоначчи. Определение. Примитивный рекурсивный алгоритм вычисления i-ого числа. Оценка числа операций. Анализ причин неэффективности. Алгоритм с запоминанием вычисленных ранее значений. Оценка числа операций. Сравнение с предыдущим. (подробнее: глава 0, страницы 8-10 из книги &amp;lt;&amp;lt;Алгоритмы&amp;gt;&amp;gt;, [[Алгоритмы_и_структуры_данных|см. список рекомендованной литературы]])&lt;br /&gt;
# Задача о ханойской башне. Постановка задачи. Рекурсивный алгоритм. Рекуррентная формула для числа перемещений. Замкнутая формула для числа перемещений (+ доказательство). Доказательство того, что эту задачу нельзя решить используя меньшее число перемещений дисков. ([https://www.dropbox.com/s/t8cbs7ttu4iasvj/algo-0-recursion.pdf?dl=0 Разбор задачи о ханойской башне], автор Сергей Объедков)&lt;br /&gt;
# Сортировка пузырьком. Алгоритм. Подсчёт количество операций сравнения и обмена (swap). Анализ наилучшего и наихудшего случаев ([https://ru.wikipedia.org/wiki/Сортировка_пузырьком Википедия])&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 1 (12.01 - 26.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
Во всех задачах, если не оговорено иного, предполагаем, что работаем с целыми неотрицательными числами. Для первых 7 задач необходимо&lt;br /&gt;
* описать что можно считать наилучшим и наихудшим случаями,&lt;br /&gt;
* для каждого из двух случаев подсчитать отдельно количество операций сравнения и swap (если есть).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Даны три числа, требуется вернуть наименьшее.&lt;br /&gt;
# Даны три числа, требуется отсортировать их.&lt;br /&gt;
# Дана последовательность A из n элементов и число x, требуется найти элемент равный x. Примечание: если таких значений i несколько, вернуть любое; если такого элемента нет, функция должна сообщить об этом.&lt;br /&gt;
# * Дана упорядоченная последовательность A из n элементов и число x, требуется найти такое i, что A[i] равно x. Алгоритм должен быть эффективней, чем в предыдущем пункте и использовать то, что последовательность упорядочена.&lt;br /&gt;
# Дана последовательность из 100 000 чисел от 0 до 100. Напишите эффективный алгоритм сортировки, который бы учитывал специфику входных данных.&lt;br /&gt;
# * Дано 32 битное неотрицательное число. Требуется номер первого ненулевого бит. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения, считая, что числа распределены равномерно.&lt;br /&gt;
# * Даны 32 битные неотрицательные числа m и n. Требуется вывести True, если m &amp;lt; n, иначе False. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения битов, считая, что числа распределены равномерно.&lt;br /&gt;
# Напишите рекурсивную функцию, вычисляющую n-ое число Фибоначчи (как на занятии). Подсчитайте количество рекурсивных вызовов.&lt;br /&gt;
# * Напишите функцию, вычисляющую n-ое число Фибоначчи, у которой число операций — полином от n, и которая использует количество памяти, независящее от n.&lt;br /&gt;
&lt;br /&gt;
==O-символика и стратегия &amp;quot;разделяй и властвуй&amp;quot; (15.01)==&lt;br /&gt;
# Сортировка слиянием. Алгоритм, рекуррентное соотношение для времени сортировки, сложность. Подробнее: [https://dl.dropboxusercontent.com/u/829163/draft.pdf §2.3 Сортировка слиянием (стр. 54)].&lt;br /&gt;
# О-символика. [https://dl.dropboxusercontent.com/u/829163/draft.pdf §0.3 О-символика (стр. 10)].&lt;br /&gt;
# Задача о слиянии m упорядоченных массивов по n элементов. Три алгоритма решения: последовательное слияние, слияние &amp;quot;деревом&amp;quot; (обе функции используют Merge из MergeSort), аналог Merge для m массивов. Анализ сложности каждого из них.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 2 (15.01-29.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
* Во всех задачах, если не оговорено иного, для простоты &#039;&#039;можно&#039;&#039; считать, что n является степенью какого-либо числа, например, степенью двойки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Дана функция F, определённая ниже. Сколько строк она напечатает? Указание: для обоих подпунктов рассмотрите два случая: 1. n является степенью двойки, 2. n не является степенью двойки.&lt;br /&gt;
## Запишите рекуррентное соотношение для числа строк.&lt;br /&gt;
## Решите уравнение, полученное в предыдущем пункте, то есть, выведите замкнутую (нерекуррентную формулу). Для простоты можно считать, что n является степенью двойки.&lt;br /&gt;
# В массиве A размера n записана возрастающая последовательность целых чисел. Постройте алгоритм типа &amp;quot;разделяй и властвуй&amp;quot;, который проверяет, существует ли такой индекс i, что A[i] = i&lt;br /&gt;
## за время O(n),&lt;br /&gt;
## * за время O(log n).&lt;br /&gt;
## Какие случаи для вашего алгоритма являются наихудшими и наилучшими? Какого время работы в лучшем и худшем случаях?&lt;br /&gt;
# Дан бесконечный массив A, первые n элементов которого содержат возрастающую последовательность положительных чисел, а дальше стоят -1. Значение n не дано. Постройте алгоритм, который получает на вход целое число x и находит это x в массиве --- или говорит, что там его нет, &lt;br /&gt;
## за время O(n),&lt;br /&gt;
## за время O(log n).&lt;br /&gt;
# Рассмотрим алгоритм вычисления наибольшего общего делителя (НОД) двух положительных чисел, основанный на методе &amp;quot;разделяй и властвуй&amp;quot;.&lt;br /&gt;
## (задание не оценивается) Прочитайте [https://dl.dropboxusercontent.com/u/829163/draft.pdf §1.2.3 Алгоритм Евклида (стр. 23)].&lt;br /&gt;
## * Докажите, что определение НОД-а, приведённое ниже, корректно.&lt;br /&gt;
## Постройте алгоритм, основанный на этом определении.&lt;br /&gt;
## Какой алгоритм будет быстрее для n-битовых чисел a и b при больших значениях n --- ваш или алгоритм Евклида?&lt;br /&gt;
# * Покажите как за время O(n log n) удалить из массива размера n все дубликаты, то есть оставить каждый элемент в одном экземпляре.&lt;br /&gt;
# * Даны два упорядоченных массива размера m и n. Постройте алгоритм, находящий k-й по величине элемент в объединении этих массивов за время O(log(n+m)). &lt;br /&gt;
&lt;br /&gt;
Функция F(n).&lt;br /&gt;
  если n &amp;gt; 1:&lt;br /&gt;
    напечатать &amp;quot;всё ещё работаю&amp;quot;&lt;br /&gt;
    F(n/2)&lt;br /&gt;
    F(n/2)&lt;br /&gt;
&lt;br /&gt;
Определение НОД-а.&lt;br /&gt;
             2НОД(a/2, b/2), если а и b чётны,&lt;br /&gt;
  НОД(a,b) = НОД(a, b/2), если а нечётно, b чётно,&lt;br /&gt;
             НОД((a-b)/2, b), если а и b нечётны.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;lt;nowiki&amp;gt;Задачи взяты из книги &amp;quot;Алгоритмы&amp;quot;, глава 2 (см. список рекомендованной литературы).&amp;lt;/nowiki&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Сложение и умножение (19.01)==&lt;br /&gt;
# Алгоритм сложения, его сложность (§1.1.1 Сложение*)&lt;br /&gt;
# &amp;quot;Школьный&amp;quot; алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Рекурсивный алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Алгоритм умножения, реализующий стратегию &amp;quot;разделяй и властвуй&amp;quot;, анализ сложности (§2.1 Умножение чисел*)&lt;br /&gt;
 * [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать.]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 3 (19.01 - 2.02)===&lt;br /&gt;
* Во всех задачах для простоты можно считать, что n является степенью какого-либо числа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Найдите произведение чисел 10011011 и 10111010 (в двоичной системе счисления), используя алгоритм умножения чисел, основанный на методе «разделяй и властвуй». Необходимо не только дать ответ, но и привести ход решения.&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 3 рекурсивных вызова для подзадач размера n-1 и комбинирует из них решение исходной задачи за О(n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте три верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 10 рекурсивных вызовов для подзадач размера n/2 и комбинирует из них решение исходной задачи за О(5n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте два верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Докажите, что 3m² + m = O(m²).&lt;br /&gt;
# Докажите, что lg m = O(m/1000), где lg m — это логарифм с двоичным основанием.&lt;br /&gt;
# Докажите, что из равенства f(n) = O(g(n)) не следует, что g(n) = O(f(n)).&lt;br /&gt;
# Докажите, что O(m) содержится в O(m²).&lt;br /&gt;
&lt;br /&gt;
==Решение рекуррентных уравнений (22.01)==&lt;br /&gt;
# Примеры решений рекуррентных уравнений (см. [https://www.dropbox.com/s/6a0r410zjm9qwe7/algo-3-recurrences.pdf?dl=0 конспект]).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 4 (до 14.02)===&lt;br /&gt;
* Нельзя использовать утверждение основной теоремы о решении рекуррентных соотношений.&lt;br /&gt;
* &#039;&#039;Можно&#039;&#039; использовать метод построения дерева рекурсии или подстановку (метод с угадыванием ответа).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Какой из трёх приведённых ниже алгоритмов вы бы предпочли? Обоснуйте свой ответ.&lt;br /&gt;
#* Алгоритм A, решая задачу, производит пять рекурсивных вызовов для подзадач вдвое меньшего размера, после чего строит ответ для исходной задачи за линейное время.&lt;br /&gt;
#* Алгоритм B, решая задачу размера n, делает два рекурсивных вызова для задач размера n − 1, после чего находит ответ за время O(1).&lt;br /&gt;
#* Алгоритм C, решая задачу размера n, рекурсивно решает девять задач размера n/3 и строит ответ за время O(n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Найдите T(n) в замкнутой форме для любых 7 из 10 приведённых ниже рекуррентных соотношений:&lt;br /&gt;
## T(n) ≤ 2T(n/3) + 1;&lt;br /&gt;
## T(n) ≤ 7T(n/7) + n;&lt;br /&gt;
## T(n) ≤ 9T(n/3) + n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 8T(n/2) + n&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 49T(n/25) + n&amp;lt;sup&amp;gt;3/2&amp;lt;/sup&amp;gt;log n;&lt;br /&gt;
## T(n) ≤ T(n − 1) + 2;&lt;br /&gt;
## T(n) ≤ T(n − 1) + n&amp;lt;sup&amp;gt;c&amp;lt;/sup&amp;gt;, где c ≥ 1 –– константа;&lt;br /&gt;
## T(n) ≤ T(n − 1) + c&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;, где c &amp;gt; 1 –– константа;&lt;br /&gt;
## T(n) ≤ 2T(n − 1) + 1;&lt;br /&gt;
## T(n) ≤ T(sqrt(n)) + 1.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №1==&lt;br /&gt;
Необходимо реализовать все 6 задач из [https://official.contest.yandex.ru/contest/1002 контеста]. Каждую задачу можно писать на С++ или Python. На выполнение работы отводится две недели. Каждая задача оценивается в 10/6 балла. Оценка &#039;&#039;может&#039;&#039; быть снижена за плохой код, но не более чем на 25%.&lt;br /&gt;
&lt;br /&gt;
==Бинарное дерево поиска (26.01)==&lt;br /&gt;
# Определение. Пример.&lt;br /&gt;
# Не модифицирующие алгоритмы: поиск (рекурсивный и итеративный алгоритмы), поиск минимума, inordered обход (вывод значений узлов в отсортированном порядке), поиск следующего по возрастанию.&lt;br /&gt;
# Модифицирующие алгоритмы: вставка (рекурсивная реализация), удаление (только идея).&lt;br /&gt;
 [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 13, стр. 248]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 5 (до 16.02)===&lt;br /&gt;
* Для получения максимальной оценки можно выполнить или все задачи без звёздочки, или задачу со звёздочкой. Преподаватель понимает, что реализацию БДП сложно не найти в интернете, но от копипасты не будет никакой пользы. Напротив, самостоятельная реализация очень полезна и приветствуется, даже если не получится выполнить всех пунктов задания.&lt;br /&gt;
* Задачи с двумя звёздочками необязательны.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Нарисуйте бинарные деревья поиска высотой 2, 3, 4, 5 и 6 для множества ключей {1, 4, 5, 10, 16, 17, 21}. Корень дерева имеет высоту 0.&lt;br /&gt;
# &#039;&#039;&#039;Сортировка с использованием БДП.&#039;&#039;&#039;&lt;br /&gt;
## Какова асимптотическая сложность алгоритма вставки элемента в дерево высоты d? Почему? Назовите наилучший и наиухдший случаи.&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который строит БДП в узлах которого стоят элементы данной последовательности. Можно использовать функцию Insert. Назовите наилучший и наихудший случаи. Есть теорема о том, что полученный алгоритм будет работать в среднем случае за время O(n * log n).&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который выводит их в порядке возрастания. Используйте бинарное дерево поиска. Какова в среднем случае сложность этого алгоритма? Назовите наилучший и наихудший случаи. Какова сложность в наихудшем случае?&lt;br /&gt;
# Напишите функцию GetRoot, которой на вход подаётся указатель на произвольный узел дерева, а она возвращает указатель на корень.&lt;br /&gt;
# Напишите процедуру PrintLeafs, которой на вход подаётся указатель на корень дерева, и она печатает листья дерева&lt;br /&gt;
## по возрастанию,&lt;br /&gt;
## по убыванию.&lt;br /&gt;
# ** Альтернативный обход в порядке возрастания бинарного дерева поиска с n узлами (или центрированный (inordered) обход) можно осуществить путём поиска минимального элемента дерева с помощью функции Minimum с последующий n-1 вызовом функции Next. Каково время работы такого алгоритма?&lt;br /&gt;
# * Реализуйте на С++ структуру данных бинарное дерево поиска, [https://yadi.sk/i/gi2SEStreFfSb используя заготовку].&lt;br /&gt;
## Нарисуйте бинарное дерево поиска, которое строится в функции getTreeExample.&lt;br /&gt;
## Реализуйте следующие алгоритмы: &lt;br /&gt;
### поиск минимума, &lt;br /&gt;
### inordered обход (вывод значений узлов в отсортированном порядке),&lt;br /&gt;
### поиск следующего по возрастанию,&lt;br /&gt;
### вставка элемента в дерево,&lt;br /&gt;
### сортировка последовательности с использованием БДП (дан вектор чисел, необходимо вывести их по возрастанию),&lt;br /&gt;
### ** удаление.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Карацубы, Штрассена. Быстрая сортировка (29.01)==&lt;br /&gt;
# Алгоритм Карацубы.&lt;br /&gt;
# Алгоритм Штрассена. [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать Дасгупту и др., §2.5 Умножение матриц]&lt;br /&gt;
# Быстрая сортировка и доказательство того, что в среднем случае она работает за О(n * log n). [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 8 Быстрая сортировка, стр. 148]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 6 (до 18.02)===&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Пусть мы хотим найти двоичное представление десятичного числа 10&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;. Будем считать, что n --- степень двойки (n = 2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt;).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Pwr2Bin(n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть 1010&lt;br /&gt;
    z = ...&lt;br /&gt;
    вернуть Multiply(z, z)&amp;lt;/source&amp;gt;&lt;br /&gt;
Multiply --- функция, перемножающая два n-битовых двоичных числа x и y по алгоритму Карацубы за O(n&amp;lt;sup&amp;gt;log&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;3&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Пусть мы хотим перевести произвольное десятичное число x в записи которого n=2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; чисел в двоичную систему счисления.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Dec2Bin(x, n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть binary[x]&lt;br /&gt;
    разделить x на два десятичных числа xl и xr из n/2 цифр.&lt;br /&gt;
    вернуть ...&amp;lt;/source&amp;gt;&lt;br /&gt;
Здесь binary --- это массив, содержащий двоичное представление десятичных цифр.&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Докажите, что математическое ожидание времени работы алгоритма быстрой сортировки (усреднение по всем вариантам выбора опорного элемента) на любом входе размера n удовлетворяет соотношению: T(n) ≤ O(n) + 1/n * &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt; (T(i-1) + T(n-i)).&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Найдите решение соотношения из предыдущего пункта.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Динамическое программирование (ДП). Первые примеры (02.01)==&lt;br /&gt;
# Нахождение самой длинной возрастающей подпоследовательности.&lt;br /&gt;
# Нахождение редакционного расстояния (или редакционной стоимости, расстояния Левенштейна).&lt;br /&gt;
# Нахождение представителя большинства.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 7 (до 20.02)===&lt;br /&gt;
* В этом задании везде, где требуется реализовать алгоритм, необходимо привести код на любом языке программирования.&lt;br /&gt;
* Для получения максимальной оценки нужно решить все задачи без звёздочек. Одна решённая задача со звёздочкой заменяет одну задачу без звёздочки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения редакционного расстояния (алгоритм Вагнера — Фишера). Например, редакционное расстояние между словами &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равно 6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения длины наибольшей общей подстроки. Например, длина наибольшей общей подстроки &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равна 8 (&amp;quot;antholog&amp;quot;). Чем больше это значение, тем схожей строки.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Предположим теперь, что сравниваемые строки состоят из символов A, С, G и T; за удаление или вставку мы платим -5; за замену буквы x на y платим w[x, y], где x, y принадлежат множеству {A, С, G, T}, a w — это матрица весов:&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
!-!! A!! G!! C!! T&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! A&lt;br /&gt;
|10||-1||-3||-4&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
!G&lt;br /&gt;
||-1||7||-5||-3&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! C&lt;br /&gt;
||-3||-5||9||0&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! T&lt;br /&gt;
||-4||-3||0||8&lt;br /&gt;
|}&lt;br /&gt;
Тогда выравнивание:&lt;br /&gt;
 AGACTAGTTAC&lt;br /&gt;
 CGA‒‒‒GACGT&lt;br /&gt;
будет иметь следующую оценку:&lt;br /&gt;
 w[A,C] + w[G,G] + w[A,A] + 3*(-5) + w[G,G] + w[T,A] + w[T,C] + w[A,G] + w[C,T] = -3 + 7 + 10 - 3*5 + 7 + (-4) + 0 + (-1) + 0 = 1.&lt;br /&gt;
&lt;br /&gt;
Напишите алгоритм, который находит максимальную стоимость всех возможных выравниваний. Верно ли, что чем больше это значение, тем непохожей строки?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как давно один народ отделился от другого? Кто похожей — итальянец и китаец или якут и эфиоп? На эти вопросы можно отвечать с разных точек зрения — культурной, исторической, лингвистической, ... В последние же годы человечество научилось секвенировать геном, что позволило исследовать этот вопрос с точки зрения генетики. Секвенирование генома — это процесс записи ДНК в виде нуклеотидной последовательности, которая представляет собой последовательность из четырёх символов — A, С, G и T. Существуют базы, которые хранят генетическую информацию о людях из разных стран и континентов, например, [http://www.mtdb.igp.uu.se/ http://www.mtdb.igp.uu.se/ → Download mtDNA sequences]. Чем больше сходство между геномами, тем сильнее родственные связи между их обладателями. Используя решение предыдущего пункта, выполните задания:&lt;br /&gt;
# Определите, кто похожей — итальянец и китаец или якут и эфиоп?&lt;br /&gt;
# Найдите нескольких похожих и нескольких непохожих народностей.&lt;br /&gt;
# * Выберите одну народность. Найдите самых похожих и самых непохожих на неё.&lt;br /&gt;
# * Найдите самые похожие и самые непохожие народности.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Задача о разрезании стержня (05.01)==&lt;br /&gt;
# Постановка задачи.&lt;br /&gt;
# Решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Решение с нахождением максимума по p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Восходящий алгоритм с запоминанием. Вывод длин кусочков стержня. Оценка сложности.&lt;br /&gt;
# Нисходящий алгоритм с запоминанием. Оценка сложности.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.1 Разрезание стержня, стр. 393]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 8 (до 22.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Решая задачу о разрезании стержня мы вначале построили рекурсивное решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt; для всех 1 ≤ i &amp;lt; n. Его сложность описывалась рекуррентной формулой T(n) = n + &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n-1&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt;(T(i) + T(n-i)), T(1) = 1.&lt;br /&gt;
# Объясните эту формулу.&lt;br /&gt;
# Покажите с помощью метода подстановок, что T(n) ≤ 2&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Покажите с помощью контрпримера, что описанная далее жадная стратегия не всегда определяет оптимальный способ разрезания стержня. Определим плотность стержня длиной i как p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;/i, то есть как стоимость единицы его длины. Жадная стратегия для стержня длиной n отрезает от стержня первую часть длиной i, где 1 ≤ i ≤ n, имеющую максимальную плотность. Затем та же жадная стратегия применяется к оставшейся части длиной n-i.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Рассмотрим модификацию задачи разрезания стержня, в которой в дополнение к цене p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; каждого стержня добавляется фиксированная цена разреза c. Теперь прибыль, связанная с решением, представляет собой сумму цен частей стержня минус стоимость разрезов. Разработайте алгоритм динамического программирования для этой модифицированной задачи.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Непрерывным участком называется группа подряд идущих элементов. Например, для последовательности&lt;br /&gt;
 5, 15, −30, 10, −5, 40, 10&lt;br /&gt;
элементы 15, −30, 10 образуют непрерывный участок, а 5, 15, 40 -- нет. Постройте линейный алгоритм для следующей задачи:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Вход: список чисел a1, a2, ... ‌, an.&lt;br /&gt;
Выход: непрерывный участок с максимальной суммой (сумма участка нулевой длины равна нулю).&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Для приведённого примера ответом будет 10, −5, 40, 10 с суммой 55. Какова сложность алгоритма? Почему?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Надо заплатить v рублей, имея купюры в x1, x2, ‌..., xn рублей (купюр каждого типа сколько угодно). Это не всегда возможно (скажем, купюрами в&lt;br /&gt;
10 и 25 рублей можно заплатить 45 рублей, но не 47 и не 15). Постройте основанный на методе динамического программирования алгоритм со временем работы O(nv), выясняющий, возможна ли уплата.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как решить предыдущую задачу, если каждая купюра имеется в единственном экземпляре? (Например, купюрами в 1, 5, 10, 20 рублей можно заплатить 16 = 1 + 5 + 10 и 31 = 1 + 10 + 20 рублей, но не 40 (не хватит денег). Время работы алгоритма по-прежнему O(nv).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Ещё один вариант той же задачи: купюр каждого типа сколько угодно, но всего разрешается использовать не более k купюр. (Например, если есть купюры в 5 и 10 рублей, а k = 6, то 55 разменять можно, а 65 –– нет).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Перемножение цепочки матриц. Оптимальное бинарное дерево поиска (начало) (09.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о перемножении цепочки матриц. Постановка задачи.Пример. Нисходящий алгоритм.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.2 Перемножение цепочки матриц, стр. 403]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 9 (до 24.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Найдите оптимальную расстановку скобок в произведении последовательности матриц, размерности которых равны 5×10, 10×3, 3×12, 12×5, 5×50, 50×6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Напишите восходящий алгоритм для поиска оптимальной расстановки скобок.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Расстановка пробелов. Оптимальное бинарное дерево поиска (середина) (12.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о расстановке пробелов. Постановка задачи. Решения для трёх случаев: 1. нужно вернуть можно ли разбить текст на слова; 2. вернуть разбивку на слова; 3. слова встречаются не равновероятно, вернуть наиболее вероятную разбивку на слова.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи. Вывод математического ожидания времени поиска.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Праздничное домашнее задание 10 (до 02.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[&amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;,&amp;quot;, &amp;quot;.&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;,&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;.&amp;quot;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Подсказка:&#039;&#039;&#039; разбейте текст на слова из списка и посмотрите на азбуку Морзе.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Способы представления графов в памяти (16.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Разбор ошибок в домашнем задании.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Графы. Способы представления графов в памяти (матрица смежности, список рёбер, список соседей (список смежностей), матрица инцидентности). Зависимость сложности алгоритмов от способа представления.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §22.1 Представление графов, стр. 626]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 11 (до 02.03)===&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача A.]&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача B.]&lt;br /&gt;
# Нарисуйте неориентированный граф с 5 вершинами и 8 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Нарисуйте ориентированный граф с 4 вершинами и 3 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Дан ориентированный граф. &#039;&#039;Исходящая степень вершины v&#039;&#039; --- это количество исходящих из неё рёбер, &#039;&#039;входящая степень v&#039;&#039; --- это количество рёбер входящих в  v. Имеется представление ориентированного графа с использование списка соседей. Как долго будут вычисляться исходящие степени всех вершин графа? А входящие степени?&lt;br /&gt;
# Дан граф G = (V, E). Какие из рассмотренных способов хранения графов используют меньше всего памяти для хранения G и почему? Указание: рассмотрите случаи |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;lt; |E| и |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;gt; |E|.&lt;br /&gt;
# Пусть C --- это матрица смежности графа G.&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
# Пусть B --- это матрица инцидентности ориентированного графа G. Как связаны элементы матрицы BB&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
&lt;br /&gt;
==Реализация поиска в глубину (19.02)==&lt;br /&gt;
# Реализация поиска в глубину и смежных задач.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 12 (до 5.03)===&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Выберите любой способ хранения графа. Реализуйте поиск в глубину.&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Напишите алгоритм, который возвращает данные о том, какие вершины лежат в одной компоненте связности.&lt;br /&gt;
# &#039;&#039;(любой ЯП или псевдокод)&#039;&#039; Напишите алгоритм проверки сильной связности ориентированного графа. Какова его сложность?&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №2==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
Необходимо реализовать 3 задачи из [https://official.contest.yandex.ru/contest/1085 контеста], см. [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing распределение задач]. Каждую задачу можно написать на С++ или Python. На выполнение работы отводится две недели (см. время окончания контеста). [https://official.contest.yandex.ru/contest/1123 Дорешивание.]&lt;br /&gt;
&lt;br /&gt;
==ДП и графы (26.02)==&lt;br /&gt;
==ДП и графы (02.03)==&lt;br /&gt;
==Жадные алгоритмы (12.03)==&lt;br /&gt;
===Домашнее задание 13 (до 23.03)===&lt;br /&gt;
# Вася хочет купить по одной акции каждой компании. Все акции стоят одинаково, но дорожают по-разному. Каждый месяц акция i-ой компании дорожает в r_i раз. В один месяц можно купить только одну акцию.&lt;br /&gt;
## Напишите алгоритм, который выводит оптимальную последовательность покупок (такую, что на покупку всех акций потратится меньше денег).&lt;br /&gt;
## Докажите корректность алгоритма, то есть докажите, что последовательность покупок, которую выводит ваш алгоритм, оптимальна.&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список, очередь (16.03)==&lt;br /&gt;
# Реализация линейного двусвязного списка (С++).&lt;br /&gt;
# Реализация очереди ограниченной длины на базе вектора (С++).&lt;br /&gt;
# Реализация очереди на базе списка (С++).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14 (до 23.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте (на С++) структуру данных Стек. У стека должно быть три операции:&lt;br /&gt;
* push --- положить элемент на вершину стека;&lt;br /&gt;
* pop --- удалить верхний элемент;&lt;br /&gt;
* front --- вернуть значение верхнего элемента.&lt;br /&gt;
Оцените время работы каждой функции.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список (19.03)==&lt;br /&gt;
===Домашнее задание 13* (до 30.03)===&lt;br /&gt;
#Для приведённой реализации класса List (https://yadi.sk/i/c5r_79WdfMyNS).&lt;br /&gt;
## Допишите print, push_back и push_front.&lt;br /&gt;
## В функции insert_after и delete_node вставьте необходимые проверки так, чтобы они работали для крайних случаев.&lt;br /&gt;
## Напишите main в котором&lt;br /&gt;
### создаётся объект класса List, &lt;br /&gt;
### заполняется элементами с помощью функций push_back, push_front и insert_after и&lt;br /&gt;
### удаляется i-ый элемент.&lt;br /&gt;
&lt;br /&gt;
==Повторение (30.03)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Для данных пар функций выясните их связь в терминах O-, o-, Ω-, ω-, Θ-обозначений. Поставьте галочку в клетке с Ω, если f(x) = Ω(g(x)) и прочерк, если равенства нет. [https://ru.wikipedia.org/wiki/«O»_большое_и_«o»_малое#.D0.94.D1.80.D1.83.D0.B3.D0.B8.D0.B5_.D0.BF.D0.BE.D0.B4.D0.BE.D0.B1.D0.BD.D1.8B.D0.B5_.D0.BE.D0.B1.D0.BE.D0.B7.D0.BD.D0.B0.D1.87.D0.B5.D0.BD.D0.B8.D1.8F Википедия]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! f(x)!! g(x)!! O!! o!! Ω!! ω!! Θ&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! 2^100&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n * log(n)&lt;br /&gt;
! 2^100 * n * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n&lt;br /&gt;
! 2^100 * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n!&lt;br /&gt;
! 2^(2015n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n*2^n&lt;br /&gt;
! 3^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 5^n&lt;br /&gt;
! 5^(n+1)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n + n^2 + n^3 + ... + n^1000&lt;br /&gt;
! 7^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм Quickselect нахождения k-ого элемента по возрастанию: http://en.wikipedia.org/wiki/Quickselect&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;На улице стоит ряд домов. В каждом из домов лежит сколько-то денег. Вор хочет обокрасть дома на переулке. Он не может обокрасть два соседних дома, потому что хозяин дома, который он обокрал, сразу предупредит соседей. Нужно найти, какую максимальную сумму вор может украсть с переулка. На вход программы подается массив неотрицательных целых чисел - количество долларов в доме с номером i. Соседние дома в массиве представлены соседними элементами. Например, пусть задан массив { 1, 4, 5 } - тогда вор максимум может украсть $6, обокрав дома 1 и 3. Пусть задан массив { 1, 7, 2 } - тогда вор максимум может украсть $7, обокрав дом 2.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Алфавит из всех маленьких латинских букв и пробела закодирован числами следующим способом:&lt;br /&gt;
  &#039;a&#039; -&amp;gt; 1&lt;br /&gt;
  &#039;b&#039; -&amp;gt; 2&lt;br /&gt;
  &#039;c&#039; -&amp;gt; 3&lt;br /&gt;
  ...&lt;br /&gt;
  &#039;z&#039; -&amp;gt; 26&lt;br /&gt;
  &#039; &#039; -&amp;gt; 27&lt;br /&gt;
На вход программы подается строка из цифр. Нужно посчитать, сколькими способами можно раскодировать эту строку.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Дан граф, заданный матрицей смежности. Вывести пары вершин между которыми нет пути.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Повторение (02.04) ==&lt;br /&gt;
Решали и разбирали первые 4 задачи из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14* (до 11.03)===&lt;br /&gt;
Решите любые две задачи (подпункты НЕ считаются отдельными задачами) с предыдущей пары (Повторение (30.03)).&lt;br /&gt;
&lt;br /&gt;
== Повторение (06.04) ==&lt;br /&gt;
Будем решать вторую половину задач из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 15 (до 16.04)===&lt;br /&gt;
# Приведите пример графа, который содержит отрицательные рёбра, не содержит циклов отрицательного веса и для которого алгоритм Дейкстры возвращает неверный результат.&lt;br /&gt;
# Используется ли в алгоритме Дейкстры то, что веса рёбер неотрицательны? Если &amp;quot;да&amp;quot;, то где именно?&lt;br /&gt;
# Пусть граф содержит рёбра с весами &amp;gt;= -100. Если прибавить к каждому ребру 101 и при помощи алгоритма Дейкстры найти кратчайшие пути. Будут ли эти пути кратчайшими в исходном графе? Почему?&lt;br /&gt;
&lt;br /&gt;
== Повторение (07.04) ==&lt;br /&gt;
&#039;&#039;&#039;Решение рекуррентных соотношений&#039;&#039;&#039;&lt;br /&gt;
# Решите уравнение: T(n) = 4*T(n/2) + O(n^2) с базой T(1) = O(1)&lt;br /&gt;
## Используя основную теорему.&lt;br /&gt;
## Используя дерево рекурсий.&lt;br /&gt;
## Методом подстановки.&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2)) + n является \Theta(n lg n).&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2) + 17) + n является \Theta(n lg n).&lt;br /&gt;
# Решите уравнения, считая, что T(1) = O(1):&lt;br /&gt;
## T(n) = T(n-1) + n&lt;br /&gt;
## T(n) = 2*T(floor(sqrt(n))) + lg n. Указание: попробуйте использовать замену переменных.&lt;br /&gt;
## T(n) = 3*T(sqrt(n)) + lg n&lt;br /&gt;
# Дайте верхнюю и нижнюю оценки функции T(n). Постарайтесь, чтобы оценки были как можно более точные&lt;br /&gt;
## T(n) = 4T(n/3) + n*lg(n)&lt;br /&gt;
## T(n) = 3T(n/3) + n/lg(n)&lt;br /&gt;
## T(n) = 4T(n/2) + n^2*sqrt(n)&lt;br /&gt;
## T(n) = T(n/2) + T(n/4) + T(n/8) + n&lt;br /&gt;
## T(n) = T(n-1) + 1/n&lt;br /&gt;
## T(n) = T(n-2) + 1/lg(n)&lt;br /&gt;
## T(n) = sqrt(n) * T(sqrt(n)) + n&lt;br /&gt;
&#039;&#039;&#039;Анализ и построение алгоритмов&#039;&#039;&#039;&lt;br /&gt;
# Числа Фибоначчи F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; можно выразить через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, используя матрицу: https://yadi.sk/i/Pm_aNzHCforFU. &lt;br /&gt;
## Покажите как вычислить F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;.&lt;br /&gt;
## Как вычислить F&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;n+1&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;?&lt;br /&gt;
## Напишите алгоритм.&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
## Ускорьте его так, чтобы он работал за O(log n).&lt;br /&gt;
# Дана последовательность символов. Какое минимальное количество символов нужно удалить из неё, чтобы получить палиндром?&lt;br /&gt;
## Напишите алгоритм (на псевдокоде или на любом языке программирования).&lt;br /&gt;
## Оцените время работы алгоритма.&lt;br /&gt;
# Какую структуру данных вы бы использовали для реализации упорядоченного множества (http://neerc.ifmo.ru/wiki/index.php?title=Упорядоченное_множество)? Какая будет сложность каждой из операций над множеством?&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 16 (до 20.04)===&lt;br /&gt;
# Решите 6 задач из первой части и 6 из второй. (Укажите какие именно.) Каждый из подпунктов является отдельной задачей.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм и теорема Форда-Фалкерсона (16.04)==&lt;br /&gt;
# Базовые определения (пропускные способности, сток, исток и пр.). Пример. &lt;br /&gt;
# Ограничения на поток (сохранение и что меньше пропускных способностей).&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, пример работы&lt;br /&gt;
# Разрез, определение, пример.&lt;br /&gt;
# Утверждение: максимальный поток &amp;lt;= любого разреза.&lt;br /&gt;
# Теорема Форда-Фалкерсона (с доказательством).&lt;br /&gt;
# Пример на котором алгоритм Форда-Фалкерсонаработает работает очень долго при неудачном выборе путей.&lt;br /&gt;
# Сложность алгоритма Форда-Фалкерсона.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №3==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
В [https://official.contest.yandex.ru/contest/1196 домашнем задании] пять задач. Они разделены на два варианта, помеченные римскими цифрами I и II. Свой вариант нужно узнать [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing здесь на вкладке HW3]. Третья задача — общая для двух вариантов; ее решение необходимо снабдить доказательством корректности алгоритма. На выполнение задания дается примерно 2 недели (см. точное время окончания в контесте). Каждую задачу можно написать на С++ или Python.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Форда-Фалкерсона и Эдмондса-Карпа (20.04)==&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, напоминание: базовые определения, пример работы, пример на котором алгоритм работает долго, сложность.&lt;br /&gt;
# Алгоритм Эдмодса-Карпа. Доказательство асимптотики времени работы.&lt;br /&gt;
&lt;br /&gt;
==(23.04)==&lt;br /&gt;
&lt;br /&gt;
==(11.05) Красно-чёрные деревья==&lt;br /&gt;
[https://ru.wikipedia.org/wiki/Красно-чёрное_дерево Красно-чёрное дерево]&lt;br /&gt;
===Домашнее задание 17 (до 18.05)===&lt;br /&gt;
# Зачем нужны красно-чёрные деревья?&lt;br /&gt;
# Благодаря какому свойству и почему красно-чёрное дерево является сбалансированным?&lt;br /&gt;
# Нарисуйте полное бинарное дерево поиска высотой 3 с ключами {1, 2, ..., 15}. Сделайте из него красно-чёрные деревья высотой 2, 3 и 4.&lt;br /&gt;
# Нарисуйте красно-чёрные деревья, получающиеся последовательной вставкой элементов 12, 10, 29, 30, 31, 32 в [https://ru.wikipedia.org/wiki/Красно-чёрное_дерево#/media/File:Red-black_tree_example.svg данное дерево]. Для вставки используйте алгоритм вставки из Википедии. Укажите какой именно функцией вы воспользовались.&lt;br /&gt;
# Определим &#039;&#039;&#039;ослабленное красно-чёрное дерево&#039;&#039;&#039; как бинарное дерево поиска, которое удовлетворяет красно-чёрным свойствам 1, 3, 4 и 5. Другими словами, корень может быть как чёрным, так и красным. Рассмотрите ослабленное красно-чёрное дерево T, корень которого красный. Если перекрасить корень дерева T в чёрный, будет ли оно красно-чёрным деревом?&lt;br /&gt;
# Покажите, что самый длинный простой нисходящий путь от вершины x к листу красно-черного дерева имеет длину, не более чем в два раза превышающую кратчайший путь от x к листу-потомку.&lt;br /&gt;
# Чему равно наибольшее возможное количество внутренних узлов в красно-чёрном дереве с чёрной высоты k? А наименьшее возможное количество?&lt;br /&gt;
# Нарисуйте красно-чёрные деревья, получающиеся последовательной вставкой ключей 41, 38, 31, 12, 19, 8 в изначально пустое дерево.&lt;br /&gt;
# Покажите какие деревья будут получаться в результате последовательного удаления ключей в порядке 8, 12, 19, 31, 38, 41.&lt;br /&gt;
&lt;br /&gt;
==(14.05) Конкурентный анализ самоорганизующихся циклов==&lt;br /&gt;
[https://vk.com/doc12518218_390369758 Лекция]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 18 (до 21.05)===&lt;br /&gt;
Все вычисления сопроводите подробными объяснениями о том, почему верно то или иное (не)равенство.&lt;br /&gt;
# Пусть имеется n-элементный список и m поисковых запросов к нему. После каждой операции поиска можно переупорядочить список. Обозначим стоимость последовательности поисков через C. Докажите, что в худшем случае C = Ω(mn).&lt;br /&gt;
#  Обозначим через c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; стоимость i-ого поискового запроса с применением эвристики перемещения в начало, которая включает стоимость поиска элемента в списке и стоимость его перемещения в начало списка путём ряда обменов соседних элементов списка. Покажите, что i-ая операция поиска находит элемент x в списке L с применением эвристики перемещения в начало, то c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = 2 * rank&amp;lt;sub&amp;gt;L&amp;lt;/sub&amp;gt;(x) - 1.&lt;br /&gt;
# Покажите, что c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = 2 * rank&amp;lt;sub&amp;gt;L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) - 1.&lt;br /&gt;
# Покажите, что c*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = rank&amp;lt;sub&amp;gt;L*&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) + t&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;.&lt;br /&gt;
# Докажите, что после одного обмена двух соседних элементов потенциал либо увеличивается на 2, либо уменьшается на 2.&lt;br /&gt;
# Докажите, что rank&amp;lt;sub&amp;gt;L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) = |A| + |B| + 1.&lt;br /&gt;
# Докажите, что rank&amp;lt;sub&amp;gt;L*&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) = |A| + |С| + 1.&lt;br /&gt;
# Покажите, что поиск i-ого элемента приводит к изменению потенциала Ф(L&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;) - Ф(L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;) &amp;lt;= 2 (|A| - |B| + t*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;), где t*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; --- это количество обменов при i-ом поиске.&lt;br /&gt;
# Во сколько раз стоимость С&amp;lt;sub&amp;gt;MFT&amp;lt;/sub&amp;gt;(S) превышает C&amp;lt;sub&amp;gt;OPT&amp;lt;/sub&amp;gt;(S)?&lt;br /&gt;
&lt;br /&gt;
== (18.05) Конечные автоматы ==&lt;br /&gt;
=== Задание 19 (до 25.05) ===&lt;br /&gt;
# Постройте автомат для языка над алфавитом Σ = {0, 1} каждое слово которого содержит хотя бы два нуля. Является ли он детерминированным?&lt;br /&gt;
# Постройте автомат над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5. Является ли он детерминированным?&lt;br /&gt;
# Постройте автомат, который допускает пустой язык (язык в котором нет ни одного слова).&lt;br /&gt;
# Постройте автомат, который допускает все слова над алфавитом Σ.&lt;br /&gt;
# Постройте ДКА над алфавитом Σ = {К, Ж, З}, который допускает слова в которых после К идёт З, после З --- Ж, после Ж --- К.&lt;br /&gt;
# * Постройте ДКА над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5, а число нулей на 3.&lt;br /&gt;
# Постройте НКА для языка над алфавитом Σ = {0, 1, 2, 3}, состоящий из слов, в которых хотя бы одна из последних пяти букв является 1.&lt;br /&gt;
# Постройте НКА над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5, а число нулей на 3.&lt;br /&gt;
# Какие языки допускают автоматы https://yadi.sk/d/fNAHbjCZghERG?&lt;br /&gt;
# Для каждого из автоматов https://yadi.sk/d/fNAHbjCZghERG постройте соответствующий ему ДКА.&lt;br /&gt;
&lt;br /&gt;
== (21.05) Регулярные выражения, КА, их эквивалентность. Лемма о накачке  ==&lt;br /&gt;
=== Задание 20 (до 28.05) ===&lt;br /&gt;
&#039;&#039;&#039;I Написать регулярные выражения&#039;&#039;&#039;&lt;br /&gt;
# Напишите регулярное выражение для языка над алфавитом Σ = {0, 1} каждое слово которого содержит хотя бы два нуля.&lt;br /&gt;
# Напишите регулярное выражение над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5.&lt;br /&gt;
# Напишите регулярное выражение, которое допускает пустой язык (язык в котором нет ни одного слова).&lt;br /&gt;
# Напишите регулярное выражение, которое допускает все слова над алфавитом Σ.&lt;br /&gt;
# Напишите регулярное выражение для языка над алфавитом Σ = {0, 1, 2, 3}, состоящий из слов, в которых хотя бы одна из последних пяти букв является 1.&lt;br /&gt;
&#039;&#039;&#039;II КА и регулярные выражения&#039;&#039;&#039;&lt;br /&gt;
# Постройте конечный автомат для языка (111 + 01)&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;1(00 + 11)&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;.&lt;br /&gt;
# Постройте конечный автомат для языка (ab)&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;(a + b)(b + a)&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;(a + bab).&lt;br /&gt;
&#039;&#039;&#039;III Доказать замкнутость относительно различных операций&#039;&#039;&#039;&lt;br /&gt;
# Покажите, что если для языков L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; и L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; существует КА, который их читает, то существует КА и для их объединения L = {w | w ∈ L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; или w ∈ L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;}.&lt;br /&gt;
# Покажите, что если для языка L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; и L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; существует КА, который их читает, то существует КА и для языка L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; = {xy | x ∈ L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, y ∈ L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;}.&lt;br /&gt;
# Покажите, что если для языка L существует КА, который его читает, то существует КА и для &#039;&#039;&#039;замыкания Клини&#039;&#039;&#039; L* = {w&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; w&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; ... w&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;| w&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; ∈ L, w&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; ∈ L, ..., w&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; ∈ L}.&lt;br /&gt;
# Покажите, что если язык L регулярен, то регулярно его дополнение (т.е. язык над тем же алфавитом, которому принадлежит слово тогда и только тогда, когда оно НЕ принадлежит L) .&lt;br /&gt;
# Покажите, что если язык L регулярен, то регулярно его обращение L&amp;lt;sub&amp;gt;R&amp;lt;/sub&amp;gt; = {a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; . . . a&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; | a&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; . . . a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; ∈ L}. (L&amp;lt;sub&amp;gt;R&amp;lt;/sub&amp;gt; --- это язык в котором все слова языка L записаны наоборот.)&lt;br /&gt;
# * Покажите, что если языки L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; и L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; регулярны, то регулярно их пересечение.&lt;br /&gt;
&#039;&#039;&#039;IV Использование леммы о накачке&#039;&#039;&#039;&lt;br /&gt;
# Докажите, что не существует КА, который бы читал язык {0&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;1&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;2&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;}. (Пояснение: запись 0&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; означает строку из n нулей: 00...0.)&lt;br /&gt;
# Докажите, что не существует КА, который бы читал язык {0&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;1&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;}.&lt;br /&gt;
# Докажите, что не существует КА, который бы читал язык {0&amp;lt;sup&amp;gt;n!&amp;lt;/sup&amp;gt;}.&lt;/div&gt;</summary>
		<author><name>Kassalanche</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=13888</id>
		<title>Алгоритмы и структуры данных. Подгруппа 105-1</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=13888"/>
		<updated>2015-05-21T04:39:31Z</updated>

		<summary type="html">&lt;p&gt;Kassalanche: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==О курсе==&lt;br /&gt;
[[Алгоритмы_и_структуры_данных|План лекций и список рекомендуемой литературы.]]&lt;br /&gt;
&lt;br /&gt;
[[Алгоритмы_и_структуры_данных._Подгруппа_105-1._FAQ|FAQ.]]&lt;br /&gt;
&lt;br /&gt;
[[Reviewboard|Инструкция по использованию Reviewboard.]]&lt;br /&gt;
&lt;br /&gt;
[[Практические_занятия_по_курсу_ОиМП/C++_check|Style guide.]]&lt;br /&gt;
&lt;br /&gt;
==Итоговая оценка за курс==&lt;br /&gt;
Итоговая оценка (ИО) зависит от&lt;br /&gt;
* оценок за пять больших домашних заданий (БДЗ1, БДЗ2, ..., БДЗ5),&lt;br /&gt;
* оценок за домашние задания (ДЗ1, ДЗ2, ...),&lt;br /&gt;
* оценки за контрольную работу (КР),&lt;br /&gt;
* оценки за экзамен (ЭКЗ),&lt;br /&gt;
и может быть вычислена по формуле:&lt;br /&gt;
 ИО = 0.7 * (0.3 * КР + 0.7 *(ИДЗ1 + ИДЗ2 + ИДЗ3 + ИДЗ4 + ИДЗ5)/5) + 0.3 * ЭКЗ =&lt;br /&gt;
    = 0.21*КР + 0.98*ИДЗ1 + 0.98*ИДЗ2 + 0.98*ИДЗ3 + 0.98*ИДЗ4 + 0.98*ИДЗ5 + 0.3*ЭКЗ,&lt;br /&gt;
где&lt;br /&gt;
 ИДЗi = min (10, 0.7 * БДЗi + 0.4 * &amp;lt;cредняя оценка за ДЗj, прошедшие с предыдущего БДЗ по i-ое&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
==Порядок сдачи домашних работ==&lt;br /&gt;
===Большие домашние работы===&lt;br /&gt;
# Получить OK за задачу в контесте.&lt;br /&gt;
# Залить исходный код на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* На каждую задачу создавайте отдельный запрос на ревью. &lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении суток приходят замечания к коду. &#039;&#039;&#039;Если в течении суток замечаний или Ship It не появилось, проверьте, что вы правильно отправили запрос и, если всё сделано правильно, спросите у семинариста получил ли он запрос.&#039;&#039;&#039;&lt;br /&gt;
# Вы их исправляете, проверяете в контесте, что программа по-прежнему проходит все тесты, заливаете новую версию в Review Board. Штрафов за посылки НЕ будет.&lt;br /&gt;
# Процесс повторяется пока остаются замечания к коду или пока не истёк дедлайн. После закрытия контеста будут ещё одни сутки на доработку замечаний в Review Board.&lt;br /&gt;
# Оценивается только последняя версия работы в Review Board.&lt;br /&gt;
&lt;br /&gt;
===Маленькие домашние работы===&lt;br /&gt;
# Залить решение на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* Желаемые форматы: txt, py, cpp, h. Допускаются любые другие.&lt;br /&gt;
#* На каждую домашнюю работу создавайте отдельный запрос на ревью. Обязательно указывайте номер домашней работы.&lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении неопределенного промежутка времени придут оценки по каждому из заданий.&lt;br /&gt;
&lt;br /&gt;
==Оценивание домашних работ==&lt;br /&gt;
* Все задания предполагаются индивидуальными. Запрещены любые заимствования без ссылки на автора.&lt;br /&gt;
* Решения после установленного дедлайна не принимаются. Дедлайн указан в заголовке каждого задания.&lt;br /&gt;
* Везде, где требуется написать алгоритм, можно использовать любой язык программирования или псевдокод.&lt;br /&gt;
* Там, где требуется построить алгоритм с заданной асимптотикой, приведите обоснование, что полученный алгоритм удовлетворяет этому условию.&lt;br /&gt;
* Эти правила не действуют, если в задании явно оговорено иное.&lt;br /&gt;
&lt;br /&gt;
==Мотивация к изучению алгоритмов. Подсчёт числа операций (12.01)==&lt;br /&gt;
# Числа Фибоначчи. Определение. Примитивный рекурсивный алгоритм вычисления i-ого числа. Оценка числа операций. Анализ причин неэффективности. Алгоритм с запоминанием вычисленных ранее значений. Оценка числа операций. Сравнение с предыдущим. (подробнее: глава 0, страницы 8-10 из книги &amp;lt;&amp;lt;Алгоритмы&amp;gt;&amp;gt;, [[Алгоритмы_и_структуры_данных|см. список рекомендованной литературы]])&lt;br /&gt;
# Задача о ханойской башне. Постановка задачи. Рекурсивный алгоритм. Рекуррентная формула для числа перемещений. Замкнутая формула для числа перемещений (+ доказательство). Доказательство того, что эту задачу нельзя решить используя меньшее число перемещений дисков. ([https://www.dropbox.com/s/t8cbs7ttu4iasvj/algo-0-recursion.pdf?dl=0 Разбор задачи о ханойской башне], автор Сергей Объедков)&lt;br /&gt;
# Сортировка пузырьком. Алгоритм. Подсчёт количество операций сравнения и обмена (swap). Анализ наилучшего и наихудшего случаев ([https://ru.wikipedia.org/wiki/Сортировка_пузырьком Википедия])&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 1 (12.01 - 26.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
Во всех задачах, если не оговорено иного, предполагаем, что работаем с целыми неотрицательными числами. Для первых 7 задач необходимо&lt;br /&gt;
* описать что можно считать наилучшим и наихудшим случаями,&lt;br /&gt;
* для каждого из двух случаев подсчитать отдельно количество операций сравнения и swap (если есть).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Даны три числа, требуется вернуть наименьшее.&lt;br /&gt;
# Даны три числа, требуется отсортировать их.&lt;br /&gt;
# Дана последовательность A из n элементов и число x, требуется найти элемент равный x. Примечание: если таких значений i несколько, вернуть любое; если такого элемента нет, функция должна сообщить об этом.&lt;br /&gt;
# * Дана упорядоченная последовательность A из n элементов и число x, требуется найти такое i, что A[i] равно x. Алгоритм должен быть эффективней, чем в предыдущем пункте и использовать то, что последовательность упорядочена.&lt;br /&gt;
# Дана последовательность из 100 000 чисел от 0 до 100. Напишите эффективный алгоритм сортировки, который бы учитывал специфику входных данных.&lt;br /&gt;
# * Дано 32 битное неотрицательное число. Требуется номер первого ненулевого бит. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения, считая, что числа распределены равномерно.&lt;br /&gt;
# * Даны 32 битные неотрицательные числа m и n. Требуется вывести True, если m &amp;lt; n, иначе False. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения битов, считая, что числа распределены равномерно.&lt;br /&gt;
# Напишите рекурсивную функцию, вычисляющую n-ое число Фибоначчи (как на занятии). Подсчитайте количество рекурсивных вызовов.&lt;br /&gt;
# * Напишите функцию, вычисляющую n-ое число Фибоначчи, у которой число операций — полином от n, и которая использует количество памяти, независящее от n.&lt;br /&gt;
&lt;br /&gt;
==O-символика и стратегия &amp;quot;разделяй и властвуй&amp;quot; (15.01)==&lt;br /&gt;
# Сортировка слиянием. Алгоритм, рекуррентное соотношение для времени сортировки, сложность. Подробнее: [https://dl.dropboxusercontent.com/u/829163/draft.pdf §2.3 Сортировка слиянием (стр. 54)].&lt;br /&gt;
# О-символика. [https://dl.dropboxusercontent.com/u/829163/draft.pdf §0.3 О-символика (стр. 10)].&lt;br /&gt;
# Задача о слиянии m упорядоченных массивов по n элементов. Три алгоритма решения: последовательное слияние, слияние &amp;quot;деревом&amp;quot; (обе функции используют Merge из MergeSort), аналог Merge для m массивов. Анализ сложности каждого из них.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 2 (15.01-29.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
* Во всех задачах, если не оговорено иного, для простоты &#039;&#039;можно&#039;&#039; считать, что n является степенью какого-либо числа, например, степенью двойки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Дана функция F, определённая ниже. Сколько строк она напечатает? Указание: для обоих подпунктов рассмотрите два случая: 1. n является степенью двойки, 2. n не является степенью двойки.&lt;br /&gt;
## Запишите рекуррентное соотношение для числа строк.&lt;br /&gt;
## Решите уравнение, полученное в предыдущем пункте, то есть, выведите замкнутую (нерекуррентную формулу). Для простоты можно считать, что n является степенью двойки.&lt;br /&gt;
# В массиве A размера n записана возрастающая последовательность целых чисел. Постройте алгоритм типа &amp;quot;разделяй и властвуй&amp;quot;, который проверяет, существует ли такой индекс i, что A[i] = i&lt;br /&gt;
## за время O(n),&lt;br /&gt;
## * за время O(log n).&lt;br /&gt;
## Какие случаи для вашего алгоритма являются наихудшими и наилучшими? Какого время работы в лучшем и худшем случаях?&lt;br /&gt;
# Дан бесконечный массив A, первые n элементов которого содержат возрастающую последовательность положительных чисел, а дальше стоят -1. Значение n не дано. Постройте алгоритм, который получает на вход целое число x и находит это x в массиве --- или говорит, что там его нет, &lt;br /&gt;
## за время O(n),&lt;br /&gt;
## за время O(log n).&lt;br /&gt;
# Рассмотрим алгоритм вычисления наибольшего общего делителя (НОД) двух положительных чисел, основанный на методе &amp;quot;разделяй и властвуй&amp;quot;.&lt;br /&gt;
## (задание не оценивается) Прочитайте [https://dl.dropboxusercontent.com/u/829163/draft.pdf §1.2.3 Алгоритм Евклида (стр. 23)].&lt;br /&gt;
## * Докажите, что определение НОД-а, приведённое ниже, корректно.&lt;br /&gt;
## Постройте алгоритм, основанный на этом определении.&lt;br /&gt;
## Какой алгоритм будет быстрее для n-битовых чисел a и b при больших значениях n --- ваш или алгоритм Евклида?&lt;br /&gt;
# * Покажите как за время O(n log n) удалить из массива размера n все дубликаты, то есть оставить каждый элемент в одном экземпляре.&lt;br /&gt;
# * Даны два упорядоченных массива размера m и n. Постройте алгоритм, находящий k-й по величине элемент в объединении этих массивов за время O(log(n+m)). &lt;br /&gt;
&lt;br /&gt;
Функция F(n).&lt;br /&gt;
  если n &amp;gt; 1:&lt;br /&gt;
    напечатать &amp;quot;всё ещё работаю&amp;quot;&lt;br /&gt;
    F(n/2)&lt;br /&gt;
    F(n/2)&lt;br /&gt;
&lt;br /&gt;
Определение НОД-а.&lt;br /&gt;
             2НОД(a/2, b/2), если а и b чётны,&lt;br /&gt;
  НОД(a,b) = НОД(a, b/2), если а нечётно, b чётно,&lt;br /&gt;
             НОД((a-b)/2, b), если а и b нечётны.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;lt;nowiki&amp;gt;Задачи взяты из книги &amp;quot;Алгоритмы&amp;quot;, глава 2 (см. список рекомендованной литературы).&amp;lt;/nowiki&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Сложение и умножение (19.01)==&lt;br /&gt;
# Алгоритм сложения, его сложность (§1.1.1 Сложение*)&lt;br /&gt;
# &amp;quot;Школьный&amp;quot; алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Рекурсивный алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Алгоритм умножения, реализующий стратегию &amp;quot;разделяй и властвуй&amp;quot;, анализ сложности (§2.1 Умножение чисел*)&lt;br /&gt;
 * [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать.]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 3 (19.01 - 2.02)===&lt;br /&gt;
* Во всех задачах для простоты можно считать, что n является степенью какого-либо числа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Найдите произведение чисел 10011011 и 10111010 (в двоичной системе счисления), используя алгоритм умножения чисел, основанный на методе «разделяй и властвуй». Необходимо не только дать ответ, но и привести ход решения.&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 3 рекурсивных вызова для подзадач размера n-1 и комбинирует из них решение исходной задачи за О(n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте три верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 10 рекурсивных вызовов для подзадач размера n/2 и комбинирует из них решение исходной задачи за О(5n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте два верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Докажите, что 3m² + m = O(m²).&lt;br /&gt;
# Докажите, что lg m = O(m/1000), где lg m — это логарифм с двоичным основанием.&lt;br /&gt;
# Докажите, что из равенства f(n) = O(g(n)) не следует, что g(n) = O(f(n)).&lt;br /&gt;
# Докажите, что O(m) содержится в O(m²).&lt;br /&gt;
&lt;br /&gt;
==Решение рекуррентных уравнений (22.01)==&lt;br /&gt;
# Примеры решений рекуррентных уравнений (см. [https://www.dropbox.com/s/6a0r410zjm9qwe7/algo-3-recurrences.pdf?dl=0 конспект]).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 4 (до 14.02)===&lt;br /&gt;
* Нельзя использовать утверждение основной теоремы о решении рекуррентных соотношений.&lt;br /&gt;
* &#039;&#039;Можно&#039;&#039; использовать метод построения дерева рекурсии или подстановку (метод с угадыванием ответа).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Какой из трёх приведённых ниже алгоритмов вы бы предпочли? Обоснуйте свой ответ.&lt;br /&gt;
#* Алгоритм A, решая задачу, производит пять рекурсивных вызовов для подзадач вдвое меньшего размера, после чего строит ответ для исходной задачи за линейное время.&lt;br /&gt;
#* Алгоритм B, решая задачу размера n, делает два рекурсивных вызова для задач размера n − 1, после чего находит ответ за время O(1).&lt;br /&gt;
#* Алгоритм C, решая задачу размера n, рекурсивно решает девять задач размера n/3 и строит ответ за время O(n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Найдите T(n) в замкнутой форме для любых 7 из 10 приведённых ниже рекуррентных соотношений:&lt;br /&gt;
## T(n) ≤ 2T(n/3) + 1;&lt;br /&gt;
## T(n) ≤ 7T(n/7) + n;&lt;br /&gt;
## T(n) ≤ 9T(n/3) + n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 8T(n/2) + n&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 49T(n/25) + n&amp;lt;sup&amp;gt;3/2&amp;lt;/sup&amp;gt;log n;&lt;br /&gt;
## T(n) ≤ T(n − 1) + 2;&lt;br /&gt;
## T(n) ≤ T(n − 1) + n&amp;lt;sup&amp;gt;c&amp;lt;/sup&amp;gt;, где c ≥ 1 –– константа;&lt;br /&gt;
## T(n) ≤ T(n − 1) + c&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;, где c &amp;gt; 1 –– константа;&lt;br /&gt;
## T(n) ≤ 2T(n − 1) + 1;&lt;br /&gt;
## T(n) ≤ T(sqrt(n)) + 1.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №1==&lt;br /&gt;
Необходимо реализовать все 6 задач из [https://official.contest.yandex.ru/contest/1002 контеста]. Каждую задачу можно писать на С++ или Python. На выполнение работы отводится две недели. Каждая задача оценивается в 10/6 балла. Оценка &#039;&#039;может&#039;&#039; быть снижена за плохой код, но не более чем на 25%.&lt;br /&gt;
&lt;br /&gt;
==Бинарное дерево поиска (26.01)==&lt;br /&gt;
# Определение. Пример.&lt;br /&gt;
# Не модифицирующие алгоритмы: поиск (рекурсивный и итеративный алгоритмы), поиск минимума, inordered обход (вывод значений узлов в отсортированном порядке), поиск следующего по возрастанию.&lt;br /&gt;
# Модифицирующие алгоритмы: вставка (рекурсивная реализация), удаление (только идея).&lt;br /&gt;
 [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 13, стр. 248]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 5 (до 16.02)===&lt;br /&gt;
* Для получения максимальной оценки можно выполнить или все задачи без звёздочки, или задачу со звёздочкой. Преподаватель понимает, что реализацию БДП сложно не найти в интернете, но от копипасты не будет никакой пользы. Напротив, самостоятельная реализация очень полезна и приветствуется, даже если не получится выполнить всех пунктов задания.&lt;br /&gt;
* Задачи с двумя звёздочками необязательны.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Нарисуйте бинарные деревья поиска высотой 2, 3, 4, 5 и 6 для множества ключей {1, 4, 5, 10, 16, 17, 21}. Корень дерева имеет высоту 0.&lt;br /&gt;
# &#039;&#039;&#039;Сортировка с использованием БДП.&#039;&#039;&#039;&lt;br /&gt;
## Какова асимптотическая сложность алгоритма вставки элемента в дерево высоты d? Почему? Назовите наилучший и наиухдший случаи.&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который строит БДП в узлах которого стоят элементы данной последовательности. Можно использовать функцию Insert. Назовите наилучший и наихудший случаи. Есть теорема о том, что полученный алгоритм будет работать в среднем случае за время O(n * log n).&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который выводит их в порядке возрастания. Используйте бинарное дерево поиска. Какова в среднем случае сложность этого алгоритма? Назовите наилучший и наихудший случаи. Какова сложность в наихудшем случае?&lt;br /&gt;
# Напишите функцию GetRoot, которой на вход подаётся указатель на произвольный узел дерева, а она возвращает указатель на корень.&lt;br /&gt;
# Напишите процедуру PrintLeafs, которой на вход подаётся указатель на корень дерева, и она печатает листья дерева&lt;br /&gt;
## по возрастанию,&lt;br /&gt;
## по убыванию.&lt;br /&gt;
# ** Альтернативный обход в порядке возрастания бинарного дерева поиска с n узлами (или центрированный (inordered) обход) можно осуществить путём поиска минимального элемента дерева с помощью функции Minimum с последующий n-1 вызовом функции Next. Каково время работы такого алгоритма?&lt;br /&gt;
# * Реализуйте на С++ структуру данных бинарное дерево поиска, [https://yadi.sk/i/gi2SEStreFfSb используя заготовку].&lt;br /&gt;
## Нарисуйте бинарное дерево поиска, которое строится в функции getTreeExample.&lt;br /&gt;
## Реализуйте следующие алгоритмы: &lt;br /&gt;
### поиск минимума, &lt;br /&gt;
### inordered обход (вывод значений узлов в отсортированном порядке),&lt;br /&gt;
### поиск следующего по возрастанию,&lt;br /&gt;
### вставка элемента в дерево,&lt;br /&gt;
### сортировка последовательности с использованием БДП (дан вектор чисел, необходимо вывести их по возрастанию),&lt;br /&gt;
### ** удаление.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Карацубы, Штрассена. Быстрая сортировка (29.01)==&lt;br /&gt;
# Алгоритм Карацубы.&lt;br /&gt;
# Алгоритм Штрассена. [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать Дасгупту и др., §2.5 Умножение матриц]&lt;br /&gt;
# Быстрая сортировка и доказательство того, что в среднем случае она работает за О(n * log n). [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 8 Быстрая сортировка, стр. 148]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 6 (до 18.02)===&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Пусть мы хотим найти двоичное представление десятичного числа 10&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;. Будем считать, что n --- степень двойки (n = 2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt;).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Pwr2Bin(n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть 1010&lt;br /&gt;
    z = ...&lt;br /&gt;
    вернуть Multiply(z, z)&amp;lt;/source&amp;gt;&lt;br /&gt;
Multiply --- функция, перемножающая два n-битовых двоичных числа x и y по алгоритму Карацубы за O(n&amp;lt;sup&amp;gt;log&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;3&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Пусть мы хотим перевести произвольное десятичное число x в записи которого n=2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; чисел в двоичную систему счисления.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Dec2Bin(x, n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть binary[x]&lt;br /&gt;
    разделить x на два десятичных числа xl и xr из n/2 цифр.&lt;br /&gt;
    вернуть ...&amp;lt;/source&amp;gt;&lt;br /&gt;
Здесь binary --- это массив, содержащий двоичное представление десятичных цифр.&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Докажите, что математическое ожидание времени работы алгоритма быстрой сортировки (усреднение по всем вариантам выбора опорного элемента) на любом входе размера n удовлетворяет соотношению: T(n) ≤ O(n) + 1/n * &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt; (T(i-1) + T(n-i)).&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Найдите решение соотношения из предыдущего пункта.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Динамическое программирование (ДП). Первые примеры (02.01)==&lt;br /&gt;
# Нахождение самой длинной возрастающей подпоследовательности.&lt;br /&gt;
# Нахождение редакционного расстояния (или редакционной стоимости, расстояния Левенштейна).&lt;br /&gt;
# Нахождение представителя большинства.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 7 (до 20.02)===&lt;br /&gt;
* В этом задании везде, где требуется реализовать алгоритм, необходимо привести код на любом языке программирования.&lt;br /&gt;
* Для получения максимальной оценки нужно решить все задачи без звёздочек. Одна решённая задача со звёздочкой заменяет одну задачу без звёздочки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения редакционного расстояния (алгоритм Вагнера — Фишера). Например, редакционное расстояние между словами &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равно 6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения длины наибольшей общей подстроки. Например, длина наибольшей общей подстроки &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равна 8 (&amp;quot;antholog&amp;quot;). Чем больше это значение, тем схожей строки.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Предположим теперь, что сравниваемые строки состоят из символов A, С, G и T; за удаление или вставку мы платим -5; за замену буквы x на y платим w[x, y], где x, y принадлежат множеству {A, С, G, T}, a w — это матрица весов:&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
!-!! A!! G!! C!! T&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! A&lt;br /&gt;
|10||-1||-3||-4&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
!G&lt;br /&gt;
||-1||7||-5||-3&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! C&lt;br /&gt;
||-3||-5||9||0&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! T&lt;br /&gt;
||-4||-3||0||8&lt;br /&gt;
|}&lt;br /&gt;
Тогда выравнивание:&lt;br /&gt;
 AGACTAGTTAC&lt;br /&gt;
 CGA‒‒‒GACGT&lt;br /&gt;
будет иметь следующую оценку:&lt;br /&gt;
 w[A,C] + w[G,G] + w[A,A] + 3*(-5) + w[G,G] + w[T,A] + w[T,C] + w[A,G] + w[C,T] = -3 + 7 + 10 - 3*5 + 7 + (-4) + 0 + (-1) + 0 = 1.&lt;br /&gt;
&lt;br /&gt;
Напишите алгоритм, который находит максимальную стоимость всех возможных выравниваний. Верно ли, что чем больше это значение, тем непохожей строки?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как давно один народ отделился от другого? Кто похожей — итальянец и китаец или якут и эфиоп? На эти вопросы можно отвечать с разных точек зрения — культурной, исторической, лингвистической, ... В последние же годы человечество научилось секвенировать геном, что позволило исследовать этот вопрос с точки зрения генетики. Секвенирование генома — это процесс записи ДНК в виде нуклеотидной последовательности, которая представляет собой последовательность из четырёх символов — A, С, G и T. Существуют базы, которые хранят генетическую информацию о людях из разных стран и континентов, например, [http://www.mtdb.igp.uu.se/ http://www.mtdb.igp.uu.se/ → Download mtDNA sequences]. Чем больше сходство между геномами, тем сильнее родственные связи между их обладателями. Используя решение предыдущего пункта, выполните задания:&lt;br /&gt;
# Определите, кто похожей — итальянец и китаец или якут и эфиоп?&lt;br /&gt;
# Найдите нескольких похожих и нескольких непохожих народностей.&lt;br /&gt;
# * Выберите одну народность. Найдите самых похожих и самых непохожих на неё.&lt;br /&gt;
# * Найдите самые похожие и самые непохожие народности.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Задача о разрезании стержня (05.01)==&lt;br /&gt;
# Постановка задачи.&lt;br /&gt;
# Решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Решение с нахождением максимума по p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Восходящий алгоритм с запоминанием. Вывод длин кусочков стержня. Оценка сложности.&lt;br /&gt;
# Нисходящий алгоритм с запоминанием. Оценка сложности.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.1 Разрезание стержня, стр. 393]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 8 (до 22.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Решая задачу о разрезании стержня мы вначале построили рекурсивное решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt; для всех 1 ≤ i &amp;lt; n. Его сложность описывалась рекуррентной формулой T(n) = n + &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n-1&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt;(T(i) + T(n-i)), T(1) = 1.&lt;br /&gt;
# Объясните эту формулу.&lt;br /&gt;
# Покажите с помощью метода подстановок, что T(n) ≤ 2&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Покажите с помощью контрпримера, что описанная далее жадная стратегия не всегда определяет оптимальный способ разрезания стержня. Определим плотность стержня длиной i как p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;/i, то есть как стоимость единицы его длины. Жадная стратегия для стержня длиной n отрезает от стержня первую часть длиной i, где 1 ≤ i ≤ n, имеющую максимальную плотность. Затем та же жадная стратегия применяется к оставшейся части длиной n-i.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Рассмотрим модификацию задачи разрезания стержня, в которой в дополнение к цене p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; каждого стержня добавляется фиксированная цена разреза c. Теперь прибыль, связанная с решением, представляет собой сумму цен частей стержня минус стоимость разрезов. Разработайте алгоритм динамического программирования для этой модифицированной задачи.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Непрерывным участком называется группа подряд идущих элементов. Например, для последовательности&lt;br /&gt;
 5, 15, −30, 10, −5, 40, 10&lt;br /&gt;
элементы 15, −30, 10 образуют непрерывный участок, а 5, 15, 40 -- нет. Постройте линейный алгоритм для следующей задачи:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Вход: список чисел a1, a2, ... ‌, an.&lt;br /&gt;
Выход: непрерывный участок с максимальной суммой (сумма участка нулевой длины равна нулю).&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Для приведённого примера ответом будет 10, −5, 40, 10 с суммой 55. Какова сложность алгоритма? Почему?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Надо заплатить v рублей, имея купюры в x1, x2, ‌..., xn рублей (купюр каждого типа сколько угодно). Это не всегда возможно (скажем, купюрами в&lt;br /&gt;
10 и 25 рублей можно заплатить 45 рублей, но не 47 и не 15). Постройте основанный на методе динамического программирования алгоритм со временем работы O(nv), выясняющий, возможна ли уплата.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как решить предыдущую задачу, если каждая купюра имеется в единственном экземпляре? (Например, купюрами в 1, 5, 10, 20 рублей можно заплатить 16 = 1 + 5 + 10 и 31 = 1 + 10 + 20 рублей, но не 40 (не хватит денег). Время работы алгоритма по-прежнему O(nv).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Ещё один вариант той же задачи: купюр каждого типа сколько угодно, но всего разрешается использовать не более k купюр. (Например, если есть купюры в 5 и 10 рублей, а k = 6, то 55 разменять можно, а 65 –– нет).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Перемножение цепочки матриц. Оптимальное бинарное дерево поиска (начало) (09.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о перемножении цепочки матриц. Постановка задачи.Пример. Нисходящий алгоритм.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.2 Перемножение цепочки матриц, стр. 403]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 9 (до 24.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Найдите оптимальную расстановку скобок в произведении последовательности матриц, размерности которых равны 5×10, 10×3, 3×12, 12×5, 5×50, 50×6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Напишите восходящий алгоритм для поиска оптимальной расстановки скобок.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Расстановка пробелов. Оптимальное бинарное дерево поиска (середина) (12.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о расстановке пробелов. Постановка задачи. Решения для трёх случаев: 1. нужно вернуть можно ли разбить текст на слова; 2. вернуть разбивку на слова; 3. слова встречаются не равновероятно, вернуть наиболее вероятную разбивку на слова.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи. Вывод математического ожидания времени поиска.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Праздничное домашнее задание 10 (до 02.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[&amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;,&amp;quot;, &amp;quot;.&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;,&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;.&amp;quot;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Подсказка:&#039;&#039;&#039; разбейте текст на слова из списка и посмотрите на азбуку Морзе.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Способы представления графов в памяти (16.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Разбор ошибок в домашнем задании.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Графы. Способы представления графов в памяти (матрица смежности, список рёбер, список соседей (список смежностей), матрица инцидентности). Зависимость сложности алгоритмов от способа представления.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §22.1 Представление графов, стр. 626]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 11 (до 02.03)===&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача A.]&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача B.]&lt;br /&gt;
# Нарисуйте неориентированный граф с 5 вершинами и 8 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Нарисуйте ориентированный граф с 4 вершинами и 3 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Дан ориентированный граф. &#039;&#039;Исходящая степень вершины v&#039;&#039; --- это количество исходящих из неё рёбер, &#039;&#039;входящая степень v&#039;&#039; --- это количество рёбер входящих в  v. Имеется представление ориентированного графа с использование списка соседей. Как долго будут вычисляться исходящие степени всех вершин графа? А входящие степени?&lt;br /&gt;
# Дан граф G = (V, E). Какие из рассмотренных способов хранения графов используют меньше всего памяти для хранения G и почему? Указание: рассмотрите случаи |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;lt; |E| и |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;gt; |E|.&lt;br /&gt;
# Пусть C --- это матрица смежности графа G.&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
# Пусть B --- это матрица инцидентности ориентированного графа G. Как связаны элементы матрицы BB&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
&lt;br /&gt;
==Реализация поиска в глубину (19.02)==&lt;br /&gt;
# Реализация поиска в глубину и смежных задач.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 12 (до 5.03)===&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Выберите любой способ хранения графа. Реализуйте поиск в глубину.&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Напишите алгоритм, который возвращает данные о том, какие вершины лежат в одной компоненте связности.&lt;br /&gt;
# &#039;&#039;(любой ЯП или псевдокод)&#039;&#039; Напишите алгоритм проверки сильной связности ориентированного графа. Какова его сложность?&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №2==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
Необходимо реализовать 3 задачи из [https://official.contest.yandex.ru/contest/1085 контеста], см. [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing распределение задач]. Каждую задачу можно написать на С++ или Python. На выполнение работы отводится две недели (см. время окончания контеста). [https://official.contest.yandex.ru/contest/1123 Дорешивание.]&lt;br /&gt;
&lt;br /&gt;
==ДП и графы (26.02)==&lt;br /&gt;
==ДП и графы (02.03)==&lt;br /&gt;
==Жадные алгоритмы (12.03)==&lt;br /&gt;
===Домашнее задание 13 (до 23.03)===&lt;br /&gt;
# Вася хочет купить по одной акции каждой компании. Все акции стоят одинаково, но дорожают по-разному. Каждый месяц акция i-ой компании дорожает в r_i раз. В один месяц можно купить только одну акцию.&lt;br /&gt;
## Напишите алгоритм, который выводит оптимальную последовательность покупок (такую, что на покупку всех акций потратится меньше денег).&lt;br /&gt;
## Докажите корректность алгоритма, то есть докажите, что последовательность покупок, которую выводит ваш алгоритм, оптимальна.&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список, очередь (16.03)==&lt;br /&gt;
# Реализация линейного двусвязного списка (С++).&lt;br /&gt;
# Реализация очереди ограниченной длины на базе вектора (С++).&lt;br /&gt;
# Реализация очереди на базе списка (С++).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14 (до 23.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте (на С++) структуру данных Стек. У стека должно быть три операции:&lt;br /&gt;
* push --- положить элемент на вершину стека;&lt;br /&gt;
* pop --- удалить верхний элемент;&lt;br /&gt;
* front --- вернуть значение верхнего элемента.&lt;br /&gt;
Оцените время работы каждой функции.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список (19.03)==&lt;br /&gt;
===Домашнее задание 13* (до 30.03)===&lt;br /&gt;
#Для приведённой реализации класса List (https://yadi.sk/i/c5r_79WdfMyNS).&lt;br /&gt;
## Допишите print, push_back и push_front.&lt;br /&gt;
## В функции insert_after и delete_node вставьте необходимые проверки так, чтобы они работали для крайних случаев.&lt;br /&gt;
## Напишите main в котором&lt;br /&gt;
### создаётся объект класса List, &lt;br /&gt;
### заполняется элементами с помощью функций push_back, push_front и insert_after и&lt;br /&gt;
### удаляется i-ый элемент.&lt;br /&gt;
&lt;br /&gt;
==Повторение (30.03)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Для данных пар функций выясните их связь в терминах O-, o-, Ω-, ω-, Θ-обозначений. Поставьте галочку в клетке с Ω, если f(x) = Ω(g(x)) и прочерк, если равенства нет. [https://ru.wikipedia.org/wiki/«O»_большое_и_«o»_малое#.D0.94.D1.80.D1.83.D0.B3.D0.B8.D0.B5_.D0.BF.D0.BE.D0.B4.D0.BE.D0.B1.D0.BD.D1.8B.D0.B5_.D0.BE.D0.B1.D0.BE.D0.B7.D0.BD.D0.B0.D1.87.D0.B5.D0.BD.D0.B8.D1.8F Википедия]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! f(x)!! g(x)!! O!! o!! Ω!! ω!! Θ&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! 2^100&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n * log(n)&lt;br /&gt;
! 2^100 * n * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n&lt;br /&gt;
! 2^100 * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n!&lt;br /&gt;
! 2^(2015n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n*2^n&lt;br /&gt;
! 3^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 5^n&lt;br /&gt;
! 5^(n+1)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n + n^2 + n^3 + ... + n^1000&lt;br /&gt;
! 7^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм Quickselect нахождения k-ого элемента по возрастанию: http://en.wikipedia.org/wiki/Quickselect&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;На улице стоит ряд домов. В каждом из домов лежит сколько-то денег. Вор хочет обокрасть дома на переулке. Он не может обокрасть два соседних дома, потому что хозяин дома, который он обокрал, сразу предупредит соседей. Нужно найти, какую максимальную сумму вор может украсть с переулка. На вход программы подается массив неотрицательных целых чисел - количество долларов в доме с номером i. Соседние дома в массиве представлены соседними элементами. Например, пусть задан массив { 1, 4, 5 } - тогда вор максимум может украсть $6, обокрав дома 1 и 3. Пусть задан массив { 1, 7, 2 } - тогда вор максимум может украсть $7, обокрав дом 2.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Алфавит из всех маленьких латинских букв и пробела закодирован числами следующим способом:&lt;br /&gt;
  &#039;a&#039; -&amp;gt; 1&lt;br /&gt;
  &#039;b&#039; -&amp;gt; 2&lt;br /&gt;
  &#039;c&#039; -&amp;gt; 3&lt;br /&gt;
  ...&lt;br /&gt;
  &#039;z&#039; -&amp;gt; 26&lt;br /&gt;
  &#039; &#039; -&amp;gt; 27&lt;br /&gt;
На вход программы подается строка из цифр. Нужно посчитать, сколькими способами можно раскодировать эту строку.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Дан граф, заданный матрицей смежности. Вывести пары вершин между которыми нет пути.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Повторение (02.04) ==&lt;br /&gt;
Решали и разбирали первые 4 задачи из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14* (до 11.03)===&lt;br /&gt;
Решите любые две задачи (подпункты НЕ считаются отдельными задачами) с предыдущей пары (Повторение (30.03)).&lt;br /&gt;
&lt;br /&gt;
== Повторение (06.04) ==&lt;br /&gt;
Будем решать вторую половину задач из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 15 (до 16.04)===&lt;br /&gt;
# Приведите пример графа, который содержит отрицательные рёбра, не содержит циклов отрицательного веса и для которого алгоритм Дейкстры возвращает неверный результат.&lt;br /&gt;
# Используется ли в алгоритме Дейкстры то, что веса рёбер неотрицательны? Если &amp;quot;да&amp;quot;, то где именно?&lt;br /&gt;
# Пусть граф содержит рёбра с весами &amp;gt;= -100. Если прибавить к каждому ребру 101 и при помощи алгоритма Дейкстры найти кратчайшие пути. Будут ли эти пути кратчайшими в исходном графе? Почему?&lt;br /&gt;
&lt;br /&gt;
== Повторение (07.04) ==&lt;br /&gt;
&#039;&#039;&#039;Решение рекуррентных соотношений&#039;&#039;&#039;&lt;br /&gt;
# Решите уравнение: T(n) = 4*T(n/2) + O(n^2) с базой T(1) = O(1)&lt;br /&gt;
## Используя основную теорему.&lt;br /&gt;
## Используя дерево рекурсий.&lt;br /&gt;
## Методом подстановки.&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2)) + n является \Theta(n lg n).&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2) + 17) + n является \Theta(n lg n).&lt;br /&gt;
# Решите уравнения, считая, что T(1) = O(1):&lt;br /&gt;
## T(n) = T(n-1) + n&lt;br /&gt;
## T(n) = 2*T(floor(sqrt(n))) + lg n. Указание: попробуйте использовать замену переменных.&lt;br /&gt;
## T(n) = 3*T(sqrt(n)) + lg n&lt;br /&gt;
# Дайте верхнюю и нижнюю оценки функции T(n). Постарайтесь, чтобы оценки были как можно более точные&lt;br /&gt;
## T(n) = 4T(n/3) + n*lg(n)&lt;br /&gt;
## T(n) = 3T(n/3) + n/lg(n)&lt;br /&gt;
## T(n) = 4T(n/2) + n^2*sqrt(n)&lt;br /&gt;
## T(n) = T(n/2) + T(n/4) + T(n/8) + n&lt;br /&gt;
## T(n) = T(n-1) + 1/n&lt;br /&gt;
## T(n) = T(n-2) + 1/lg(n)&lt;br /&gt;
## T(n) = sqrt(n) * T(sqrt(n)) + n&lt;br /&gt;
&#039;&#039;&#039;Анализ и построение алгоритмов&#039;&#039;&#039;&lt;br /&gt;
# Числа Фибоначчи F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; можно выразить через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, используя матрицу: https://yadi.sk/i/Pm_aNzHCforFU. &lt;br /&gt;
## Покажите как вычислить F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;.&lt;br /&gt;
## Как вычислить F&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;n+1&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;?&lt;br /&gt;
## Напишите алгоритм.&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
## Ускорьте его так, чтобы он работал за O(log n).&lt;br /&gt;
# Дана последовательность символов. Какое минимальное количество символов нужно удалить из неё, чтобы получить палиндром?&lt;br /&gt;
## Напишите алгоритм (на псевдокоде или на любом языке программирования).&lt;br /&gt;
## Оцените время работы алгоритма.&lt;br /&gt;
# Какую структуру данных вы бы использовали для реализации упорядоченного множества (http://neerc.ifmo.ru/wiki/index.php?title=Упорядоченное_множество)? Какая будет сложность каждой из операций над множеством?&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 16 (до 20.04)===&lt;br /&gt;
# Решите 6 задач из первой части и 6 из второй. (Укажите какие именно.) Каждый из подпунктов является отдельной задачей.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм и теорема Форда-Фалкерсона (16.04)==&lt;br /&gt;
# Базовые определения (пропускные способности, сток, исток и пр.). Пример. &lt;br /&gt;
# Ограничения на поток (сохранение и что меньше пропускных способностей).&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, пример работы&lt;br /&gt;
# Разрез, определение, пример.&lt;br /&gt;
# Утверждение: максимальный поток &amp;lt;= любого разреза.&lt;br /&gt;
# Теорема Форда-Фалкерсона (с доказательством).&lt;br /&gt;
# Пример на котором алгоритм Форда-Фалкерсонаработает работает очень долго при неудачном выборе путей.&lt;br /&gt;
# Сложность алгоритма Форда-Фалкерсона.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №3==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
В [https://official.contest.yandex.ru/contest/1196 домашнем задании] пять задач. Они разделены на два варианта, помеченные римскими цифрами I и II. Свой вариант нужно узнать [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing здесь на вкладке HW3]. Третья задача — общая для двух вариантов; ее решение необходимо снабдить доказательством корректности алгоритма. На выполнение задания дается примерно 2 недели (см. точное время окончания в контесте). Каждую задачу можно написать на С++ или Python.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Форда-Фалкерсона и Эдмондса-Карпа (20.04)==&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, напоминание: базовые определения, пример работы, пример на котором алгоритм работает долго, сложность.&lt;br /&gt;
# Алгоритм Эдмодса-Карпа. Доказательство асимптотики времени работы.&lt;br /&gt;
&lt;br /&gt;
==(23.04)==&lt;br /&gt;
&lt;br /&gt;
==(11.05) Красно-чёрные деревья==&lt;br /&gt;
[https://ru.wikipedia.org/wiki/Красно-чёрное_дерево Красно-чёрное дерево]&lt;br /&gt;
===Домашнее задание 17 (до 18.05)===&lt;br /&gt;
# Зачем нужны красно-чёрные деревья?&lt;br /&gt;
# Благодаря какому свойству и почему красно-чёрное дерево является сбалансированным?&lt;br /&gt;
# Нарисуйте полное бинарное дерево поиска высотой 3 с ключами {1, 2, ..., 15}. Сделайте из него красно-чёрные деревья высотой 2, 3 и 4.&lt;br /&gt;
# Нарисуйте красно-чёрные деревья, получающиеся последовательной вставкой элементов 12, 10, 29, 30, 31, 32 в [https://ru.wikipedia.org/wiki/Красно-чёрное_дерево#/media/File:Red-black_tree_example.svg данное дерево]. Для вставки используйте алгоритм вставки из Википедии. Укажите какой именно функцией вы воспользовались.&lt;br /&gt;
# Определим &#039;&#039;&#039;ослабленное красно-чёрное дерево&#039;&#039;&#039; как бинарное дерево поиска, которое удовлетворяет красно-чёрным свойствам 1, 3, 4 и 5. Другими словами, корень может быть как чёрным, так и красным. Рассмотрите ослабленное красно-чёрное дерево T, корень которого красный. Если перекрасить корень дерева T в чёрный, будет ли оно красно-чёрным деревом?&lt;br /&gt;
# Покажите, что самый длинный простой нисходящий путь от вершины x к листу красно-черного дерева имеет длину, не более чем в два раза превышающую кратчайший путь от x к листу-потомку.&lt;br /&gt;
# Чему равно наибольшее возможное количество внутренних узлов в красно-чёрном дереве с чёрной высоты k? А наименьшее возможное количество?&lt;br /&gt;
# Нарисуйте красно-чёрные деревья, получающиеся последовательной вставкой ключей 41, 38, 31, 12, 19, 8 в изначально пустое дерево.&lt;br /&gt;
# Покажите какие деревья будут получаться в результате последовательного удаления ключей в порядке 8, 12, 19, 31, 38, 41.&lt;br /&gt;
&lt;br /&gt;
==(14.05) Конкурентный анализ самоорганизующихся циклов==&lt;br /&gt;
[https://vk.com/doc12518218_390369758 Лекция]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 18 (до 21.05)===&lt;br /&gt;
Все вычисления сопроводите подробными объяснениями о том, почему верно то или иное (не)равенство.&lt;br /&gt;
# Пусть имеется n-элементный список и m поисковых запросов к нему. После каждой операции поиска можно переупорядочить список. Обозначим стоимость последовательности поисков через C. Докажите, что в худшем случае C = Ω(mn).&lt;br /&gt;
#  Обозначим через c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; стоимость i-ого поискового запроса с применением эвристики перемещения в начало, которая включает стоимость поиска элемента в списке и стоимость его перемещения в начало списка путём ряда обменов соседних элементов списка. Покажите, что i-ая операция поиска находит элемент x в списке L с применением эвристики перемещения в начало, то c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = 2 * rank&amp;lt;sub&amp;gt;L&amp;lt;/sub&amp;gt;(x) - 1.&lt;br /&gt;
# Покажите, что c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = 2 * rank&amp;lt;sub&amp;gt;L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) - 1.&lt;br /&gt;
# Покажите, что c*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = rank&amp;lt;sub&amp;gt;L*&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) + t&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;.&lt;br /&gt;
# Докажите, что после одного обмена двух соседних элементов потенциал либо увеличивается на 2, либо уменьшается на 2.&lt;br /&gt;
# Докажите, что rank&amp;lt;sub&amp;gt;L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) = |A| + |B| + 1.&lt;br /&gt;
# Докажите, что rank&amp;lt;sub&amp;gt;L*&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) = |A| + |С| + 1.&lt;br /&gt;
# Покажите, что поиск i-ого элемента приводит к изменению потенциала Ф(L&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;) - Ф(L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;) &amp;lt;= 2 (|A| - |B| + t*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;), где t*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; --- это количество обменов при i-ом поиске.&lt;br /&gt;
# Во сколько раз стоимость С&amp;lt;sub&amp;gt;MFT&amp;lt;/sub&amp;gt;(S) превышает C&amp;lt;sub&amp;gt;OPT&amp;lt;/sub&amp;gt;(S)?&lt;br /&gt;
&lt;br /&gt;
== (18.05) Конечные автоматы ==&lt;br /&gt;
=== Задание 19 (до 25.05) ===&lt;br /&gt;
# Постройте автомат для языка над алфавитом Σ = {0, 1} каждое слово которого содержит хотя бы два нуля. Является ли он детерминированным?&lt;br /&gt;
# Постройте автомат над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5. Является ли он детерминированным?&lt;br /&gt;
# Постройте автомат, который допускает пустой язык (язык в котором нет ни одного слова).&lt;br /&gt;
# Постройте автомат, который допускает все слова над алфавитом Σ.&lt;br /&gt;
# Постройте ДКА над алфавитом Σ = {К, Ж, З}, который допускает слова в которых после К идёт З, после З --- Ж, после Ж --- К.&lt;br /&gt;
# * Постройте ДКА над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5, а число нулей на 3.&lt;br /&gt;
# Постройте НКА для языка над алфавитом Σ = {0, 1, 2, 3}, состоящий из слов, в которых хотя бы одна из последних пяти букв является 1.&lt;br /&gt;
# Постройте НКА над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5, а число нулей на 3.&lt;br /&gt;
# Какие языки допускают автоматы https://yadi.sk/d/fNAHbjCZghERG?&lt;br /&gt;
# Для каждого из автоматов https://yadi.sk/d/fNAHbjCZghERG постройте соответствующий ему ДКА.&lt;br /&gt;
&lt;br /&gt;
== (21.05) Регулярные выражения, КА, их эквивалентность. Лемма о накачке  ==&lt;br /&gt;
=== Задание 20 (до 28.05) ===&lt;br /&gt;
&#039;&#039;&#039;I Написать регулярные выражения&#039;&#039;&#039;&lt;br /&gt;
# Напишите регулярное выражение для языка над алфавитом Σ = {0, 1} каждое слово которого содержит хотя бы два нуля.&lt;br /&gt;
# Напишите регулярное выражение над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5.&lt;br /&gt;
# Напишите регулярное выражение, которое допускает пустой язык (язык в котором нет ни одного слова).&lt;br /&gt;
# Напишите регулярное выражение, которое допускает все слова над алфавитом Σ.&lt;br /&gt;
# Напишите регулярное выражение для языка над алфавитом Σ = {0, 1, 2, 3}, состоящий из слов, в которых хотя бы одна из последних пяти букв является 1.&lt;br /&gt;
&#039;&#039;&#039;II КА и регулярные выражения&#039;&#039;&#039;&lt;br /&gt;
# Постройте конечный автомат для языка (111 + 01)&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;1(00 + 11)&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&#039;&#039;&#039;III Доказать замкнутость относительно различных операций&#039;&#039;&#039;&lt;br /&gt;
# Покажите, что если для языков L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; и L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; существует КА, который их читает, то существует КА и для их объединения L = {w | w ∈ L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; или w ∈ L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;}.&lt;br /&gt;
# Покажите, что если для языка L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; и L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; существует КА, который их читает, то существует КА и для языка L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; = {xy | x ∈ L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, y ∈ L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;}.&lt;br /&gt;
# Покажите, что если для языка L существует КА, который его читает, то существует КА и для &#039;&#039;&#039;замыкания Клини&#039;&#039;&#039; L* = {w&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; w&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; ... w&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;| w&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; ∈ L, w&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; ∈ L, ..., w&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; ∈ L}.&lt;br /&gt;
# Покажите, что если язык L регулярен, то регулярно его дополнение (т.е. язык над тем же алфавитом, которому принадлежит слово тогда и только тогда, когда оно НЕ принадлежит L) .&lt;br /&gt;
# Покажите, что если язык L регулярен, то регулярно его обращение L&amp;lt;sub&amp;gt;R&amp;lt;/sub&amp;gt; = {a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; . . . a&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; | a&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; . . . a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; ∈ L}. (L&amp;lt;sub&amp;gt;R&amp;lt;/sub&amp;gt; --- это язык в котором все слова языка L записаны наоборот.)&lt;br /&gt;
# * Покажите, что если языки L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; и L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; регулярны, то регулярно их пересечение.&lt;br /&gt;
&#039;&#039;&#039;IV Использование леммы о накачке&#039;&#039;&#039;&lt;br /&gt;
# Докажите, что не существует КА, который бы читал язык {0&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;1&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;2&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;}. (Пояснение: запись 0&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; означает строку из n нулей: 00...0.)&lt;br /&gt;
# Докажите, что не существует КА, который бы читал язык {0&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;1&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;}.&lt;br /&gt;
# Докажите, что не существует КА, который бы читал язык {0&amp;lt;sup&amp;gt;n!&amp;lt;/sup&amp;gt;}.&lt;/div&gt;</summary>
		<author><name>Kassalanche</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=13887</id>
		<title>Алгоритмы и структуры данных. Подгруппа 105-1</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=13887"/>
		<updated>2015-05-21T04:38:16Z</updated>

		<summary type="html">&lt;p&gt;Kassalanche: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==О курсе==&lt;br /&gt;
[[Алгоритмы_и_структуры_данных|План лекций и список рекомендуемой литературы.]]&lt;br /&gt;
&lt;br /&gt;
[[Алгоритмы_и_структуры_данных._Подгруппа_105-1._FAQ|FAQ.]]&lt;br /&gt;
&lt;br /&gt;
[[Reviewboard|Инструкция по использованию Reviewboard.]]&lt;br /&gt;
&lt;br /&gt;
[[Практические_занятия_по_курсу_ОиМП/C++_check|Style guide.]]&lt;br /&gt;
&lt;br /&gt;
==Итоговая оценка за курс==&lt;br /&gt;
Итоговая оценка (ИО) зависит от&lt;br /&gt;
* оценок за пять больших домашних заданий (БДЗ1, БДЗ2, ..., БДЗ5),&lt;br /&gt;
* оценок за домашние задания (ДЗ1, ДЗ2, ...),&lt;br /&gt;
* оценки за контрольную работу (КР),&lt;br /&gt;
* оценки за экзамен (ЭКЗ),&lt;br /&gt;
и может быть вычислена по формуле:&lt;br /&gt;
 ИО = 0.7 * (0.3 * КР + 0.7 *(ИДЗ1 + ИДЗ2 + ИДЗ3 + ИДЗ4 + ИДЗ5)/5) + 0.3 * ЭКЗ =&lt;br /&gt;
    = 0.21*КР + 0.98*ИДЗ1 + 0.98*ИДЗ2 + 0.98*ИДЗ3 + 0.98*ИДЗ4 + 0.98*ИДЗ5 + 0.3*ЭКЗ,&lt;br /&gt;
где&lt;br /&gt;
 ИДЗi = min (10, 0.7 * БДЗi + 0.4 * &amp;lt;cредняя оценка за ДЗj, прошедшие с предыдущего БДЗ по i-ое&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
==Порядок сдачи домашних работ==&lt;br /&gt;
===Большие домашние работы===&lt;br /&gt;
# Получить OK за задачу в контесте.&lt;br /&gt;
# Залить исходный код на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* На каждую задачу создавайте отдельный запрос на ревью. &lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении суток приходят замечания к коду. &#039;&#039;&#039;Если в течении суток замечаний или Ship It не появилось, проверьте, что вы правильно отправили запрос и, если всё сделано правильно, спросите у семинариста получил ли он запрос.&#039;&#039;&#039;&lt;br /&gt;
# Вы их исправляете, проверяете в контесте, что программа по-прежнему проходит все тесты, заливаете новую версию в Review Board. Штрафов за посылки НЕ будет.&lt;br /&gt;
# Процесс повторяется пока остаются замечания к коду или пока не истёк дедлайн. После закрытия контеста будут ещё одни сутки на доработку замечаний в Review Board.&lt;br /&gt;
# Оценивается только последняя версия работы в Review Board.&lt;br /&gt;
&lt;br /&gt;
===Маленькие домашние работы===&lt;br /&gt;
# Залить решение на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* Желаемые форматы: txt, py, cpp, h. Допускаются любые другие.&lt;br /&gt;
#* На каждую домашнюю работу создавайте отдельный запрос на ревью. Обязательно указывайте номер домашней работы.&lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении неопределенного промежутка времени придут оценки по каждому из заданий.&lt;br /&gt;
&lt;br /&gt;
==Оценивание домашних работ==&lt;br /&gt;
* Все задания предполагаются индивидуальными. Запрещены любые заимствования без ссылки на автора.&lt;br /&gt;
* Решения после установленного дедлайна не принимаются. Дедлайн указан в заголовке каждого задания.&lt;br /&gt;
* Везде, где требуется написать алгоритм, можно использовать любой язык программирования или псевдокод.&lt;br /&gt;
* Там, где требуется построить алгоритм с заданной асимптотикой, приведите обоснование, что полученный алгоритм удовлетворяет этому условию.&lt;br /&gt;
* Эти правила не действуют, если в задании явно оговорено иное.&lt;br /&gt;
&lt;br /&gt;
==Мотивация к изучению алгоритмов. Подсчёт числа операций (12.01)==&lt;br /&gt;
# Числа Фибоначчи. Определение. Примитивный рекурсивный алгоритм вычисления i-ого числа. Оценка числа операций. Анализ причин неэффективности. Алгоритм с запоминанием вычисленных ранее значений. Оценка числа операций. Сравнение с предыдущим. (подробнее: глава 0, страницы 8-10 из книги &amp;lt;&amp;lt;Алгоритмы&amp;gt;&amp;gt;, [[Алгоритмы_и_структуры_данных|см. список рекомендованной литературы]])&lt;br /&gt;
# Задача о ханойской башне. Постановка задачи. Рекурсивный алгоритм. Рекуррентная формула для числа перемещений. Замкнутая формула для числа перемещений (+ доказательство). Доказательство того, что эту задачу нельзя решить используя меньшее число перемещений дисков. ([https://www.dropbox.com/s/t8cbs7ttu4iasvj/algo-0-recursion.pdf?dl=0 Разбор задачи о ханойской башне], автор Сергей Объедков)&lt;br /&gt;
# Сортировка пузырьком. Алгоритм. Подсчёт количество операций сравнения и обмена (swap). Анализ наилучшего и наихудшего случаев ([https://ru.wikipedia.org/wiki/Сортировка_пузырьком Википедия])&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 1 (12.01 - 26.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
Во всех задачах, если не оговорено иного, предполагаем, что работаем с целыми неотрицательными числами. Для первых 7 задач необходимо&lt;br /&gt;
* описать что можно считать наилучшим и наихудшим случаями,&lt;br /&gt;
* для каждого из двух случаев подсчитать отдельно количество операций сравнения и swap (если есть).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Даны три числа, требуется вернуть наименьшее.&lt;br /&gt;
# Даны три числа, требуется отсортировать их.&lt;br /&gt;
# Дана последовательность A из n элементов и число x, требуется найти элемент равный x. Примечание: если таких значений i несколько, вернуть любое; если такого элемента нет, функция должна сообщить об этом.&lt;br /&gt;
# * Дана упорядоченная последовательность A из n элементов и число x, требуется найти такое i, что A[i] равно x. Алгоритм должен быть эффективней, чем в предыдущем пункте и использовать то, что последовательность упорядочена.&lt;br /&gt;
# Дана последовательность из 100 000 чисел от 0 до 100. Напишите эффективный алгоритм сортировки, который бы учитывал специфику входных данных.&lt;br /&gt;
# * Дано 32 битное неотрицательное число. Требуется номер первого ненулевого бит. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения, считая, что числа распределены равномерно.&lt;br /&gt;
# * Даны 32 битные неотрицательные числа m и n. Требуется вывести True, если m &amp;lt; n, иначе False. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения битов, считая, что числа распределены равномерно.&lt;br /&gt;
# Напишите рекурсивную функцию, вычисляющую n-ое число Фибоначчи (как на занятии). Подсчитайте количество рекурсивных вызовов.&lt;br /&gt;
# * Напишите функцию, вычисляющую n-ое число Фибоначчи, у которой число операций — полином от n, и которая использует количество памяти, независящее от n.&lt;br /&gt;
&lt;br /&gt;
==O-символика и стратегия &amp;quot;разделяй и властвуй&amp;quot; (15.01)==&lt;br /&gt;
# Сортировка слиянием. Алгоритм, рекуррентное соотношение для времени сортировки, сложность. Подробнее: [https://dl.dropboxusercontent.com/u/829163/draft.pdf §2.3 Сортировка слиянием (стр. 54)].&lt;br /&gt;
# О-символика. [https://dl.dropboxusercontent.com/u/829163/draft.pdf §0.3 О-символика (стр. 10)].&lt;br /&gt;
# Задача о слиянии m упорядоченных массивов по n элементов. Три алгоритма решения: последовательное слияние, слияние &amp;quot;деревом&amp;quot; (обе функции используют Merge из MergeSort), аналог Merge для m массивов. Анализ сложности каждого из них.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 2 (15.01-29.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
* Во всех задачах, если не оговорено иного, для простоты &#039;&#039;можно&#039;&#039; считать, что n является степенью какого-либо числа, например, степенью двойки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Дана функция F, определённая ниже. Сколько строк она напечатает? Указание: для обоих подпунктов рассмотрите два случая: 1. n является степенью двойки, 2. n не является степенью двойки.&lt;br /&gt;
## Запишите рекуррентное соотношение для числа строк.&lt;br /&gt;
## Решите уравнение, полученное в предыдущем пункте, то есть, выведите замкнутую (нерекуррентную формулу). Для простоты можно считать, что n является степенью двойки.&lt;br /&gt;
# В массиве A размера n записана возрастающая последовательность целых чисел. Постройте алгоритм типа &amp;quot;разделяй и властвуй&amp;quot;, который проверяет, существует ли такой индекс i, что A[i] = i&lt;br /&gt;
## за время O(n),&lt;br /&gt;
## * за время O(log n).&lt;br /&gt;
## Какие случаи для вашего алгоритма являются наихудшими и наилучшими? Какого время работы в лучшем и худшем случаях?&lt;br /&gt;
# Дан бесконечный массив A, первые n элементов которого содержат возрастающую последовательность положительных чисел, а дальше стоят -1. Значение n не дано. Постройте алгоритм, который получает на вход целое число x и находит это x в массиве --- или говорит, что там его нет, &lt;br /&gt;
## за время O(n),&lt;br /&gt;
## за время O(log n).&lt;br /&gt;
# Рассмотрим алгоритм вычисления наибольшего общего делителя (НОД) двух положительных чисел, основанный на методе &amp;quot;разделяй и властвуй&amp;quot;.&lt;br /&gt;
## (задание не оценивается) Прочитайте [https://dl.dropboxusercontent.com/u/829163/draft.pdf §1.2.3 Алгоритм Евклида (стр. 23)].&lt;br /&gt;
## * Докажите, что определение НОД-а, приведённое ниже, корректно.&lt;br /&gt;
## Постройте алгоритм, основанный на этом определении.&lt;br /&gt;
## Какой алгоритм будет быстрее для n-битовых чисел a и b при больших значениях n --- ваш или алгоритм Евклида?&lt;br /&gt;
# * Покажите как за время O(n log n) удалить из массива размера n все дубликаты, то есть оставить каждый элемент в одном экземпляре.&lt;br /&gt;
# * Даны два упорядоченных массива размера m и n. Постройте алгоритм, находящий k-й по величине элемент в объединении этих массивов за время O(log(n+m)). &lt;br /&gt;
&lt;br /&gt;
Функция F(n).&lt;br /&gt;
  если n &amp;gt; 1:&lt;br /&gt;
    напечатать &amp;quot;всё ещё работаю&amp;quot;&lt;br /&gt;
    F(n/2)&lt;br /&gt;
    F(n/2)&lt;br /&gt;
&lt;br /&gt;
Определение НОД-а.&lt;br /&gt;
             2НОД(a/2, b/2), если а и b чётны,&lt;br /&gt;
  НОД(a,b) = НОД(a, b/2), если а нечётно, b чётно,&lt;br /&gt;
             НОД((a-b)/2, b), если а и b нечётны.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;lt;nowiki&amp;gt;Задачи взяты из книги &amp;quot;Алгоритмы&amp;quot;, глава 2 (см. список рекомендованной литературы).&amp;lt;/nowiki&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Сложение и умножение (19.01)==&lt;br /&gt;
# Алгоритм сложения, его сложность (§1.1.1 Сложение*)&lt;br /&gt;
# &amp;quot;Школьный&amp;quot; алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Рекурсивный алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Алгоритм умножения, реализующий стратегию &amp;quot;разделяй и властвуй&amp;quot;, анализ сложности (§2.1 Умножение чисел*)&lt;br /&gt;
 * [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать.]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 3 (19.01 - 2.02)===&lt;br /&gt;
* Во всех задачах для простоты можно считать, что n является степенью какого-либо числа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Найдите произведение чисел 10011011 и 10111010 (в двоичной системе счисления), используя алгоритм умножения чисел, основанный на методе «разделяй и властвуй». Необходимо не только дать ответ, но и привести ход решения.&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 3 рекурсивных вызова для подзадач размера n-1 и комбинирует из них решение исходной задачи за О(n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте три верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 10 рекурсивных вызовов для подзадач размера n/2 и комбинирует из них решение исходной задачи за О(5n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте два верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Докажите, что 3m² + m = O(m²).&lt;br /&gt;
# Докажите, что lg m = O(m/1000), где lg m — это логарифм с двоичным основанием.&lt;br /&gt;
# Докажите, что из равенства f(n) = O(g(n)) не следует, что g(n) = O(f(n)).&lt;br /&gt;
# Докажите, что O(m) содержится в O(m²).&lt;br /&gt;
&lt;br /&gt;
==Решение рекуррентных уравнений (22.01)==&lt;br /&gt;
# Примеры решений рекуррентных уравнений (см. [https://www.dropbox.com/s/6a0r410zjm9qwe7/algo-3-recurrences.pdf?dl=0 конспект]).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 4 (до 14.02)===&lt;br /&gt;
* Нельзя использовать утверждение основной теоремы о решении рекуррентных соотношений.&lt;br /&gt;
* &#039;&#039;Можно&#039;&#039; использовать метод построения дерева рекурсии или подстановку (метод с угадыванием ответа).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Какой из трёх приведённых ниже алгоритмов вы бы предпочли? Обоснуйте свой ответ.&lt;br /&gt;
#* Алгоритм A, решая задачу, производит пять рекурсивных вызовов для подзадач вдвое меньшего размера, после чего строит ответ для исходной задачи за линейное время.&lt;br /&gt;
#* Алгоритм B, решая задачу размера n, делает два рекурсивных вызова для задач размера n − 1, после чего находит ответ за время O(1).&lt;br /&gt;
#* Алгоритм C, решая задачу размера n, рекурсивно решает девять задач размера n/3 и строит ответ за время O(n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Найдите T(n) в замкнутой форме для любых 7 из 10 приведённых ниже рекуррентных соотношений:&lt;br /&gt;
## T(n) ≤ 2T(n/3) + 1;&lt;br /&gt;
## T(n) ≤ 7T(n/7) + n;&lt;br /&gt;
## T(n) ≤ 9T(n/3) + n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 8T(n/2) + n&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 49T(n/25) + n&amp;lt;sup&amp;gt;3/2&amp;lt;/sup&amp;gt;log n;&lt;br /&gt;
## T(n) ≤ T(n − 1) + 2;&lt;br /&gt;
## T(n) ≤ T(n − 1) + n&amp;lt;sup&amp;gt;c&amp;lt;/sup&amp;gt;, где c ≥ 1 –– константа;&lt;br /&gt;
## T(n) ≤ T(n − 1) + c&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;, где c &amp;gt; 1 –– константа;&lt;br /&gt;
## T(n) ≤ 2T(n − 1) + 1;&lt;br /&gt;
## T(n) ≤ T(sqrt(n)) + 1.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №1==&lt;br /&gt;
Необходимо реализовать все 6 задач из [https://official.contest.yandex.ru/contest/1002 контеста]. Каждую задачу можно писать на С++ или Python. На выполнение работы отводится две недели. Каждая задача оценивается в 10/6 балла. Оценка &#039;&#039;может&#039;&#039; быть снижена за плохой код, но не более чем на 25%.&lt;br /&gt;
&lt;br /&gt;
==Бинарное дерево поиска (26.01)==&lt;br /&gt;
# Определение. Пример.&lt;br /&gt;
# Не модифицирующие алгоритмы: поиск (рекурсивный и итеративный алгоритмы), поиск минимума, inordered обход (вывод значений узлов в отсортированном порядке), поиск следующего по возрастанию.&lt;br /&gt;
# Модифицирующие алгоритмы: вставка (рекурсивная реализация), удаление (только идея).&lt;br /&gt;
 [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 13, стр. 248]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 5 (до 16.02)===&lt;br /&gt;
* Для получения максимальной оценки можно выполнить или все задачи без звёздочки, или задачу со звёздочкой. Преподаватель понимает, что реализацию БДП сложно не найти в интернете, но от копипасты не будет никакой пользы. Напротив, самостоятельная реализация очень полезна и приветствуется, даже если не получится выполнить всех пунктов задания.&lt;br /&gt;
* Задачи с двумя звёздочками необязательны.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Нарисуйте бинарные деревья поиска высотой 2, 3, 4, 5 и 6 для множества ключей {1, 4, 5, 10, 16, 17, 21}. Корень дерева имеет высоту 0.&lt;br /&gt;
# &#039;&#039;&#039;Сортировка с использованием БДП.&#039;&#039;&#039;&lt;br /&gt;
## Какова асимптотическая сложность алгоритма вставки элемента в дерево высоты d? Почему? Назовите наилучший и наиухдший случаи.&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который строит БДП в узлах которого стоят элементы данной последовательности. Можно использовать функцию Insert. Назовите наилучший и наихудший случаи. Есть теорема о том, что полученный алгоритм будет работать в среднем случае за время O(n * log n).&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который выводит их в порядке возрастания. Используйте бинарное дерево поиска. Какова в среднем случае сложность этого алгоритма? Назовите наилучший и наихудший случаи. Какова сложность в наихудшем случае?&lt;br /&gt;
# Напишите функцию GetRoot, которой на вход подаётся указатель на произвольный узел дерева, а она возвращает указатель на корень.&lt;br /&gt;
# Напишите процедуру PrintLeafs, которой на вход подаётся указатель на корень дерева, и она печатает листья дерева&lt;br /&gt;
## по возрастанию,&lt;br /&gt;
## по убыванию.&lt;br /&gt;
# ** Альтернативный обход в порядке возрастания бинарного дерева поиска с n узлами (или центрированный (inordered) обход) можно осуществить путём поиска минимального элемента дерева с помощью функции Minimum с последующий n-1 вызовом функции Next. Каково время работы такого алгоритма?&lt;br /&gt;
# * Реализуйте на С++ структуру данных бинарное дерево поиска, [https://yadi.sk/i/gi2SEStreFfSb используя заготовку].&lt;br /&gt;
## Нарисуйте бинарное дерево поиска, которое строится в функции getTreeExample.&lt;br /&gt;
## Реализуйте следующие алгоритмы: &lt;br /&gt;
### поиск минимума, &lt;br /&gt;
### inordered обход (вывод значений узлов в отсортированном порядке),&lt;br /&gt;
### поиск следующего по возрастанию,&lt;br /&gt;
### вставка элемента в дерево,&lt;br /&gt;
### сортировка последовательности с использованием БДП (дан вектор чисел, необходимо вывести их по возрастанию),&lt;br /&gt;
### ** удаление.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Карацубы, Штрассена. Быстрая сортировка (29.01)==&lt;br /&gt;
# Алгоритм Карацубы.&lt;br /&gt;
# Алгоритм Штрассена. [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать Дасгупту и др., §2.5 Умножение матриц]&lt;br /&gt;
# Быстрая сортировка и доказательство того, что в среднем случае она работает за О(n * log n). [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 8 Быстрая сортировка, стр. 148]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 6 (до 18.02)===&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Пусть мы хотим найти двоичное представление десятичного числа 10&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;. Будем считать, что n --- степень двойки (n = 2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt;).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Pwr2Bin(n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть 1010&lt;br /&gt;
    z = ...&lt;br /&gt;
    вернуть Multiply(z, z)&amp;lt;/source&amp;gt;&lt;br /&gt;
Multiply --- функция, перемножающая два n-битовых двоичных числа x и y по алгоритму Карацубы за O(n&amp;lt;sup&amp;gt;log&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;3&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Пусть мы хотим перевести произвольное десятичное число x в записи которого n=2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; чисел в двоичную систему счисления.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Dec2Bin(x, n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть binary[x]&lt;br /&gt;
    разделить x на два десятичных числа xl и xr из n/2 цифр.&lt;br /&gt;
    вернуть ...&amp;lt;/source&amp;gt;&lt;br /&gt;
Здесь binary --- это массив, содержащий двоичное представление десятичных цифр.&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Докажите, что математическое ожидание времени работы алгоритма быстрой сортировки (усреднение по всем вариантам выбора опорного элемента) на любом входе размера n удовлетворяет соотношению: T(n) ≤ O(n) + 1/n * &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt; (T(i-1) + T(n-i)).&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Найдите решение соотношения из предыдущего пункта.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Динамическое программирование (ДП). Первые примеры (02.01)==&lt;br /&gt;
# Нахождение самой длинной возрастающей подпоследовательности.&lt;br /&gt;
# Нахождение редакционного расстояния (или редакционной стоимости, расстояния Левенштейна).&lt;br /&gt;
# Нахождение представителя большинства.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 7 (до 20.02)===&lt;br /&gt;
* В этом задании везде, где требуется реализовать алгоритм, необходимо привести код на любом языке программирования.&lt;br /&gt;
* Для получения максимальной оценки нужно решить все задачи без звёздочек. Одна решённая задача со звёздочкой заменяет одну задачу без звёздочки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения редакционного расстояния (алгоритм Вагнера — Фишера). Например, редакционное расстояние между словами &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равно 6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения длины наибольшей общей подстроки. Например, длина наибольшей общей подстроки &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равна 8 (&amp;quot;antholog&amp;quot;). Чем больше это значение, тем схожей строки.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Предположим теперь, что сравниваемые строки состоят из символов A, С, G и T; за удаление или вставку мы платим -5; за замену буквы x на y платим w[x, y], где x, y принадлежат множеству {A, С, G, T}, a w — это матрица весов:&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
!-!! A!! G!! C!! T&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! A&lt;br /&gt;
|10||-1||-3||-4&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
!G&lt;br /&gt;
||-1||7||-5||-3&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! C&lt;br /&gt;
||-3||-5||9||0&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! T&lt;br /&gt;
||-4||-3||0||8&lt;br /&gt;
|}&lt;br /&gt;
Тогда выравнивание:&lt;br /&gt;
 AGACTAGTTAC&lt;br /&gt;
 CGA‒‒‒GACGT&lt;br /&gt;
будет иметь следующую оценку:&lt;br /&gt;
 w[A,C] + w[G,G] + w[A,A] + 3*(-5) + w[G,G] + w[T,A] + w[T,C] + w[A,G] + w[C,T] = -3 + 7 + 10 - 3*5 + 7 + (-4) + 0 + (-1) + 0 = 1.&lt;br /&gt;
&lt;br /&gt;
Напишите алгоритм, который находит максимальную стоимость всех возможных выравниваний. Верно ли, что чем больше это значение, тем непохожей строки?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как давно один народ отделился от другого? Кто похожей — итальянец и китаец или якут и эфиоп? На эти вопросы можно отвечать с разных точек зрения — культурной, исторической, лингвистической, ... В последние же годы человечество научилось секвенировать геном, что позволило исследовать этот вопрос с точки зрения генетики. Секвенирование генома — это процесс записи ДНК в виде нуклеотидной последовательности, которая представляет собой последовательность из четырёх символов — A, С, G и T. Существуют базы, которые хранят генетическую информацию о людях из разных стран и континентов, например, [http://www.mtdb.igp.uu.se/ http://www.mtdb.igp.uu.se/ → Download mtDNA sequences]. Чем больше сходство между геномами, тем сильнее родственные связи между их обладателями. Используя решение предыдущего пункта, выполните задания:&lt;br /&gt;
# Определите, кто похожей — итальянец и китаец или якут и эфиоп?&lt;br /&gt;
# Найдите нескольких похожих и нескольких непохожих народностей.&lt;br /&gt;
# * Выберите одну народность. Найдите самых похожих и самых непохожих на неё.&lt;br /&gt;
# * Найдите самые похожие и самые непохожие народности.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Задача о разрезании стержня (05.01)==&lt;br /&gt;
# Постановка задачи.&lt;br /&gt;
# Решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Решение с нахождением максимума по p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Восходящий алгоритм с запоминанием. Вывод длин кусочков стержня. Оценка сложности.&lt;br /&gt;
# Нисходящий алгоритм с запоминанием. Оценка сложности.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.1 Разрезание стержня, стр. 393]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 8 (до 22.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Решая задачу о разрезании стержня мы вначале построили рекурсивное решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt; для всех 1 ≤ i &amp;lt; n. Его сложность описывалась рекуррентной формулой T(n) = n + &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n-1&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt;(T(i) + T(n-i)), T(1) = 1.&lt;br /&gt;
# Объясните эту формулу.&lt;br /&gt;
# Покажите с помощью метода подстановок, что T(n) ≤ 2&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Покажите с помощью контрпримера, что описанная далее жадная стратегия не всегда определяет оптимальный способ разрезания стержня. Определим плотность стержня длиной i как p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;/i, то есть как стоимость единицы его длины. Жадная стратегия для стержня длиной n отрезает от стержня первую часть длиной i, где 1 ≤ i ≤ n, имеющую максимальную плотность. Затем та же жадная стратегия применяется к оставшейся части длиной n-i.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Рассмотрим модификацию задачи разрезания стержня, в которой в дополнение к цене p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; каждого стержня добавляется фиксированная цена разреза c. Теперь прибыль, связанная с решением, представляет собой сумму цен частей стержня минус стоимость разрезов. Разработайте алгоритм динамического программирования для этой модифицированной задачи.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Непрерывным участком называется группа подряд идущих элементов. Например, для последовательности&lt;br /&gt;
 5, 15, −30, 10, −5, 40, 10&lt;br /&gt;
элементы 15, −30, 10 образуют непрерывный участок, а 5, 15, 40 -- нет. Постройте линейный алгоритм для следующей задачи:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Вход: список чисел a1, a2, ... ‌, an.&lt;br /&gt;
Выход: непрерывный участок с максимальной суммой (сумма участка нулевой длины равна нулю).&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Для приведённого примера ответом будет 10, −5, 40, 10 с суммой 55. Какова сложность алгоритма? Почему?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Надо заплатить v рублей, имея купюры в x1, x2, ‌..., xn рублей (купюр каждого типа сколько угодно). Это не всегда возможно (скажем, купюрами в&lt;br /&gt;
10 и 25 рублей можно заплатить 45 рублей, но не 47 и не 15). Постройте основанный на методе динамического программирования алгоритм со временем работы O(nv), выясняющий, возможна ли уплата.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как решить предыдущую задачу, если каждая купюра имеется в единственном экземпляре? (Например, купюрами в 1, 5, 10, 20 рублей можно заплатить 16 = 1 + 5 + 10 и 31 = 1 + 10 + 20 рублей, но не 40 (не хватит денег). Время работы алгоритма по-прежнему O(nv).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Ещё один вариант той же задачи: купюр каждого типа сколько угодно, но всего разрешается использовать не более k купюр. (Например, если есть купюры в 5 и 10 рублей, а k = 6, то 55 разменять можно, а 65 –– нет).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Перемножение цепочки матриц. Оптимальное бинарное дерево поиска (начало) (09.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о перемножении цепочки матриц. Постановка задачи.Пример. Нисходящий алгоритм.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.2 Перемножение цепочки матриц, стр. 403]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 9 (до 24.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Найдите оптимальную расстановку скобок в произведении последовательности матриц, размерности которых равны 5×10, 10×3, 3×12, 12×5, 5×50, 50×6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Напишите восходящий алгоритм для поиска оптимальной расстановки скобок.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Расстановка пробелов. Оптимальное бинарное дерево поиска (середина) (12.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о расстановке пробелов. Постановка задачи. Решения для трёх случаев: 1. нужно вернуть можно ли разбить текст на слова; 2. вернуть разбивку на слова; 3. слова встречаются не равновероятно, вернуть наиболее вероятную разбивку на слова.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи. Вывод математического ожидания времени поиска.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Праздничное домашнее задание 10 (до 02.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[&amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;,&amp;quot;, &amp;quot;.&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;,&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;.&amp;quot;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Подсказка:&#039;&#039;&#039; разбейте текст на слова из списка и посмотрите на азбуку Морзе.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Способы представления графов в памяти (16.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Разбор ошибок в домашнем задании.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Графы. Способы представления графов в памяти (матрица смежности, список рёбер, список соседей (список смежностей), матрица инцидентности). Зависимость сложности алгоритмов от способа представления.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §22.1 Представление графов, стр. 626]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 11 (до 02.03)===&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача A.]&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача B.]&lt;br /&gt;
# Нарисуйте неориентированный граф с 5 вершинами и 8 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Нарисуйте ориентированный граф с 4 вершинами и 3 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Дан ориентированный граф. &#039;&#039;Исходящая степень вершины v&#039;&#039; --- это количество исходящих из неё рёбер, &#039;&#039;входящая степень v&#039;&#039; --- это количество рёбер входящих в  v. Имеется представление ориентированного графа с использование списка соседей. Как долго будут вычисляться исходящие степени всех вершин графа? А входящие степени?&lt;br /&gt;
# Дан граф G = (V, E). Какие из рассмотренных способов хранения графов используют меньше всего памяти для хранения G и почему? Указание: рассмотрите случаи |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;lt; |E| и |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;gt; |E|.&lt;br /&gt;
# Пусть C --- это матрица смежности графа G.&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
# Пусть B --- это матрица инцидентности ориентированного графа G. Как связаны элементы матрицы BB&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
&lt;br /&gt;
==Реализация поиска в глубину (19.02)==&lt;br /&gt;
# Реализация поиска в глубину и смежных задач.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 12 (до 5.03)===&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Выберите любой способ хранения графа. Реализуйте поиск в глубину.&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Напишите алгоритм, который возвращает данные о том, какие вершины лежат в одной компоненте связности.&lt;br /&gt;
# &#039;&#039;(любой ЯП или псевдокод)&#039;&#039; Напишите алгоритм проверки сильной связности ориентированного графа. Какова его сложность?&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №2==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
Необходимо реализовать 3 задачи из [https://official.contest.yandex.ru/contest/1085 контеста], см. [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing распределение задач]. Каждую задачу можно написать на С++ или Python. На выполнение работы отводится две недели (см. время окончания контеста). [https://official.contest.yandex.ru/contest/1123 Дорешивание.]&lt;br /&gt;
&lt;br /&gt;
==ДП и графы (26.02)==&lt;br /&gt;
==ДП и графы (02.03)==&lt;br /&gt;
==Жадные алгоритмы (12.03)==&lt;br /&gt;
===Домашнее задание 13 (до 23.03)===&lt;br /&gt;
# Вася хочет купить по одной акции каждой компании. Все акции стоят одинаково, но дорожают по-разному. Каждый месяц акция i-ой компании дорожает в r_i раз. В один месяц можно купить только одну акцию.&lt;br /&gt;
## Напишите алгоритм, который выводит оптимальную последовательность покупок (такую, что на покупку всех акций потратится меньше денег).&lt;br /&gt;
## Докажите корректность алгоритма, то есть докажите, что последовательность покупок, которую выводит ваш алгоритм, оптимальна.&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список, очередь (16.03)==&lt;br /&gt;
# Реализация линейного двусвязного списка (С++).&lt;br /&gt;
# Реализация очереди ограниченной длины на базе вектора (С++).&lt;br /&gt;
# Реализация очереди на базе списка (С++).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14 (до 23.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте (на С++) структуру данных Стек. У стека должно быть три операции:&lt;br /&gt;
* push --- положить элемент на вершину стека;&lt;br /&gt;
* pop --- удалить верхний элемент;&lt;br /&gt;
* front --- вернуть значение верхнего элемента.&lt;br /&gt;
Оцените время работы каждой функции.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список (19.03)==&lt;br /&gt;
===Домашнее задание 13* (до 30.03)===&lt;br /&gt;
#Для приведённой реализации класса List (https://yadi.sk/i/c5r_79WdfMyNS).&lt;br /&gt;
## Допишите print, push_back и push_front.&lt;br /&gt;
## В функции insert_after и delete_node вставьте необходимые проверки так, чтобы они работали для крайних случаев.&lt;br /&gt;
## Напишите main в котором&lt;br /&gt;
### создаётся объект класса List, &lt;br /&gt;
### заполняется элементами с помощью функций push_back, push_front и insert_after и&lt;br /&gt;
### удаляется i-ый элемент.&lt;br /&gt;
&lt;br /&gt;
==Повторение (30.03)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Для данных пар функций выясните их связь в терминах O-, o-, Ω-, ω-, Θ-обозначений. Поставьте галочку в клетке с Ω, если f(x) = Ω(g(x)) и прочерк, если равенства нет. [https://ru.wikipedia.org/wiki/«O»_большое_и_«o»_малое#.D0.94.D1.80.D1.83.D0.B3.D0.B8.D0.B5_.D0.BF.D0.BE.D0.B4.D0.BE.D0.B1.D0.BD.D1.8B.D0.B5_.D0.BE.D0.B1.D0.BE.D0.B7.D0.BD.D0.B0.D1.87.D0.B5.D0.BD.D0.B8.D1.8F Википедия]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! f(x)!! g(x)!! O!! o!! Ω!! ω!! Θ&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! 2^100&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n * log(n)&lt;br /&gt;
! 2^100 * n * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n&lt;br /&gt;
! 2^100 * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n!&lt;br /&gt;
! 2^(2015n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n*2^n&lt;br /&gt;
! 3^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 5^n&lt;br /&gt;
! 5^(n+1)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n + n^2 + n^3 + ... + n^1000&lt;br /&gt;
! 7^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм Quickselect нахождения k-ого элемента по возрастанию: http://en.wikipedia.org/wiki/Quickselect&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;На улице стоит ряд домов. В каждом из домов лежит сколько-то денег. Вор хочет обокрасть дома на переулке. Он не может обокрасть два соседних дома, потому что хозяин дома, который он обокрал, сразу предупредит соседей. Нужно найти, какую максимальную сумму вор может украсть с переулка. На вход программы подается массив неотрицательных целых чисел - количество долларов в доме с номером i. Соседние дома в массиве представлены соседними элементами. Например, пусть задан массив { 1, 4, 5 } - тогда вор максимум может украсть $6, обокрав дома 1 и 3. Пусть задан массив { 1, 7, 2 } - тогда вор максимум может украсть $7, обокрав дом 2.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Алфавит из всех маленьких латинских букв и пробела закодирован числами следующим способом:&lt;br /&gt;
  &#039;a&#039; -&amp;gt; 1&lt;br /&gt;
  &#039;b&#039; -&amp;gt; 2&lt;br /&gt;
  &#039;c&#039; -&amp;gt; 3&lt;br /&gt;
  ...&lt;br /&gt;
  &#039;z&#039; -&amp;gt; 26&lt;br /&gt;
  &#039; &#039; -&amp;gt; 27&lt;br /&gt;
На вход программы подается строка из цифр. Нужно посчитать, сколькими способами можно раскодировать эту строку.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Дан граф, заданный матрицей смежности. Вывести пары вершин между которыми нет пути.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Повторение (02.04) ==&lt;br /&gt;
Решали и разбирали первые 4 задачи из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14* (до 11.03)===&lt;br /&gt;
Решите любые две задачи (подпункты НЕ считаются отдельными задачами) с предыдущей пары (Повторение (30.03)).&lt;br /&gt;
&lt;br /&gt;
== Повторение (06.04) ==&lt;br /&gt;
Будем решать вторую половину задач из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 15 (до 16.04)===&lt;br /&gt;
# Приведите пример графа, который содержит отрицательные рёбра, не содержит циклов отрицательного веса и для которого алгоритм Дейкстры возвращает неверный результат.&lt;br /&gt;
# Используется ли в алгоритме Дейкстры то, что веса рёбер неотрицательны? Если &amp;quot;да&amp;quot;, то где именно?&lt;br /&gt;
# Пусть граф содержит рёбра с весами &amp;gt;= -100. Если прибавить к каждому ребру 101 и при помощи алгоритма Дейкстры найти кратчайшие пути. Будут ли эти пути кратчайшими в исходном графе? Почему?&lt;br /&gt;
&lt;br /&gt;
== Повторение (07.04) ==&lt;br /&gt;
&#039;&#039;&#039;Решение рекуррентных соотношений&#039;&#039;&#039;&lt;br /&gt;
# Решите уравнение: T(n) = 4*T(n/2) + O(n^2) с базой T(1) = O(1)&lt;br /&gt;
## Используя основную теорему.&lt;br /&gt;
## Используя дерево рекурсий.&lt;br /&gt;
## Методом подстановки.&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2)) + n является \Theta(n lg n).&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2) + 17) + n является \Theta(n lg n).&lt;br /&gt;
# Решите уравнения, считая, что T(1) = O(1):&lt;br /&gt;
## T(n) = T(n-1) + n&lt;br /&gt;
## T(n) = 2*T(floor(sqrt(n))) + lg n. Указание: попробуйте использовать замену переменных.&lt;br /&gt;
## T(n) = 3*T(sqrt(n)) + lg n&lt;br /&gt;
# Дайте верхнюю и нижнюю оценки функции T(n). Постарайтесь, чтобы оценки были как можно более точные&lt;br /&gt;
## T(n) = 4T(n/3) + n*lg(n)&lt;br /&gt;
## T(n) = 3T(n/3) + n/lg(n)&lt;br /&gt;
## T(n) = 4T(n/2) + n^2*sqrt(n)&lt;br /&gt;
## T(n) = T(n/2) + T(n/4) + T(n/8) + n&lt;br /&gt;
## T(n) = T(n-1) + 1/n&lt;br /&gt;
## T(n) = T(n-2) + 1/lg(n)&lt;br /&gt;
## T(n) = sqrt(n) * T(sqrt(n)) + n&lt;br /&gt;
&#039;&#039;&#039;Анализ и построение алгоритмов&#039;&#039;&#039;&lt;br /&gt;
# Числа Фибоначчи F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; можно выразить через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, используя матрицу: https://yadi.sk/i/Pm_aNzHCforFU. &lt;br /&gt;
## Покажите как вычислить F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;.&lt;br /&gt;
## Как вычислить F&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;n+1&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;?&lt;br /&gt;
## Напишите алгоритм.&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
## Ускорьте его так, чтобы он работал за O(log n).&lt;br /&gt;
# Дана последовательность символов. Какое минимальное количество символов нужно удалить из неё, чтобы получить палиндром?&lt;br /&gt;
## Напишите алгоритм (на псевдокоде или на любом языке программирования).&lt;br /&gt;
## Оцените время работы алгоритма.&lt;br /&gt;
# Какую структуру данных вы бы использовали для реализации упорядоченного множества (http://neerc.ifmo.ru/wiki/index.php?title=Упорядоченное_множество)? Какая будет сложность каждой из операций над множеством?&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 16 (до 20.04)===&lt;br /&gt;
# Решите 6 задач из первой части и 6 из второй. (Укажите какие именно.) Каждый из подпунктов является отдельной задачей.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм и теорема Форда-Фалкерсона (16.04)==&lt;br /&gt;
# Базовые определения (пропускные способности, сток, исток и пр.). Пример. &lt;br /&gt;
# Ограничения на поток (сохранение и что меньше пропускных способностей).&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, пример работы&lt;br /&gt;
# Разрез, определение, пример.&lt;br /&gt;
# Утверждение: максимальный поток &amp;lt;= любого разреза.&lt;br /&gt;
# Теорема Форда-Фалкерсона (с доказательством).&lt;br /&gt;
# Пример на котором алгоритм Форда-Фалкерсонаработает работает очень долго при неудачном выборе путей.&lt;br /&gt;
# Сложность алгоритма Форда-Фалкерсона.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №3==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
В [https://official.contest.yandex.ru/contest/1196 домашнем задании] пять задач. Они разделены на два варианта, помеченные римскими цифрами I и II. Свой вариант нужно узнать [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing здесь на вкладке HW3]. Третья задача — общая для двух вариантов; ее решение необходимо снабдить доказательством корректности алгоритма. На выполнение задания дается примерно 2 недели (см. точное время окончания в контесте). Каждую задачу можно написать на С++ или Python.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Форда-Фалкерсона и Эдмондса-Карпа (20.04)==&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, напоминание: базовые определения, пример работы, пример на котором алгоритм работает долго, сложность.&lt;br /&gt;
# Алгоритм Эдмодса-Карпа. Доказательство асимптотики времени работы.&lt;br /&gt;
&lt;br /&gt;
==(23.04)==&lt;br /&gt;
&lt;br /&gt;
==(11.05) Красно-чёрные деревья==&lt;br /&gt;
[https://ru.wikipedia.org/wiki/Красно-чёрное_дерево Красно-чёрное дерево]&lt;br /&gt;
===Домашнее задание 17 (до 18.05)===&lt;br /&gt;
# Зачем нужны красно-чёрные деревья?&lt;br /&gt;
# Благодаря какому свойству и почему красно-чёрное дерево является сбалансированным?&lt;br /&gt;
# Нарисуйте полное бинарное дерево поиска высотой 3 с ключами {1, 2, ..., 15}. Сделайте из него красно-чёрные деревья высотой 2, 3 и 4.&lt;br /&gt;
# Нарисуйте красно-чёрные деревья, получающиеся последовательной вставкой элементов 12, 10, 29, 30, 31, 32 в [https://ru.wikipedia.org/wiki/Красно-чёрное_дерево#/media/File:Red-black_tree_example.svg данное дерево]. Для вставки используйте алгоритм вставки из Википедии. Укажите какой именно функцией вы воспользовались.&lt;br /&gt;
# Определим &#039;&#039;&#039;ослабленное красно-чёрное дерево&#039;&#039;&#039; как бинарное дерево поиска, которое удовлетворяет красно-чёрным свойствам 1, 3, 4 и 5. Другими словами, корень может быть как чёрным, так и красным. Рассмотрите ослабленное красно-чёрное дерево T, корень которого красный. Если перекрасить корень дерева T в чёрный, будет ли оно красно-чёрным деревом?&lt;br /&gt;
# Покажите, что самый длинный простой нисходящий путь от вершины x к листу красно-черного дерева имеет длину, не более чем в два раза превышающую кратчайший путь от x к листу-потомку.&lt;br /&gt;
# Чему равно наибольшее возможное количество внутренних узлов в красно-чёрном дереве с чёрной высоты k? А наименьшее возможное количество?&lt;br /&gt;
# Нарисуйте красно-чёрные деревья, получающиеся последовательной вставкой ключей 41, 38, 31, 12, 19, 8 в изначально пустое дерево.&lt;br /&gt;
# Покажите какие деревья будут получаться в результате последовательного удаления ключей в порядке 8, 12, 19, 31, 38, 41.&lt;br /&gt;
&lt;br /&gt;
==(14.05) Конкурентный анализ самоорганизующихся циклов==&lt;br /&gt;
[https://vk.com/doc12518218_390369758 Лекция]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 18 (до 21.05)===&lt;br /&gt;
Все вычисления сопроводите подробными объяснениями о том, почему верно то или иное (не)равенство.&lt;br /&gt;
# Пусть имеется n-элементный список и m поисковых запросов к нему. После каждой операции поиска можно переупорядочить список. Обозначим стоимость последовательности поисков через C. Докажите, что в худшем случае C = Ω(mn).&lt;br /&gt;
#  Обозначим через c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; стоимость i-ого поискового запроса с применением эвристики перемещения в начало, которая включает стоимость поиска элемента в списке и стоимость его перемещения в начало списка путём ряда обменов соседних элементов списка. Покажите, что i-ая операция поиска находит элемент x в списке L с применением эвристики перемещения в начало, то c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = 2 * rank&amp;lt;sub&amp;gt;L&amp;lt;/sub&amp;gt;(x) - 1.&lt;br /&gt;
# Покажите, что c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = 2 * rank&amp;lt;sub&amp;gt;L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) - 1.&lt;br /&gt;
# Покажите, что c*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = rank&amp;lt;sub&amp;gt;L*&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) + t&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;.&lt;br /&gt;
# Докажите, что после одного обмена двух соседних элементов потенциал либо увеличивается на 2, либо уменьшается на 2.&lt;br /&gt;
# Докажите, что rank&amp;lt;sub&amp;gt;L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) = |A| + |B| + 1.&lt;br /&gt;
# Докажите, что rank&amp;lt;sub&amp;gt;L*&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) = |A| + |С| + 1.&lt;br /&gt;
# Покажите, что поиск i-ого элемента приводит к изменению потенциала Ф(L&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;) - Ф(L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;) &amp;lt;= 2 (|A| - |B| + t*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;), где t*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; --- это количество обменов при i-ом поиске.&lt;br /&gt;
# Во сколько раз стоимость С&amp;lt;sub&amp;gt;MFT&amp;lt;/sub&amp;gt;(S) превышает C&amp;lt;sub&amp;gt;OPT&amp;lt;/sub&amp;gt;(S)?&lt;br /&gt;
&lt;br /&gt;
== (18.05) Конечные автоматы ==&lt;br /&gt;
=== Задание 19 (до 25.05) ===&lt;br /&gt;
# Постройте автомат для языка над алфавитом Σ = {0, 1} каждое слово которого содержит хотя бы два нуля. Является ли он детерминированным?&lt;br /&gt;
# Постройте автомат над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5. Является ли он детерминированным?&lt;br /&gt;
# Постройте автомат, который допускает пустой язык (язык в котором нет ни одного слова).&lt;br /&gt;
# Постройте автомат, который допускает все слова над алфавитом Σ.&lt;br /&gt;
# Постройте ДКА над алфавитом Σ = {К, Ж, З}, который допускает слова в которых после К идёт З, после З --- Ж, после Ж --- К.&lt;br /&gt;
# * Постройте ДКА над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5, а число нулей на 3.&lt;br /&gt;
# Постройте НКА для языка над алфавитом Σ = {0, 1, 2, 3}, состоящий из слов, в которых хотя бы одна из последних пяти букв является 1.&lt;br /&gt;
# Постройте НКА над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5, а число нулей на 3.&lt;br /&gt;
# Какие языки допускают автоматы https://yadi.sk/d/fNAHbjCZghERG?&lt;br /&gt;
# Для каждого из автоматов https://yadi.sk/d/fNAHbjCZghERG постройте соответствующий ему ДКА.&lt;br /&gt;
&lt;br /&gt;
== (21.05) Регулярные выражения, КА, их эквивалентность. Лемма о накачке  ==&lt;br /&gt;
=== Задание 20 (до 28.05) ===&lt;br /&gt;
&#039;&#039;&#039;I Написать регулярные выражения&#039;&#039;&#039;&lt;br /&gt;
# Напишите регулярное выражение для языка над алфавитом Σ = {0, 1} каждое слово которого содержит хотя бы два нуля.&lt;br /&gt;
# Напишите регулярное выражение над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5. Является ли он детерминированным?&lt;br /&gt;
# Напишите регулярное выражение, которое допускает пустой язык (язык в котором нет ни одного слова).&lt;br /&gt;
# Напишите регулярное выражение, которое допускает все слова над алфавитом Σ.&lt;br /&gt;
# Напишите регулярное выражение для языка над алфавитом Σ = {0, 1, 2, 3}, состоящий из слов, в которых хотя бы одна из последних пяти букв является 1.&lt;br /&gt;
&#039;&#039;&#039;II КА и регулярные выражения&#039;&#039;&#039;&lt;br /&gt;
# Постройте конечный автомат для языка (111 + 01)&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;1(00 + 11)&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&#039;&#039;&#039;III Доказать замкнутость относительно различных операций&#039;&#039;&#039;&lt;br /&gt;
# Покажите, что если для языков L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; и L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; существует КА, который их читает, то существует КА и для их объединения L = {w | w ∈ L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; или w ∈ L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;}.&lt;br /&gt;
# Покажите, что если для языка L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; и L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; существует КА, который их читает, то существует КА и для языка L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; = {xy | x ∈ L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, y ∈ L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;}.&lt;br /&gt;
# Покажите, что если для языка L существует КА, который его читает, то существует КА и для &#039;&#039;&#039;замыкания Клини&#039;&#039;&#039; L* = {w&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; w&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; ... w&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;| w&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; ∈ L, w&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; ∈ L, ..., w&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; ∈ L}.&lt;br /&gt;
# Покажите, что если язык L регулярен, то регулярно его дополнение (т.е. язык над тем же алфавитом, которому принадлежит слово тогда и только тогда, когда оно НЕ принадлежит L) .&lt;br /&gt;
# Покажите, что если язык L регулярен, то регулярно его обращение L&amp;lt;sub&amp;gt;R&amp;lt;/sub&amp;gt; = {a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; . . . a&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; | a&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; . . . a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; ∈ L}. (L&amp;lt;sub&amp;gt;R&amp;lt;/sub&amp;gt; --- это язык в котором все слова языка L записаны наоборот.)&lt;br /&gt;
# * Покажите, что если языки L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; и L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; регулярны, то регулярно их пересечение.&lt;br /&gt;
&#039;&#039;&#039;IV Использование леммы о накачке&#039;&#039;&#039;&lt;br /&gt;
# Докажите, что не существует КА, который бы читал язык {0&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;1&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;2&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;}. (Пояснение: запись 0&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; означает строку из n нулей: 00...0.)&lt;br /&gt;
# Докажите, что не существует КА, который бы читал язык {0&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;1&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;}.&lt;br /&gt;
# Докажите, что не существует КА, который бы читал язык {0&amp;lt;sup&amp;gt;n!&amp;lt;/sup&amp;gt;}.&lt;/div&gt;</summary>
		<author><name>Kassalanche</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=13886</id>
		<title>Алгоритмы и структуры данных. Подгруппа 105-1</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=13886"/>
		<updated>2015-05-21T04:37:51Z</updated>

		<summary type="html">&lt;p&gt;Kassalanche: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==О курсе==&lt;br /&gt;
[[Алгоритмы_и_структуры_данных|План лекций и список рекомендуемой литературы.]]&lt;br /&gt;
&lt;br /&gt;
[[Алгоритмы_и_структуры_данных._Подгруппа_105-1._FAQ|FAQ.]]&lt;br /&gt;
&lt;br /&gt;
[[Reviewboard|Инструкция по использованию Reviewboard.]]&lt;br /&gt;
&lt;br /&gt;
[[Практические_занятия_по_курсу_ОиМП/C++_check|Style guide.]]&lt;br /&gt;
&lt;br /&gt;
==Итоговая оценка за курс==&lt;br /&gt;
Итоговая оценка (ИО) зависит от&lt;br /&gt;
* оценок за пять больших домашних заданий (БДЗ1, БДЗ2, ..., БДЗ5),&lt;br /&gt;
* оценок за домашние задания (ДЗ1, ДЗ2, ...),&lt;br /&gt;
* оценки за контрольную работу (КР),&lt;br /&gt;
* оценки за экзамен (ЭКЗ),&lt;br /&gt;
и может быть вычислена по формуле:&lt;br /&gt;
 ИО = 0.7 * (0.3 * КР + 0.7 *(ИДЗ1 + ИДЗ2 + ИДЗ3 + ИДЗ4 + ИДЗ5)/5) + 0.3 * ЭКЗ =&lt;br /&gt;
    = 0.21*КР + 0.98*ИДЗ1 + 0.98*ИДЗ2 + 0.98*ИДЗ3 + 0.98*ИДЗ4 + 0.98*ИДЗ5 + 0.3*ЭКЗ,&lt;br /&gt;
где&lt;br /&gt;
 ИДЗi = min (10, 0.7 * БДЗi + 0.4 * &amp;lt;cредняя оценка за ДЗj, прошедшие с предыдущего БДЗ по i-ое&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
==Порядок сдачи домашних работ==&lt;br /&gt;
===Большие домашние работы===&lt;br /&gt;
# Получить OK за задачу в контесте.&lt;br /&gt;
# Залить исходный код на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* На каждую задачу создавайте отдельный запрос на ревью. &lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении суток приходят замечания к коду. &#039;&#039;&#039;Если в течении суток замечаний или Ship It не появилось, проверьте, что вы правильно отправили запрос и, если всё сделано правильно, спросите у семинариста получил ли он запрос.&#039;&#039;&#039;&lt;br /&gt;
# Вы их исправляете, проверяете в контесте, что программа по-прежнему проходит все тесты, заливаете новую версию в Review Board. Штрафов за посылки НЕ будет.&lt;br /&gt;
# Процесс повторяется пока остаются замечания к коду или пока не истёк дедлайн. После закрытия контеста будут ещё одни сутки на доработку замечаний в Review Board.&lt;br /&gt;
# Оценивается только последняя версия работы в Review Board.&lt;br /&gt;
&lt;br /&gt;
===Маленькие домашние работы===&lt;br /&gt;
# Залить решение на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* Желаемые форматы: txt, py, cpp, h. Допускаются любые другие.&lt;br /&gt;
#* На каждую домашнюю работу создавайте отдельный запрос на ревью. Обязательно указывайте номер домашней работы.&lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении неопределенного промежутка времени придут оценки по каждому из заданий.&lt;br /&gt;
&lt;br /&gt;
==Оценивание домашних работ==&lt;br /&gt;
* Все задания предполагаются индивидуальными. Запрещены любые заимствования без ссылки на автора.&lt;br /&gt;
* Решения после установленного дедлайна не принимаются. Дедлайн указан в заголовке каждого задания.&lt;br /&gt;
* Везде, где требуется написать алгоритм, можно использовать любой язык программирования или псевдокод.&lt;br /&gt;
* Там, где требуется построить алгоритм с заданной асимптотикой, приведите обоснование, что полученный алгоритм удовлетворяет этому условию.&lt;br /&gt;
* Эти правила не действуют, если в задании явно оговорено иное.&lt;br /&gt;
&lt;br /&gt;
==Мотивация к изучению алгоритмов. Подсчёт числа операций (12.01)==&lt;br /&gt;
# Числа Фибоначчи. Определение. Примитивный рекурсивный алгоритм вычисления i-ого числа. Оценка числа операций. Анализ причин неэффективности. Алгоритм с запоминанием вычисленных ранее значений. Оценка числа операций. Сравнение с предыдущим. (подробнее: глава 0, страницы 8-10 из книги &amp;lt;&amp;lt;Алгоритмы&amp;gt;&amp;gt;, [[Алгоритмы_и_структуры_данных|см. список рекомендованной литературы]])&lt;br /&gt;
# Задача о ханойской башне. Постановка задачи. Рекурсивный алгоритм. Рекуррентная формула для числа перемещений. Замкнутая формула для числа перемещений (+ доказательство). Доказательство того, что эту задачу нельзя решить используя меньшее число перемещений дисков. ([https://www.dropbox.com/s/t8cbs7ttu4iasvj/algo-0-recursion.pdf?dl=0 Разбор задачи о ханойской башне], автор Сергей Объедков)&lt;br /&gt;
# Сортировка пузырьком. Алгоритм. Подсчёт количество операций сравнения и обмена (swap). Анализ наилучшего и наихудшего случаев ([https://ru.wikipedia.org/wiki/Сортировка_пузырьком Википедия])&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 1 (12.01 - 26.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
Во всех задачах, если не оговорено иного, предполагаем, что работаем с целыми неотрицательными числами. Для первых 7 задач необходимо&lt;br /&gt;
* описать что можно считать наилучшим и наихудшим случаями,&lt;br /&gt;
* для каждого из двух случаев подсчитать отдельно количество операций сравнения и swap (если есть).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Даны три числа, требуется вернуть наименьшее.&lt;br /&gt;
# Даны три числа, требуется отсортировать их.&lt;br /&gt;
# Дана последовательность A из n элементов и число x, требуется найти элемент равный x. Примечание: если таких значений i несколько, вернуть любое; если такого элемента нет, функция должна сообщить об этом.&lt;br /&gt;
# * Дана упорядоченная последовательность A из n элементов и число x, требуется найти такое i, что A[i] равно x. Алгоритм должен быть эффективней, чем в предыдущем пункте и использовать то, что последовательность упорядочена.&lt;br /&gt;
# Дана последовательность из 100 000 чисел от 0 до 100. Напишите эффективный алгоритм сортировки, который бы учитывал специфику входных данных.&lt;br /&gt;
# * Дано 32 битное неотрицательное число. Требуется номер первого ненулевого бит. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения, считая, что числа распределены равномерно.&lt;br /&gt;
# * Даны 32 битные неотрицательные числа m и n. Требуется вывести True, если m &amp;lt; n, иначе False. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения битов, считая, что числа распределены равномерно.&lt;br /&gt;
# Напишите рекурсивную функцию, вычисляющую n-ое число Фибоначчи (как на занятии). Подсчитайте количество рекурсивных вызовов.&lt;br /&gt;
# * Напишите функцию, вычисляющую n-ое число Фибоначчи, у которой число операций — полином от n, и которая использует количество памяти, независящее от n.&lt;br /&gt;
&lt;br /&gt;
==O-символика и стратегия &amp;quot;разделяй и властвуй&amp;quot; (15.01)==&lt;br /&gt;
# Сортировка слиянием. Алгоритм, рекуррентное соотношение для времени сортировки, сложность. Подробнее: [https://dl.dropboxusercontent.com/u/829163/draft.pdf §2.3 Сортировка слиянием (стр. 54)].&lt;br /&gt;
# О-символика. [https://dl.dropboxusercontent.com/u/829163/draft.pdf §0.3 О-символика (стр. 10)].&lt;br /&gt;
# Задача о слиянии m упорядоченных массивов по n элементов. Три алгоритма решения: последовательное слияние, слияние &amp;quot;деревом&amp;quot; (обе функции используют Merge из MergeSort), аналог Merge для m массивов. Анализ сложности каждого из них.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 2 (15.01-29.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
* Во всех задачах, если не оговорено иного, для простоты &#039;&#039;можно&#039;&#039; считать, что n является степенью какого-либо числа, например, степенью двойки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Дана функция F, определённая ниже. Сколько строк она напечатает? Указание: для обоих подпунктов рассмотрите два случая: 1. n является степенью двойки, 2. n не является степенью двойки.&lt;br /&gt;
## Запишите рекуррентное соотношение для числа строк.&lt;br /&gt;
## Решите уравнение, полученное в предыдущем пункте, то есть, выведите замкнутую (нерекуррентную формулу). Для простоты можно считать, что n является степенью двойки.&lt;br /&gt;
# В массиве A размера n записана возрастающая последовательность целых чисел. Постройте алгоритм типа &amp;quot;разделяй и властвуй&amp;quot;, который проверяет, существует ли такой индекс i, что A[i] = i&lt;br /&gt;
## за время O(n),&lt;br /&gt;
## * за время O(log n).&lt;br /&gt;
## Какие случаи для вашего алгоритма являются наихудшими и наилучшими? Какого время работы в лучшем и худшем случаях?&lt;br /&gt;
# Дан бесконечный массив A, первые n элементов которого содержат возрастающую последовательность положительных чисел, а дальше стоят -1. Значение n не дано. Постройте алгоритм, который получает на вход целое число x и находит это x в массиве --- или говорит, что там его нет, &lt;br /&gt;
## за время O(n),&lt;br /&gt;
## за время O(log n).&lt;br /&gt;
# Рассмотрим алгоритм вычисления наибольшего общего делителя (НОД) двух положительных чисел, основанный на методе &amp;quot;разделяй и властвуй&amp;quot;.&lt;br /&gt;
## (задание не оценивается) Прочитайте [https://dl.dropboxusercontent.com/u/829163/draft.pdf §1.2.3 Алгоритм Евклида (стр. 23)].&lt;br /&gt;
## * Докажите, что определение НОД-а, приведённое ниже, корректно.&lt;br /&gt;
## Постройте алгоритм, основанный на этом определении.&lt;br /&gt;
## Какой алгоритм будет быстрее для n-битовых чисел a и b при больших значениях n --- ваш или алгоритм Евклида?&lt;br /&gt;
# * Покажите как за время O(n log n) удалить из массива размера n все дубликаты, то есть оставить каждый элемент в одном экземпляре.&lt;br /&gt;
# * Даны два упорядоченных массива размера m и n. Постройте алгоритм, находящий k-й по величине элемент в объединении этих массивов за время O(log(n+m)). &lt;br /&gt;
&lt;br /&gt;
Функция F(n).&lt;br /&gt;
  если n &amp;gt; 1:&lt;br /&gt;
    напечатать &amp;quot;всё ещё работаю&amp;quot;&lt;br /&gt;
    F(n/2)&lt;br /&gt;
    F(n/2)&lt;br /&gt;
&lt;br /&gt;
Определение НОД-а.&lt;br /&gt;
             2НОД(a/2, b/2), если а и b чётны,&lt;br /&gt;
  НОД(a,b) = НОД(a, b/2), если а нечётно, b чётно,&lt;br /&gt;
             НОД((a-b)/2, b), если а и b нечётны.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;lt;nowiki&amp;gt;Задачи взяты из книги &amp;quot;Алгоритмы&amp;quot;, глава 2 (см. список рекомендованной литературы).&amp;lt;/nowiki&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Сложение и умножение (19.01)==&lt;br /&gt;
# Алгоритм сложения, его сложность (§1.1.1 Сложение*)&lt;br /&gt;
# &amp;quot;Школьный&amp;quot; алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Рекурсивный алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Алгоритм умножения, реализующий стратегию &amp;quot;разделяй и властвуй&amp;quot;, анализ сложности (§2.1 Умножение чисел*)&lt;br /&gt;
 * [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать.]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 3 (19.01 - 2.02)===&lt;br /&gt;
* Во всех задачах для простоты можно считать, что n является степенью какого-либо числа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Найдите произведение чисел 10011011 и 10111010 (в двоичной системе счисления), используя алгоритм умножения чисел, основанный на методе «разделяй и властвуй». Необходимо не только дать ответ, но и привести ход решения.&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 3 рекурсивных вызова для подзадач размера n-1 и комбинирует из них решение исходной задачи за О(n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте три верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 10 рекурсивных вызовов для подзадач размера n/2 и комбинирует из них решение исходной задачи за О(5n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте два верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Докажите, что 3m² + m = O(m²).&lt;br /&gt;
# Докажите, что lg m = O(m/1000), где lg m — это логарифм с двоичным основанием.&lt;br /&gt;
# Докажите, что из равенства f(n) = O(g(n)) не следует, что g(n) = O(f(n)).&lt;br /&gt;
# Докажите, что O(m) содержится в O(m²).&lt;br /&gt;
&lt;br /&gt;
==Решение рекуррентных уравнений (22.01)==&lt;br /&gt;
# Примеры решений рекуррентных уравнений (см. [https://www.dropbox.com/s/6a0r410zjm9qwe7/algo-3-recurrences.pdf?dl=0 конспект]).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 4 (до 14.02)===&lt;br /&gt;
* Нельзя использовать утверждение основной теоремы о решении рекуррентных соотношений.&lt;br /&gt;
* &#039;&#039;Можно&#039;&#039; использовать метод построения дерева рекурсии или подстановку (метод с угадыванием ответа).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Какой из трёх приведённых ниже алгоритмов вы бы предпочли? Обоснуйте свой ответ.&lt;br /&gt;
#* Алгоритм A, решая задачу, производит пять рекурсивных вызовов для подзадач вдвое меньшего размера, после чего строит ответ для исходной задачи за линейное время.&lt;br /&gt;
#* Алгоритм B, решая задачу размера n, делает два рекурсивных вызова для задач размера n − 1, после чего находит ответ за время O(1).&lt;br /&gt;
#* Алгоритм C, решая задачу размера n, рекурсивно решает девять задач размера n/3 и строит ответ за время O(n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Найдите T(n) в замкнутой форме для любых 7 из 10 приведённых ниже рекуррентных соотношений:&lt;br /&gt;
## T(n) ≤ 2T(n/3) + 1;&lt;br /&gt;
## T(n) ≤ 7T(n/7) + n;&lt;br /&gt;
## T(n) ≤ 9T(n/3) + n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 8T(n/2) + n&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 49T(n/25) + n&amp;lt;sup&amp;gt;3/2&amp;lt;/sup&amp;gt;log n;&lt;br /&gt;
## T(n) ≤ T(n − 1) + 2;&lt;br /&gt;
## T(n) ≤ T(n − 1) + n&amp;lt;sup&amp;gt;c&amp;lt;/sup&amp;gt;, где c ≥ 1 –– константа;&lt;br /&gt;
## T(n) ≤ T(n − 1) + c&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;, где c &amp;gt; 1 –– константа;&lt;br /&gt;
## T(n) ≤ 2T(n − 1) + 1;&lt;br /&gt;
## T(n) ≤ T(sqrt(n)) + 1.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №1==&lt;br /&gt;
Необходимо реализовать все 6 задач из [https://official.contest.yandex.ru/contest/1002 контеста]. Каждую задачу можно писать на С++ или Python. На выполнение работы отводится две недели. Каждая задача оценивается в 10/6 балла. Оценка &#039;&#039;может&#039;&#039; быть снижена за плохой код, но не более чем на 25%.&lt;br /&gt;
&lt;br /&gt;
==Бинарное дерево поиска (26.01)==&lt;br /&gt;
# Определение. Пример.&lt;br /&gt;
# Не модифицирующие алгоритмы: поиск (рекурсивный и итеративный алгоритмы), поиск минимума, inordered обход (вывод значений узлов в отсортированном порядке), поиск следующего по возрастанию.&lt;br /&gt;
# Модифицирующие алгоритмы: вставка (рекурсивная реализация), удаление (только идея).&lt;br /&gt;
 [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 13, стр. 248]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 5 (до 16.02)===&lt;br /&gt;
* Для получения максимальной оценки можно выполнить или все задачи без звёздочки, или задачу со звёздочкой. Преподаватель понимает, что реализацию БДП сложно не найти в интернете, но от копипасты не будет никакой пользы. Напротив, самостоятельная реализация очень полезна и приветствуется, даже если не получится выполнить всех пунктов задания.&lt;br /&gt;
* Задачи с двумя звёздочками необязательны.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Нарисуйте бинарные деревья поиска высотой 2, 3, 4, 5 и 6 для множества ключей {1, 4, 5, 10, 16, 17, 21}. Корень дерева имеет высоту 0.&lt;br /&gt;
# &#039;&#039;&#039;Сортировка с использованием БДП.&#039;&#039;&#039;&lt;br /&gt;
## Какова асимптотическая сложность алгоритма вставки элемента в дерево высоты d? Почему? Назовите наилучший и наиухдший случаи.&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который строит БДП в узлах которого стоят элементы данной последовательности. Можно использовать функцию Insert. Назовите наилучший и наихудший случаи. Есть теорема о том, что полученный алгоритм будет работать в среднем случае за время O(n * log n).&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который выводит их в порядке возрастания. Используйте бинарное дерево поиска. Какова в среднем случае сложность этого алгоритма? Назовите наилучший и наихудший случаи. Какова сложность в наихудшем случае?&lt;br /&gt;
# Напишите функцию GetRoot, которой на вход подаётся указатель на произвольный узел дерева, а она возвращает указатель на корень.&lt;br /&gt;
# Напишите процедуру PrintLeafs, которой на вход подаётся указатель на корень дерева, и она печатает листья дерева&lt;br /&gt;
## по возрастанию,&lt;br /&gt;
## по убыванию.&lt;br /&gt;
# ** Альтернативный обход в порядке возрастания бинарного дерева поиска с n узлами (или центрированный (inordered) обход) можно осуществить путём поиска минимального элемента дерева с помощью функции Minimum с последующий n-1 вызовом функции Next. Каково время работы такого алгоритма?&lt;br /&gt;
# * Реализуйте на С++ структуру данных бинарное дерево поиска, [https://yadi.sk/i/gi2SEStreFfSb используя заготовку].&lt;br /&gt;
## Нарисуйте бинарное дерево поиска, которое строится в функции getTreeExample.&lt;br /&gt;
## Реализуйте следующие алгоритмы: &lt;br /&gt;
### поиск минимума, &lt;br /&gt;
### inordered обход (вывод значений узлов в отсортированном порядке),&lt;br /&gt;
### поиск следующего по возрастанию,&lt;br /&gt;
### вставка элемента в дерево,&lt;br /&gt;
### сортировка последовательности с использованием БДП (дан вектор чисел, необходимо вывести их по возрастанию),&lt;br /&gt;
### ** удаление.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Карацубы, Штрассена. Быстрая сортировка (29.01)==&lt;br /&gt;
# Алгоритм Карацубы.&lt;br /&gt;
# Алгоритм Штрассена. [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать Дасгупту и др., §2.5 Умножение матриц]&lt;br /&gt;
# Быстрая сортировка и доказательство того, что в среднем случае она работает за О(n * log n). [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 8 Быстрая сортировка, стр. 148]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 6 (до 18.02)===&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Пусть мы хотим найти двоичное представление десятичного числа 10&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;. Будем считать, что n --- степень двойки (n = 2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt;).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Pwr2Bin(n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть 1010&lt;br /&gt;
    z = ...&lt;br /&gt;
    вернуть Multiply(z, z)&amp;lt;/source&amp;gt;&lt;br /&gt;
Multiply --- функция, перемножающая два n-битовых двоичных числа x и y по алгоритму Карацубы за O(n&amp;lt;sup&amp;gt;log&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;3&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Пусть мы хотим перевести произвольное десятичное число x в записи которого n=2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; чисел в двоичную систему счисления.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Dec2Bin(x, n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть binary[x]&lt;br /&gt;
    разделить x на два десятичных числа xl и xr из n/2 цифр.&lt;br /&gt;
    вернуть ...&amp;lt;/source&amp;gt;&lt;br /&gt;
Здесь binary --- это массив, содержащий двоичное представление десятичных цифр.&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Докажите, что математическое ожидание времени работы алгоритма быстрой сортировки (усреднение по всем вариантам выбора опорного элемента) на любом входе размера n удовлетворяет соотношению: T(n) ≤ O(n) + 1/n * &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt; (T(i-1) + T(n-i)).&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Найдите решение соотношения из предыдущего пункта.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Динамическое программирование (ДП). Первые примеры (02.01)==&lt;br /&gt;
# Нахождение самой длинной возрастающей подпоследовательности.&lt;br /&gt;
# Нахождение редакционного расстояния (или редакционной стоимости, расстояния Левенштейна).&lt;br /&gt;
# Нахождение представителя большинства.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 7 (до 20.02)===&lt;br /&gt;
* В этом задании везде, где требуется реализовать алгоритм, необходимо привести код на любом языке программирования.&lt;br /&gt;
* Для получения максимальной оценки нужно решить все задачи без звёздочек. Одна решённая задача со звёздочкой заменяет одну задачу без звёздочки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения редакционного расстояния (алгоритм Вагнера — Фишера). Например, редакционное расстояние между словами &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равно 6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения длины наибольшей общей подстроки. Например, длина наибольшей общей подстроки &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равна 8 (&amp;quot;antholog&amp;quot;). Чем больше это значение, тем схожей строки.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Предположим теперь, что сравниваемые строки состоят из символов A, С, G и T; за удаление или вставку мы платим -5; за замену буквы x на y платим w[x, y], где x, y принадлежат множеству {A, С, G, T}, a w — это матрица весов:&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
!-!! A!! G!! C!! T&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! A&lt;br /&gt;
|10||-1||-3||-4&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
!G&lt;br /&gt;
||-1||7||-5||-3&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! C&lt;br /&gt;
||-3||-5||9||0&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! T&lt;br /&gt;
||-4||-3||0||8&lt;br /&gt;
|}&lt;br /&gt;
Тогда выравнивание:&lt;br /&gt;
 AGACTAGTTAC&lt;br /&gt;
 CGA‒‒‒GACGT&lt;br /&gt;
будет иметь следующую оценку:&lt;br /&gt;
 w[A,C] + w[G,G] + w[A,A] + 3*(-5) + w[G,G] + w[T,A] + w[T,C] + w[A,G] + w[C,T] = -3 + 7 + 10 - 3*5 + 7 + (-4) + 0 + (-1) + 0 = 1.&lt;br /&gt;
&lt;br /&gt;
Напишите алгоритм, который находит максимальную стоимость всех возможных выравниваний. Верно ли, что чем больше это значение, тем непохожей строки?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как давно один народ отделился от другого? Кто похожей — итальянец и китаец или якут и эфиоп? На эти вопросы можно отвечать с разных точек зрения — культурной, исторической, лингвистической, ... В последние же годы человечество научилось секвенировать геном, что позволило исследовать этот вопрос с точки зрения генетики. Секвенирование генома — это процесс записи ДНК в виде нуклеотидной последовательности, которая представляет собой последовательность из четырёх символов — A, С, G и T. Существуют базы, которые хранят генетическую информацию о людях из разных стран и континентов, например, [http://www.mtdb.igp.uu.se/ http://www.mtdb.igp.uu.se/ → Download mtDNA sequences]. Чем больше сходство между геномами, тем сильнее родственные связи между их обладателями. Используя решение предыдущего пункта, выполните задания:&lt;br /&gt;
# Определите, кто похожей — итальянец и китаец или якут и эфиоп?&lt;br /&gt;
# Найдите нескольких похожих и нескольких непохожих народностей.&lt;br /&gt;
# * Выберите одну народность. Найдите самых похожих и самых непохожих на неё.&lt;br /&gt;
# * Найдите самые похожие и самые непохожие народности.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Задача о разрезании стержня (05.01)==&lt;br /&gt;
# Постановка задачи.&lt;br /&gt;
# Решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Решение с нахождением максимума по p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Восходящий алгоритм с запоминанием. Вывод длин кусочков стержня. Оценка сложности.&lt;br /&gt;
# Нисходящий алгоритм с запоминанием. Оценка сложности.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.1 Разрезание стержня, стр. 393]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 8 (до 22.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Решая задачу о разрезании стержня мы вначале построили рекурсивное решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt; для всех 1 ≤ i &amp;lt; n. Его сложность описывалась рекуррентной формулой T(n) = n + &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n-1&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt;(T(i) + T(n-i)), T(1) = 1.&lt;br /&gt;
# Объясните эту формулу.&lt;br /&gt;
# Покажите с помощью метода подстановок, что T(n) ≤ 2&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Покажите с помощью контрпримера, что описанная далее жадная стратегия не всегда определяет оптимальный способ разрезания стержня. Определим плотность стержня длиной i как p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;/i, то есть как стоимость единицы его длины. Жадная стратегия для стержня длиной n отрезает от стержня первую часть длиной i, где 1 ≤ i ≤ n, имеющую максимальную плотность. Затем та же жадная стратегия применяется к оставшейся части длиной n-i.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Рассмотрим модификацию задачи разрезания стержня, в которой в дополнение к цене p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; каждого стержня добавляется фиксированная цена разреза c. Теперь прибыль, связанная с решением, представляет собой сумму цен частей стержня минус стоимость разрезов. Разработайте алгоритм динамического программирования для этой модифицированной задачи.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Непрерывным участком называется группа подряд идущих элементов. Например, для последовательности&lt;br /&gt;
 5, 15, −30, 10, −5, 40, 10&lt;br /&gt;
элементы 15, −30, 10 образуют непрерывный участок, а 5, 15, 40 -- нет. Постройте линейный алгоритм для следующей задачи:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Вход: список чисел a1, a2, ... ‌, an.&lt;br /&gt;
Выход: непрерывный участок с максимальной суммой (сумма участка нулевой длины равна нулю).&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Для приведённого примера ответом будет 10, −5, 40, 10 с суммой 55. Какова сложность алгоритма? Почему?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Надо заплатить v рублей, имея купюры в x1, x2, ‌..., xn рублей (купюр каждого типа сколько угодно). Это не всегда возможно (скажем, купюрами в&lt;br /&gt;
10 и 25 рублей можно заплатить 45 рублей, но не 47 и не 15). Постройте основанный на методе динамического программирования алгоритм со временем работы O(nv), выясняющий, возможна ли уплата.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как решить предыдущую задачу, если каждая купюра имеется в единственном экземпляре? (Например, купюрами в 1, 5, 10, 20 рублей можно заплатить 16 = 1 + 5 + 10 и 31 = 1 + 10 + 20 рублей, но не 40 (не хватит денег). Время работы алгоритма по-прежнему O(nv).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Ещё один вариант той же задачи: купюр каждого типа сколько угодно, но всего разрешается использовать не более k купюр. (Например, если есть купюры в 5 и 10 рублей, а k = 6, то 55 разменять можно, а 65 –– нет).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Перемножение цепочки матриц. Оптимальное бинарное дерево поиска (начало) (09.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о перемножении цепочки матриц. Постановка задачи.Пример. Нисходящий алгоритм.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.2 Перемножение цепочки матриц, стр. 403]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 9 (до 24.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Найдите оптимальную расстановку скобок в произведении последовательности матриц, размерности которых равны 5×10, 10×3, 3×12, 12×5, 5×50, 50×6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Напишите восходящий алгоритм для поиска оптимальной расстановки скобок.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Расстановка пробелов. Оптимальное бинарное дерево поиска (середина) (12.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о расстановке пробелов. Постановка задачи. Решения для трёх случаев: 1. нужно вернуть можно ли разбить текст на слова; 2. вернуть разбивку на слова; 3. слова встречаются не равновероятно, вернуть наиболее вероятную разбивку на слова.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи. Вывод математического ожидания времени поиска.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Праздничное домашнее задание 10 (до 02.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[&amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;,&amp;quot;, &amp;quot;.&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;,&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;.&amp;quot;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Подсказка:&#039;&#039;&#039; разбейте текст на слова из списка и посмотрите на азбуку Морзе.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Способы представления графов в памяти (16.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Разбор ошибок в домашнем задании.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Графы. Способы представления графов в памяти (матрица смежности, список рёбер, список соседей (список смежностей), матрица инцидентности). Зависимость сложности алгоритмов от способа представления.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §22.1 Представление графов, стр. 626]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 11 (до 02.03)===&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача A.]&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача B.]&lt;br /&gt;
# Нарисуйте неориентированный граф с 5 вершинами и 8 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Нарисуйте ориентированный граф с 4 вершинами и 3 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Дан ориентированный граф. &#039;&#039;Исходящая степень вершины v&#039;&#039; --- это количество исходящих из неё рёбер, &#039;&#039;входящая степень v&#039;&#039; --- это количество рёбер входящих в  v. Имеется представление ориентированного графа с использование списка соседей. Как долго будут вычисляться исходящие степени всех вершин графа? А входящие степени?&lt;br /&gt;
# Дан граф G = (V, E). Какие из рассмотренных способов хранения графов используют меньше всего памяти для хранения G и почему? Указание: рассмотрите случаи |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;lt; |E| и |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;gt; |E|.&lt;br /&gt;
# Пусть C --- это матрица смежности графа G.&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
# Пусть B --- это матрица инцидентности ориентированного графа G. Как связаны элементы матрицы BB&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
&lt;br /&gt;
==Реализация поиска в глубину (19.02)==&lt;br /&gt;
# Реализация поиска в глубину и смежных задач.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 12 (до 5.03)===&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Выберите любой способ хранения графа. Реализуйте поиск в глубину.&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Напишите алгоритм, который возвращает данные о том, какие вершины лежат в одной компоненте связности.&lt;br /&gt;
# &#039;&#039;(любой ЯП или псевдокод)&#039;&#039; Напишите алгоритм проверки сильной связности ориентированного графа. Какова его сложность?&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №2==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
Необходимо реализовать 3 задачи из [https://official.contest.yandex.ru/contest/1085 контеста], см. [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing распределение задач]. Каждую задачу можно написать на С++ или Python. На выполнение работы отводится две недели (см. время окончания контеста). [https://official.contest.yandex.ru/contest/1123 Дорешивание.]&lt;br /&gt;
&lt;br /&gt;
==ДП и графы (26.02)==&lt;br /&gt;
==ДП и графы (02.03)==&lt;br /&gt;
==Жадные алгоритмы (12.03)==&lt;br /&gt;
===Домашнее задание 13 (до 23.03)===&lt;br /&gt;
# Вася хочет купить по одной акции каждой компании. Все акции стоят одинаково, но дорожают по-разному. Каждый месяц акция i-ой компании дорожает в r_i раз. В один месяц можно купить только одну акцию.&lt;br /&gt;
## Напишите алгоритм, который выводит оптимальную последовательность покупок (такую, что на покупку всех акций потратится меньше денег).&lt;br /&gt;
## Докажите корректность алгоритма, то есть докажите, что последовательность покупок, которую выводит ваш алгоритм, оптимальна.&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список, очередь (16.03)==&lt;br /&gt;
# Реализация линейного двусвязного списка (С++).&lt;br /&gt;
# Реализация очереди ограниченной длины на базе вектора (С++).&lt;br /&gt;
# Реализация очереди на базе списка (С++).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14 (до 23.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте (на С++) структуру данных Стек. У стека должно быть три операции:&lt;br /&gt;
* push --- положить элемент на вершину стека;&lt;br /&gt;
* pop --- удалить верхний элемент;&lt;br /&gt;
* front --- вернуть значение верхнего элемента.&lt;br /&gt;
Оцените время работы каждой функции.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список (19.03)==&lt;br /&gt;
===Домашнее задание 13* (до 30.03)===&lt;br /&gt;
#Для приведённой реализации класса List (https://yadi.sk/i/c5r_79WdfMyNS).&lt;br /&gt;
## Допишите print, push_back и push_front.&lt;br /&gt;
## В функции insert_after и delete_node вставьте необходимые проверки так, чтобы они работали для крайних случаев.&lt;br /&gt;
## Напишите main в котором&lt;br /&gt;
### создаётся объект класса List, &lt;br /&gt;
### заполняется элементами с помощью функций push_back, push_front и insert_after и&lt;br /&gt;
### удаляется i-ый элемент.&lt;br /&gt;
&lt;br /&gt;
==Повторение (30.03)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Для данных пар функций выясните их связь в терминах O-, o-, Ω-, ω-, Θ-обозначений. Поставьте галочку в клетке с Ω, если f(x) = Ω(g(x)) и прочерк, если равенства нет. [https://ru.wikipedia.org/wiki/«O»_большое_и_«o»_малое#.D0.94.D1.80.D1.83.D0.B3.D0.B8.D0.B5_.D0.BF.D0.BE.D0.B4.D0.BE.D0.B1.D0.BD.D1.8B.D0.B5_.D0.BE.D0.B1.D0.BE.D0.B7.D0.BD.D0.B0.D1.87.D0.B5.D0.BD.D0.B8.D1.8F Википедия]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! f(x)!! g(x)!! O!! o!! Ω!! ω!! Θ&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! 2^100&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n * log(n)&lt;br /&gt;
! 2^100 * n * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n&lt;br /&gt;
! 2^100 * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n!&lt;br /&gt;
! 2^(2015n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n*2^n&lt;br /&gt;
! 3^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 5^n&lt;br /&gt;
! 5^(n+1)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n + n^2 + n^3 + ... + n^1000&lt;br /&gt;
! 7^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм Quickselect нахождения k-ого элемента по возрастанию: http://en.wikipedia.org/wiki/Quickselect&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;На улице стоит ряд домов. В каждом из домов лежит сколько-то денег. Вор хочет обокрасть дома на переулке. Он не может обокрасть два соседних дома, потому что хозяин дома, который он обокрал, сразу предупредит соседей. Нужно найти, какую максимальную сумму вор может украсть с переулка. На вход программы подается массив неотрицательных целых чисел - количество долларов в доме с номером i. Соседние дома в массиве представлены соседними элементами. Например, пусть задан массив { 1, 4, 5 } - тогда вор максимум может украсть $6, обокрав дома 1 и 3. Пусть задан массив { 1, 7, 2 } - тогда вор максимум может украсть $7, обокрав дом 2.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Алфавит из всех маленьких латинских букв и пробела закодирован числами следующим способом:&lt;br /&gt;
  &#039;a&#039; -&amp;gt; 1&lt;br /&gt;
  &#039;b&#039; -&amp;gt; 2&lt;br /&gt;
  &#039;c&#039; -&amp;gt; 3&lt;br /&gt;
  ...&lt;br /&gt;
  &#039;z&#039; -&amp;gt; 26&lt;br /&gt;
  &#039; &#039; -&amp;gt; 27&lt;br /&gt;
На вход программы подается строка из цифр. Нужно посчитать, сколькими способами можно раскодировать эту строку.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Дан граф, заданный матрицей смежности. Вывести пары вершин между которыми нет пути.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Повторение (02.04) ==&lt;br /&gt;
Решали и разбирали первые 4 задачи из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14* (до 11.03)===&lt;br /&gt;
Решите любые две задачи (подпункты НЕ считаются отдельными задачами) с предыдущей пары (Повторение (30.03)).&lt;br /&gt;
&lt;br /&gt;
== Повторение (06.04) ==&lt;br /&gt;
Будем решать вторую половину задач из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 15 (до 16.04)===&lt;br /&gt;
# Приведите пример графа, который содержит отрицательные рёбра, не содержит циклов отрицательного веса и для которого алгоритм Дейкстры возвращает неверный результат.&lt;br /&gt;
# Используется ли в алгоритме Дейкстры то, что веса рёбер неотрицательны? Если &amp;quot;да&amp;quot;, то где именно?&lt;br /&gt;
# Пусть граф содержит рёбра с весами &amp;gt;= -100. Если прибавить к каждому ребру 101 и при помощи алгоритма Дейкстры найти кратчайшие пути. Будут ли эти пути кратчайшими в исходном графе? Почему?&lt;br /&gt;
&lt;br /&gt;
== Повторение (07.04) ==&lt;br /&gt;
&#039;&#039;&#039;Решение рекуррентных соотношений&#039;&#039;&#039;&lt;br /&gt;
# Решите уравнение: T(n) = 4*T(n/2) + O(n^2) с базой T(1) = O(1)&lt;br /&gt;
## Используя основную теорему.&lt;br /&gt;
## Используя дерево рекурсий.&lt;br /&gt;
## Методом подстановки.&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2)) + n является \Theta(n lg n).&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2) + 17) + n является \Theta(n lg n).&lt;br /&gt;
# Решите уравнения, считая, что T(1) = O(1):&lt;br /&gt;
## T(n) = T(n-1) + n&lt;br /&gt;
## T(n) = 2*T(floor(sqrt(n))) + lg n. Указание: попробуйте использовать замену переменных.&lt;br /&gt;
## T(n) = 3*T(sqrt(n)) + lg n&lt;br /&gt;
# Дайте верхнюю и нижнюю оценки функции T(n). Постарайтесь, чтобы оценки были как можно более точные&lt;br /&gt;
## T(n) = 4T(n/3) + n*lg(n)&lt;br /&gt;
## T(n) = 3T(n/3) + n/lg(n)&lt;br /&gt;
## T(n) = 4T(n/2) + n^2*sqrt(n)&lt;br /&gt;
## T(n) = T(n/2) + T(n/4) + T(n/8) + n&lt;br /&gt;
## T(n) = T(n-1) + 1/n&lt;br /&gt;
## T(n) = T(n-2) + 1/lg(n)&lt;br /&gt;
## T(n) = sqrt(n) * T(sqrt(n)) + n&lt;br /&gt;
&#039;&#039;&#039;Анализ и построение алгоритмов&#039;&#039;&#039;&lt;br /&gt;
# Числа Фибоначчи F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; можно выразить через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, используя матрицу: https://yadi.sk/i/Pm_aNzHCforFU. &lt;br /&gt;
## Покажите как вычислить F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;.&lt;br /&gt;
## Как вычислить F&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;n+1&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;?&lt;br /&gt;
## Напишите алгоритм.&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
## Ускорьте его так, чтобы он работал за O(log n).&lt;br /&gt;
# Дана последовательность символов. Какое минимальное количество символов нужно удалить из неё, чтобы получить палиндром?&lt;br /&gt;
## Напишите алгоритм (на псевдокоде или на любом языке программирования).&lt;br /&gt;
## Оцените время работы алгоритма.&lt;br /&gt;
# Какую структуру данных вы бы использовали для реализации упорядоченного множества (http://neerc.ifmo.ru/wiki/index.php?title=Упорядоченное_множество)? Какая будет сложность каждой из операций над множеством?&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 16 (до 20.04)===&lt;br /&gt;
# Решите 6 задач из первой части и 6 из второй. (Укажите какие именно.) Каждый из подпунктов является отдельной задачей.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм и теорема Форда-Фалкерсона (16.04)==&lt;br /&gt;
# Базовые определения (пропускные способности, сток, исток и пр.). Пример. &lt;br /&gt;
# Ограничения на поток (сохранение и что меньше пропускных способностей).&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, пример работы&lt;br /&gt;
# Разрез, определение, пример.&lt;br /&gt;
# Утверждение: максимальный поток &amp;lt;= любого разреза.&lt;br /&gt;
# Теорема Форда-Фалкерсона (с доказательством).&lt;br /&gt;
# Пример на котором алгоритм Форда-Фалкерсонаработает работает очень долго при неудачном выборе путей.&lt;br /&gt;
# Сложность алгоритма Форда-Фалкерсона.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №3==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
В [https://official.contest.yandex.ru/contest/1196 домашнем задании] пять задач. Они разделены на два варианта, помеченные римскими цифрами I и II. Свой вариант нужно узнать [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing здесь на вкладке HW3]. Третья задача — общая для двух вариантов; ее решение необходимо снабдить доказательством корректности алгоритма. На выполнение задания дается примерно 2 недели (см. точное время окончания в контесте). Каждую задачу можно написать на С++ или Python.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Форда-Фалкерсона и Эдмондса-Карпа (20.04)==&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, напоминание: базовые определения, пример работы, пример на котором алгоритм работает долго, сложность.&lt;br /&gt;
# Алгоритм Эдмодса-Карпа. Доказательство асимптотики времени работы.&lt;br /&gt;
&lt;br /&gt;
==(23.04)==&lt;br /&gt;
&lt;br /&gt;
==(11.05) Красно-чёрные деревья==&lt;br /&gt;
[https://ru.wikipedia.org/wiki/Красно-чёрное_дерево Красно-чёрное дерево]&lt;br /&gt;
===Домашнее задание 17 (до 18.05)===&lt;br /&gt;
# Зачем нужны красно-чёрные деревья?&lt;br /&gt;
# Благодаря какому свойству и почему красно-чёрное дерево является сбалансированным?&lt;br /&gt;
# Нарисуйте полное бинарное дерево поиска высотой 3 с ключами {1, 2, ..., 15}. Сделайте из него красно-чёрные деревья высотой 2, 3 и 4.&lt;br /&gt;
# Нарисуйте красно-чёрные деревья, получающиеся последовательной вставкой элементов 12, 10, 29, 30, 31, 32 в [https://ru.wikipedia.org/wiki/Красно-чёрное_дерево#/media/File:Red-black_tree_example.svg данное дерево]. Для вставки используйте алгоритм вставки из Википедии. Укажите какой именно функцией вы воспользовались.&lt;br /&gt;
# Определим &#039;&#039;&#039;ослабленное красно-чёрное дерево&#039;&#039;&#039; как бинарное дерево поиска, которое удовлетворяет красно-чёрным свойствам 1, 3, 4 и 5. Другими словами, корень может быть как чёрным, так и красным. Рассмотрите ослабленное красно-чёрное дерево T, корень которого красный. Если перекрасить корень дерева T в чёрный, будет ли оно красно-чёрным деревом?&lt;br /&gt;
# Покажите, что самый длинный простой нисходящий путь от вершины x к листу красно-черного дерева имеет длину, не более чем в два раза превышающую кратчайший путь от x к листу-потомку.&lt;br /&gt;
# Чему равно наибольшее возможное количество внутренних узлов в красно-чёрном дереве с чёрной высоты k? А наименьшее возможное количество?&lt;br /&gt;
# Нарисуйте красно-чёрные деревья, получающиеся последовательной вставкой ключей 41, 38, 31, 12, 19, 8 в изначально пустое дерево.&lt;br /&gt;
# Покажите какие деревья будут получаться в результате последовательного удаления ключей в порядке 8, 12, 19, 31, 38, 41.&lt;br /&gt;
&lt;br /&gt;
==(14.05) Конкурентный анализ самоорганизующихся циклов==&lt;br /&gt;
[https://vk.com/doc12518218_390369758 Лекция]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 18 (до 21.05)===&lt;br /&gt;
Все вычисления сопроводите подробными объяснениями о том, почему верно то или иное (не)равенство.&lt;br /&gt;
# Пусть имеется n-элементный список и m поисковых запросов к нему. После каждой операции поиска можно переупорядочить список. Обозначим стоимость последовательности поисков через C. Докажите, что в худшем случае C = Ω(mn).&lt;br /&gt;
#  Обозначим через c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; стоимость i-ого поискового запроса с применением эвристики перемещения в начало, которая включает стоимость поиска элемента в списке и стоимость его перемещения в начало списка путём ряда обменов соседних элементов списка. Покажите, что i-ая операция поиска находит элемент x в списке L с применением эвристики перемещения в начало, то c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = 2 * rank&amp;lt;sub&amp;gt;L&amp;lt;/sub&amp;gt;(x) - 1.&lt;br /&gt;
# Покажите, что c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = 2 * rank&amp;lt;sub&amp;gt;L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) - 1.&lt;br /&gt;
# Покажите, что c*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = rank&amp;lt;sub&amp;gt;L*&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) + t&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;.&lt;br /&gt;
# Докажите, что после одного обмена двух соседних элементов потенциал либо увеличивается на 2, либо уменьшается на 2.&lt;br /&gt;
# Докажите, что rank&amp;lt;sub&amp;gt;L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) = |A| + |B| + 1.&lt;br /&gt;
# Докажите, что rank&amp;lt;sub&amp;gt;L*&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) = |A| + |С| + 1.&lt;br /&gt;
# Покажите, что поиск i-ого элемента приводит к изменению потенциала Ф(L&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;) - Ф(L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;) &amp;lt;= 2 (|A| - |B| + t*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;), где t*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; --- это количество обменов при i-ом поиске.&lt;br /&gt;
# Во сколько раз стоимость С&amp;lt;sub&amp;gt;MFT&amp;lt;/sub&amp;gt;(S) превышает C&amp;lt;sub&amp;gt;OPT&amp;lt;/sub&amp;gt;(S)?&lt;br /&gt;
&lt;br /&gt;
== (18.05) Конечные автоматы ==&lt;br /&gt;
=== Задание 19 (до 25.05) ===&lt;br /&gt;
# Постройте автомат для языка над алфавитом Σ = {0, 1} каждое слово которого содержит хотя бы два нуля. Является ли он детерминированным?&lt;br /&gt;
# Постройте автомат над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5. Является ли он детерминированным?&lt;br /&gt;
# Постройте автомат, который допускает пустой язык (язык в котором нет ни одного слова).&lt;br /&gt;
# Постройте автомат, который допускает все слова над алфавитом Σ.&lt;br /&gt;
# Постройте ДКА над алфавитом Σ = {К, Ж, З}, который допускает слова в которых после К идёт З, после З --- Ж, после Ж --- К.&lt;br /&gt;
# * Постройте ДКА над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5, а число нулей на 3.&lt;br /&gt;
# Постройте НКА для языка над алфавитом Σ = {0, 1, 2, 3}, состоящий из слов, в которых хотя бы одна из последних пяти букв является 1.&lt;br /&gt;
# Постройте НКА над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5, а число нулей на 3.&lt;br /&gt;
# Какие языки допускают автоматы https://yadi.sk/d/fNAHbjCZghERG?&lt;br /&gt;
# Для каждого из автоматов https://yadi.sk/d/fNAHbjCZghERG постройте соответствующий ему ДКА.&lt;br /&gt;
&lt;br /&gt;
== (21.05) Регулярные выражения, КА, их эквивалентность. Лемма о накачке  ==&lt;br /&gt;
=== Задание 20 (до 28.05) ===&lt;br /&gt;
&#039;&#039;&#039;I Написать регулярные выражения&#039;&#039;&#039;&lt;br /&gt;
# Напишите регулярное выражение для языка над алфавитом Σ = {0, 1} каждое слово которого содержит хотя бы два нуля.&lt;br /&gt;
# Напишите регулярное выражение над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5. Является ли он детерминированным?&lt;br /&gt;
# Напишите регулярное выражение, которое допускает пустой язык (язык в котором нет ни одного слова).&lt;br /&gt;
# Напишите регулярное выражение, которое допускает все слова над алфавитом Σ.&lt;br /&gt;
# Напишите регулярное выражение для языка над алфавитом Σ = {0, 1, 2, 3}, состоящий из слов, в которых хотя бы одна из последних пяти букв является 1.&lt;br /&gt;
&#039;&#039;&#039;II КА и регулярные выражения&#039;&#039;&#039;&lt;br /&gt;
# Постройте конечный автомат для языка (111 + 01)&amp;lt;sup&amp;gt;∗&amp;lt;/sup&amp;gt;1(00 + 11)&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&#039;&#039;&#039;III Доказать замкнутость относительно различных операций&#039;&#039;&#039;&lt;br /&gt;
# Покажите, что если для языков L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; и L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; существует КА, который их читает, то существует КА и для их объединения L = {w | w ∈ L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; или w ∈ L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;}.&lt;br /&gt;
# Покажите, что если для языка L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; и L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; существует КА, который их читает, то существует КА и для языка L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; = {xy | x ∈ L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, y ∈ L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;}.&lt;br /&gt;
# Покажите, что если для языка L существует КА, который его читает, то существует КА и для &#039;&#039;&#039;замыкания Клини&#039;&#039;&#039; L* = {w&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; w&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; ... w&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;| w&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; ∈ L, w&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; ∈ L, ..., w&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; ∈ L}.&lt;br /&gt;
# Покажите, что если язык L регулярен, то регулярно его дополнение (т.е. язык над тем же алфавитом, которому принадлежит слово тогда и только тогда, когда оно НЕ принадлежит L) .&lt;br /&gt;
# Покажите, что если язык L регулярен, то регулярно его обращение L&amp;lt;sub&amp;gt;R&amp;lt;/sub&amp;gt; = {a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; . . . a&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; | a&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; . . . a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; ∈ L}. (L&amp;lt;sub&amp;gt;R&amp;lt;/sub&amp;gt; --- это язык в котором все слова языка L записаны наоборот.)&lt;br /&gt;
# * Покажите, что если языки L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; и L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; регулярны, то регулярно их пересечение.&lt;br /&gt;
&#039;&#039;&#039;IV Использование леммы о накачке&#039;&#039;&#039;&lt;br /&gt;
# Докажите, что не существует КА, который бы читал язык {0&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;1&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;2&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;}. (Пояснение: запись 0&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; означает строку из n нулей: 00...0.)&lt;br /&gt;
# Докажите, что не существует КА, который бы читал язык {0&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;1&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;}.&lt;br /&gt;
# Докажите, что не существует КА, который бы читал язык {0&amp;lt;sup&amp;gt;n!&amp;lt;/sup&amp;gt;}.&lt;/div&gt;</summary>
		<author><name>Kassalanche</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=13879</id>
		<title>Алгоритмы и структуры данных. Подгруппа 105-1</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=13879"/>
		<updated>2015-05-21T04:20:23Z</updated>

		<summary type="html">&lt;p&gt;Kassalanche: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==О курсе==&lt;br /&gt;
[[Алгоритмы_и_структуры_данных|План лекций и список рекомендуемой литературы.]]&lt;br /&gt;
&lt;br /&gt;
[[Алгоритмы_и_структуры_данных._Подгруппа_105-1._FAQ|FAQ.]]&lt;br /&gt;
&lt;br /&gt;
[[Reviewboard|Инструкция по использованию Reviewboard.]]&lt;br /&gt;
&lt;br /&gt;
[[Практические_занятия_по_курсу_ОиМП/C++_check|Style guide.]]&lt;br /&gt;
&lt;br /&gt;
==Итоговая оценка за курс==&lt;br /&gt;
Итоговая оценка (ИО) зависит от&lt;br /&gt;
* оценок за пять больших домашних заданий (БДЗ1, БДЗ2, ..., БДЗ5),&lt;br /&gt;
* оценок за домашние задания (ДЗ1, ДЗ2, ...),&lt;br /&gt;
* оценки за контрольную работу (КР),&lt;br /&gt;
* оценки за экзамен (ЭКЗ),&lt;br /&gt;
и может быть вычислена по формуле:&lt;br /&gt;
 ИО = 0.7 * (0.3 * КР + 0.7 *(ИДЗ1 + ИДЗ2 + ИДЗ3 + ИДЗ4 + ИДЗ5)/5) + 0.3 * ЭКЗ =&lt;br /&gt;
    = 0.21*КР + 0.98*ИДЗ1 + 0.98*ИДЗ2 + 0.98*ИДЗ3 + 0.98*ИДЗ4 + 0.98*ИДЗ5 + 0.3*ЭКЗ,&lt;br /&gt;
где&lt;br /&gt;
 ИДЗi = min (10, 0.7 * БДЗi + 0.4 * &amp;lt;cредняя оценка за ДЗj, прошедшие с предыдущего БДЗ по i-ое&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
==Порядок сдачи домашних работ==&lt;br /&gt;
===Большие домашние работы===&lt;br /&gt;
# Получить OK за задачу в контесте.&lt;br /&gt;
# Залить исходный код на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* На каждую задачу создавайте отдельный запрос на ревью. &lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении суток приходят замечания к коду. &#039;&#039;&#039;Если в течении суток замечаний или Ship It не появилось, проверьте, что вы правильно отправили запрос и, если всё сделано правильно, спросите у семинариста получил ли он запрос.&#039;&#039;&#039;&lt;br /&gt;
# Вы их исправляете, проверяете в контесте, что программа по-прежнему проходит все тесты, заливаете новую версию в Review Board. Штрафов за посылки НЕ будет.&lt;br /&gt;
# Процесс повторяется пока остаются замечания к коду или пока не истёк дедлайн. После закрытия контеста будут ещё одни сутки на доработку замечаний в Review Board.&lt;br /&gt;
# Оценивается только последняя версия работы в Review Board.&lt;br /&gt;
&lt;br /&gt;
===Маленькие домашние работы===&lt;br /&gt;
# Залить решение на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* Желаемые форматы: txt, py, cpp, h. Допускаются любые другие.&lt;br /&gt;
#* На каждую домашнюю работу создавайте отдельный запрос на ревью. Обязательно указывайте номер домашней работы.&lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении неопределенного промежутка времени придут оценки по каждому из заданий.&lt;br /&gt;
&lt;br /&gt;
==Оценивание домашних работ==&lt;br /&gt;
* Все задания предполагаются индивидуальными. Запрещены любые заимствования без ссылки на автора.&lt;br /&gt;
* Решения после установленного дедлайна не принимаются. Дедлайн указан в заголовке каждого задания.&lt;br /&gt;
* Везде, где требуется написать алгоритм, можно использовать любой язык программирования или псевдокод.&lt;br /&gt;
* Там, где требуется построить алгоритм с заданной асимптотикой, приведите обоснование, что полученный алгоритм удовлетворяет этому условию.&lt;br /&gt;
* Эти правила не действуют, если в задании явно оговорено иное.&lt;br /&gt;
&lt;br /&gt;
==Мотивация к изучению алгоритмов. Подсчёт числа операций (12.01)==&lt;br /&gt;
# Числа Фибоначчи. Определение. Примитивный рекурсивный алгоритм вычисления i-ого числа. Оценка числа операций. Анализ причин неэффективности. Алгоритм с запоминанием вычисленных ранее значений. Оценка числа операций. Сравнение с предыдущим. (подробнее: глава 0, страницы 8-10 из книги &amp;lt;&amp;lt;Алгоритмы&amp;gt;&amp;gt;, [[Алгоритмы_и_структуры_данных|см. список рекомендованной литературы]])&lt;br /&gt;
# Задача о ханойской башне. Постановка задачи. Рекурсивный алгоритм. Рекуррентная формула для числа перемещений. Замкнутая формула для числа перемещений (+ доказательство). Доказательство того, что эту задачу нельзя решить используя меньшее число перемещений дисков. ([https://www.dropbox.com/s/t8cbs7ttu4iasvj/algo-0-recursion.pdf?dl=0 Разбор задачи о ханойской башне], автор Сергей Объедков)&lt;br /&gt;
# Сортировка пузырьком. Алгоритм. Подсчёт количество операций сравнения и обмена (swap). Анализ наилучшего и наихудшего случаев ([https://ru.wikipedia.org/wiki/Сортировка_пузырьком Википедия])&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 1 (12.01 - 26.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
Во всех задачах, если не оговорено иного, предполагаем, что работаем с целыми неотрицательными числами. Для первых 7 задач необходимо&lt;br /&gt;
* описать что можно считать наилучшим и наихудшим случаями,&lt;br /&gt;
* для каждого из двух случаев подсчитать отдельно количество операций сравнения и swap (если есть).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Даны три числа, требуется вернуть наименьшее.&lt;br /&gt;
# Даны три числа, требуется отсортировать их.&lt;br /&gt;
# Дана последовательность A из n элементов и число x, требуется найти элемент равный x. Примечание: если таких значений i несколько, вернуть любое; если такого элемента нет, функция должна сообщить об этом.&lt;br /&gt;
# * Дана упорядоченная последовательность A из n элементов и число x, требуется найти такое i, что A[i] равно x. Алгоритм должен быть эффективней, чем в предыдущем пункте и использовать то, что последовательность упорядочена.&lt;br /&gt;
# Дана последовательность из 100 000 чисел от 0 до 100. Напишите эффективный алгоритм сортировки, который бы учитывал специфику входных данных.&lt;br /&gt;
# * Дано 32 битное неотрицательное число. Требуется номер первого ненулевого бит. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения, считая, что числа распределены равномерно.&lt;br /&gt;
# * Даны 32 битные неотрицательные числа m и n. Требуется вывести True, если m &amp;lt; n, иначе False. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения битов, считая, что числа распределены равномерно.&lt;br /&gt;
# Напишите рекурсивную функцию, вычисляющую n-ое число Фибоначчи (как на занятии). Подсчитайте количество рекурсивных вызовов.&lt;br /&gt;
# * Напишите функцию, вычисляющую n-ое число Фибоначчи, у которой число операций — полином от n, и которая использует количество памяти, независящее от n.&lt;br /&gt;
&lt;br /&gt;
==O-символика и стратегия &amp;quot;разделяй и властвуй&amp;quot; (15.01)==&lt;br /&gt;
# Сортировка слиянием. Алгоритм, рекуррентное соотношение для времени сортировки, сложность. Подробнее: [https://dl.dropboxusercontent.com/u/829163/draft.pdf §2.3 Сортировка слиянием (стр. 54)].&lt;br /&gt;
# О-символика. [https://dl.dropboxusercontent.com/u/829163/draft.pdf §0.3 О-символика (стр. 10)].&lt;br /&gt;
# Задача о слиянии m упорядоченных массивов по n элементов. Три алгоритма решения: последовательное слияние, слияние &amp;quot;деревом&amp;quot; (обе функции используют Merge из MergeSort), аналог Merge для m массивов. Анализ сложности каждого из них.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 2 (15.01-29.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
* Во всех задачах, если не оговорено иного, для простоты &#039;&#039;можно&#039;&#039; считать, что n является степенью какого-либо числа, например, степенью двойки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Дана функция F, определённая ниже. Сколько строк она напечатает? Указание: для обоих подпунктов рассмотрите два случая: 1. n является степенью двойки, 2. n не является степенью двойки.&lt;br /&gt;
## Запишите рекуррентное соотношение для числа строк.&lt;br /&gt;
## Решите уравнение, полученное в предыдущем пункте, то есть, выведите замкнутую (нерекуррентную формулу). Для простоты можно считать, что n является степенью двойки.&lt;br /&gt;
# В массиве A размера n записана возрастающая последовательность целых чисел. Постройте алгоритм типа &amp;quot;разделяй и властвуй&amp;quot;, который проверяет, существует ли такой индекс i, что A[i] = i&lt;br /&gt;
## за время O(n),&lt;br /&gt;
## * за время O(log n).&lt;br /&gt;
## Какие случаи для вашего алгоритма являются наихудшими и наилучшими? Какого время работы в лучшем и худшем случаях?&lt;br /&gt;
# Дан бесконечный массив A, первые n элементов которого содержат возрастающую последовательность положительных чисел, а дальше стоят -1. Значение n не дано. Постройте алгоритм, который получает на вход целое число x и находит это x в массиве --- или говорит, что там его нет, &lt;br /&gt;
## за время O(n),&lt;br /&gt;
## за время O(log n).&lt;br /&gt;
# Рассмотрим алгоритм вычисления наибольшего общего делителя (НОД) двух положительных чисел, основанный на методе &amp;quot;разделяй и властвуй&amp;quot;.&lt;br /&gt;
## (задание не оценивается) Прочитайте [https://dl.dropboxusercontent.com/u/829163/draft.pdf §1.2.3 Алгоритм Евклида (стр. 23)].&lt;br /&gt;
## * Докажите, что определение НОД-а, приведённое ниже, корректно.&lt;br /&gt;
## Постройте алгоритм, основанный на этом определении.&lt;br /&gt;
## Какой алгоритм будет быстрее для n-битовых чисел a и b при больших значениях n --- ваш или алгоритм Евклида?&lt;br /&gt;
# * Покажите как за время O(n log n) удалить из массива размера n все дубликаты, то есть оставить каждый элемент в одном экземпляре.&lt;br /&gt;
# * Даны два упорядоченных массива размера m и n. Постройте алгоритм, находящий k-й по величине элемент в объединении этих массивов за время O(log(n+m)). &lt;br /&gt;
&lt;br /&gt;
Функция F(n).&lt;br /&gt;
  если n &amp;gt; 1:&lt;br /&gt;
    напечатать &amp;quot;всё ещё работаю&amp;quot;&lt;br /&gt;
    F(n/2)&lt;br /&gt;
    F(n/2)&lt;br /&gt;
&lt;br /&gt;
Определение НОД-а.&lt;br /&gt;
             2НОД(a/2, b/2), если а и b чётны,&lt;br /&gt;
  НОД(a,b) = НОД(a, b/2), если а нечётно, b чётно,&lt;br /&gt;
             НОД((a-b)/2, b), если а и b нечётны.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;lt;nowiki&amp;gt;Задачи взяты из книги &amp;quot;Алгоритмы&amp;quot;, глава 2 (см. список рекомендованной литературы).&amp;lt;/nowiki&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Сложение и умножение (19.01)==&lt;br /&gt;
# Алгоритм сложения, его сложность (§1.1.1 Сложение*)&lt;br /&gt;
# &amp;quot;Школьный&amp;quot; алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Рекурсивный алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Алгоритм умножения, реализующий стратегию &amp;quot;разделяй и властвуй&amp;quot;, анализ сложности (§2.1 Умножение чисел*)&lt;br /&gt;
 * [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать.]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 3 (19.01 - 2.02)===&lt;br /&gt;
* Во всех задачах для простоты можно считать, что n является степенью какого-либо числа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Найдите произведение чисел 10011011 и 10111010 (в двоичной системе счисления), используя алгоритм умножения чисел, основанный на методе «разделяй и властвуй». Необходимо не только дать ответ, но и привести ход решения.&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 3 рекурсивных вызова для подзадач размера n-1 и комбинирует из них решение исходной задачи за О(n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте три верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 10 рекурсивных вызовов для подзадач размера n/2 и комбинирует из них решение исходной задачи за О(5n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте два верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Докажите, что 3m² + m = O(m²).&lt;br /&gt;
# Докажите, что lg m = O(m/1000), где lg m — это логарифм с двоичным основанием.&lt;br /&gt;
# Докажите, что из равенства f(n) = O(g(n)) не следует, что g(n) = O(f(n)).&lt;br /&gt;
# Докажите, что O(m) содержится в O(m²).&lt;br /&gt;
&lt;br /&gt;
==Решение рекуррентных уравнений (22.01)==&lt;br /&gt;
# Примеры решений рекуррентных уравнений (см. [https://www.dropbox.com/s/6a0r410zjm9qwe7/algo-3-recurrences.pdf?dl=0 конспект]).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 4 (до 14.02)===&lt;br /&gt;
* Нельзя использовать утверждение основной теоремы о решении рекуррентных соотношений.&lt;br /&gt;
* &#039;&#039;Можно&#039;&#039; использовать метод построения дерева рекурсии или подстановку (метод с угадыванием ответа).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Какой из трёх приведённых ниже алгоритмов вы бы предпочли? Обоснуйте свой ответ.&lt;br /&gt;
#* Алгоритм A, решая задачу, производит пять рекурсивных вызовов для подзадач вдвое меньшего размера, после чего строит ответ для исходной задачи за линейное время.&lt;br /&gt;
#* Алгоритм B, решая задачу размера n, делает два рекурсивных вызова для задач размера n − 1, после чего находит ответ за время O(1).&lt;br /&gt;
#* Алгоритм C, решая задачу размера n, рекурсивно решает девять задач размера n/3 и строит ответ за время O(n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Найдите T(n) в замкнутой форме для любых 7 из 10 приведённых ниже рекуррентных соотношений:&lt;br /&gt;
## T(n) ≤ 2T(n/3) + 1;&lt;br /&gt;
## T(n) ≤ 7T(n/7) + n;&lt;br /&gt;
## T(n) ≤ 9T(n/3) + n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 8T(n/2) + n&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 49T(n/25) + n&amp;lt;sup&amp;gt;3/2&amp;lt;/sup&amp;gt;log n;&lt;br /&gt;
## T(n) ≤ T(n − 1) + 2;&lt;br /&gt;
## T(n) ≤ T(n − 1) + n&amp;lt;sup&amp;gt;c&amp;lt;/sup&amp;gt;, где c ≥ 1 –– константа;&lt;br /&gt;
## T(n) ≤ T(n − 1) + c&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;, где c &amp;gt; 1 –– константа;&lt;br /&gt;
## T(n) ≤ 2T(n − 1) + 1;&lt;br /&gt;
## T(n) ≤ T(sqrt(n)) + 1.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №1==&lt;br /&gt;
Необходимо реализовать все 6 задач из [https://official.contest.yandex.ru/contest/1002 контеста]. Каждую задачу можно писать на С++ или Python. На выполнение работы отводится две недели. Каждая задача оценивается в 10/6 балла. Оценка &#039;&#039;может&#039;&#039; быть снижена за плохой код, но не более чем на 25%.&lt;br /&gt;
&lt;br /&gt;
==Бинарное дерево поиска (26.01)==&lt;br /&gt;
# Определение. Пример.&lt;br /&gt;
# Не модифицирующие алгоритмы: поиск (рекурсивный и итеративный алгоритмы), поиск минимума, inordered обход (вывод значений узлов в отсортированном порядке), поиск следующего по возрастанию.&lt;br /&gt;
# Модифицирующие алгоритмы: вставка (рекурсивная реализация), удаление (только идея).&lt;br /&gt;
 [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 13, стр. 248]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 5 (до 16.02)===&lt;br /&gt;
* Для получения максимальной оценки можно выполнить или все задачи без звёздочки, или задачу со звёздочкой. Преподаватель понимает, что реализацию БДП сложно не найти в интернете, но от копипасты не будет никакой пользы. Напротив, самостоятельная реализация очень полезна и приветствуется, даже если не получится выполнить всех пунктов задания.&lt;br /&gt;
* Задачи с двумя звёздочками необязательны.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Нарисуйте бинарные деревья поиска высотой 2, 3, 4, 5 и 6 для множества ключей {1, 4, 5, 10, 16, 17, 21}. Корень дерева имеет высоту 0.&lt;br /&gt;
# &#039;&#039;&#039;Сортировка с использованием БДП.&#039;&#039;&#039;&lt;br /&gt;
## Какова асимптотическая сложность алгоритма вставки элемента в дерево высоты d? Почему? Назовите наилучший и наиухдший случаи.&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который строит БДП в узлах которого стоят элементы данной последовательности. Можно использовать функцию Insert. Назовите наилучший и наихудший случаи. Есть теорема о том, что полученный алгоритм будет работать в среднем случае за время O(n * log n).&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который выводит их в порядке возрастания. Используйте бинарное дерево поиска. Какова в среднем случае сложность этого алгоритма? Назовите наилучший и наихудший случаи. Какова сложность в наихудшем случае?&lt;br /&gt;
# Напишите функцию GetRoot, которой на вход подаётся указатель на произвольный узел дерева, а она возвращает указатель на корень.&lt;br /&gt;
# Напишите процедуру PrintLeafs, которой на вход подаётся указатель на корень дерева, и она печатает листья дерева&lt;br /&gt;
## по возрастанию,&lt;br /&gt;
## по убыванию.&lt;br /&gt;
# ** Альтернативный обход в порядке возрастания бинарного дерева поиска с n узлами (или центрированный (inordered) обход) можно осуществить путём поиска минимального элемента дерева с помощью функции Minimum с последующий n-1 вызовом функции Next. Каково время работы такого алгоритма?&lt;br /&gt;
# * Реализуйте на С++ структуру данных бинарное дерево поиска, [https://yadi.sk/i/gi2SEStreFfSb используя заготовку].&lt;br /&gt;
## Нарисуйте бинарное дерево поиска, которое строится в функции getTreeExample.&lt;br /&gt;
## Реализуйте следующие алгоритмы: &lt;br /&gt;
### поиск минимума, &lt;br /&gt;
### inordered обход (вывод значений узлов в отсортированном порядке),&lt;br /&gt;
### поиск следующего по возрастанию,&lt;br /&gt;
### вставка элемента в дерево,&lt;br /&gt;
### сортировка последовательности с использованием БДП (дан вектор чисел, необходимо вывести их по возрастанию),&lt;br /&gt;
### ** удаление.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Карацубы, Штрассена. Быстрая сортировка (29.01)==&lt;br /&gt;
# Алгоритм Карацубы.&lt;br /&gt;
# Алгоритм Штрассена. [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать Дасгупту и др., §2.5 Умножение матриц]&lt;br /&gt;
# Быстрая сортировка и доказательство того, что в среднем случае она работает за О(n * log n). [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 8 Быстрая сортировка, стр. 148]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 6 (до 18.02)===&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Пусть мы хотим найти двоичное представление десятичного числа 10&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;. Будем считать, что n --- степень двойки (n = 2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt;).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Pwr2Bin(n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть 1010&lt;br /&gt;
    z = ...&lt;br /&gt;
    вернуть Multiply(z, z)&amp;lt;/source&amp;gt;&lt;br /&gt;
Multiply --- функция, перемножающая два n-битовых двоичных числа x и y по алгоритму Карацубы за O(n&amp;lt;sup&amp;gt;log&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;3&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Пусть мы хотим перевести произвольное десятичное число x в записи которого n=2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; чисел в двоичную систему счисления.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Dec2Bin(x, n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть binary[x]&lt;br /&gt;
    разделить x на два десятичных числа xl и xr из n/2 цифр.&lt;br /&gt;
    вернуть ...&amp;lt;/source&amp;gt;&lt;br /&gt;
Здесь binary --- это массив, содержащий двоичное представление десятичных цифр.&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Докажите, что математическое ожидание времени работы алгоритма быстрой сортировки (усреднение по всем вариантам выбора опорного элемента) на любом входе размера n удовлетворяет соотношению: T(n) ≤ O(n) + 1/n * &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt; (T(i-1) + T(n-i)).&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Найдите решение соотношения из предыдущего пункта.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Динамическое программирование (ДП). Первые примеры (02.01)==&lt;br /&gt;
# Нахождение самой длинной возрастающей подпоследовательности.&lt;br /&gt;
# Нахождение редакционного расстояния (или редакционной стоимости, расстояния Левенштейна).&lt;br /&gt;
# Нахождение представителя большинства.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 7 (до 20.02)===&lt;br /&gt;
* В этом задании везде, где требуется реализовать алгоритм, необходимо привести код на любом языке программирования.&lt;br /&gt;
* Для получения максимальной оценки нужно решить все задачи без звёздочек. Одна решённая задача со звёздочкой заменяет одну задачу без звёздочки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения редакционного расстояния (алгоритм Вагнера — Фишера). Например, редакционное расстояние между словами &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равно 6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения длины наибольшей общей подстроки. Например, длина наибольшей общей подстроки &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равна 8 (&amp;quot;antholog&amp;quot;). Чем больше это значение, тем схожей строки.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Предположим теперь, что сравниваемые строки состоят из символов A, С, G и T; за удаление или вставку мы платим -5; за замену буквы x на y платим w[x, y], где x, y принадлежат множеству {A, С, G, T}, a w — это матрица весов:&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
!-!! A!! G!! C!! T&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! A&lt;br /&gt;
|10||-1||-3||-4&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
!G&lt;br /&gt;
||-1||7||-5||-3&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! C&lt;br /&gt;
||-3||-5||9||0&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! T&lt;br /&gt;
||-4||-3||0||8&lt;br /&gt;
|}&lt;br /&gt;
Тогда выравнивание:&lt;br /&gt;
 AGACTAGTTAC&lt;br /&gt;
 CGA‒‒‒GACGT&lt;br /&gt;
будет иметь следующую оценку:&lt;br /&gt;
 w[A,C] + w[G,G] + w[A,A] + 3*(-5) + w[G,G] + w[T,A] + w[T,C] + w[A,G] + w[C,T] = -3 + 7 + 10 - 3*5 + 7 + (-4) + 0 + (-1) + 0 = 1.&lt;br /&gt;
&lt;br /&gt;
Напишите алгоритм, который находит максимальную стоимость всех возможных выравниваний. Верно ли, что чем больше это значение, тем непохожей строки?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как давно один народ отделился от другого? Кто похожей — итальянец и китаец или якут и эфиоп? На эти вопросы можно отвечать с разных точек зрения — культурной, исторической, лингвистической, ... В последние же годы человечество научилось секвенировать геном, что позволило исследовать этот вопрос с точки зрения генетики. Секвенирование генома — это процесс записи ДНК в виде нуклеотидной последовательности, которая представляет собой последовательность из четырёх символов — A, С, G и T. Существуют базы, которые хранят генетическую информацию о людях из разных стран и континентов, например, [http://www.mtdb.igp.uu.se/ http://www.mtdb.igp.uu.se/ → Download mtDNA sequences]. Чем больше сходство между геномами, тем сильнее родственные связи между их обладателями. Используя решение предыдущего пункта, выполните задания:&lt;br /&gt;
# Определите, кто похожей — итальянец и китаец или якут и эфиоп?&lt;br /&gt;
# Найдите нескольких похожих и нескольких непохожих народностей.&lt;br /&gt;
# * Выберите одну народность. Найдите самых похожих и самых непохожих на неё.&lt;br /&gt;
# * Найдите самые похожие и самые непохожие народности.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Задача о разрезании стержня (05.01)==&lt;br /&gt;
# Постановка задачи.&lt;br /&gt;
# Решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Решение с нахождением максимума по p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Восходящий алгоритм с запоминанием. Вывод длин кусочков стержня. Оценка сложности.&lt;br /&gt;
# Нисходящий алгоритм с запоминанием. Оценка сложности.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.1 Разрезание стержня, стр. 393]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 8 (до 22.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Решая задачу о разрезании стержня мы вначале построили рекурсивное решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt; для всех 1 ≤ i &amp;lt; n. Его сложность описывалась рекуррентной формулой T(n) = n + &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n-1&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt;(T(i) + T(n-i)), T(1) = 1.&lt;br /&gt;
# Объясните эту формулу.&lt;br /&gt;
# Покажите с помощью метода подстановок, что T(n) ≤ 2&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Покажите с помощью контрпримера, что описанная далее жадная стратегия не всегда определяет оптимальный способ разрезания стержня. Определим плотность стержня длиной i как p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;/i, то есть как стоимость единицы его длины. Жадная стратегия для стержня длиной n отрезает от стержня первую часть длиной i, где 1 ≤ i ≤ n, имеющую максимальную плотность. Затем та же жадная стратегия применяется к оставшейся части длиной n-i.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Рассмотрим модификацию задачи разрезания стержня, в которой в дополнение к цене p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; каждого стержня добавляется фиксированная цена разреза c. Теперь прибыль, связанная с решением, представляет собой сумму цен частей стержня минус стоимость разрезов. Разработайте алгоритм динамического программирования для этой модифицированной задачи.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Непрерывным участком называется группа подряд идущих элементов. Например, для последовательности&lt;br /&gt;
 5, 15, −30, 10, −5, 40, 10&lt;br /&gt;
элементы 15, −30, 10 образуют непрерывный участок, а 5, 15, 40 -- нет. Постройте линейный алгоритм для следующей задачи:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Вход: список чисел a1, a2, ... ‌, an.&lt;br /&gt;
Выход: непрерывный участок с максимальной суммой (сумма участка нулевой длины равна нулю).&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Для приведённого примера ответом будет 10, −5, 40, 10 с суммой 55. Какова сложность алгоритма? Почему?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Надо заплатить v рублей, имея купюры в x1, x2, ‌..., xn рублей (купюр каждого типа сколько угодно). Это не всегда возможно (скажем, купюрами в&lt;br /&gt;
10 и 25 рублей можно заплатить 45 рублей, но не 47 и не 15). Постройте основанный на методе динамического программирования алгоритм со временем работы O(nv), выясняющий, возможна ли уплата.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как решить предыдущую задачу, если каждая купюра имеется в единственном экземпляре? (Например, купюрами в 1, 5, 10, 20 рублей можно заплатить 16 = 1 + 5 + 10 и 31 = 1 + 10 + 20 рублей, но не 40 (не хватит денег). Время работы алгоритма по-прежнему O(nv).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Ещё один вариант той же задачи: купюр каждого типа сколько угодно, но всего разрешается использовать не более k купюр. (Например, если есть купюры в 5 и 10 рублей, а k = 6, то 55 разменять можно, а 65 –– нет).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Перемножение цепочки матриц. Оптимальное бинарное дерево поиска (начало) (09.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о перемножении цепочки матриц. Постановка задачи.Пример. Нисходящий алгоритм.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.2 Перемножение цепочки матриц, стр. 403]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 9 (до 24.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Найдите оптимальную расстановку скобок в произведении последовательности матриц, размерности которых равны 5×10, 10×3, 3×12, 12×5, 5×50, 50×6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Напишите восходящий алгоритм для поиска оптимальной расстановки скобок.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Расстановка пробелов. Оптимальное бинарное дерево поиска (середина) (12.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о расстановке пробелов. Постановка задачи. Решения для трёх случаев: 1. нужно вернуть можно ли разбить текст на слова; 2. вернуть разбивку на слова; 3. слова встречаются не равновероятно, вернуть наиболее вероятную разбивку на слова.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи. Вывод математического ожидания времени поиска.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Праздничное домашнее задание 10 (до 02.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[&amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;,&amp;quot;, &amp;quot;.&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;,&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;.&amp;quot;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Подсказка:&#039;&#039;&#039; разбейте текст на слова из списка и посмотрите на азбуку Морзе.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Способы представления графов в памяти (16.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Разбор ошибок в домашнем задании.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Графы. Способы представления графов в памяти (матрица смежности, список рёбер, список соседей (список смежностей), матрица инцидентности). Зависимость сложности алгоритмов от способа представления.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §22.1 Представление графов, стр. 626]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 11 (до 02.03)===&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача A.]&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача B.]&lt;br /&gt;
# Нарисуйте неориентированный граф с 5 вершинами и 8 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Нарисуйте ориентированный граф с 4 вершинами и 3 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Дан ориентированный граф. &#039;&#039;Исходящая степень вершины v&#039;&#039; --- это количество исходящих из неё рёбер, &#039;&#039;входящая степень v&#039;&#039; --- это количество рёбер входящих в  v. Имеется представление ориентированного графа с использование списка соседей. Как долго будут вычисляться исходящие степени всех вершин графа? А входящие степени?&lt;br /&gt;
# Дан граф G = (V, E). Какие из рассмотренных способов хранения графов используют меньше всего памяти для хранения G и почему? Указание: рассмотрите случаи |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;lt; |E| и |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;gt; |E|.&lt;br /&gt;
# Пусть C --- это матрица смежности графа G.&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
# Пусть B --- это матрица инцидентности ориентированного графа G. Как связаны элементы матрицы BB&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
&lt;br /&gt;
==Реализация поиска в глубину (19.02)==&lt;br /&gt;
# Реализация поиска в глубину и смежных задач.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 12 (до 5.03)===&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Выберите любой способ хранения графа. Реализуйте поиск в глубину.&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Напишите алгоритм, который возвращает данные о том, какие вершины лежат в одной компоненте связности.&lt;br /&gt;
# &#039;&#039;(любой ЯП или псевдокод)&#039;&#039; Напишите алгоритм проверки сильной связности ориентированного графа. Какова его сложность?&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №2==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
Необходимо реализовать 3 задачи из [https://official.contest.yandex.ru/contest/1085 контеста], см. [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing распределение задач]. Каждую задачу можно написать на С++ или Python. На выполнение работы отводится две недели (см. время окончания контеста). [https://official.contest.yandex.ru/contest/1123 Дорешивание.]&lt;br /&gt;
&lt;br /&gt;
==ДП и графы (26.02)==&lt;br /&gt;
==ДП и графы (02.03)==&lt;br /&gt;
==Жадные алгоритмы (12.03)==&lt;br /&gt;
===Домашнее задание 13 (до 23.03)===&lt;br /&gt;
# Вася хочет купить по одной акции каждой компании. Все акции стоят одинаково, но дорожают по-разному. Каждый месяц акция i-ой компании дорожает в r_i раз. В один месяц можно купить только одну акцию.&lt;br /&gt;
## Напишите алгоритм, который выводит оптимальную последовательность покупок (такую, что на покупку всех акций потратится меньше денег).&lt;br /&gt;
## Докажите корректность алгоритма, то есть докажите, что последовательность покупок, которую выводит ваш алгоритм, оптимальна.&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список, очередь (16.03)==&lt;br /&gt;
# Реализация линейного двусвязного списка (С++).&lt;br /&gt;
# Реализация очереди ограниченной длины на базе вектора (С++).&lt;br /&gt;
# Реализация очереди на базе списка (С++).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14 (до 23.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте (на С++) структуру данных Стек. У стека должно быть три операции:&lt;br /&gt;
* push --- положить элемент на вершину стека;&lt;br /&gt;
* pop --- удалить верхний элемент;&lt;br /&gt;
* front --- вернуть значение верхнего элемента.&lt;br /&gt;
Оцените время работы каждой функции.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список (19.03)==&lt;br /&gt;
===Домашнее задание 13* (до 30.03)===&lt;br /&gt;
#Для приведённой реализации класса List (https://yadi.sk/i/c5r_79WdfMyNS).&lt;br /&gt;
## Допишите print, push_back и push_front.&lt;br /&gt;
## В функции insert_after и delete_node вставьте необходимые проверки так, чтобы они работали для крайних случаев.&lt;br /&gt;
## Напишите main в котором&lt;br /&gt;
### создаётся объект класса List, &lt;br /&gt;
### заполняется элементами с помощью функций push_back, push_front и insert_after и&lt;br /&gt;
### удаляется i-ый элемент.&lt;br /&gt;
&lt;br /&gt;
==Повторение (30.03)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Для данных пар функций выясните их связь в терминах O-, o-, Ω-, ω-, Θ-обозначений. Поставьте галочку в клетке с Ω, если f(x) = Ω(g(x)) и прочерк, если равенства нет. [https://ru.wikipedia.org/wiki/«O»_большое_и_«o»_малое#.D0.94.D1.80.D1.83.D0.B3.D0.B8.D0.B5_.D0.BF.D0.BE.D0.B4.D0.BE.D0.B1.D0.BD.D1.8B.D0.B5_.D0.BE.D0.B1.D0.BE.D0.B7.D0.BD.D0.B0.D1.87.D0.B5.D0.BD.D0.B8.D1.8F Википедия]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! f(x)!! g(x)!! O!! o!! Ω!! ω!! Θ&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! 2^100&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n * log(n)&lt;br /&gt;
! 2^100 * n * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n&lt;br /&gt;
! 2^100 * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n!&lt;br /&gt;
! 2^(2015n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n*2^n&lt;br /&gt;
! 3^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 5^n&lt;br /&gt;
! 5^(n+1)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n + n^2 + n^3 + ... + n^1000&lt;br /&gt;
! 7^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм Quickselect нахождения k-ого элемента по возрастанию: http://en.wikipedia.org/wiki/Quickselect&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;На улице стоит ряд домов. В каждом из домов лежит сколько-то денег. Вор хочет обокрасть дома на переулке. Он не может обокрасть два соседних дома, потому что хозяин дома, который он обокрал, сразу предупредит соседей. Нужно найти, какую максимальную сумму вор может украсть с переулка. На вход программы подается массив неотрицательных целых чисел - количество долларов в доме с номером i. Соседние дома в массиве представлены соседними элементами. Например, пусть задан массив { 1, 4, 5 } - тогда вор максимум может украсть $6, обокрав дома 1 и 3. Пусть задан массив { 1, 7, 2 } - тогда вор максимум может украсть $7, обокрав дом 2.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Алфавит из всех маленьких латинских букв и пробела закодирован числами следующим способом:&lt;br /&gt;
  &#039;a&#039; -&amp;gt; 1&lt;br /&gt;
  &#039;b&#039; -&amp;gt; 2&lt;br /&gt;
  &#039;c&#039; -&amp;gt; 3&lt;br /&gt;
  ...&lt;br /&gt;
  &#039;z&#039; -&amp;gt; 26&lt;br /&gt;
  &#039; &#039; -&amp;gt; 27&lt;br /&gt;
На вход программы подается строка из цифр. Нужно посчитать, сколькими способами можно раскодировать эту строку.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Дан граф, заданный матрицей смежности. Вывести пары вершин между которыми нет пути.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Повторение (02.04) ==&lt;br /&gt;
Решали и разбирали первые 4 задачи из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14* (до 11.03)===&lt;br /&gt;
Решите любые две задачи (подпункты НЕ считаются отдельными задачами) с предыдущей пары (Повторение (30.03)).&lt;br /&gt;
&lt;br /&gt;
== Повторение (06.04) ==&lt;br /&gt;
Будем решать вторую половину задач из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 15 (до 16.04)===&lt;br /&gt;
# Приведите пример графа, который содержит отрицательные рёбра, не содержит циклов отрицательного веса и для которого алгоритм Дейкстры возвращает неверный результат.&lt;br /&gt;
# Используется ли в алгоритме Дейкстры то, что веса рёбер неотрицательны? Если &amp;quot;да&amp;quot;, то где именно?&lt;br /&gt;
# Пусть граф содержит рёбра с весами &amp;gt;= -100. Если прибавить к каждому ребру 101 и при помощи алгоритма Дейкстры найти кратчайшие пути. Будут ли эти пути кратчайшими в исходном графе? Почему?&lt;br /&gt;
&lt;br /&gt;
== Повторение (07.04) ==&lt;br /&gt;
&#039;&#039;&#039;Решение рекуррентных соотношений&#039;&#039;&#039;&lt;br /&gt;
# Решите уравнение: T(n) = 4*T(n/2) + O(n^2) с базой T(1) = O(1)&lt;br /&gt;
## Используя основную теорему.&lt;br /&gt;
## Используя дерево рекурсий.&lt;br /&gt;
## Методом подстановки.&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2)) + n является \Theta(n lg n).&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2) + 17) + n является \Theta(n lg n).&lt;br /&gt;
# Решите уравнения, считая, что T(1) = O(1):&lt;br /&gt;
## T(n) = T(n-1) + n&lt;br /&gt;
## T(n) = 2*T(floor(sqrt(n))) + lg n. Указание: попробуйте использовать замену переменных.&lt;br /&gt;
## T(n) = 3*T(sqrt(n)) + lg n&lt;br /&gt;
# Дайте верхнюю и нижнюю оценки функции T(n). Постарайтесь, чтобы оценки были как можно более точные&lt;br /&gt;
## T(n) = 4T(n/3) + n*lg(n)&lt;br /&gt;
## T(n) = 3T(n/3) + n/lg(n)&lt;br /&gt;
## T(n) = 4T(n/2) + n^2*sqrt(n)&lt;br /&gt;
## T(n) = T(n/2) + T(n/4) + T(n/8) + n&lt;br /&gt;
## T(n) = T(n-1) + 1/n&lt;br /&gt;
## T(n) = T(n-2) + 1/lg(n)&lt;br /&gt;
## T(n) = sqrt(n) * T(sqrt(n)) + n&lt;br /&gt;
&#039;&#039;&#039;Анализ и построение алгоритмов&#039;&#039;&#039;&lt;br /&gt;
# Числа Фибоначчи F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; можно выразить через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, используя матрицу: https://yadi.sk/i/Pm_aNzHCforFU. &lt;br /&gt;
## Покажите как вычислить F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;.&lt;br /&gt;
## Как вычислить F&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;n+1&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;?&lt;br /&gt;
## Напишите алгоритм.&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
## Ускорьте его так, чтобы он работал за O(log n).&lt;br /&gt;
# Дана последовательность символов. Какое минимальное количество символов нужно удалить из неё, чтобы получить палиндром?&lt;br /&gt;
## Напишите алгоритм (на псевдокоде или на любом языке программирования).&lt;br /&gt;
## Оцените время работы алгоритма.&lt;br /&gt;
# Какую структуру данных вы бы использовали для реализации упорядоченного множества (http://neerc.ifmo.ru/wiki/index.php?title=Упорядоченное_множество)? Какая будет сложность каждой из операций над множеством?&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 16 (до 20.04)===&lt;br /&gt;
# Решите 6 задач из первой части и 6 из второй. (Укажите какие именно.) Каждый из подпунктов является отдельной задачей.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм и теорема Форда-Фалкерсона (16.04)==&lt;br /&gt;
# Базовые определения (пропускные способности, сток, исток и пр.). Пример. &lt;br /&gt;
# Ограничения на поток (сохранение и что меньше пропускных способностей).&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, пример работы&lt;br /&gt;
# Разрез, определение, пример.&lt;br /&gt;
# Утверждение: максимальный поток &amp;lt;= любого разреза.&lt;br /&gt;
# Теорема Форда-Фалкерсона (с доказательством).&lt;br /&gt;
# Пример на котором алгоритм Форда-Фалкерсонаработает работает очень долго при неудачном выборе путей.&lt;br /&gt;
# Сложность алгоритма Форда-Фалкерсона.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №3==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
В [https://official.contest.yandex.ru/contest/1196 домашнем задании] пять задач. Они разделены на два варианта, помеченные римскими цифрами I и II. Свой вариант нужно узнать [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing здесь на вкладке HW3]. Третья задача — общая для двух вариантов; ее решение необходимо снабдить доказательством корректности алгоритма. На выполнение задания дается примерно 2 недели (см. точное время окончания в контесте). Каждую задачу можно написать на С++ или Python.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Форда-Фалкерсона и Эдмондса-Карпа (20.04)==&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, напоминание: базовые определения, пример работы, пример на котором алгоритм работает долго, сложность.&lt;br /&gt;
# Алгоритм Эдмодса-Карпа. Доказательство асимптотики времени работы.&lt;br /&gt;
&lt;br /&gt;
==(23.04)==&lt;br /&gt;
&lt;br /&gt;
==(11.05) Красно-чёрные деревья==&lt;br /&gt;
[https://ru.wikipedia.org/wiki/Красно-чёрное_дерево Красно-чёрное дерево]&lt;br /&gt;
===Домашнее задание 17 (до 18.05)===&lt;br /&gt;
# Зачем нужны красно-чёрные деревья?&lt;br /&gt;
# Благодаря какому свойству и почему красно-чёрное дерево является сбалансированным?&lt;br /&gt;
# Нарисуйте полное бинарное дерево поиска высотой 3 с ключами {1, 2, ..., 15}. Сделайте из него красно-чёрные деревья высотой 2, 3 и 4.&lt;br /&gt;
# Нарисуйте красно-чёрные деревья, получающиеся последовательной вставкой элементов 12, 10, 29, 30, 31, 32 в [https://ru.wikipedia.org/wiki/Красно-чёрное_дерево#/media/File:Red-black_tree_example.svg данное дерево]. Для вставки используйте алгоритм вставки из Википедии. Укажите какой именно функцией вы воспользовались.&lt;br /&gt;
# Определим &#039;&#039;&#039;ослабленное красно-чёрное дерево&#039;&#039;&#039; как бинарное дерево поиска, которое удовлетворяет красно-чёрным свойствам 1, 3, 4 и 5. Другими словами, корень может быть как чёрным, так и красным. Рассмотрите ослабленное красно-чёрное дерево T, корень которого красный. Если перекрасить корень дерева T в чёрный, будет ли оно красно-чёрным деревом?&lt;br /&gt;
# Покажите, что самый длинный простой нисходящий путь от вершины x к листу красно-черного дерева имеет длину, не более чем в два раза превышающую кратчайший путь от x к листу-потомку.&lt;br /&gt;
# Чему равно наибольшее возможное количество внутренних узлов в красно-чёрном дереве с чёрной высоты k? А наименьшее возможное количество?&lt;br /&gt;
# Нарисуйте красно-чёрные деревья, получающиеся последовательной вставкой ключей 41, 38, 31, 12, 19, 8 в изначально пустое дерево.&lt;br /&gt;
# Покажите какие деревья будут получаться в результате последовательного удаления ключей в порядке 8, 12, 19, 31, 38, 41.&lt;br /&gt;
&lt;br /&gt;
==(14.05) Конкурентный анализ самоорганизующихся циклов==&lt;br /&gt;
[https://vk.com/doc12518218_390369758 Лекция]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 18 (до 21.05)===&lt;br /&gt;
Все вычисления сопроводите подробными объяснениями о том, почему верно то или иное (не)равенство.&lt;br /&gt;
# Пусть имеется n-элементный список и m поисковых запросов к нему. После каждой операции поиска можно переупорядочить список. Обозначим стоимость последовательности поисков через C. Докажите, что в худшем случае C = Ω(mn).&lt;br /&gt;
#  Обозначим через c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; стоимость i-ого поискового запроса с применением эвристики перемещения в начало, которая включает стоимость поиска элемента в списке и стоимость его перемещения в начало списка путём ряда обменов соседних элементов списка. Покажите, что i-ая операция поиска находит элемент x в списке L с применением эвристики перемещения в начало, то c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = 2 * rank&amp;lt;sub&amp;gt;L&amp;lt;/sub&amp;gt;(x) - 1.&lt;br /&gt;
# Покажите, что c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = 2 * rank&amp;lt;sub&amp;gt;L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) - 1.&lt;br /&gt;
# Покажите, что c*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = rank&amp;lt;sub&amp;gt;L*&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) + t&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;.&lt;br /&gt;
# Докажите, что после одного обмена двух соседних элементов потенциал либо увеличивается на 2, либо уменьшается на 2.&lt;br /&gt;
# Докажите, что rank&amp;lt;sub&amp;gt;L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) = |A| + |B| + 1.&lt;br /&gt;
# Докажите, что rank&amp;lt;sub&amp;gt;L*&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) = |A| + |С| + 1.&lt;br /&gt;
# Покажите, что поиск i-ого элемента приводит к изменению потенциала Ф(L&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;) - Ф(L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;) &amp;lt;= 2 (|A| - |B| + t*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;), где t*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; --- это количество обменов при i-ом поиске.&lt;br /&gt;
# Во сколько раз стоимость С&amp;lt;sub&amp;gt;MFT&amp;lt;/sub&amp;gt;(S) превышает C&amp;lt;sub&amp;gt;OPT&amp;lt;/sub&amp;gt;(S)?&lt;br /&gt;
&lt;br /&gt;
== (18.05) Конечные автоматы ==&lt;br /&gt;
=== Задание 19 (до 25.05) ===&lt;br /&gt;
# Постройте автомат для языка над алфавитом Σ = {0, 1} каждое слово которого содержит хотя бы два нуля. Является ли он детерминированным?&lt;br /&gt;
# Постройте автомат над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5. Является ли он детерминированным?&lt;br /&gt;
# Постройте автомат, который допускает пустой язык (язык в котором нет ни одного слова).&lt;br /&gt;
# Постройте автомат, который допускает все слова над алфавитом Σ.&lt;br /&gt;
# Постройте ДКА над алфавитом Σ = {К, Ж, З}, который допускает слова в которых после К идёт З, после З --- Ж, после Ж --- К.&lt;br /&gt;
# * Постройте ДКА над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5, а число нулей на 3.&lt;br /&gt;
# Постройте НКА для языка над алфавитом Σ = {0, 1, 2, 3}, состоящий из слов, в которых хотя бы одна из последних пяти букв является 1.&lt;br /&gt;
# Постройте НКА над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5, а число нулей на 3.&lt;br /&gt;
# Какие языки допускают автоматы https://yadi.sk/d/fNAHbjCZghERG?&lt;br /&gt;
# Для каждого из автоматов https://yadi.sk/d/fNAHbjCZghERG постройте соответствующий ему ДКА.&lt;br /&gt;
&lt;br /&gt;
== (21.05) Регулярные выражения, КА, их эквивалентность. Лемма о накачке  ==&lt;br /&gt;
=== Задание 20 (до 28.05) ===&lt;br /&gt;
&#039;&#039;&#039;I Написать регулярные выражения&#039;&#039;&#039;&lt;br /&gt;
# Напишите регулярное выражение для языка {1, 000, 1010}.&lt;br /&gt;
# Напишите регулярное выражение для языка над алфавитом Σ = {0, 1} каждое слово которого содержит хотя бы два нуля.&lt;br /&gt;
# Напишите регулярное выражение над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5. Является ли он детерминированным?&lt;br /&gt;
# Напишите регулярное выражение, которое допускает пустой язык (язык в котором нет ни одного слова).&lt;br /&gt;
# Напишите регулярное выражение, которое допускает все слова над алфавитом Σ.&lt;br /&gt;
# Напишите регулярное выражение для языка над алфавитом Σ = {0, 1, 2, 3}, состоящий из слов, в которых хотя бы одна из последних пяти букв является 1.&lt;br /&gt;
&#039;&#039;&#039;II Доказать замкнутость относительно различных операций&#039;&#039;&#039;&lt;br /&gt;
# Покажите, что если для языков L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; и L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; существует КА, который их читает, то существует КА и для их объединения L = {w | w ∈ L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; или w ∈ L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;}.&lt;br /&gt;
# Покажите, что если для языка L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; и L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; существует КА, который их читает, то существует КА и для языка L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; = {xy | x ∈ L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, y ∈ L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;}.&lt;br /&gt;
# Покажите, что если для языка L существует КА, который его читает, то существует КА и для &#039;&#039;&#039;замыкания Клини&#039;&#039;&#039; L* = {w&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; w&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; ... w&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;| w&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; ∈ L, w&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; ∈ L, ..., w&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; ∈ L}.&lt;br /&gt;
# Покажите, что если язык L регулярен, то регулярно его дополнение (т.е. язык над тем же алфавитом, которому принадлежит слово тогда и только тогда, когда оно НЕ принадлежит L) .&lt;br /&gt;
# Покажите, что если язык L регулярен, то регулярно его обращение L&amp;lt;sub&amp;gt;R&amp;lt;/sub&amp;gt; = {a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; . . . a&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; | a&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; . . . a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; ∈ L}. (L&amp;lt;sub&amp;gt;R&amp;lt;/sub&amp;gt; --- это язык в котором все слова языка L записаны наоборот.)&lt;br /&gt;
# * Покажите, что если языки L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; и L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; регулярны, то регулярно их пересечение.&lt;br /&gt;
&#039;&#039;&#039;III Использование леммы о накачке&#039;&#039;&#039;&lt;br /&gt;
# Докажите, что не существует КА, который бы читал язык {0&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;1&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;2&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;}. (Пояснение: запись 0&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; означает строку из n нулей: 00...0.)&lt;br /&gt;
# Докажите, что не существует КА, который бы читал язык {0&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;1&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;}.&lt;br /&gt;
# Докажите, что не существует КА, который бы читал язык {0&amp;lt;sup&amp;gt;n!&amp;lt;/sup&amp;gt;}.&lt;/div&gt;</summary>
		<author><name>Kassalanche</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=13878</id>
		<title>Алгоритмы и структуры данных. Подгруппа 105-1</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=13878"/>
		<updated>2015-05-21T04:19:39Z</updated>

		<summary type="html">&lt;p&gt;Kassalanche: /* Задание 20 (до 28.05) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==О курсе==&lt;br /&gt;
[[Алгоритмы_и_структуры_данных|План лекций и список рекомендуемой литературы.]]&lt;br /&gt;
&lt;br /&gt;
[[Алгоритмы_и_структуры_данных._Подгруппа_105-1._FAQ|FAQ.]]&lt;br /&gt;
&lt;br /&gt;
[[Reviewboard|Инструкция по использованию Reviewboard.]]&lt;br /&gt;
&lt;br /&gt;
[[Практические_занятия_по_курсу_ОиМП/C++_check|Style guide.]]&lt;br /&gt;
&lt;br /&gt;
==Итоговая оценка за курс==&lt;br /&gt;
Итоговая оценка (ИО) зависит от&lt;br /&gt;
* оценок за пять больших домашних заданий (БДЗ1, БДЗ2, ..., БДЗ5),&lt;br /&gt;
* оценок за домашние задания (ДЗ1, ДЗ2, ...),&lt;br /&gt;
* оценки за контрольную работу (КР),&lt;br /&gt;
* оценки за экзамен (ЭКЗ),&lt;br /&gt;
и может быть вычислена по формуле:&lt;br /&gt;
 ИО = 0.7 * (0.3 * КР + 0.7 *(ИДЗ1 + ИДЗ2 + ИДЗ3 + ИДЗ4 + ИДЗ5)/5) + 0.3 * ЭКЗ =&lt;br /&gt;
    = 0.21*КР + 0.98*ИДЗ1 + 0.98*ИДЗ2 + 0.98*ИДЗ3 + 0.98*ИДЗ4 + 0.98*ИДЗ5 + 0.3*ЭКЗ,&lt;br /&gt;
где&lt;br /&gt;
 ИДЗi = min (10, 0.7 * БДЗi + 0.4 * &amp;lt;cредняя оценка за ДЗj, прошедшие с предыдущего БДЗ по i-ое&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
==Порядок сдачи домашних работ==&lt;br /&gt;
===Большие домашние работы===&lt;br /&gt;
# Получить OK за задачу в контесте.&lt;br /&gt;
# Залить исходный код на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* На каждую задачу создавайте отдельный запрос на ревью. &lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении суток приходят замечания к коду. &#039;&#039;&#039;Если в течении суток замечаний или Ship It не появилось, проверьте, что вы правильно отправили запрос и, если всё сделано правильно, спросите у семинариста получил ли он запрос.&#039;&#039;&#039;&lt;br /&gt;
# Вы их исправляете, проверяете в контесте, что программа по-прежнему проходит все тесты, заливаете новую версию в Review Board. Штрафов за посылки НЕ будет.&lt;br /&gt;
# Процесс повторяется пока остаются замечания к коду или пока не истёк дедлайн. После закрытия контеста будут ещё одни сутки на доработку замечаний в Review Board.&lt;br /&gt;
# Оценивается только последняя версия работы в Review Board.&lt;br /&gt;
&lt;br /&gt;
===Маленькие домашние работы===&lt;br /&gt;
# Залить решение на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* Желаемые форматы: txt, py, cpp, h. Допускаются любые другие.&lt;br /&gt;
#* На каждую домашнюю работу создавайте отдельный запрос на ревью. Обязательно указывайте номер домашней работы.&lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении неопределенного промежутка времени придут оценки по каждому из заданий.&lt;br /&gt;
&lt;br /&gt;
==Оценивание домашних работ==&lt;br /&gt;
* Все задания предполагаются индивидуальными. Запрещены любые заимствования без ссылки на автора.&lt;br /&gt;
* Решения после установленного дедлайна не принимаются. Дедлайн указан в заголовке каждого задания.&lt;br /&gt;
* Везде, где требуется написать алгоритм, можно использовать любой язык программирования или псевдокод.&lt;br /&gt;
* Там, где требуется построить алгоритм с заданной асимптотикой, приведите обоснование, что полученный алгоритм удовлетворяет этому условию.&lt;br /&gt;
* Эти правила не действуют, если в задании явно оговорено иное.&lt;br /&gt;
&lt;br /&gt;
==Мотивация к изучению алгоритмов. Подсчёт числа операций (12.01)==&lt;br /&gt;
# Числа Фибоначчи. Определение. Примитивный рекурсивный алгоритм вычисления i-ого числа. Оценка числа операций. Анализ причин неэффективности. Алгоритм с запоминанием вычисленных ранее значений. Оценка числа операций. Сравнение с предыдущим. (подробнее: глава 0, страницы 8-10 из книги &amp;lt;&amp;lt;Алгоритмы&amp;gt;&amp;gt;, [[Алгоритмы_и_структуры_данных|см. список рекомендованной литературы]])&lt;br /&gt;
# Задача о ханойской башне. Постановка задачи. Рекурсивный алгоритм. Рекуррентная формула для числа перемещений. Замкнутая формула для числа перемещений (+ доказательство). Доказательство того, что эту задачу нельзя решить используя меньшее число перемещений дисков. ([https://www.dropbox.com/s/t8cbs7ttu4iasvj/algo-0-recursion.pdf?dl=0 Разбор задачи о ханойской башне], автор Сергей Объедков)&lt;br /&gt;
# Сортировка пузырьком. Алгоритм. Подсчёт количество операций сравнения и обмена (swap). Анализ наилучшего и наихудшего случаев ([https://ru.wikipedia.org/wiki/Сортировка_пузырьком Википедия])&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 1 (12.01 - 26.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
Во всех задачах, если не оговорено иного, предполагаем, что работаем с целыми неотрицательными числами. Для первых 7 задач необходимо&lt;br /&gt;
* описать что можно считать наилучшим и наихудшим случаями,&lt;br /&gt;
* для каждого из двух случаев подсчитать отдельно количество операций сравнения и swap (если есть).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Даны три числа, требуется вернуть наименьшее.&lt;br /&gt;
# Даны три числа, требуется отсортировать их.&lt;br /&gt;
# Дана последовательность A из n элементов и число x, требуется найти элемент равный x. Примечание: если таких значений i несколько, вернуть любое; если такого элемента нет, функция должна сообщить об этом.&lt;br /&gt;
# * Дана упорядоченная последовательность A из n элементов и число x, требуется найти такое i, что A[i] равно x. Алгоритм должен быть эффективней, чем в предыдущем пункте и использовать то, что последовательность упорядочена.&lt;br /&gt;
# Дана последовательность из 100 000 чисел от 0 до 100. Напишите эффективный алгоритм сортировки, который бы учитывал специфику входных данных.&lt;br /&gt;
# * Дано 32 битное неотрицательное число. Требуется номер первого ненулевого бит. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения, считая, что числа распределены равномерно.&lt;br /&gt;
# * Даны 32 битные неотрицательные числа m и n. Требуется вывести True, если m &amp;lt; n, иначе False. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения битов, считая, что числа распределены равномерно.&lt;br /&gt;
# Напишите рекурсивную функцию, вычисляющую n-ое число Фибоначчи (как на занятии). Подсчитайте количество рекурсивных вызовов.&lt;br /&gt;
# * Напишите функцию, вычисляющую n-ое число Фибоначчи, у которой число операций — полином от n, и которая использует количество памяти, независящее от n.&lt;br /&gt;
&lt;br /&gt;
==O-символика и стратегия &amp;quot;разделяй и властвуй&amp;quot; (15.01)==&lt;br /&gt;
# Сортировка слиянием. Алгоритм, рекуррентное соотношение для времени сортировки, сложность. Подробнее: [https://dl.dropboxusercontent.com/u/829163/draft.pdf §2.3 Сортировка слиянием (стр. 54)].&lt;br /&gt;
# О-символика. [https://dl.dropboxusercontent.com/u/829163/draft.pdf §0.3 О-символика (стр. 10)].&lt;br /&gt;
# Задача о слиянии m упорядоченных массивов по n элементов. Три алгоритма решения: последовательное слияние, слияние &amp;quot;деревом&amp;quot; (обе функции используют Merge из MergeSort), аналог Merge для m массивов. Анализ сложности каждого из них.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 2 (15.01-29.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
* Во всех задачах, если не оговорено иного, для простоты &#039;&#039;можно&#039;&#039; считать, что n является степенью какого-либо числа, например, степенью двойки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Дана функция F, определённая ниже. Сколько строк она напечатает? Указание: для обоих подпунктов рассмотрите два случая: 1. n является степенью двойки, 2. n не является степенью двойки.&lt;br /&gt;
## Запишите рекуррентное соотношение для числа строк.&lt;br /&gt;
## Решите уравнение, полученное в предыдущем пункте, то есть, выведите замкнутую (нерекуррентную формулу). Для простоты можно считать, что n является степенью двойки.&lt;br /&gt;
# В массиве A размера n записана возрастающая последовательность целых чисел. Постройте алгоритм типа &amp;quot;разделяй и властвуй&amp;quot;, который проверяет, существует ли такой индекс i, что A[i] = i&lt;br /&gt;
## за время O(n),&lt;br /&gt;
## * за время O(log n).&lt;br /&gt;
## Какие случаи для вашего алгоритма являются наихудшими и наилучшими? Какого время работы в лучшем и худшем случаях?&lt;br /&gt;
# Дан бесконечный массив A, первые n элементов которого содержат возрастающую последовательность положительных чисел, а дальше стоят -1. Значение n не дано. Постройте алгоритм, который получает на вход целое число x и находит это x в массиве --- или говорит, что там его нет, &lt;br /&gt;
## за время O(n),&lt;br /&gt;
## за время O(log n).&lt;br /&gt;
# Рассмотрим алгоритм вычисления наибольшего общего делителя (НОД) двух положительных чисел, основанный на методе &amp;quot;разделяй и властвуй&amp;quot;.&lt;br /&gt;
## (задание не оценивается) Прочитайте [https://dl.dropboxusercontent.com/u/829163/draft.pdf §1.2.3 Алгоритм Евклида (стр. 23)].&lt;br /&gt;
## * Докажите, что определение НОД-а, приведённое ниже, корректно.&lt;br /&gt;
## Постройте алгоритм, основанный на этом определении.&lt;br /&gt;
## Какой алгоритм будет быстрее для n-битовых чисел a и b при больших значениях n --- ваш или алгоритм Евклида?&lt;br /&gt;
# * Покажите как за время O(n log n) удалить из массива размера n все дубликаты, то есть оставить каждый элемент в одном экземпляре.&lt;br /&gt;
# * Даны два упорядоченных массива размера m и n. Постройте алгоритм, находящий k-й по величине элемент в объединении этих массивов за время O(log(n+m)). &lt;br /&gt;
&lt;br /&gt;
Функция F(n).&lt;br /&gt;
  если n &amp;gt; 1:&lt;br /&gt;
    напечатать &amp;quot;всё ещё работаю&amp;quot;&lt;br /&gt;
    F(n/2)&lt;br /&gt;
    F(n/2)&lt;br /&gt;
&lt;br /&gt;
Определение НОД-а.&lt;br /&gt;
             2НОД(a/2, b/2), если а и b чётны,&lt;br /&gt;
  НОД(a,b) = НОД(a, b/2), если а нечётно, b чётно,&lt;br /&gt;
             НОД((a-b)/2, b), если а и b нечётны.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;lt;nowiki&amp;gt;Задачи взяты из книги &amp;quot;Алгоритмы&amp;quot;, глава 2 (см. список рекомендованной литературы).&amp;lt;/nowiki&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Сложение и умножение (19.01)==&lt;br /&gt;
# Алгоритм сложения, его сложность (§1.1.1 Сложение*)&lt;br /&gt;
# &amp;quot;Школьный&amp;quot; алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Рекурсивный алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Алгоритм умножения, реализующий стратегию &amp;quot;разделяй и властвуй&amp;quot;, анализ сложности (§2.1 Умножение чисел*)&lt;br /&gt;
 * [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать.]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 3 (19.01 - 2.02)===&lt;br /&gt;
* Во всех задачах для простоты можно считать, что n является степенью какого-либо числа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Найдите произведение чисел 10011011 и 10111010 (в двоичной системе счисления), используя алгоритм умножения чисел, основанный на методе «разделяй и властвуй». Необходимо не только дать ответ, но и привести ход решения.&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 3 рекурсивных вызова для подзадач размера n-1 и комбинирует из них решение исходной задачи за О(n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте три верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 10 рекурсивных вызовов для подзадач размера n/2 и комбинирует из них решение исходной задачи за О(5n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте два верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Докажите, что 3m² + m = O(m²).&lt;br /&gt;
# Докажите, что lg m = O(m/1000), где lg m — это логарифм с двоичным основанием.&lt;br /&gt;
# Докажите, что из равенства f(n) = O(g(n)) не следует, что g(n) = O(f(n)).&lt;br /&gt;
# Докажите, что O(m) содержится в O(m²).&lt;br /&gt;
&lt;br /&gt;
==Решение рекуррентных уравнений (22.01)==&lt;br /&gt;
# Примеры решений рекуррентных уравнений (см. [https://www.dropbox.com/s/6a0r410zjm9qwe7/algo-3-recurrences.pdf?dl=0 конспект]).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 4 (до 14.02)===&lt;br /&gt;
* Нельзя использовать утверждение основной теоремы о решении рекуррентных соотношений.&lt;br /&gt;
* &#039;&#039;Можно&#039;&#039; использовать метод построения дерева рекурсии или подстановку (метод с угадыванием ответа).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Какой из трёх приведённых ниже алгоритмов вы бы предпочли? Обоснуйте свой ответ.&lt;br /&gt;
#* Алгоритм A, решая задачу, производит пять рекурсивных вызовов для подзадач вдвое меньшего размера, после чего строит ответ для исходной задачи за линейное время.&lt;br /&gt;
#* Алгоритм B, решая задачу размера n, делает два рекурсивных вызова для задач размера n − 1, после чего находит ответ за время O(1).&lt;br /&gt;
#* Алгоритм C, решая задачу размера n, рекурсивно решает девять задач размера n/3 и строит ответ за время O(n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Найдите T(n) в замкнутой форме для любых 7 из 10 приведённых ниже рекуррентных соотношений:&lt;br /&gt;
## T(n) ≤ 2T(n/3) + 1;&lt;br /&gt;
## T(n) ≤ 7T(n/7) + n;&lt;br /&gt;
## T(n) ≤ 9T(n/3) + n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 8T(n/2) + n&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 49T(n/25) + n&amp;lt;sup&amp;gt;3/2&amp;lt;/sup&amp;gt;log n;&lt;br /&gt;
## T(n) ≤ T(n − 1) + 2;&lt;br /&gt;
## T(n) ≤ T(n − 1) + n&amp;lt;sup&amp;gt;c&amp;lt;/sup&amp;gt;, где c ≥ 1 –– константа;&lt;br /&gt;
## T(n) ≤ T(n − 1) + c&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;, где c &amp;gt; 1 –– константа;&lt;br /&gt;
## T(n) ≤ 2T(n − 1) + 1;&lt;br /&gt;
## T(n) ≤ T(sqrt(n)) + 1.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №1==&lt;br /&gt;
Необходимо реализовать все 6 задач из [https://official.contest.yandex.ru/contest/1002 контеста]. Каждую задачу можно писать на С++ или Python. На выполнение работы отводится две недели. Каждая задача оценивается в 10/6 балла. Оценка &#039;&#039;может&#039;&#039; быть снижена за плохой код, но не более чем на 25%.&lt;br /&gt;
&lt;br /&gt;
==Бинарное дерево поиска (26.01)==&lt;br /&gt;
# Определение. Пример.&lt;br /&gt;
# Не модифицирующие алгоритмы: поиск (рекурсивный и итеративный алгоритмы), поиск минимума, inordered обход (вывод значений узлов в отсортированном порядке), поиск следующего по возрастанию.&lt;br /&gt;
# Модифицирующие алгоритмы: вставка (рекурсивная реализация), удаление (только идея).&lt;br /&gt;
 [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 13, стр. 248]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 5 (до 16.02)===&lt;br /&gt;
* Для получения максимальной оценки можно выполнить или все задачи без звёздочки, или задачу со звёздочкой. Преподаватель понимает, что реализацию БДП сложно не найти в интернете, но от копипасты не будет никакой пользы. Напротив, самостоятельная реализация очень полезна и приветствуется, даже если не получится выполнить всех пунктов задания.&lt;br /&gt;
* Задачи с двумя звёздочками необязательны.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Нарисуйте бинарные деревья поиска высотой 2, 3, 4, 5 и 6 для множества ключей {1, 4, 5, 10, 16, 17, 21}. Корень дерева имеет высоту 0.&lt;br /&gt;
# &#039;&#039;&#039;Сортировка с использованием БДП.&#039;&#039;&#039;&lt;br /&gt;
## Какова асимптотическая сложность алгоритма вставки элемента в дерево высоты d? Почему? Назовите наилучший и наиухдший случаи.&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который строит БДП в узлах которого стоят элементы данной последовательности. Можно использовать функцию Insert. Назовите наилучший и наихудший случаи. Есть теорема о том, что полученный алгоритм будет работать в среднем случае за время O(n * log n).&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который выводит их в порядке возрастания. Используйте бинарное дерево поиска. Какова в среднем случае сложность этого алгоритма? Назовите наилучший и наихудший случаи. Какова сложность в наихудшем случае?&lt;br /&gt;
# Напишите функцию GetRoot, которой на вход подаётся указатель на произвольный узел дерева, а она возвращает указатель на корень.&lt;br /&gt;
# Напишите процедуру PrintLeafs, которой на вход подаётся указатель на корень дерева, и она печатает листья дерева&lt;br /&gt;
## по возрастанию,&lt;br /&gt;
## по убыванию.&lt;br /&gt;
# ** Альтернативный обход в порядке возрастания бинарного дерева поиска с n узлами (или центрированный (inordered) обход) можно осуществить путём поиска минимального элемента дерева с помощью функции Minimum с последующий n-1 вызовом функции Next. Каково время работы такого алгоритма?&lt;br /&gt;
# * Реализуйте на С++ структуру данных бинарное дерево поиска, [https://yadi.sk/i/gi2SEStreFfSb используя заготовку].&lt;br /&gt;
## Нарисуйте бинарное дерево поиска, которое строится в функции getTreeExample.&lt;br /&gt;
## Реализуйте следующие алгоритмы: &lt;br /&gt;
### поиск минимума, &lt;br /&gt;
### inordered обход (вывод значений узлов в отсортированном порядке),&lt;br /&gt;
### поиск следующего по возрастанию,&lt;br /&gt;
### вставка элемента в дерево,&lt;br /&gt;
### сортировка последовательности с использованием БДП (дан вектор чисел, необходимо вывести их по возрастанию),&lt;br /&gt;
### ** удаление.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Карацубы, Штрассена. Быстрая сортировка (29.01)==&lt;br /&gt;
# Алгоритм Карацубы.&lt;br /&gt;
# Алгоритм Штрассена. [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать Дасгупту и др., §2.5 Умножение матриц]&lt;br /&gt;
# Быстрая сортировка и доказательство того, что в среднем случае она работает за О(n * log n). [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 8 Быстрая сортировка, стр. 148]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 6 (до 18.02)===&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Пусть мы хотим найти двоичное представление десятичного числа 10&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;. Будем считать, что n --- степень двойки (n = 2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt;).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Pwr2Bin(n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть 1010&lt;br /&gt;
    z = ...&lt;br /&gt;
    вернуть Multiply(z, z)&amp;lt;/source&amp;gt;&lt;br /&gt;
Multiply --- функция, перемножающая два n-битовых двоичных числа x и y по алгоритму Карацубы за O(n&amp;lt;sup&amp;gt;log&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;3&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Пусть мы хотим перевести произвольное десятичное число x в записи которого n=2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; чисел в двоичную систему счисления.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Dec2Bin(x, n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть binary[x]&lt;br /&gt;
    разделить x на два десятичных числа xl и xr из n/2 цифр.&lt;br /&gt;
    вернуть ...&amp;lt;/source&amp;gt;&lt;br /&gt;
Здесь binary --- это массив, содержащий двоичное представление десятичных цифр.&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Докажите, что математическое ожидание времени работы алгоритма быстрой сортировки (усреднение по всем вариантам выбора опорного элемента) на любом входе размера n удовлетворяет соотношению: T(n) ≤ O(n) + 1/n * &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt; (T(i-1) + T(n-i)).&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Найдите решение соотношения из предыдущего пункта.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Динамическое программирование (ДП). Первые примеры (02.01)==&lt;br /&gt;
# Нахождение самой длинной возрастающей подпоследовательности.&lt;br /&gt;
# Нахождение редакционного расстояния (или редакционной стоимости, расстояния Левенштейна).&lt;br /&gt;
# Нахождение представителя большинства.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 7 (до 20.02)===&lt;br /&gt;
* В этом задании везде, где требуется реализовать алгоритм, необходимо привести код на любом языке программирования.&lt;br /&gt;
* Для получения максимальной оценки нужно решить все задачи без звёздочек. Одна решённая задача со звёздочкой заменяет одну задачу без звёздочки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения редакционного расстояния (алгоритм Вагнера — Фишера). Например, редакционное расстояние между словами &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равно 6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения длины наибольшей общей подстроки. Например, длина наибольшей общей подстроки &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равна 8 (&amp;quot;antholog&amp;quot;). Чем больше это значение, тем схожей строки.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Предположим теперь, что сравниваемые строки состоят из символов A, С, G и T; за удаление или вставку мы платим -5; за замену буквы x на y платим w[x, y], где x, y принадлежат множеству {A, С, G, T}, a w — это матрица весов:&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
!-!! A!! G!! C!! T&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! A&lt;br /&gt;
|10||-1||-3||-4&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
!G&lt;br /&gt;
||-1||7||-5||-3&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! C&lt;br /&gt;
||-3||-5||9||0&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! T&lt;br /&gt;
||-4||-3||0||8&lt;br /&gt;
|}&lt;br /&gt;
Тогда выравнивание:&lt;br /&gt;
 AGACTAGTTAC&lt;br /&gt;
 CGA‒‒‒GACGT&lt;br /&gt;
будет иметь следующую оценку:&lt;br /&gt;
 w[A,C] + w[G,G] + w[A,A] + 3*(-5) + w[G,G] + w[T,A] + w[T,C] + w[A,G] + w[C,T] = -3 + 7 + 10 - 3*5 + 7 + (-4) + 0 + (-1) + 0 = 1.&lt;br /&gt;
&lt;br /&gt;
Напишите алгоритм, который находит максимальную стоимость всех возможных выравниваний. Верно ли, что чем больше это значение, тем непохожей строки?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как давно один народ отделился от другого? Кто похожей — итальянец и китаец или якут и эфиоп? На эти вопросы можно отвечать с разных точек зрения — культурной, исторической, лингвистической, ... В последние же годы человечество научилось секвенировать геном, что позволило исследовать этот вопрос с точки зрения генетики. Секвенирование генома — это процесс записи ДНК в виде нуклеотидной последовательности, которая представляет собой последовательность из четырёх символов — A, С, G и T. Существуют базы, которые хранят генетическую информацию о людях из разных стран и континентов, например, [http://www.mtdb.igp.uu.se/ http://www.mtdb.igp.uu.se/ → Download mtDNA sequences]. Чем больше сходство между геномами, тем сильнее родственные связи между их обладателями. Используя решение предыдущего пункта, выполните задания:&lt;br /&gt;
# Определите, кто похожей — итальянец и китаец или якут и эфиоп?&lt;br /&gt;
# Найдите нескольких похожих и нескольких непохожих народностей.&lt;br /&gt;
# * Выберите одну народность. Найдите самых похожих и самых непохожих на неё.&lt;br /&gt;
# * Найдите самые похожие и самые непохожие народности.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Задача о разрезании стержня (05.01)==&lt;br /&gt;
# Постановка задачи.&lt;br /&gt;
# Решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Решение с нахождением максимума по p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Восходящий алгоритм с запоминанием. Вывод длин кусочков стержня. Оценка сложности.&lt;br /&gt;
# Нисходящий алгоритм с запоминанием. Оценка сложности.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.1 Разрезание стержня, стр. 393]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 8 (до 22.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Решая задачу о разрезании стержня мы вначале построили рекурсивное решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt; для всех 1 ≤ i &amp;lt; n. Его сложность описывалась рекуррентной формулой T(n) = n + &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n-1&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt;(T(i) + T(n-i)), T(1) = 1.&lt;br /&gt;
# Объясните эту формулу.&lt;br /&gt;
# Покажите с помощью метода подстановок, что T(n) ≤ 2&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Покажите с помощью контрпримера, что описанная далее жадная стратегия не всегда определяет оптимальный способ разрезания стержня. Определим плотность стержня длиной i как p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;/i, то есть как стоимость единицы его длины. Жадная стратегия для стержня длиной n отрезает от стержня первую часть длиной i, где 1 ≤ i ≤ n, имеющую максимальную плотность. Затем та же жадная стратегия применяется к оставшейся части длиной n-i.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Рассмотрим модификацию задачи разрезания стержня, в которой в дополнение к цене p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; каждого стержня добавляется фиксированная цена разреза c. Теперь прибыль, связанная с решением, представляет собой сумму цен частей стержня минус стоимость разрезов. Разработайте алгоритм динамического программирования для этой модифицированной задачи.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Непрерывным участком называется группа подряд идущих элементов. Например, для последовательности&lt;br /&gt;
 5, 15, −30, 10, −5, 40, 10&lt;br /&gt;
элементы 15, −30, 10 образуют непрерывный участок, а 5, 15, 40 -- нет. Постройте линейный алгоритм для следующей задачи:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Вход: список чисел a1, a2, ... ‌, an.&lt;br /&gt;
Выход: непрерывный участок с максимальной суммой (сумма участка нулевой длины равна нулю).&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Для приведённого примера ответом будет 10, −5, 40, 10 с суммой 55. Какова сложность алгоритма? Почему?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Надо заплатить v рублей, имея купюры в x1, x2, ‌..., xn рублей (купюр каждого типа сколько угодно). Это не всегда возможно (скажем, купюрами в&lt;br /&gt;
10 и 25 рублей можно заплатить 45 рублей, но не 47 и не 15). Постройте основанный на методе динамического программирования алгоритм со временем работы O(nv), выясняющий, возможна ли уплата.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как решить предыдущую задачу, если каждая купюра имеется в единственном экземпляре? (Например, купюрами в 1, 5, 10, 20 рублей можно заплатить 16 = 1 + 5 + 10 и 31 = 1 + 10 + 20 рублей, но не 40 (не хватит денег). Время работы алгоритма по-прежнему O(nv).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Ещё один вариант той же задачи: купюр каждого типа сколько угодно, но всего разрешается использовать не более k купюр. (Например, если есть купюры в 5 и 10 рублей, а k = 6, то 55 разменять можно, а 65 –– нет).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Перемножение цепочки матриц. Оптимальное бинарное дерево поиска (начало) (09.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о перемножении цепочки матриц. Постановка задачи.Пример. Нисходящий алгоритм.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.2 Перемножение цепочки матриц, стр. 403]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 9 (до 24.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Найдите оптимальную расстановку скобок в произведении последовательности матриц, размерности которых равны 5×10, 10×3, 3×12, 12×5, 5×50, 50×6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Напишите восходящий алгоритм для поиска оптимальной расстановки скобок.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Расстановка пробелов. Оптимальное бинарное дерево поиска (середина) (12.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о расстановке пробелов. Постановка задачи. Решения для трёх случаев: 1. нужно вернуть можно ли разбить текст на слова; 2. вернуть разбивку на слова; 3. слова встречаются не равновероятно, вернуть наиболее вероятную разбивку на слова.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи. Вывод математического ожидания времени поиска.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Праздничное домашнее задание 10 (до 02.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[&amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;,&amp;quot;, &amp;quot;.&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;,&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;.&amp;quot;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Подсказка:&#039;&#039;&#039; разбейте текст на слова из списка и посмотрите на азбуку Морзе.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Способы представления графов в памяти (16.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Разбор ошибок в домашнем задании.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Графы. Способы представления графов в памяти (матрица смежности, список рёбер, список соседей (список смежностей), матрица инцидентности). Зависимость сложности алгоритмов от способа представления.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §22.1 Представление графов, стр. 626]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 11 (до 02.03)===&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача A.]&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача B.]&lt;br /&gt;
# Нарисуйте неориентированный граф с 5 вершинами и 8 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Нарисуйте ориентированный граф с 4 вершинами и 3 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Дан ориентированный граф. &#039;&#039;Исходящая степень вершины v&#039;&#039; --- это количество исходящих из неё рёбер, &#039;&#039;входящая степень v&#039;&#039; --- это количество рёбер входящих в  v. Имеется представление ориентированного графа с использование списка соседей. Как долго будут вычисляться исходящие степени всех вершин графа? А входящие степени?&lt;br /&gt;
# Дан граф G = (V, E). Какие из рассмотренных способов хранения графов используют меньше всего памяти для хранения G и почему? Указание: рассмотрите случаи |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;lt; |E| и |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;gt; |E|.&lt;br /&gt;
# Пусть C --- это матрица смежности графа G.&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
# Пусть B --- это матрица инцидентности ориентированного графа G. Как связаны элементы матрицы BB&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
&lt;br /&gt;
==Реализация поиска в глубину (19.02)==&lt;br /&gt;
# Реализация поиска в глубину и смежных задач.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 12 (до 5.03)===&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Выберите любой способ хранения графа. Реализуйте поиск в глубину.&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Напишите алгоритм, который возвращает данные о том, какие вершины лежат в одной компоненте связности.&lt;br /&gt;
# &#039;&#039;(любой ЯП или псевдокод)&#039;&#039; Напишите алгоритм проверки сильной связности ориентированного графа. Какова его сложность?&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №2==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
Необходимо реализовать 3 задачи из [https://official.contest.yandex.ru/contest/1085 контеста], см. [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing распределение задач]. Каждую задачу можно написать на С++ или Python. На выполнение работы отводится две недели (см. время окончания контеста). [https://official.contest.yandex.ru/contest/1123 Дорешивание.]&lt;br /&gt;
&lt;br /&gt;
==ДП и графы (26.02)==&lt;br /&gt;
==ДП и графы (02.03)==&lt;br /&gt;
==Жадные алгоритмы (12.03)==&lt;br /&gt;
===Домашнее задание 13 (до 23.03)===&lt;br /&gt;
# Вася хочет купить по одной акции каждой компании. Все акции стоят одинаково, но дорожают по-разному. Каждый месяц акция i-ой компании дорожает в r_i раз. В один месяц можно купить только одну акцию.&lt;br /&gt;
## Напишите алгоритм, который выводит оптимальную последовательность покупок (такую, что на покупку всех акций потратится меньше денег).&lt;br /&gt;
## Докажите корректность алгоритма, то есть докажите, что последовательность покупок, которую выводит ваш алгоритм, оптимальна.&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список, очередь (16.03)==&lt;br /&gt;
# Реализация линейного двусвязного списка (С++).&lt;br /&gt;
# Реализация очереди ограниченной длины на базе вектора (С++).&lt;br /&gt;
# Реализация очереди на базе списка (С++).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14 (до 23.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте (на С++) структуру данных Стек. У стека должно быть три операции:&lt;br /&gt;
* push --- положить элемент на вершину стека;&lt;br /&gt;
* pop --- удалить верхний элемент;&lt;br /&gt;
* front --- вернуть значение верхнего элемента.&lt;br /&gt;
Оцените время работы каждой функции.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список (19.03)==&lt;br /&gt;
===Домашнее задание 13* (до 30.03)===&lt;br /&gt;
#Для приведённой реализации класса List (https://yadi.sk/i/c5r_79WdfMyNS).&lt;br /&gt;
## Допишите print, push_back и push_front.&lt;br /&gt;
## В функции insert_after и delete_node вставьте необходимые проверки так, чтобы они работали для крайних случаев.&lt;br /&gt;
## Напишите main в котором&lt;br /&gt;
### создаётся объект класса List, &lt;br /&gt;
### заполняется элементами с помощью функций push_back, push_front и insert_after и&lt;br /&gt;
### удаляется i-ый элемент.&lt;br /&gt;
&lt;br /&gt;
==Повторение (30.03)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Для данных пар функций выясните их связь в терминах O-, o-, Ω-, ω-, Θ-обозначений. Поставьте галочку в клетке с Ω, если f(x) = Ω(g(x)) и прочерк, если равенства нет. [https://ru.wikipedia.org/wiki/«O»_большое_и_«o»_малое#.D0.94.D1.80.D1.83.D0.B3.D0.B8.D0.B5_.D0.BF.D0.BE.D0.B4.D0.BE.D0.B1.D0.BD.D1.8B.D0.B5_.D0.BE.D0.B1.D0.BE.D0.B7.D0.BD.D0.B0.D1.87.D0.B5.D0.BD.D0.B8.D1.8F Википедия]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! f(x)!! g(x)!! O!! o!! Ω!! ω!! Θ&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! 2^100&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n * log(n)&lt;br /&gt;
! 2^100 * n * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n&lt;br /&gt;
! 2^100 * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n!&lt;br /&gt;
! 2^(2015n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n*2^n&lt;br /&gt;
! 3^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 5^n&lt;br /&gt;
! 5^(n+1)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n + n^2 + n^3 + ... + n^1000&lt;br /&gt;
! 7^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм Quickselect нахождения k-ого элемента по возрастанию: http://en.wikipedia.org/wiki/Quickselect&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;На улице стоит ряд домов. В каждом из домов лежит сколько-то денег. Вор хочет обокрасть дома на переулке. Он не может обокрасть два соседних дома, потому что хозяин дома, который он обокрал, сразу предупредит соседей. Нужно найти, какую максимальную сумму вор может украсть с переулка. На вход программы подается массив неотрицательных целых чисел - количество долларов в доме с номером i. Соседние дома в массиве представлены соседними элементами. Например, пусть задан массив { 1, 4, 5 } - тогда вор максимум может украсть $6, обокрав дома 1 и 3. Пусть задан массив { 1, 7, 2 } - тогда вор максимум может украсть $7, обокрав дом 2.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Алфавит из всех маленьких латинских букв и пробела закодирован числами следующим способом:&lt;br /&gt;
  &#039;a&#039; -&amp;gt; 1&lt;br /&gt;
  &#039;b&#039; -&amp;gt; 2&lt;br /&gt;
  &#039;c&#039; -&amp;gt; 3&lt;br /&gt;
  ...&lt;br /&gt;
  &#039;z&#039; -&amp;gt; 26&lt;br /&gt;
  &#039; &#039; -&amp;gt; 27&lt;br /&gt;
На вход программы подается строка из цифр. Нужно посчитать, сколькими способами можно раскодировать эту строку.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Дан граф, заданный матрицей смежности. Вывести пары вершин между которыми нет пути.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Повторение (02.04) ==&lt;br /&gt;
Решали и разбирали первые 4 задачи из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14* (до 11.03)===&lt;br /&gt;
Решите любые две задачи (подпункты НЕ считаются отдельными задачами) с предыдущей пары (Повторение (30.03)).&lt;br /&gt;
&lt;br /&gt;
== Повторение (06.04) ==&lt;br /&gt;
Будем решать вторую половину задач из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 15 (до 16.04)===&lt;br /&gt;
# Приведите пример графа, который содержит отрицательные рёбра, не содержит циклов отрицательного веса и для которого алгоритм Дейкстры возвращает неверный результат.&lt;br /&gt;
# Используется ли в алгоритме Дейкстры то, что веса рёбер неотрицательны? Если &amp;quot;да&amp;quot;, то где именно?&lt;br /&gt;
# Пусть граф содержит рёбра с весами &amp;gt;= -100. Если прибавить к каждому ребру 101 и при помощи алгоритма Дейкстры найти кратчайшие пути. Будут ли эти пути кратчайшими в исходном графе? Почему?&lt;br /&gt;
&lt;br /&gt;
== Повторение (07.04) ==&lt;br /&gt;
&#039;&#039;&#039;Решение рекуррентных соотношений&#039;&#039;&#039;&lt;br /&gt;
# Решите уравнение: T(n) = 4*T(n/2) + O(n^2) с базой T(1) = O(1)&lt;br /&gt;
## Используя основную теорему.&lt;br /&gt;
## Используя дерево рекурсий.&lt;br /&gt;
## Методом подстановки.&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2)) + n является \Theta(n lg n).&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2) + 17) + n является \Theta(n lg n).&lt;br /&gt;
# Решите уравнения, считая, что T(1) = O(1):&lt;br /&gt;
## T(n) = T(n-1) + n&lt;br /&gt;
## T(n) = 2*T(floor(sqrt(n))) + lg n. Указание: попробуйте использовать замену переменных.&lt;br /&gt;
## T(n) = 3*T(sqrt(n)) + lg n&lt;br /&gt;
# Дайте верхнюю и нижнюю оценки функции T(n). Постарайтесь, чтобы оценки были как можно более точные&lt;br /&gt;
## T(n) = 4T(n/3) + n*lg(n)&lt;br /&gt;
## T(n) = 3T(n/3) + n/lg(n)&lt;br /&gt;
## T(n) = 4T(n/2) + n^2*sqrt(n)&lt;br /&gt;
## T(n) = T(n/2) + T(n/4) + T(n/8) + n&lt;br /&gt;
## T(n) = T(n-1) + 1/n&lt;br /&gt;
## T(n) = T(n-2) + 1/lg(n)&lt;br /&gt;
## T(n) = sqrt(n) * T(sqrt(n)) + n&lt;br /&gt;
&#039;&#039;&#039;Анализ и построение алгоритмов&#039;&#039;&#039;&lt;br /&gt;
# Числа Фибоначчи F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; можно выразить через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, используя матрицу: https://yadi.sk/i/Pm_aNzHCforFU. &lt;br /&gt;
## Покажите как вычислить F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;.&lt;br /&gt;
## Как вычислить F&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;n+1&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;?&lt;br /&gt;
## Напишите алгоритм.&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
## Ускорьте его так, чтобы он работал за O(log n).&lt;br /&gt;
# Дана последовательность символов. Какое минимальное количество символов нужно удалить из неё, чтобы получить палиндром?&lt;br /&gt;
## Напишите алгоритм (на псевдокоде или на любом языке программирования).&lt;br /&gt;
## Оцените время работы алгоритма.&lt;br /&gt;
# Какую структуру данных вы бы использовали для реализации упорядоченного множества (http://neerc.ifmo.ru/wiki/index.php?title=Упорядоченное_множество)? Какая будет сложность каждой из операций над множеством?&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 16 (до 20.04)===&lt;br /&gt;
# Решите 6 задач из первой части и 6 из второй. (Укажите какие именно.) Каждый из подпунктов является отдельной задачей.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм и теорема Форда-Фалкерсона (16.04)==&lt;br /&gt;
# Базовые определения (пропускные способности, сток, исток и пр.). Пример. &lt;br /&gt;
# Ограничения на поток (сохранение и что меньше пропускных способностей).&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, пример работы&lt;br /&gt;
# Разрез, определение, пример.&lt;br /&gt;
# Утверждение: максимальный поток &amp;lt;= любого разреза.&lt;br /&gt;
# Теорема Форда-Фалкерсона (с доказательством).&lt;br /&gt;
# Пример на котором алгоритм Форда-Фалкерсонаработает работает очень долго при неудачном выборе путей.&lt;br /&gt;
# Сложность алгоритма Форда-Фалкерсона.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №3==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
В [https://official.contest.yandex.ru/contest/1196 домашнем задании] пять задач. Они разделены на два варианта, помеченные римскими цифрами I и II. Свой вариант нужно узнать [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing здесь на вкладке HW3]. Третья задача — общая для двух вариантов; ее решение необходимо снабдить доказательством корректности алгоритма. На выполнение задания дается примерно 2 недели (см. точное время окончания в контесте). Каждую задачу можно написать на С++ или Python.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Форда-Фалкерсона и Эдмондса-Карпа (20.04)==&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, напоминание: базовые определения, пример работы, пример на котором алгоритм работает долго, сложность.&lt;br /&gt;
# Алгоритм Эдмодса-Карпа. Доказательство асимптотики времени работы.&lt;br /&gt;
&lt;br /&gt;
==(23.04)==&lt;br /&gt;
&lt;br /&gt;
==(11.05) Красно-чёрные деревья==&lt;br /&gt;
[https://ru.wikipedia.org/wiki/Красно-чёрное_дерево Красно-чёрное дерево]&lt;br /&gt;
===Домашнее задание 17 (до 18.05)===&lt;br /&gt;
# Зачем нужны красно-чёрные деревья?&lt;br /&gt;
# Благодаря какому свойству и почему красно-чёрное дерево является сбалансированным?&lt;br /&gt;
# Нарисуйте полное бинарное дерево поиска высотой 3 с ключами {1, 2, ..., 15}. Сделайте из него красно-чёрные деревья высотой 2, 3 и 4.&lt;br /&gt;
# Нарисуйте красно-чёрные деревья, получающиеся последовательной вставкой элементов 12, 10, 29, 30, 31, 32 в [https://ru.wikipedia.org/wiki/Красно-чёрное_дерево#/media/File:Red-black_tree_example.svg данное дерево]. Для вставки используйте алгоритм вставки из Википедии. Укажите какой именно функцией вы воспользовались.&lt;br /&gt;
# Определим &#039;&#039;&#039;ослабленное красно-чёрное дерево&#039;&#039;&#039; как бинарное дерево поиска, которое удовлетворяет красно-чёрным свойствам 1, 3, 4 и 5. Другими словами, корень может быть как чёрным, так и красным. Рассмотрите ослабленное красно-чёрное дерево T, корень которого красный. Если перекрасить корень дерева T в чёрный, будет ли оно красно-чёрным деревом?&lt;br /&gt;
# Покажите, что самый длинный простой нисходящий путь от вершины x к листу красно-черного дерева имеет длину, не более чем в два раза превышающую кратчайший путь от x к листу-потомку.&lt;br /&gt;
# Чему равно наибольшее возможное количество внутренних узлов в красно-чёрном дереве с чёрной высоты k? А наименьшее возможное количество?&lt;br /&gt;
# Нарисуйте красно-чёрные деревья, получающиеся последовательной вставкой ключей 41, 38, 31, 12, 19, 8 в изначально пустое дерево.&lt;br /&gt;
# Покажите какие деревья будут получаться в результате последовательного удаления ключей в порядке 8, 12, 19, 31, 38, 41.&lt;br /&gt;
&lt;br /&gt;
==(14.05) Конкурентный анализ самоорганизующихся циклов==&lt;br /&gt;
[https://vk.com/doc12518218_390369758 Лекция]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 18 (до 21.05)===&lt;br /&gt;
Все вычисления сопроводите подробными объяснениями о том, почему верно то или иное (не)равенство.&lt;br /&gt;
# Пусть имеется n-элементный список и m поисковых запросов к нему. После каждой операции поиска можно переупорядочить список. Обозначим стоимость последовательности поисков через C. Докажите, что в худшем случае C = Ω(mn).&lt;br /&gt;
#  Обозначим через c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; стоимость i-ого поискового запроса с применением эвристики перемещения в начало, которая включает стоимость поиска элемента в списке и стоимость его перемещения в начало списка путём ряда обменов соседних элементов списка. Покажите, что i-ая операция поиска находит элемент x в списке L с применением эвристики перемещения в начало, то c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = 2 * rank&amp;lt;sub&amp;gt;L&amp;lt;/sub&amp;gt;(x) - 1.&lt;br /&gt;
# Покажите, что c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = 2 * rank&amp;lt;sub&amp;gt;L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) - 1.&lt;br /&gt;
# Покажите, что c*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = rank&amp;lt;sub&amp;gt;L*&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) + t&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;.&lt;br /&gt;
# Докажите, что после одного обмена двух соседних элементов потенциал либо увеличивается на 2, либо уменьшается на 2.&lt;br /&gt;
# Докажите, что rank&amp;lt;sub&amp;gt;L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) = |A| + |B| + 1.&lt;br /&gt;
# Докажите, что rank&amp;lt;sub&amp;gt;L*&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) = |A| + |С| + 1.&lt;br /&gt;
# Покажите, что поиск i-ого элемента приводит к изменению потенциала Ф(L&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;) - Ф(L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;) &amp;lt;= 2 (|A| - |B| + t*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;), где t*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; --- это количество обменов при i-ом поиске.&lt;br /&gt;
# Во сколько раз стоимость С&amp;lt;sub&amp;gt;MFT&amp;lt;/sub&amp;gt;(S) превышает C&amp;lt;sub&amp;gt;OPT&amp;lt;/sub&amp;gt;(S)?&lt;br /&gt;
&lt;br /&gt;
== (18.05) Конечные автоматы ==&lt;br /&gt;
=== Задание 19 (до 25.05) ===&lt;br /&gt;
# Постройте автомат для языка над алфавитом Σ = {0, 1} каждое слово которого содержит хотя бы два нуля. Является ли он детерминированным?&lt;br /&gt;
# Постройте автомат над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5. Является ли он детерминированным?&lt;br /&gt;
# Постройте автомат, который допускает пустой язык (язык в котором нет ни одного слова).&lt;br /&gt;
# Постройте автомат, который допускает все слова над алфавитом Σ.&lt;br /&gt;
# Постройте ДКА над алфавитом Σ = {К, Ж, З}, который допускает слова в которых после К идёт З, после З --- Ж, после Ж --- К.&lt;br /&gt;
# * Постройте ДКА над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5, а число нулей на 3.&lt;br /&gt;
# Постройте НКА для языка над алфавитом Σ = {0, 1, 2, 3}, состоящий из слов, в которых хотя бы одна из последних пяти букв является 1.&lt;br /&gt;
# Постройте НКА над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5, а число нулей на 3.&lt;br /&gt;
# Какие языки допускают автоматы https://yadi.sk/d/fNAHbjCZghERG?&lt;br /&gt;
# Для каждого из автоматов https://yadi.sk/d/fNAHbjCZghERG постройте соответствующий ему ДКА.&lt;br /&gt;
&lt;br /&gt;
== (21.05) Регулярные выражения, КА, их эквивалентность. Лемма о накачке  ==&lt;br /&gt;
=== Задание 20 (до 28.05) ===&lt;br /&gt;
&#039;&#039;&#039;I Написать регулярные выражения&#039;&#039;&#039;&lt;br /&gt;
# Напишите регулярное выражение для языка {1, 000, 1010}.&lt;br /&gt;
# Напишите регулярное выражение для языка над алфавитом Σ = {0, 1} каждое слово которого содержит хотя бы два нуля.&lt;br /&gt;
# Напишите регулярное выражение над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5. Является ли он детерминированным?&lt;br /&gt;
# Напишите регулярное выражение, которое допускает пустой язык (язык в котором нет ни одного слова).&lt;br /&gt;
# Напишите регулярное выражение, которое допускает все слова над алфавитом Σ.&lt;br /&gt;
# Напишите регулярное выражение над алфавитом Σ = {К, Ж, З}, который допускает слова в которых после К идёт З, после З --- Ж, после Ж --- К.&lt;br /&gt;
# Напишите регулярное выражение для языка над алфавитом Σ = {0, 1, 2, 3}, состоящий из слов, в которых хотя бы одна из последних пяти букв является 1.&lt;br /&gt;
&#039;&#039;&#039;II Доказать замкнутость относительно различных операций&#039;&#039;&#039;&lt;br /&gt;
# Покажите, что если для языков L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; и L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; существует КА, который их читает, то существует КА и для их объединения L = {w | w ∈ L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; или w ∈ L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;}.&lt;br /&gt;
# Покажите, что если для языка L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; и L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; существует КА, который их читает, то существует КА и для языка L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; = {xy | x ∈ L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, y ∈ L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;}.&lt;br /&gt;
# Покажите, что если для языка L существует КА, который его читает, то существует КА и для &#039;&#039;&#039;замыкания Клини&#039;&#039;&#039; L* = {w&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; w&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; ... w&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;| w&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; ∈ L, w&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; ∈ L, ..., w&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; ∈ L}.&lt;br /&gt;
# Покажите, что если язык L регулярен, то регулярно его дополнение (т.е. язык над тем же алфавитом, которому принадлежит слово тогда и только тогда, когда оно НЕ принадлежит L) .&lt;br /&gt;
# Покажите, что если язык L регулярен, то регулярно его обращение L&amp;lt;sub&amp;gt;R&amp;lt;/sub&amp;gt; = {a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; . . . a&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; | a&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; . . . a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; ∈ L}. (L&amp;lt;sub&amp;gt;R&amp;lt;/sub&amp;gt; --- это язык в котором все слова языка L записаны наоборот.)&lt;br /&gt;
# * Покажите, что если языки L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; и L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; регулярны, то регулярно их пересечение.&lt;br /&gt;
&#039;&#039;&#039;III Использование леммы о накачке&#039;&#039;&#039;&lt;br /&gt;
# Докажите, что не существует КА, который бы читал язык {0&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;1&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;2&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;}. (Пояснение: запись 0&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; означает строку из n нулей: 00...0.)&lt;br /&gt;
# Докажите, что не существует КА, который бы читал язык {0&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;1&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;}.&lt;br /&gt;
# Докажите, что не существует КА, который бы читал язык {0&amp;lt;sup&amp;gt;n!&amp;lt;/sup&amp;gt;}.&lt;/div&gt;</summary>
		<author><name>Kassalanche</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=13876</id>
		<title>Алгоритмы и структуры данных. Подгруппа 105-1</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=13876"/>
		<updated>2015-05-21T04:18:21Z</updated>

		<summary type="html">&lt;p&gt;Kassalanche: /* Задание 20 (до 28.05) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==О курсе==&lt;br /&gt;
[[Алгоритмы_и_структуры_данных|План лекций и список рекомендуемой литературы.]]&lt;br /&gt;
&lt;br /&gt;
[[Алгоритмы_и_структуры_данных._Подгруппа_105-1._FAQ|FAQ.]]&lt;br /&gt;
&lt;br /&gt;
[[Reviewboard|Инструкция по использованию Reviewboard.]]&lt;br /&gt;
&lt;br /&gt;
[[Практические_занятия_по_курсу_ОиМП/C++_check|Style guide.]]&lt;br /&gt;
&lt;br /&gt;
==Итоговая оценка за курс==&lt;br /&gt;
Итоговая оценка (ИО) зависит от&lt;br /&gt;
* оценок за пять больших домашних заданий (БДЗ1, БДЗ2, ..., БДЗ5),&lt;br /&gt;
* оценок за домашние задания (ДЗ1, ДЗ2, ...),&lt;br /&gt;
* оценки за контрольную работу (КР),&lt;br /&gt;
* оценки за экзамен (ЭКЗ),&lt;br /&gt;
и может быть вычислена по формуле:&lt;br /&gt;
 ИО = 0.7 * (0.3 * КР + 0.7 *(ИДЗ1 + ИДЗ2 + ИДЗ3 + ИДЗ4 + ИДЗ5)/5) + 0.3 * ЭКЗ =&lt;br /&gt;
    = 0.21*КР + 0.98*ИДЗ1 + 0.98*ИДЗ2 + 0.98*ИДЗ3 + 0.98*ИДЗ4 + 0.98*ИДЗ5 + 0.3*ЭКЗ,&lt;br /&gt;
где&lt;br /&gt;
 ИДЗi = min (10, 0.7 * БДЗi + 0.4 * &amp;lt;cредняя оценка за ДЗj, прошедшие с предыдущего БДЗ по i-ое&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
==Порядок сдачи домашних работ==&lt;br /&gt;
===Большие домашние работы===&lt;br /&gt;
# Получить OK за задачу в контесте.&lt;br /&gt;
# Залить исходный код на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* На каждую задачу создавайте отдельный запрос на ревью. &lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении суток приходят замечания к коду. &#039;&#039;&#039;Если в течении суток замечаний или Ship It не появилось, проверьте, что вы правильно отправили запрос и, если всё сделано правильно, спросите у семинариста получил ли он запрос.&#039;&#039;&#039;&lt;br /&gt;
# Вы их исправляете, проверяете в контесте, что программа по-прежнему проходит все тесты, заливаете новую версию в Review Board. Штрафов за посылки НЕ будет.&lt;br /&gt;
# Процесс повторяется пока остаются замечания к коду или пока не истёк дедлайн. После закрытия контеста будут ещё одни сутки на доработку замечаний в Review Board.&lt;br /&gt;
# Оценивается только последняя версия работы в Review Board.&lt;br /&gt;
&lt;br /&gt;
===Маленькие домашние работы===&lt;br /&gt;
# Залить решение на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* Желаемые форматы: txt, py, cpp, h. Допускаются любые другие.&lt;br /&gt;
#* На каждую домашнюю работу создавайте отдельный запрос на ревью. Обязательно указывайте номер домашней работы.&lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении неопределенного промежутка времени придут оценки по каждому из заданий.&lt;br /&gt;
&lt;br /&gt;
==Оценивание домашних работ==&lt;br /&gt;
* Все задания предполагаются индивидуальными. Запрещены любые заимствования без ссылки на автора.&lt;br /&gt;
* Решения после установленного дедлайна не принимаются. Дедлайн указан в заголовке каждого задания.&lt;br /&gt;
* Везде, где требуется написать алгоритм, можно использовать любой язык программирования или псевдокод.&lt;br /&gt;
* Там, где требуется построить алгоритм с заданной асимптотикой, приведите обоснование, что полученный алгоритм удовлетворяет этому условию.&lt;br /&gt;
* Эти правила не действуют, если в задании явно оговорено иное.&lt;br /&gt;
&lt;br /&gt;
==Мотивация к изучению алгоритмов. Подсчёт числа операций (12.01)==&lt;br /&gt;
# Числа Фибоначчи. Определение. Примитивный рекурсивный алгоритм вычисления i-ого числа. Оценка числа операций. Анализ причин неэффективности. Алгоритм с запоминанием вычисленных ранее значений. Оценка числа операций. Сравнение с предыдущим. (подробнее: глава 0, страницы 8-10 из книги &amp;lt;&amp;lt;Алгоритмы&amp;gt;&amp;gt;, [[Алгоритмы_и_структуры_данных|см. список рекомендованной литературы]])&lt;br /&gt;
# Задача о ханойской башне. Постановка задачи. Рекурсивный алгоритм. Рекуррентная формула для числа перемещений. Замкнутая формула для числа перемещений (+ доказательство). Доказательство того, что эту задачу нельзя решить используя меньшее число перемещений дисков. ([https://www.dropbox.com/s/t8cbs7ttu4iasvj/algo-0-recursion.pdf?dl=0 Разбор задачи о ханойской башне], автор Сергей Объедков)&lt;br /&gt;
# Сортировка пузырьком. Алгоритм. Подсчёт количество операций сравнения и обмена (swap). Анализ наилучшего и наихудшего случаев ([https://ru.wikipedia.org/wiki/Сортировка_пузырьком Википедия])&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 1 (12.01 - 26.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
Во всех задачах, если не оговорено иного, предполагаем, что работаем с целыми неотрицательными числами. Для первых 7 задач необходимо&lt;br /&gt;
* описать что можно считать наилучшим и наихудшим случаями,&lt;br /&gt;
* для каждого из двух случаев подсчитать отдельно количество операций сравнения и swap (если есть).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Даны три числа, требуется вернуть наименьшее.&lt;br /&gt;
# Даны три числа, требуется отсортировать их.&lt;br /&gt;
# Дана последовательность A из n элементов и число x, требуется найти элемент равный x. Примечание: если таких значений i несколько, вернуть любое; если такого элемента нет, функция должна сообщить об этом.&lt;br /&gt;
# * Дана упорядоченная последовательность A из n элементов и число x, требуется найти такое i, что A[i] равно x. Алгоритм должен быть эффективней, чем в предыдущем пункте и использовать то, что последовательность упорядочена.&lt;br /&gt;
# Дана последовательность из 100 000 чисел от 0 до 100. Напишите эффективный алгоритм сортировки, который бы учитывал специфику входных данных.&lt;br /&gt;
# * Дано 32 битное неотрицательное число. Требуется номер первого ненулевого бит. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения, считая, что числа распределены равномерно.&lt;br /&gt;
# * Даны 32 битные неотрицательные числа m и n. Требуется вывести True, если m &amp;lt; n, иначе False. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения битов, считая, что числа распределены равномерно.&lt;br /&gt;
# Напишите рекурсивную функцию, вычисляющую n-ое число Фибоначчи (как на занятии). Подсчитайте количество рекурсивных вызовов.&lt;br /&gt;
# * Напишите функцию, вычисляющую n-ое число Фибоначчи, у которой число операций — полином от n, и которая использует количество памяти, независящее от n.&lt;br /&gt;
&lt;br /&gt;
==O-символика и стратегия &amp;quot;разделяй и властвуй&amp;quot; (15.01)==&lt;br /&gt;
# Сортировка слиянием. Алгоритм, рекуррентное соотношение для времени сортировки, сложность. Подробнее: [https://dl.dropboxusercontent.com/u/829163/draft.pdf §2.3 Сортировка слиянием (стр. 54)].&lt;br /&gt;
# О-символика. [https://dl.dropboxusercontent.com/u/829163/draft.pdf §0.3 О-символика (стр. 10)].&lt;br /&gt;
# Задача о слиянии m упорядоченных массивов по n элементов. Три алгоритма решения: последовательное слияние, слияние &amp;quot;деревом&amp;quot; (обе функции используют Merge из MergeSort), аналог Merge для m массивов. Анализ сложности каждого из них.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 2 (15.01-29.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
* Во всех задачах, если не оговорено иного, для простоты &#039;&#039;можно&#039;&#039; считать, что n является степенью какого-либо числа, например, степенью двойки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Дана функция F, определённая ниже. Сколько строк она напечатает? Указание: для обоих подпунктов рассмотрите два случая: 1. n является степенью двойки, 2. n не является степенью двойки.&lt;br /&gt;
## Запишите рекуррентное соотношение для числа строк.&lt;br /&gt;
## Решите уравнение, полученное в предыдущем пункте, то есть, выведите замкнутую (нерекуррентную формулу). Для простоты можно считать, что n является степенью двойки.&lt;br /&gt;
# В массиве A размера n записана возрастающая последовательность целых чисел. Постройте алгоритм типа &amp;quot;разделяй и властвуй&amp;quot;, который проверяет, существует ли такой индекс i, что A[i] = i&lt;br /&gt;
## за время O(n),&lt;br /&gt;
## * за время O(log n).&lt;br /&gt;
## Какие случаи для вашего алгоритма являются наихудшими и наилучшими? Какого время работы в лучшем и худшем случаях?&lt;br /&gt;
# Дан бесконечный массив A, первые n элементов которого содержат возрастающую последовательность положительных чисел, а дальше стоят -1. Значение n не дано. Постройте алгоритм, который получает на вход целое число x и находит это x в массиве --- или говорит, что там его нет, &lt;br /&gt;
## за время O(n),&lt;br /&gt;
## за время O(log n).&lt;br /&gt;
# Рассмотрим алгоритм вычисления наибольшего общего делителя (НОД) двух положительных чисел, основанный на методе &amp;quot;разделяй и властвуй&amp;quot;.&lt;br /&gt;
## (задание не оценивается) Прочитайте [https://dl.dropboxusercontent.com/u/829163/draft.pdf §1.2.3 Алгоритм Евклида (стр. 23)].&lt;br /&gt;
## * Докажите, что определение НОД-а, приведённое ниже, корректно.&lt;br /&gt;
## Постройте алгоритм, основанный на этом определении.&lt;br /&gt;
## Какой алгоритм будет быстрее для n-битовых чисел a и b при больших значениях n --- ваш или алгоритм Евклида?&lt;br /&gt;
# * Покажите как за время O(n log n) удалить из массива размера n все дубликаты, то есть оставить каждый элемент в одном экземпляре.&lt;br /&gt;
# * Даны два упорядоченных массива размера m и n. Постройте алгоритм, находящий k-й по величине элемент в объединении этих массивов за время O(log(n+m)). &lt;br /&gt;
&lt;br /&gt;
Функция F(n).&lt;br /&gt;
  если n &amp;gt; 1:&lt;br /&gt;
    напечатать &amp;quot;всё ещё работаю&amp;quot;&lt;br /&gt;
    F(n/2)&lt;br /&gt;
    F(n/2)&lt;br /&gt;
&lt;br /&gt;
Определение НОД-а.&lt;br /&gt;
             2НОД(a/2, b/2), если а и b чётны,&lt;br /&gt;
  НОД(a,b) = НОД(a, b/2), если а нечётно, b чётно,&lt;br /&gt;
             НОД((a-b)/2, b), если а и b нечётны.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;lt;nowiki&amp;gt;Задачи взяты из книги &amp;quot;Алгоритмы&amp;quot;, глава 2 (см. список рекомендованной литературы).&amp;lt;/nowiki&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Сложение и умножение (19.01)==&lt;br /&gt;
# Алгоритм сложения, его сложность (§1.1.1 Сложение*)&lt;br /&gt;
# &amp;quot;Школьный&amp;quot; алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Рекурсивный алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Алгоритм умножения, реализующий стратегию &amp;quot;разделяй и властвуй&amp;quot;, анализ сложности (§2.1 Умножение чисел*)&lt;br /&gt;
 * [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать.]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 3 (19.01 - 2.02)===&lt;br /&gt;
* Во всех задачах для простоты можно считать, что n является степенью какого-либо числа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Найдите произведение чисел 10011011 и 10111010 (в двоичной системе счисления), используя алгоритм умножения чисел, основанный на методе «разделяй и властвуй». Необходимо не только дать ответ, но и привести ход решения.&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 3 рекурсивных вызова для подзадач размера n-1 и комбинирует из них решение исходной задачи за О(n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте три верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 10 рекурсивных вызовов для подзадач размера n/2 и комбинирует из них решение исходной задачи за О(5n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте два верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Докажите, что 3m² + m = O(m²).&lt;br /&gt;
# Докажите, что lg m = O(m/1000), где lg m — это логарифм с двоичным основанием.&lt;br /&gt;
# Докажите, что из равенства f(n) = O(g(n)) не следует, что g(n) = O(f(n)).&lt;br /&gt;
# Докажите, что O(m) содержится в O(m²).&lt;br /&gt;
&lt;br /&gt;
==Решение рекуррентных уравнений (22.01)==&lt;br /&gt;
# Примеры решений рекуррентных уравнений (см. [https://www.dropbox.com/s/6a0r410zjm9qwe7/algo-3-recurrences.pdf?dl=0 конспект]).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 4 (до 14.02)===&lt;br /&gt;
* Нельзя использовать утверждение основной теоремы о решении рекуррентных соотношений.&lt;br /&gt;
* &#039;&#039;Можно&#039;&#039; использовать метод построения дерева рекурсии или подстановку (метод с угадыванием ответа).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Какой из трёх приведённых ниже алгоритмов вы бы предпочли? Обоснуйте свой ответ.&lt;br /&gt;
#* Алгоритм A, решая задачу, производит пять рекурсивных вызовов для подзадач вдвое меньшего размера, после чего строит ответ для исходной задачи за линейное время.&lt;br /&gt;
#* Алгоритм B, решая задачу размера n, делает два рекурсивных вызова для задач размера n − 1, после чего находит ответ за время O(1).&lt;br /&gt;
#* Алгоритм C, решая задачу размера n, рекурсивно решает девять задач размера n/3 и строит ответ за время O(n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Найдите T(n) в замкнутой форме для любых 7 из 10 приведённых ниже рекуррентных соотношений:&lt;br /&gt;
## T(n) ≤ 2T(n/3) + 1;&lt;br /&gt;
## T(n) ≤ 7T(n/7) + n;&lt;br /&gt;
## T(n) ≤ 9T(n/3) + n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 8T(n/2) + n&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 49T(n/25) + n&amp;lt;sup&amp;gt;3/2&amp;lt;/sup&amp;gt;log n;&lt;br /&gt;
## T(n) ≤ T(n − 1) + 2;&lt;br /&gt;
## T(n) ≤ T(n − 1) + n&amp;lt;sup&amp;gt;c&amp;lt;/sup&amp;gt;, где c ≥ 1 –– константа;&lt;br /&gt;
## T(n) ≤ T(n − 1) + c&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;, где c &amp;gt; 1 –– константа;&lt;br /&gt;
## T(n) ≤ 2T(n − 1) + 1;&lt;br /&gt;
## T(n) ≤ T(sqrt(n)) + 1.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №1==&lt;br /&gt;
Необходимо реализовать все 6 задач из [https://official.contest.yandex.ru/contest/1002 контеста]. Каждую задачу можно писать на С++ или Python. На выполнение работы отводится две недели. Каждая задача оценивается в 10/6 балла. Оценка &#039;&#039;может&#039;&#039; быть снижена за плохой код, но не более чем на 25%.&lt;br /&gt;
&lt;br /&gt;
==Бинарное дерево поиска (26.01)==&lt;br /&gt;
# Определение. Пример.&lt;br /&gt;
# Не модифицирующие алгоритмы: поиск (рекурсивный и итеративный алгоритмы), поиск минимума, inordered обход (вывод значений узлов в отсортированном порядке), поиск следующего по возрастанию.&lt;br /&gt;
# Модифицирующие алгоритмы: вставка (рекурсивная реализация), удаление (только идея).&lt;br /&gt;
 [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 13, стр. 248]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 5 (до 16.02)===&lt;br /&gt;
* Для получения максимальной оценки можно выполнить или все задачи без звёздочки, или задачу со звёздочкой. Преподаватель понимает, что реализацию БДП сложно не найти в интернете, но от копипасты не будет никакой пользы. Напротив, самостоятельная реализация очень полезна и приветствуется, даже если не получится выполнить всех пунктов задания.&lt;br /&gt;
* Задачи с двумя звёздочками необязательны.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Нарисуйте бинарные деревья поиска высотой 2, 3, 4, 5 и 6 для множества ключей {1, 4, 5, 10, 16, 17, 21}. Корень дерева имеет высоту 0.&lt;br /&gt;
# &#039;&#039;&#039;Сортировка с использованием БДП.&#039;&#039;&#039;&lt;br /&gt;
## Какова асимптотическая сложность алгоритма вставки элемента в дерево высоты d? Почему? Назовите наилучший и наиухдший случаи.&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который строит БДП в узлах которого стоят элементы данной последовательности. Можно использовать функцию Insert. Назовите наилучший и наихудший случаи. Есть теорема о том, что полученный алгоритм будет работать в среднем случае за время O(n * log n).&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который выводит их в порядке возрастания. Используйте бинарное дерево поиска. Какова в среднем случае сложность этого алгоритма? Назовите наилучший и наихудший случаи. Какова сложность в наихудшем случае?&lt;br /&gt;
# Напишите функцию GetRoot, которой на вход подаётся указатель на произвольный узел дерева, а она возвращает указатель на корень.&lt;br /&gt;
# Напишите процедуру PrintLeafs, которой на вход подаётся указатель на корень дерева, и она печатает листья дерева&lt;br /&gt;
## по возрастанию,&lt;br /&gt;
## по убыванию.&lt;br /&gt;
# ** Альтернативный обход в порядке возрастания бинарного дерева поиска с n узлами (или центрированный (inordered) обход) можно осуществить путём поиска минимального элемента дерева с помощью функции Minimum с последующий n-1 вызовом функции Next. Каково время работы такого алгоритма?&lt;br /&gt;
# * Реализуйте на С++ структуру данных бинарное дерево поиска, [https://yadi.sk/i/gi2SEStreFfSb используя заготовку].&lt;br /&gt;
## Нарисуйте бинарное дерево поиска, которое строится в функции getTreeExample.&lt;br /&gt;
## Реализуйте следующие алгоритмы: &lt;br /&gt;
### поиск минимума, &lt;br /&gt;
### inordered обход (вывод значений узлов в отсортированном порядке),&lt;br /&gt;
### поиск следующего по возрастанию,&lt;br /&gt;
### вставка элемента в дерево,&lt;br /&gt;
### сортировка последовательности с использованием БДП (дан вектор чисел, необходимо вывести их по возрастанию),&lt;br /&gt;
### ** удаление.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Карацубы, Штрассена. Быстрая сортировка (29.01)==&lt;br /&gt;
# Алгоритм Карацубы.&lt;br /&gt;
# Алгоритм Штрассена. [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать Дасгупту и др., §2.5 Умножение матриц]&lt;br /&gt;
# Быстрая сортировка и доказательство того, что в среднем случае она работает за О(n * log n). [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 8 Быстрая сортировка, стр. 148]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 6 (до 18.02)===&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Пусть мы хотим найти двоичное представление десятичного числа 10&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;. Будем считать, что n --- степень двойки (n = 2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt;).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Pwr2Bin(n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть 1010&lt;br /&gt;
    z = ...&lt;br /&gt;
    вернуть Multiply(z, z)&amp;lt;/source&amp;gt;&lt;br /&gt;
Multiply --- функция, перемножающая два n-битовых двоичных числа x и y по алгоритму Карацубы за O(n&amp;lt;sup&amp;gt;log&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;3&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Пусть мы хотим перевести произвольное десятичное число x в записи которого n=2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; чисел в двоичную систему счисления.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Dec2Bin(x, n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть binary[x]&lt;br /&gt;
    разделить x на два десятичных числа xl и xr из n/2 цифр.&lt;br /&gt;
    вернуть ...&amp;lt;/source&amp;gt;&lt;br /&gt;
Здесь binary --- это массив, содержащий двоичное представление десятичных цифр.&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Докажите, что математическое ожидание времени работы алгоритма быстрой сортировки (усреднение по всем вариантам выбора опорного элемента) на любом входе размера n удовлетворяет соотношению: T(n) ≤ O(n) + 1/n * &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt; (T(i-1) + T(n-i)).&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Найдите решение соотношения из предыдущего пункта.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Динамическое программирование (ДП). Первые примеры (02.01)==&lt;br /&gt;
# Нахождение самой длинной возрастающей подпоследовательности.&lt;br /&gt;
# Нахождение редакционного расстояния (или редакционной стоимости, расстояния Левенштейна).&lt;br /&gt;
# Нахождение представителя большинства.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 7 (до 20.02)===&lt;br /&gt;
* В этом задании везде, где требуется реализовать алгоритм, необходимо привести код на любом языке программирования.&lt;br /&gt;
* Для получения максимальной оценки нужно решить все задачи без звёздочек. Одна решённая задача со звёздочкой заменяет одну задачу без звёздочки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения редакционного расстояния (алгоритм Вагнера — Фишера). Например, редакционное расстояние между словами &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равно 6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения длины наибольшей общей подстроки. Например, длина наибольшей общей подстроки &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равна 8 (&amp;quot;antholog&amp;quot;). Чем больше это значение, тем схожей строки.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Предположим теперь, что сравниваемые строки состоят из символов A, С, G и T; за удаление или вставку мы платим -5; за замену буквы x на y платим w[x, y], где x, y принадлежат множеству {A, С, G, T}, a w — это матрица весов:&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
!-!! A!! G!! C!! T&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! A&lt;br /&gt;
|10||-1||-3||-4&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
!G&lt;br /&gt;
||-1||7||-5||-3&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! C&lt;br /&gt;
||-3||-5||9||0&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! T&lt;br /&gt;
||-4||-3||0||8&lt;br /&gt;
|}&lt;br /&gt;
Тогда выравнивание:&lt;br /&gt;
 AGACTAGTTAC&lt;br /&gt;
 CGA‒‒‒GACGT&lt;br /&gt;
будет иметь следующую оценку:&lt;br /&gt;
 w[A,C] + w[G,G] + w[A,A] + 3*(-5) + w[G,G] + w[T,A] + w[T,C] + w[A,G] + w[C,T] = -3 + 7 + 10 - 3*5 + 7 + (-4) + 0 + (-1) + 0 = 1.&lt;br /&gt;
&lt;br /&gt;
Напишите алгоритм, который находит максимальную стоимость всех возможных выравниваний. Верно ли, что чем больше это значение, тем непохожей строки?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как давно один народ отделился от другого? Кто похожей — итальянец и китаец или якут и эфиоп? На эти вопросы можно отвечать с разных точек зрения — культурной, исторической, лингвистической, ... В последние же годы человечество научилось секвенировать геном, что позволило исследовать этот вопрос с точки зрения генетики. Секвенирование генома — это процесс записи ДНК в виде нуклеотидной последовательности, которая представляет собой последовательность из четырёх символов — A, С, G и T. Существуют базы, которые хранят генетическую информацию о людях из разных стран и континентов, например, [http://www.mtdb.igp.uu.se/ http://www.mtdb.igp.uu.se/ → Download mtDNA sequences]. Чем больше сходство между геномами, тем сильнее родственные связи между их обладателями. Используя решение предыдущего пункта, выполните задания:&lt;br /&gt;
# Определите, кто похожей — итальянец и китаец или якут и эфиоп?&lt;br /&gt;
# Найдите нескольких похожих и нескольких непохожих народностей.&lt;br /&gt;
# * Выберите одну народность. Найдите самых похожих и самых непохожих на неё.&lt;br /&gt;
# * Найдите самые похожие и самые непохожие народности.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Задача о разрезании стержня (05.01)==&lt;br /&gt;
# Постановка задачи.&lt;br /&gt;
# Решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Решение с нахождением максимума по p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Восходящий алгоритм с запоминанием. Вывод длин кусочков стержня. Оценка сложности.&lt;br /&gt;
# Нисходящий алгоритм с запоминанием. Оценка сложности.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.1 Разрезание стержня, стр. 393]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 8 (до 22.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Решая задачу о разрезании стержня мы вначале построили рекурсивное решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt; для всех 1 ≤ i &amp;lt; n. Его сложность описывалась рекуррентной формулой T(n) = n + &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n-1&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt;(T(i) + T(n-i)), T(1) = 1.&lt;br /&gt;
# Объясните эту формулу.&lt;br /&gt;
# Покажите с помощью метода подстановок, что T(n) ≤ 2&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Покажите с помощью контрпримера, что описанная далее жадная стратегия не всегда определяет оптимальный способ разрезания стержня. Определим плотность стержня длиной i как p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;/i, то есть как стоимость единицы его длины. Жадная стратегия для стержня длиной n отрезает от стержня первую часть длиной i, где 1 ≤ i ≤ n, имеющую максимальную плотность. Затем та же жадная стратегия применяется к оставшейся части длиной n-i.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Рассмотрим модификацию задачи разрезания стержня, в которой в дополнение к цене p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; каждого стержня добавляется фиксированная цена разреза c. Теперь прибыль, связанная с решением, представляет собой сумму цен частей стержня минус стоимость разрезов. Разработайте алгоритм динамического программирования для этой модифицированной задачи.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Непрерывным участком называется группа подряд идущих элементов. Например, для последовательности&lt;br /&gt;
 5, 15, −30, 10, −5, 40, 10&lt;br /&gt;
элементы 15, −30, 10 образуют непрерывный участок, а 5, 15, 40 -- нет. Постройте линейный алгоритм для следующей задачи:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Вход: список чисел a1, a2, ... ‌, an.&lt;br /&gt;
Выход: непрерывный участок с максимальной суммой (сумма участка нулевой длины равна нулю).&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Для приведённого примера ответом будет 10, −5, 40, 10 с суммой 55. Какова сложность алгоритма? Почему?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Надо заплатить v рублей, имея купюры в x1, x2, ‌..., xn рублей (купюр каждого типа сколько угодно). Это не всегда возможно (скажем, купюрами в&lt;br /&gt;
10 и 25 рублей можно заплатить 45 рублей, но не 47 и не 15). Постройте основанный на методе динамического программирования алгоритм со временем работы O(nv), выясняющий, возможна ли уплата.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как решить предыдущую задачу, если каждая купюра имеется в единственном экземпляре? (Например, купюрами в 1, 5, 10, 20 рублей можно заплатить 16 = 1 + 5 + 10 и 31 = 1 + 10 + 20 рублей, но не 40 (не хватит денег). Время работы алгоритма по-прежнему O(nv).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Ещё один вариант той же задачи: купюр каждого типа сколько угодно, но всего разрешается использовать не более k купюр. (Например, если есть купюры в 5 и 10 рублей, а k = 6, то 55 разменять можно, а 65 –– нет).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Перемножение цепочки матриц. Оптимальное бинарное дерево поиска (начало) (09.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о перемножении цепочки матриц. Постановка задачи.Пример. Нисходящий алгоритм.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.2 Перемножение цепочки матриц, стр. 403]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 9 (до 24.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Найдите оптимальную расстановку скобок в произведении последовательности матриц, размерности которых равны 5×10, 10×3, 3×12, 12×5, 5×50, 50×6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Напишите восходящий алгоритм для поиска оптимальной расстановки скобок.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Расстановка пробелов. Оптимальное бинарное дерево поиска (середина) (12.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о расстановке пробелов. Постановка задачи. Решения для трёх случаев: 1. нужно вернуть можно ли разбить текст на слова; 2. вернуть разбивку на слова; 3. слова встречаются не равновероятно, вернуть наиболее вероятную разбивку на слова.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи. Вывод математического ожидания времени поиска.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Праздничное домашнее задание 10 (до 02.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[&amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;,&amp;quot;, &amp;quot;.&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;,&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;.&amp;quot;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Подсказка:&#039;&#039;&#039; разбейте текст на слова из списка и посмотрите на азбуку Морзе.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Способы представления графов в памяти (16.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Разбор ошибок в домашнем задании.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Графы. Способы представления графов в памяти (матрица смежности, список рёбер, список соседей (список смежностей), матрица инцидентности). Зависимость сложности алгоритмов от способа представления.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §22.1 Представление графов, стр. 626]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 11 (до 02.03)===&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача A.]&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача B.]&lt;br /&gt;
# Нарисуйте неориентированный граф с 5 вершинами и 8 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Нарисуйте ориентированный граф с 4 вершинами и 3 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Дан ориентированный граф. &#039;&#039;Исходящая степень вершины v&#039;&#039; --- это количество исходящих из неё рёбер, &#039;&#039;входящая степень v&#039;&#039; --- это количество рёбер входящих в  v. Имеется представление ориентированного графа с использование списка соседей. Как долго будут вычисляться исходящие степени всех вершин графа? А входящие степени?&lt;br /&gt;
# Дан граф G = (V, E). Какие из рассмотренных способов хранения графов используют меньше всего памяти для хранения G и почему? Указание: рассмотрите случаи |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;lt; |E| и |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;gt; |E|.&lt;br /&gt;
# Пусть C --- это матрица смежности графа G.&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
# Пусть B --- это матрица инцидентности ориентированного графа G. Как связаны элементы матрицы BB&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
&lt;br /&gt;
==Реализация поиска в глубину (19.02)==&lt;br /&gt;
# Реализация поиска в глубину и смежных задач.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 12 (до 5.03)===&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Выберите любой способ хранения графа. Реализуйте поиск в глубину.&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Напишите алгоритм, который возвращает данные о том, какие вершины лежат в одной компоненте связности.&lt;br /&gt;
# &#039;&#039;(любой ЯП или псевдокод)&#039;&#039; Напишите алгоритм проверки сильной связности ориентированного графа. Какова его сложность?&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №2==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
Необходимо реализовать 3 задачи из [https://official.contest.yandex.ru/contest/1085 контеста], см. [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing распределение задач]. Каждую задачу можно написать на С++ или Python. На выполнение работы отводится две недели (см. время окончания контеста). [https://official.contest.yandex.ru/contest/1123 Дорешивание.]&lt;br /&gt;
&lt;br /&gt;
==ДП и графы (26.02)==&lt;br /&gt;
==ДП и графы (02.03)==&lt;br /&gt;
==Жадные алгоритмы (12.03)==&lt;br /&gt;
===Домашнее задание 13 (до 23.03)===&lt;br /&gt;
# Вася хочет купить по одной акции каждой компании. Все акции стоят одинаково, но дорожают по-разному. Каждый месяц акция i-ой компании дорожает в r_i раз. В один месяц можно купить только одну акцию.&lt;br /&gt;
## Напишите алгоритм, который выводит оптимальную последовательность покупок (такую, что на покупку всех акций потратится меньше денег).&lt;br /&gt;
## Докажите корректность алгоритма, то есть докажите, что последовательность покупок, которую выводит ваш алгоритм, оптимальна.&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список, очередь (16.03)==&lt;br /&gt;
# Реализация линейного двусвязного списка (С++).&lt;br /&gt;
# Реализация очереди ограниченной длины на базе вектора (С++).&lt;br /&gt;
# Реализация очереди на базе списка (С++).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14 (до 23.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте (на С++) структуру данных Стек. У стека должно быть три операции:&lt;br /&gt;
* push --- положить элемент на вершину стека;&lt;br /&gt;
* pop --- удалить верхний элемент;&lt;br /&gt;
* front --- вернуть значение верхнего элемента.&lt;br /&gt;
Оцените время работы каждой функции.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список (19.03)==&lt;br /&gt;
===Домашнее задание 13* (до 30.03)===&lt;br /&gt;
#Для приведённой реализации класса List (https://yadi.sk/i/c5r_79WdfMyNS).&lt;br /&gt;
## Допишите print, push_back и push_front.&lt;br /&gt;
## В функции insert_after и delete_node вставьте необходимые проверки так, чтобы они работали для крайних случаев.&lt;br /&gt;
## Напишите main в котором&lt;br /&gt;
### создаётся объект класса List, &lt;br /&gt;
### заполняется элементами с помощью функций push_back, push_front и insert_after и&lt;br /&gt;
### удаляется i-ый элемент.&lt;br /&gt;
&lt;br /&gt;
==Повторение (30.03)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Для данных пар функций выясните их связь в терминах O-, o-, Ω-, ω-, Θ-обозначений. Поставьте галочку в клетке с Ω, если f(x) = Ω(g(x)) и прочерк, если равенства нет. [https://ru.wikipedia.org/wiki/«O»_большое_и_«o»_малое#.D0.94.D1.80.D1.83.D0.B3.D0.B8.D0.B5_.D0.BF.D0.BE.D0.B4.D0.BE.D0.B1.D0.BD.D1.8B.D0.B5_.D0.BE.D0.B1.D0.BE.D0.B7.D0.BD.D0.B0.D1.87.D0.B5.D0.BD.D0.B8.D1.8F Википедия]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! f(x)!! g(x)!! O!! o!! Ω!! ω!! Θ&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! 2^100&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n * log(n)&lt;br /&gt;
! 2^100 * n * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n&lt;br /&gt;
! 2^100 * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n!&lt;br /&gt;
! 2^(2015n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n*2^n&lt;br /&gt;
! 3^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 5^n&lt;br /&gt;
! 5^(n+1)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n + n^2 + n^3 + ... + n^1000&lt;br /&gt;
! 7^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм Quickselect нахождения k-ого элемента по возрастанию: http://en.wikipedia.org/wiki/Quickselect&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;На улице стоит ряд домов. В каждом из домов лежит сколько-то денег. Вор хочет обокрасть дома на переулке. Он не может обокрасть два соседних дома, потому что хозяин дома, который он обокрал, сразу предупредит соседей. Нужно найти, какую максимальную сумму вор может украсть с переулка. На вход программы подается массив неотрицательных целых чисел - количество долларов в доме с номером i. Соседние дома в массиве представлены соседними элементами. Например, пусть задан массив { 1, 4, 5 } - тогда вор максимум может украсть $6, обокрав дома 1 и 3. Пусть задан массив { 1, 7, 2 } - тогда вор максимум может украсть $7, обокрав дом 2.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Алфавит из всех маленьких латинских букв и пробела закодирован числами следующим способом:&lt;br /&gt;
  &#039;a&#039; -&amp;gt; 1&lt;br /&gt;
  &#039;b&#039; -&amp;gt; 2&lt;br /&gt;
  &#039;c&#039; -&amp;gt; 3&lt;br /&gt;
  ...&lt;br /&gt;
  &#039;z&#039; -&amp;gt; 26&lt;br /&gt;
  &#039; &#039; -&amp;gt; 27&lt;br /&gt;
На вход программы подается строка из цифр. Нужно посчитать, сколькими способами можно раскодировать эту строку.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Дан граф, заданный матрицей смежности. Вывести пары вершин между которыми нет пути.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Повторение (02.04) ==&lt;br /&gt;
Решали и разбирали первые 4 задачи из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14* (до 11.03)===&lt;br /&gt;
Решите любые две задачи (подпункты НЕ считаются отдельными задачами) с предыдущей пары (Повторение (30.03)).&lt;br /&gt;
&lt;br /&gt;
== Повторение (06.04) ==&lt;br /&gt;
Будем решать вторую половину задач из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 15 (до 16.04)===&lt;br /&gt;
# Приведите пример графа, который содержит отрицательные рёбра, не содержит циклов отрицательного веса и для которого алгоритм Дейкстры возвращает неверный результат.&lt;br /&gt;
# Используется ли в алгоритме Дейкстры то, что веса рёбер неотрицательны? Если &amp;quot;да&amp;quot;, то где именно?&lt;br /&gt;
# Пусть граф содержит рёбра с весами &amp;gt;= -100. Если прибавить к каждому ребру 101 и при помощи алгоритма Дейкстры найти кратчайшие пути. Будут ли эти пути кратчайшими в исходном графе? Почему?&lt;br /&gt;
&lt;br /&gt;
== Повторение (07.04) ==&lt;br /&gt;
&#039;&#039;&#039;Решение рекуррентных соотношений&#039;&#039;&#039;&lt;br /&gt;
# Решите уравнение: T(n) = 4*T(n/2) + O(n^2) с базой T(1) = O(1)&lt;br /&gt;
## Используя основную теорему.&lt;br /&gt;
## Используя дерево рекурсий.&lt;br /&gt;
## Методом подстановки.&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2)) + n является \Theta(n lg n).&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2) + 17) + n является \Theta(n lg n).&lt;br /&gt;
# Решите уравнения, считая, что T(1) = O(1):&lt;br /&gt;
## T(n) = T(n-1) + n&lt;br /&gt;
## T(n) = 2*T(floor(sqrt(n))) + lg n. Указание: попробуйте использовать замену переменных.&lt;br /&gt;
## T(n) = 3*T(sqrt(n)) + lg n&lt;br /&gt;
# Дайте верхнюю и нижнюю оценки функции T(n). Постарайтесь, чтобы оценки были как можно более точные&lt;br /&gt;
## T(n) = 4T(n/3) + n*lg(n)&lt;br /&gt;
## T(n) = 3T(n/3) + n/lg(n)&lt;br /&gt;
## T(n) = 4T(n/2) + n^2*sqrt(n)&lt;br /&gt;
## T(n) = T(n/2) + T(n/4) + T(n/8) + n&lt;br /&gt;
## T(n) = T(n-1) + 1/n&lt;br /&gt;
## T(n) = T(n-2) + 1/lg(n)&lt;br /&gt;
## T(n) = sqrt(n) * T(sqrt(n)) + n&lt;br /&gt;
&#039;&#039;&#039;Анализ и построение алгоритмов&#039;&#039;&#039;&lt;br /&gt;
# Числа Фибоначчи F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; можно выразить через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, используя матрицу: https://yadi.sk/i/Pm_aNzHCforFU. &lt;br /&gt;
## Покажите как вычислить F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;.&lt;br /&gt;
## Как вычислить F&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;n+1&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;?&lt;br /&gt;
## Напишите алгоритм.&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
## Ускорьте его так, чтобы он работал за O(log n).&lt;br /&gt;
# Дана последовательность символов. Какое минимальное количество символов нужно удалить из неё, чтобы получить палиндром?&lt;br /&gt;
## Напишите алгоритм (на псевдокоде или на любом языке программирования).&lt;br /&gt;
## Оцените время работы алгоритма.&lt;br /&gt;
# Какую структуру данных вы бы использовали для реализации упорядоченного множества (http://neerc.ifmo.ru/wiki/index.php?title=Упорядоченное_множество)? Какая будет сложность каждой из операций над множеством?&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 16 (до 20.04)===&lt;br /&gt;
# Решите 6 задач из первой части и 6 из второй. (Укажите какие именно.) Каждый из подпунктов является отдельной задачей.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм и теорема Форда-Фалкерсона (16.04)==&lt;br /&gt;
# Базовые определения (пропускные способности, сток, исток и пр.). Пример. &lt;br /&gt;
# Ограничения на поток (сохранение и что меньше пропускных способностей).&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, пример работы&lt;br /&gt;
# Разрез, определение, пример.&lt;br /&gt;
# Утверждение: максимальный поток &amp;lt;= любого разреза.&lt;br /&gt;
# Теорема Форда-Фалкерсона (с доказательством).&lt;br /&gt;
# Пример на котором алгоритм Форда-Фалкерсонаработает работает очень долго при неудачном выборе путей.&lt;br /&gt;
# Сложность алгоритма Форда-Фалкерсона.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №3==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
В [https://official.contest.yandex.ru/contest/1196 домашнем задании] пять задач. Они разделены на два варианта, помеченные римскими цифрами I и II. Свой вариант нужно узнать [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing здесь на вкладке HW3]. Третья задача — общая для двух вариантов; ее решение необходимо снабдить доказательством корректности алгоритма. На выполнение задания дается примерно 2 недели (см. точное время окончания в контесте). Каждую задачу можно написать на С++ или Python.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Форда-Фалкерсона и Эдмондса-Карпа (20.04)==&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, напоминание: базовые определения, пример работы, пример на котором алгоритм работает долго, сложность.&lt;br /&gt;
# Алгоритм Эдмодса-Карпа. Доказательство асимптотики времени работы.&lt;br /&gt;
&lt;br /&gt;
==(23.04)==&lt;br /&gt;
&lt;br /&gt;
==(11.05) Красно-чёрные деревья==&lt;br /&gt;
[https://ru.wikipedia.org/wiki/Красно-чёрное_дерево Красно-чёрное дерево]&lt;br /&gt;
===Домашнее задание 17 (до 18.05)===&lt;br /&gt;
# Зачем нужны красно-чёрные деревья?&lt;br /&gt;
# Благодаря какому свойству и почему красно-чёрное дерево является сбалансированным?&lt;br /&gt;
# Нарисуйте полное бинарное дерево поиска высотой 3 с ключами {1, 2, ..., 15}. Сделайте из него красно-чёрные деревья высотой 2, 3 и 4.&lt;br /&gt;
# Нарисуйте красно-чёрные деревья, получающиеся последовательной вставкой элементов 12, 10, 29, 30, 31, 32 в [https://ru.wikipedia.org/wiki/Красно-чёрное_дерево#/media/File:Red-black_tree_example.svg данное дерево]. Для вставки используйте алгоритм вставки из Википедии. Укажите какой именно функцией вы воспользовались.&lt;br /&gt;
# Определим &#039;&#039;&#039;ослабленное красно-чёрное дерево&#039;&#039;&#039; как бинарное дерево поиска, которое удовлетворяет красно-чёрным свойствам 1, 3, 4 и 5. Другими словами, корень может быть как чёрным, так и красным. Рассмотрите ослабленное красно-чёрное дерево T, корень которого красный. Если перекрасить корень дерева T в чёрный, будет ли оно красно-чёрным деревом?&lt;br /&gt;
# Покажите, что самый длинный простой нисходящий путь от вершины x к листу красно-черного дерева имеет длину, не более чем в два раза превышающую кратчайший путь от x к листу-потомку.&lt;br /&gt;
# Чему равно наибольшее возможное количество внутренних узлов в красно-чёрном дереве с чёрной высоты k? А наименьшее возможное количество?&lt;br /&gt;
# Нарисуйте красно-чёрные деревья, получающиеся последовательной вставкой ключей 41, 38, 31, 12, 19, 8 в изначально пустое дерево.&lt;br /&gt;
# Покажите какие деревья будут получаться в результате последовательного удаления ключей в порядке 8, 12, 19, 31, 38, 41.&lt;br /&gt;
&lt;br /&gt;
==(14.05) Конкурентный анализ самоорганизующихся циклов==&lt;br /&gt;
[https://vk.com/doc12518218_390369758 Лекция]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 18 (до 21.05)===&lt;br /&gt;
Все вычисления сопроводите подробными объяснениями о том, почему верно то или иное (не)равенство.&lt;br /&gt;
# Пусть имеется n-элементный список и m поисковых запросов к нему. После каждой операции поиска можно переупорядочить список. Обозначим стоимость последовательности поисков через C. Докажите, что в худшем случае C = Ω(mn).&lt;br /&gt;
#  Обозначим через c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; стоимость i-ого поискового запроса с применением эвристики перемещения в начало, которая включает стоимость поиска элемента в списке и стоимость его перемещения в начало списка путём ряда обменов соседних элементов списка. Покажите, что i-ая операция поиска находит элемент x в списке L с применением эвристики перемещения в начало, то c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = 2 * rank&amp;lt;sub&amp;gt;L&amp;lt;/sub&amp;gt;(x) - 1.&lt;br /&gt;
# Покажите, что c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = 2 * rank&amp;lt;sub&amp;gt;L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) - 1.&lt;br /&gt;
# Покажите, что c*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = rank&amp;lt;sub&amp;gt;L*&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) + t&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;.&lt;br /&gt;
# Докажите, что после одного обмена двух соседних элементов потенциал либо увеличивается на 2, либо уменьшается на 2.&lt;br /&gt;
# Докажите, что rank&amp;lt;sub&amp;gt;L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) = |A| + |B| + 1.&lt;br /&gt;
# Докажите, что rank&amp;lt;sub&amp;gt;L*&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) = |A| + |С| + 1.&lt;br /&gt;
# Покажите, что поиск i-ого элемента приводит к изменению потенциала Ф(L&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;) - Ф(L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;) &amp;lt;= 2 (|A| - |B| + t*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;), где t*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; --- это количество обменов при i-ом поиске.&lt;br /&gt;
# Во сколько раз стоимость С&amp;lt;sub&amp;gt;MFT&amp;lt;/sub&amp;gt;(S) превышает C&amp;lt;sub&amp;gt;OPT&amp;lt;/sub&amp;gt;(S)?&lt;br /&gt;
&lt;br /&gt;
== (18.05) Конечные автоматы ==&lt;br /&gt;
=== Задание 19 (до 25.05) ===&lt;br /&gt;
# Постройте автомат для языка над алфавитом Σ = {0, 1} каждое слово которого содержит хотя бы два нуля. Является ли он детерминированным?&lt;br /&gt;
# Постройте автомат над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5. Является ли он детерминированным?&lt;br /&gt;
# Постройте автомат, который допускает пустой язык (язык в котором нет ни одного слова).&lt;br /&gt;
# Постройте автомат, который допускает все слова над алфавитом Σ.&lt;br /&gt;
# Постройте ДКА над алфавитом Σ = {К, Ж, З}, который допускает слова в которых после К идёт З, после З --- Ж, после Ж --- К.&lt;br /&gt;
# * Постройте ДКА над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5, а число нулей на 3.&lt;br /&gt;
# Постройте НКА для языка над алфавитом Σ = {0, 1, 2, 3}, состоящий из слов, в которых хотя бы одна из последних пяти букв является 1.&lt;br /&gt;
# Постройте НКА над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5, а число нулей на 3.&lt;br /&gt;
# Какие языки допускают автоматы https://yadi.sk/d/fNAHbjCZghERG?&lt;br /&gt;
# Для каждого из автоматов https://yadi.sk/d/fNAHbjCZghERG постройте соответствующий ему ДКА.&lt;br /&gt;
&lt;br /&gt;
== (21.05) Регулярные выражения, КА, их эквивалентность. Лемма о накачке  ==&lt;br /&gt;
=== Задание 20 (до 28.05) ===&lt;br /&gt;
&#039;&#039;&#039;I Написать регулярные выражения&#039;&#039;&#039;&lt;br /&gt;
# Напишите регулярное выражение для языка {1, 000, 1010}.&lt;br /&gt;
# Напишите регулярное выражение для языка над алфавитом Σ = {0, 1} каждое слово которого содержит хотя бы два нуля.&lt;br /&gt;
# Напишите регулярное выражение над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5. Является ли он детерминированным?&lt;br /&gt;
# Напишите регулярное выражение, которое допускает пустой язык (язык в котором нет ни одного слова).&lt;br /&gt;
# Напишите регулярное выражение, которое допускает все слова над алфавитом Σ.&lt;br /&gt;
# Напишите регулярное выражение над алфавитом Σ = {К, Ж, З}, который допускает слова в которых после К идёт З, после З --- Ж, после Ж --- К.&lt;br /&gt;
# Напишите регулярное выражение для языка над алфавитом Σ = {0, 1, 2, 3}, состоящий из слов, в которых хотя бы одна из последних пяти букв является 1.&lt;br /&gt;
&#039;&#039;&#039;II Доказать замкнутость относительно различных операций&#039;&#039;&#039;&lt;br /&gt;
# Покажите, что если для языков L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; и L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; существует КА, который их читает, то существует КА и для их объединения L = {w | w ∈ L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; или w ∈ L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;}.&lt;br /&gt;
# Покажите, что если для языка L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; и L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; существует КА, который их читает, то существует КА и для языка L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; = {xy | x ∈ L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, y ∈ L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;}.&lt;br /&gt;
# Покажите, что если для языка L существует КА, который его читает, то существует КА и для &#039;&#039;&#039;замыкания Клини&#039;&#039;&#039; L* = {w&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; w&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; ... w&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;| w&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; ∈ L, w&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; ∈ L, ..., w&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; ∈ L}.&lt;br /&gt;
# Покажите, что если язык L регулярен, то регулярно его дополнение (т.е. язык над тем же алфавитом, которому принадлежит слово тогда и только тогда, когда оно НЕ принадлежит L) .&lt;br /&gt;
# Покажите, что если язык L регулярен, то регулярно его обращение L&amp;lt;sub&amp;gt;R&amp;lt;/sub&amp;gt; = {a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; . . . a&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; | a&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; . . . a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; ∈ L}. (L&amp;lt;sub&amp;gt;R&amp;lt;/sub&amp;gt; --- это язык в котором все слова языка L записаны наоборот.)&lt;br /&gt;
# * Покажите, что если языки L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; и L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; регулярны, то регулярно их пересечение.&lt;br /&gt;
&#039;&#039;&#039;III Использование леммы о накачке&#039;&#039;&#039;&lt;br /&gt;
# Докажите, что не существует КА, который бы читал язык {0&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;1&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;2&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;}.&lt;br /&gt;
# Докажите, что не существует КА, который бы читал язык {0&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;1&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;}.&lt;br /&gt;
# Докажите, что не существует КА, который бы читал язык {0&amp;lt;sup&amp;gt;n!&amp;lt;/sup&amp;gt;}.&lt;/div&gt;</summary>
		<author><name>Kassalanche</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=13873</id>
		<title>Алгоритмы и структуры данных. Подгруппа 105-1</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=13873"/>
		<updated>2015-05-21T04:13:35Z</updated>

		<summary type="html">&lt;p&gt;Kassalanche: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==О курсе==&lt;br /&gt;
[[Алгоритмы_и_структуры_данных|План лекций и список рекомендуемой литературы.]]&lt;br /&gt;
&lt;br /&gt;
[[Алгоритмы_и_структуры_данных._Подгруппа_105-1._FAQ|FAQ.]]&lt;br /&gt;
&lt;br /&gt;
[[Reviewboard|Инструкция по использованию Reviewboard.]]&lt;br /&gt;
&lt;br /&gt;
[[Практические_занятия_по_курсу_ОиМП/C++_check|Style guide.]]&lt;br /&gt;
&lt;br /&gt;
==Итоговая оценка за курс==&lt;br /&gt;
Итоговая оценка (ИО) зависит от&lt;br /&gt;
* оценок за пять больших домашних заданий (БДЗ1, БДЗ2, ..., БДЗ5),&lt;br /&gt;
* оценок за домашние задания (ДЗ1, ДЗ2, ...),&lt;br /&gt;
* оценки за контрольную работу (КР),&lt;br /&gt;
* оценки за экзамен (ЭКЗ),&lt;br /&gt;
и может быть вычислена по формуле:&lt;br /&gt;
 ИО = 0.7 * (0.3 * КР + 0.7 *(ИДЗ1 + ИДЗ2 + ИДЗ3 + ИДЗ4 + ИДЗ5)/5) + 0.3 * ЭКЗ =&lt;br /&gt;
    = 0.21*КР + 0.98*ИДЗ1 + 0.98*ИДЗ2 + 0.98*ИДЗ3 + 0.98*ИДЗ4 + 0.98*ИДЗ5 + 0.3*ЭКЗ,&lt;br /&gt;
где&lt;br /&gt;
 ИДЗi = min (10, 0.7 * БДЗi + 0.4 * &amp;lt;cредняя оценка за ДЗj, прошедшие с предыдущего БДЗ по i-ое&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
==Порядок сдачи домашних работ==&lt;br /&gt;
===Большие домашние работы===&lt;br /&gt;
# Получить OK за задачу в контесте.&lt;br /&gt;
# Залить исходный код на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* На каждую задачу создавайте отдельный запрос на ревью. &lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении суток приходят замечания к коду. &#039;&#039;&#039;Если в течении суток замечаний или Ship It не появилось, проверьте, что вы правильно отправили запрос и, если всё сделано правильно, спросите у семинариста получил ли он запрос.&#039;&#039;&#039;&lt;br /&gt;
# Вы их исправляете, проверяете в контесте, что программа по-прежнему проходит все тесты, заливаете новую версию в Review Board. Штрафов за посылки НЕ будет.&lt;br /&gt;
# Процесс повторяется пока остаются замечания к коду или пока не истёк дедлайн. После закрытия контеста будут ещё одни сутки на доработку замечаний в Review Board.&lt;br /&gt;
# Оценивается только последняя версия работы в Review Board.&lt;br /&gt;
&lt;br /&gt;
===Маленькие домашние работы===&lt;br /&gt;
# Залить решение на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* Желаемые форматы: txt, py, cpp, h. Допускаются любые другие.&lt;br /&gt;
#* На каждую домашнюю работу создавайте отдельный запрос на ревью. Обязательно указывайте номер домашней работы.&lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении неопределенного промежутка времени придут оценки по каждому из заданий.&lt;br /&gt;
&lt;br /&gt;
==Оценивание домашних работ==&lt;br /&gt;
* Все задания предполагаются индивидуальными. Запрещены любые заимствования без ссылки на автора.&lt;br /&gt;
* Решения после установленного дедлайна не принимаются. Дедлайн указан в заголовке каждого задания.&lt;br /&gt;
* Везде, где требуется написать алгоритм, можно использовать любой язык программирования или псевдокод.&lt;br /&gt;
* Там, где требуется построить алгоритм с заданной асимптотикой, приведите обоснование, что полученный алгоритм удовлетворяет этому условию.&lt;br /&gt;
* Эти правила не действуют, если в задании явно оговорено иное.&lt;br /&gt;
&lt;br /&gt;
==Мотивация к изучению алгоритмов. Подсчёт числа операций (12.01)==&lt;br /&gt;
# Числа Фибоначчи. Определение. Примитивный рекурсивный алгоритм вычисления i-ого числа. Оценка числа операций. Анализ причин неэффективности. Алгоритм с запоминанием вычисленных ранее значений. Оценка числа операций. Сравнение с предыдущим. (подробнее: глава 0, страницы 8-10 из книги &amp;lt;&amp;lt;Алгоритмы&amp;gt;&amp;gt;, [[Алгоритмы_и_структуры_данных|см. список рекомендованной литературы]])&lt;br /&gt;
# Задача о ханойской башне. Постановка задачи. Рекурсивный алгоритм. Рекуррентная формула для числа перемещений. Замкнутая формула для числа перемещений (+ доказательство). Доказательство того, что эту задачу нельзя решить используя меньшее число перемещений дисков. ([https://www.dropbox.com/s/t8cbs7ttu4iasvj/algo-0-recursion.pdf?dl=0 Разбор задачи о ханойской башне], автор Сергей Объедков)&lt;br /&gt;
# Сортировка пузырьком. Алгоритм. Подсчёт количество операций сравнения и обмена (swap). Анализ наилучшего и наихудшего случаев ([https://ru.wikipedia.org/wiki/Сортировка_пузырьком Википедия])&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 1 (12.01 - 26.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
Во всех задачах, если не оговорено иного, предполагаем, что работаем с целыми неотрицательными числами. Для первых 7 задач необходимо&lt;br /&gt;
* описать что можно считать наилучшим и наихудшим случаями,&lt;br /&gt;
* для каждого из двух случаев подсчитать отдельно количество операций сравнения и swap (если есть).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Даны три числа, требуется вернуть наименьшее.&lt;br /&gt;
# Даны три числа, требуется отсортировать их.&lt;br /&gt;
# Дана последовательность A из n элементов и число x, требуется найти элемент равный x. Примечание: если таких значений i несколько, вернуть любое; если такого элемента нет, функция должна сообщить об этом.&lt;br /&gt;
# * Дана упорядоченная последовательность A из n элементов и число x, требуется найти такое i, что A[i] равно x. Алгоритм должен быть эффективней, чем в предыдущем пункте и использовать то, что последовательность упорядочена.&lt;br /&gt;
# Дана последовательность из 100 000 чисел от 0 до 100. Напишите эффективный алгоритм сортировки, который бы учитывал специфику входных данных.&lt;br /&gt;
# * Дано 32 битное неотрицательное число. Требуется номер первого ненулевого бит. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения, считая, что числа распределены равномерно.&lt;br /&gt;
# * Даны 32 битные неотрицательные числа m и n. Требуется вывести True, если m &amp;lt; n, иначе False. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения битов, считая, что числа распределены равномерно.&lt;br /&gt;
# Напишите рекурсивную функцию, вычисляющую n-ое число Фибоначчи (как на занятии). Подсчитайте количество рекурсивных вызовов.&lt;br /&gt;
# * Напишите функцию, вычисляющую n-ое число Фибоначчи, у которой число операций — полином от n, и которая использует количество памяти, независящее от n.&lt;br /&gt;
&lt;br /&gt;
==O-символика и стратегия &amp;quot;разделяй и властвуй&amp;quot; (15.01)==&lt;br /&gt;
# Сортировка слиянием. Алгоритм, рекуррентное соотношение для времени сортировки, сложность. Подробнее: [https://dl.dropboxusercontent.com/u/829163/draft.pdf §2.3 Сортировка слиянием (стр. 54)].&lt;br /&gt;
# О-символика. [https://dl.dropboxusercontent.com/u/829163/draft.pdf §0.3 О-символика (стр. 10)].&lt;br /&gt;
# Задача о слиянии m упорядоченных массивов по n элементов. Три алгоритма решения: последовательное слияние, слияние &amp;quot;деревом&amp;quot; (обе функции используют Merge из MergeSort), аналог Merge для m массивов. Анализ сложности каждого из них.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 2 (15.01-29.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
* Во всех задачах, если не оговорено иного, для простоты &#039;&#039;можно&#039;&#039; считать, что n является степенью какого-либо числа, например, степенью двойки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Дана функция F, определённая ниже. Сколько строк она напечатает? Указание: для обоих подпунктов рассмотрите два случая: 1. n является степенью двойки, 2. n не является степенью двойки.&lt;br /&gt;
## Запишите рекуррентное соотношение для числа строк.&lt;br /&gt;
## Решите уравнение, полученное в предыдущем пункте, то есть, выведите замкнутую (нерекуррентную формулу). Для простоты можно считать, что n является степенью двойки.&lt;br /&gt;
# В массиве A размера n записана возрастающая последовательность целых чисел. Постройте алгоритм типа &amp;quot;разделяй и властвуй&amp;quot;, который проверяет, существует ли такой индекс i, что A[i] = i&lt;br /&gt;
## за время O(n),&lt;br /&gt;
## * за время O(log n).&lt;br /&gt;
## Какие случаи для вашего алгоритма являются наихудшими и наилучшими? Какого время работы в лучшем и худшем случаях?&lt;br /&gt;
# Дан бесконечный массив A, первые n элементов которого содержат возрастающую последовательность положительных чисел, а дальше стоят -1. Значение n не дано. Постройте алгоритм, который получает на вход целое число x и находит это x в массиве --- или говорит, что там его нет, &lt;br /&gt;
## за время O(n),&lt;br /&gt;
## за время O(log n).&lt;br /&gt;
# Рассмотрим алгоритм вычисления наибольшего общего делителя (НОД) двух положительных чисел, основанный на методе &amp;quot;разделяй и властвуй&amp;quot;.&lt;br /&gt;
## (задание не оценивается) Прочитайте [https://dl.dropboxusercontent.com/u/829163/draft.pdf §1.2.3 Алгоритм Евклида (стр. 23)].&lt;br /&gt;
## * Докажите, что определение НОД-а, приведённое ниже, корректно.&lt;br /&gt;
## Постройте алгоритм, основанный на этом определении.&lt;br /&gt;
## Какой алгоритм будет быстрее для n-битовых чисел a и b при больших значениях n --- ваш или алгоритм Евклида?&lt;br /&gt;
# * Покажите как за время O(n log n) удалить из массива размера n все дубликаты, то есть оставить каждый элемент в одном экземпляре.&lt;br /&gt;
# * Даны два упорядоченных массива размера m и n. Постройте алгоритм, находящий k-й по величине элемент в объединении этих массивов за время O(log(n+m)). &lt;br /&gt;
&lt;br /&gt;
Функция F(n).&lt;br /&gt;
  если n &amp;gt; 1:&lt;br /&gt;
    напечатать &amp;quot;всё ещё работаю&amp;quot;&lt;br /&gt;
    F(n/2)&lt;br /&gt;
    F(n/2)&lt;br /&gt;
&lt;br /&gt;
Определение НОД-а.&lt;br /&gt;
             2НОД(a/2, b/2), если а и b чётны,&lt;br /&gt;
  НОД(a,b) = НОД(a, b/2), если а нечётно, b чётно,&lt;br /&gt;
             НОД((a-b)/2, b), если а и b нечётны.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;lt;nowiki&amp;gt;Задачи взяты из книги &amp;quot;Алгоритмы&amp;quot;, глава 2 (см. список рекомендованной литературы).&amp;lt;/nowiki&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Сложение и умножение (19.01)==&lt;br /&gt;
# Алгоритм сложения, его сложность (§1.1.1 Сложение*)&lt;br /&gt;
# &amp;quot;Школьный&amp;quot; алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Рекурсивный алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Алгоритм умножения, реализующий стратегию &amp;quot;разделяй и властвуй&amp;quot;, анализ сложности (§2.1 Умножение чисел*)&lt;br /&gt;
 * [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать.]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 3 (19.01 - 2.02)===&lt;br /&gt;
* Во всех задачах для простоты можно считать, что n является степенью какого-либо числа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Найдите произведение чисел 10011011 и 10111010 (в двоичной системе счисления), используя алгоритм умножения чисел, основанный на методе «разделяй и властвуй». Необходимо не только дать ответ, но и привести ход решения.&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 3 рекурсивных вызова для подзадач размера n-1 и комбинирует из них решение исходной задачи за О(n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте три верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 10 рекурсивных вызовов для подзадач размера n/2 и комбинирует из них решение исходной задачи за О(5n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте два верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Докажите, что 3m² + m = O(m²).&lt;br /&gt;
# Докажите, что lg m = O(m/1000), где lg m — это логарифм с двоичным основанием.&lt;br /&gt;
# Докажите, что из равенства f(n) = O(g(n)) не следует, что g(n) = O(f(n)).&lt;br /&gt;
# Докажите, что O(m) содержится в O(m²).&lt;br /&gt;
&lt;br /&gt;
==Решение рекуррентных уравнений (22.01)==&lt;br /&gt;
# Примеры решений рекуррентных уравнений (см. [https://www.dropbox.com/s/6a0r410zjm9qwe7/algo-3-recurrences.pdf?dl=0 конспект]).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 4 (до 14.02)===&lt;br /&gt;
* Нельзя использовать утверждение основной теоремы о решении рекуррентных соотношений.&lt;br /&gt;
* &#039;&#039;Можно&#039;&#039; использовать метод построения дерева рекурсии или подстановку (метод с угадыванием ответа).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Какой из трёх приведённых ниже алгоритмов вы бы предпочли? Обоснуйте свой ответ.&lt;br /&gt;
#* Алгоритм A, решая задачу, производит пять рекурсивных вызовов для подзадач вдвое меньшего размера, после чего строит ответ для исходной задачи за линейное время.&lt;br /&gt;
#* Алгоритм B, решая задачу размера n, делает два рекурсивных вызова для задач размера n − 1, после чего находит ответ за время O(1).&lt;br /&gt;
#* Алгоритм C, решая задачу размера n, рекурсивно решает девять задач размера n/3 и строит ответ за время O(n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Найдите T(n) в замкнутой форме для любых 7 из 10 приведённых ниже рекуррентных соотношений:&lt;br /&gt;
## T(n) ≤ 2T(n/3) + 1;&lt;br /&gt;
## T(n) ≤ 7T(n/7) + n;&lt;br /&gt;
## T(n) ≤ 9T(n/3) + n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 8T(n/2) + n&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 49T(n/25) + n&amp;lt;sup&amp;gt;3/2&amp;lt;/sup&amp;gt;log n;&lt;br /&gt;
## T(n) ≤ T(n − 1) + 2;&lt;br /&gt;
## T(n) ≤ T(n − 1) + n&amp;lt;sup&amp;gt;c&amp;lt;/sup&amp;gt;, где c ≥ 1 –– константа;&lt;br /&gt;
## T(n) ≤ T(n − 1) + c&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;, где c &amp;gt; 1 –– константа;&lt;br /&gt;
## T(n) ≤ 2T(n − 1) + 1;&lt;br /&gt;
## T(n) ≤ T(sqrt(n)) + 1.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №1==&lt;br /&gt;
Необходимо реализовать все 6 задач из [https://official.contest.yandex.ru/contest/1002 контеста]. Каждую задачу можно писать на С++ или Python. На выполнение работы отводится две недели. Каждая задача оценивается в 10/6 балла. Оценка &#039;&#039;может&#039;&#039; быть снижена за плохой код, но не более чем на 25%.&lt;br /&gt;
&lt;br /&gt;
==Бинарное дерево поиска (26.01)==&lt;br /&gt;
# Определение. Пример.&lt;br /&gt;
# Не модифицирующие алгоритмы: поиск (рекурсивный и итеративный алгоритмы), поиск минимума, inordered обход (вывод значений узлов в отсортированном порядке), поиск следующего по возрастанию.&lt;br /&gt;
# Модифицирующие алгоритмы: вставка (рекурсивная реализация), удаление (только идея).&lt;br /&gt;
 [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 13, стр. 248]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 5 (до 16.02)===&lt;br /&gt;
* Для получения максимальной оценки можно выполнить или все задачи без звёздочки, или задачу со звёздочкой. Преподаватель понимает, что реализацию БДП сложно не найти в интернете, но от копипасты не будет никакой пользы. Напротив, самостоятельная реализация очень полезна и приветствуется, даже если не получится выполнить всех пунктов задания.&lt;br /&gt;
* Задачи с двумя звёздочками необязательны.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Нарисуйте бинарные деревья поиска высотой 2, 3, 4, 5 и 6 для множества ключей {1, 4, 5, 10, 16, 17, 21}. Корень дерева имеет высоту 0.&lt;br /&gt;
# &#039;&#039;&#039;Сортировка с использованием БДП.&#039;&#039;&#039;&lt;br /&gt;
## Какова асимптотическая сложность алгоритма вставки элемента в дерево высоты d? Почему? Назовите наилучший и наиухдший случаи.&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который строит БДП в узлах которого стоят элементы данной последовательности. Можно использовать функцию Insert. Назовите наилучший и наихудший случаи. Есть теорема о том, что полученный алгоритм будет работать в среднем случае за время O(n * log n).&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который выводит их в порядке возрастания. Используйте бинарное дерево поиска. Какова в среднем случае сложность этого алгоритма? Назовите наилучший и наихудший случаи. Какова сложность в наихудшем случае?&lt;br /&gt;
# Напишите функцию GetRoot, которой на вход подаётся указатель на произвольный узел дерева, а она возвращает указатель на корень.&lt;br /&gt;
# Напишите процедуру PrintLeafs, которой на вход подаётся указатель на корень дерева, и она печатает листья дерева&lt;br /&gt;
## по возрастанию,&lt;br /&gt;
## по убыванию.&lt;br /&gt;
# ** Альтернативный обход в порядке возрастания бинарного дерева поиска с n узлами (или центрированный (inordered) обход) можно осуществить путём поиска минимального элемента дерева с помощью функции Minimum с последующий n-1 вызовом функции Next. Каково время работы такого алгоритма?&lt;br /&gt;
# * Реализуйте на С++ структуру данных бинарное дерево поиска, [https://yadi.sk/i/gi2SEStreFfSb используя заготовку].&lt;br /&gt;
## Нарисуйте бинарное дерево поиска, которое строится в функции getTreeExample.&lt;br /&gt;
## Реализуйте следующие алгоритмы: &lt;br /&gt;
### поиск минимума, &lt;br /&gt;
### inordered обход (вывод значений узлов в отсортированном порядке),&lt;br /&gt;
### поиск следующего по возрастанию,&lt;br /&gt;
### вставка элемента в дерево,&lt;br /&gt;
### сортировка последовательности с использованием БДП (дан вектор чисел, необходимо вывести их по возрастанию),&lt;br /&gt;
### ** удаление.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Карацубы, Штрассена. Быстрая сортировка (29.01)==&lt;br /&gt;
# Алгоритм Карацубы.&lt;br /&gt;
# Алгоритм Штрассена. [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать Дасгупту и др., §2.5 Умножение матриц]&lt;br /&gt;
# Быстрая сортировка и доказательство того, что в среднем случае она работает за О(n * log n). [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 8 Быстрая сортировка, стр. 148]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 6 (до 18.02)===&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Пусть мы хотим найти двоичное представление десятичного числа 10&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;. Будем считать, что n --- степень двойки (n = 2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt;).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Pwr2Bin(n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть 1010&lt;br /&gt;
    z = ...&lt;br /&gt;
    вернуть Multiply(z, z)&amp;lt;/source&amp;gt;&lt;br /&gt;
Multiply --- функция, перемножающая два n-битовых двоичных числа x и y по алгоритму Карацубы за O(n&amp;lt;sup&amp;gt;log&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;3&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Пусть мы хотим перевести произвольное десятичное число x в записи которого n=2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; чисел в двоичную систему счисления.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Dec2Bin(x, n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть binary[x]&lt;br /&gt;
    разделить x на два десятичных числа xl и xr из n/2 цифр.&lt;br /&gt;
    вернуть ...&amp;lt;/source&amp;gt;&lt;br /&gt;
Здесь binary --- это массив, содержащий двоичное представление десятичных цифр.&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Докажите, что математическое ожидание времени работы алгоритма быстрой сортировки (усреднение по всем вариантам выбора опорного элемента) на любом входе размера n удовлетворяет соотношению: T(n) ≤ O(n) + 1/n * &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt; (T(i-1) + T(n-i)).&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Найдите решение соотношения из предыдущего пункта.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Динамическое программирование (ДП). Первые примеры (02.01)==&lt;br /&gt;
# Нахождение самой длинной возрастающей подпоследовательности.&lt;br /&gt;
# Нахождение редакционного расстояния (или редакционной стоимости, расстояния Левенштейна).&lt;br /&gt;
# Нахождение представителя большинства.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 7 (до 20.02)===&lt;br /&gt;
* В этом задании везде, где требуется реализовать алгоритм, необходимо привести код на любом языке программирования.&lt;br /&gt;
* Для получения максимальной оценки нужно решить все задачи без звёздочек. Одна решённая задача со звёздочкой заменяет одну задачу без звёздочки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения редакционного расстояния (алгоритм Вагнера — Фишера). Например, редакционное расстояние между словами &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равно 6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения длины наибольшей общей подстроки. Например, длина наибольшей общей подстроки &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равна 8 (&amp;quot;antholog&amp;quot;). Чем больше это значение, тем схожей строки.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Предположим теперь, что сравниваемые строки состоят из символов A, С, G и T; за удаление или вставку мы платим -5; за замену буквы x на y платим w[x, y], где x, y принадлежат множеству {A, С, G, T}, a w — это матрица весов:&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
!-!! A!! G!! C!! T&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! A&lt;br /&gt;
|10||-1||-3||-4&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
!G&lt;br /&gt;
||-1||7||-5||-3&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! C&lt;br /&gt;
||-3||-5||9||0&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! T&lt;br /&gt;
||-4||-3||0||8&lt;br /&gt;
|}&lt;br /&gt;
Тогда выравнивание:&lt;br /&gt;
 AGACTAGTTAC&lt;br /&gt;
 CGA‒‒‒GACGT&lt;br /&gt;
будет иметь следующую оценку:&lt;br /&gt;
 w[A,C] + w[G,G] + w[A,A] + 3*(-5) + w[G,G] + w[T,A] + w[T,C] + w[A,G] + w[C,T] = -3 + 7 + 10 - 3*5 + 7 + (-4) + 0 + (-1) + 0 = 1.&lt;br /&gt;
&lt;br /&gt;
Напишите алгоритм, который находит максимальную стоимость всех возможных выравниваний. Верно ли, что чем больше это значение, тем непохожей строки?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как давно один народ отделился от другого? Кто похожей — итальянец и китаец или якут и эфиоп? На эти вопросы можно отвечать с разных точек зрения — культурной, исторической, лингвистической, ... В последние же годы человечество научилось секвенировать геном, что позволило исследовать этот вопрос с точки зрения генетики. Секвенирование генома — это процесс записи ДНК в виде нуклеотидной последовательности, которая представляет собой последовательность из четырёх символов — A, С, G и T. Существуют базы, которые хранят генетическую информацию о людях из разных стран и континентов, например, [http://www.mtdb.igp.uu.se/ http://www.mtdb.igp.uu.se/ → Download mtDNA sequences]. Чем больше сходство между геномами, тем сильнее родственные связи между их обладателями. Используя решение предыдущего пункта, выполните задания:&lt;br /&gt;
# Определите, кто похожей — итальянец и китаец или якут и эфиоп?&lt;br /&gt;
# Найдите нескольких похожих и нескольких непохожих народностей.&lt;br /&gt;
# * Выберите одну народность. Найдите самых похожих и самых непохожих на неё.&lt;br /&gt;
# * Найдите самые похожие и самые непохожие народности.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Задача о разрезании стержня (05.01)==&lt;br /&gt;
# Постановка задачи.&lt;br /&gt;
# Решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Решение с нахождением максимума по p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Восходящий алгоритм с запоминанием. Вывод длин кусочков стержня. Оценка сложности.&lt;br /&gt;
# Нисходящий алгоритм с запоминанием. Оценка сложности.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.1 Разрезание стержня, стр. 393]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 8 (до 22.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Решая задачу о разрезании стержня мы вначале построили рекурсивное решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt; для всех 1 ≤ i &amp;lt; n. Его сложность описывалась рекуррентной формулой T(n) = n + &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n-1&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt;(T(i) + T(n-i)), T(1) = 1.&lt;br /&gt;
# Объясните эту формулу.&lt;br /&gt;
# Покажите с помощью метода подстановок, что T(n) ≤ 2&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Покажите с помощью контрпримера, что описанная далее жадная стратегия не всегда определяет оптимальный способ разрезания стержня. Определим плотность стержня длиной i как p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;/i, то есть как стоимость единицы его длины. Жадная стратегия для стержня длиной n отрезает от стержня первую часть длиной i, где 1 ≤ i ≤ n, имеющую максимальную плотность. Затем та же жадная стратегия применяется к оставшейся части длиной n-i.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Рассмотрим модификацию задачи разрезания стержня, в которой в дополнение к цене p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; каждого стержня добавляется фиксированная цена разреза c. Теперь прибыль, связанная с решением, представляет собой сумму цен частей стержня минус стоимость разрезов. Разработайте алгоритм динамического программирования для этой модифицированной задачи.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Непрерывным участком называется группа подряд идущих элементов. Например, для последовательности&lt;br /&gt;
 5, 15, −30, 10, −5, 40, 10&lt;br /&gt;
элементы 15, −30, 10 образуют непрерывный участок, а 5, 15, 40 -- нет. Постройте линейный алгоритм для следующей задачи:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Вход: список чисел a1, a2, ... ‌, an.&lt;br /&gt;
Выход: непрерывный участок с максимальной суммой (сумма участка нулевой длины равна нулю).&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Для приведённого примера ответом будет 10, −5, 40, 10 с суммой 55. Какова сложность алгоритма? Почему?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Надо заплатить v рублей, имея купюры в x1, x2, ‌..., xn рублей (купюр каждого типа сколько угодно). Это не всегда возможно (скажем, купюрами в&lt;br /&gt;
10 и 25 рублей можно заплатить 45 рублей, но не 47 и не 15). Постройте основанный на методе динамического программирования алгоритм со временем работы O(nv), выясняющий, возможна ли уплата.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как решить предыдущую задачу, если каждая купюра имеется в единственном экземпляре? (Например, купюрами в 1, 5, 10, 20 рублей можно заплатить 16 = 1 + 5 + 10 и 31 = 1 + 10 + 20 рублей, но не 40 (не хватит денег). Время работы алгоритма по-прежнему O(nv).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Ещё один вариант той же задачи: купюр каждого типа сколько угодно, но всего разрешается использовать не более k купюр. (Например, если есть купюры в 5 и 10 рублей, а k = 6, то 55 разменять можно, а 65 –– нет).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Перемножение цепочки матриц. Оптимальное бинарное дерево поиска (начало) (09.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о перемножении цепочки матриц. Постановка задачи.Пример. Нисходящий алгоритм.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.2 Перемножение цепочки матриц, стр. 403]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 9 (до 24.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Найдите оптимальную расстановку скобок в произведении последовательности матриц, размерности которых равны 5×10, 10×3, 3×12, 12×5, 5×50, 50×6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Напишите восходящий алгоритм для поиска оптимальной расстановки скобок.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Расстановка пробелов. Оптимальное бинарное дерево поиска (середина) (12.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о расстановке пробелов. Постановка задачи. Решения для трёх случаев: 1. нужно вернуть можно ли разбить текст на слова; 2. вернуть разбивку на слова; 3. слова встречаются не равновероятно, вернуть наиболее вероятную разбивку на слова.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи. Вывод математического ожидания времени поиска.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Праздничное домашнее задание 10 (до 02.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[&amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;,&amp;quot;, &amp;quot;.&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;,&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;.&amp;quot;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Подсказка:&#039;&#039;&#039; разбейте текст на слова из списка и посмотрите на азбуку Морзе.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Способы представления графов в памяти (16.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Разбор ошибок в домашнем задании.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Графы. Способы представления графов в памяти (матрица смежности, список рёбер, список соседей (список смежностей), матрица инцидентности). Зависимость сложности алгоритмов от способа представления.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §22.1 Представление графов, стр. 626]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 11 (до 02.03)===&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача A.]&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача B.]&lt;br /&gt;
# Нарисуйте неориентированный граф с 5 вершинами и 8 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Нарисуйте ориентированный граф с 4 вершинами и 3 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Дан ориентированный граф. &#039;&#039;Исходящая степень вершины v&#039;&#039; --- это количество исходящих из неё рёбер, &#039;&#039;входящая степень v&#039;&#039; --- это количество рёбер входящих в  v. Имеется представление ориентированного графа с использование списка соседей. Как долго будут вычисляться исходящие степени всех вершин графа? А входящие степени?&lt;br /&gt;
# Дан граф G = (V, E). Какие из рассмотренных способов хранения графов используют меньше всего памяти для хранения G и почему? Указание: рассмотрите случаи |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;lt; |E| и |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;gt; |E|.&lt;br /&gt;
# Пусть C --- это матрица смежности графа G.&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
# Пусть B --- это матрица инцидентности ориентированного графа G. Как связаны элементы матрицы BB&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
&lt;br /&gt;
==Реализация поиска в глубину (19.02)==&lt;br /&gt;
# Реализация поиска в глубину и смежных задач.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 12 (до 5.03)===&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Выберите любой способ хранения графа. Реализуйте поиск в глубину.&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Напишите алгоритм, который возвращает данные о том, какие вершины лежат в одной компоненте связности.&lt;br /&gt;
# &#039;&#039;(любой ЯП или псевдокод)&#039;&#039; Напишите алгоритм проверки сильной связности ориентированного графа. Какова его сложность?&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №2==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
Необходимо реализовать 3 задачи из [https://official.contest.yandex.ru/contest/1085 контеста], см. [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing распределение задач]. Каждую задачу можно написать на С++ или Python. На выполнение работы отводится две недели (см. время окончания контеста). [https://official.contest.yandex.ru/contest/1123 Дорешивание.]&lt;br /&gt;
&lt;br /&gt;
==ДП и графы (26.02)==&lt;br /&gt;
==ДП и графы (02.03)==&lt;br /&gt;
==Жадные алгоритмы (12.03)==&lt;br /&gt;
===Домашнее задание 13 (до 23.03)===&lt;br /&gt;
# Вася хочет купить по одной акции каждой компании. Все акции стоят одинаково, но дорожают по-разному. Каждый месяц акция i-ой компании дорожает в r_i раз. В один месяц можно купить только одну акцию.&lt;br /&gt;
## Напишите алгоритм, который выводит оптимальную последовательность покупок (такую, что на покупку всех акций потратится меньше денег).&lt;br /&gt;
## Докажите корректность алгоритма, то есть докажите, что последовательность покупок, которую выводит ваш алгоритм, оптимальна.&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список, очередь (16.03)==&lt;br /&gt;
# Реализация линейного двусвязного списка (С++).&lt;br /&gt;
# Реализация очереди ограниченной длины на базе вектора (С++).&lt;br /&gt;
# Реализация очереди на базе списка (С++).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14 (до 23.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте (на С++) структуру данных Стек. У стека должно быть три операции:&lt;br /&gt;
* push --- положить элемент на вершину стека;&lt;br /&gt;
* pop --- удалить верхний элемент;&lt;br /&gt;
* front --- вернуть значение верхнего элемента.&lt;br /&gt;
Оцените время работы каждой функции.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список (19.03)==&lt;br /&gt;
===Домашнее задание 13* (до 30.03)===&lt;br /&gt;
#Для приведённой реализации класса List (https://yadi.sk/i/c5r_79WdfMyNS).&lt;br /&gt;
## Допишите print, push_back и push_front.&lt;br /&gt;
## В функции insert_after и delete_node вставьте необходимые проверки так, чтобы они работали для крайних случаев.&lt;br /&gt;
## Напишите main в котором&lt;br /&gt;
### создаётся объект класса List, &lt;br /&gt;
### заполняется элементами с помощью функций push_back, push_front и insert_after и&lt;br /&gt;
### удаляется i-ый элемент.&lt;br /&gt;
&lt;br /&gt;
==Повторение (30.03)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Для данных пар функций выясните их связь в терминах O-, o-, Ω-, ω-, Θ-обозначений. Поставьте галочку в клетке с Ω, если f(x) = Ω(g(x)) и прочерк, если равенства нет. [https://ru.wikipedia.org/wiki/«O»_большое_и_«o»_малое#.D0.94.D1.80.D1.83.D0.B3.D0.B8.D0.B5_.D0.BF.D0.BE.D0.B4.D0.BE.D0.B1.D0.BD.D1.8B.D0.B5_.D0.BE.D0.B1.D0.BE.D0.B7.D0.BD.D0.B0.D1.87.D0.B5.D0.BD.D0.B8.D1.8F Википедия]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! f(x)!! g(x)!! O!! o!! Ω!! ω!! Θ&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! 2^100&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n * log(n)&lt;br /&gt;
! 2^100 * n * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n&lt;br /&gt;
! 2^100 * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n!&lt;br /&gt;
! 2^(2015n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n*2^n&lt;br /&gt;
! 3^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 5^n&lt;br /&gt;
! 5^(n+1)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n + n^2 + n^3 + ... + n^1000&lt;br /&gt;
! 7^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм Quickselect нахождения k-ого элемента по возрастанию: http://en.wikipedia.org/wiki/Quickselect&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;На улице стоит ряд домов. В каждом из домов лежит сколько-то денег. Вор хочет обокрасть дома на переулке. Он не может обокрасть два соседних дома, потому что хозяин дома, который он обокрал, сразу предупредит соседей. Нужно найти, какую максимальную сумму вор может украсть с переулка. На вход программы подается массив неотрицательных целых чисел - количество долларов в доме с номером i. Соседние дома в массиве представлены соседними элементами. Например, пусть задан массив { 1, 4, 5 } - тогда вор максимум может украсть $6, обокрав дома 1 и 3. Пусть задан массив { 1, 7, 2 } - тогда вор максимум может украсть $7, обокрав дом 2.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Алфавит из всех маленьких латинских букв и пробела закодирован числами следующим способом:&lt;br /&gt;
  &#039;a&#039; -&amp;gt; 1&lt;br /&gt;
  &#039;b&#039; -&amp;gt; 2&lt;br /&gt;
  &#039;c&#039; -&amp;gt; 3&lt;br /&gt;
  ...&lt;br /&gt;
  &#039;z&#039; -&amp;gt; 26&lt;br /&gt;
  &#039; &#039; -&amp;gt; 27&lt;br /&gt;
На вход программы подается строка из цифр. Нужно посчитать, сколькими способами можно раскодировать эту строку.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Дан граф, заданный матрицей смежности. Вывести пары вершин между которыми нет пути.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Повторение (02.04) ==&lt;br /&gt;
Решали и разбирали первые 4 задачи из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14* (до 11.03)===&lt;br /&gt;
Решите любые две задачи (подпункты НЕ считаются отдельными задачами) с предыдущей пары (Повторение (30.03)).&lt;br /&gt;
&lt;br /&gt;
== Повторение (06.04) ==&lt;br /&gt;
Будем решать вторую половину задач из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 15 (до 16.04)===&lt;br /&gt;
# Приведите пример графа, который содержит отрицательные рёбра, не содержит циклов отрицательного веса и для которого алгоритм Дейкстры возвращает неверный результат.&lt;br /&gt;
# Используется ли в алгоритме Дейкстры то, что веса рёбер неотрицательны? Если &amp;quot;да&amp;quot;, то где именно?&lt;br /&gt;
# Пусть граф содержит рёбра с весами &amp;gt;= -100. Если прибавить к каждому ребру 101 и при помощи алгоритма Дейкстры найти кратчайшие пути. Будут ли эти пути кратчайшими в исходном графе? Почему?&lt;br /&gt;
&lt;br /&gt;
== Повторение (07.04) ==&lt;br /&gt;
&#039;&#039;&#039;Решение рекуррентных соотношений&#039;&#039;&#039;&lt;br /&gt;
# Решите уравнение: T(n) = 4*T(n/2) + O(n^2) с базой T(1) = O(1)&lt;br /&gt;
## Используя основную теорему.&lt;br /&gt;
## Используя дерево рекурсий.&lt;br /&gt;
## Методом подстановки.&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2)) + n является \Theta(n lg n).&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2) + 17) + n является \Theta(n lg n).&lt;br /&gt;
# Решите уравнения, считая, что T(1) = O(1):&lt;br /&gt;
## T(n) = T(n-1) + n&lt;br /&gt;
## T(n) = 2*T(floor(sqrt(n))) + lg n. Указание: попробуйте использовать замену переменных.&lt;br /&gt;
## T(n) = 3*T(sqrt(n)) + lg n&lt;br /&gt;
# Дайте верхнюю и нижнюю оценки функции T(n). Постарайтесь, чтобы оценки были как можно более точные&lt;br /&gt;
## T(n) = 4T(n/3) + n*lg(n)&lt;br /&gt;
## T(n) = 3T(n/3) + n/lg(n)&lt;br /&gt;
## T(n) = 4T(n/2) + n^2*sqrt(n)&lt;br /&gt;
## T(n) = T(n/2) + T(n/4) + T(n/8) + n&lt;br /&gt;
## T(n) = T(n-1) + 1/n&lt;br /&gt;
## T(n) = T(n-2) + 1/lg(n)&lt;br /&gt;
## T(n) = sqrt(n) * T(sqrt(n)) + n&lt;br /&gt;
&#039;&#039;&#039;Анализ и построение алгоритмов&#039;&#039;&#039;&lt;br /&gt;
# Числа Фибоначчи F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; можно выразить через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, используя матрицу: https://yadi.sk/i/Pm_aNzHCforFU. &lt;br /&gt;
## Покажите как вычислить F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;.&lt;br /&gt;
## Как вычислить F&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;n+1&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;?&lt;br /&gt;
## Напишите алгоритм.&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
## Ускорьте его так, чтобы он работал за O(log n).&lt;br /&gt;
# Дана последовательность символов. Какое минимальное количество символов нужно удалить из неё, чтобы получить палиндром?&lt;br /&gt;
## Напишите алгоритм (на псевдокоде или на любом языке программирования).&lt;br /&gt;
## Оцените время работы алгоритма.&lt;br /&gt;
# Какую структуру данных вы бы использовали для реализации упорядоченного множества (http://neerc.ifmo.ru/wiki/index.php?title=Упорядоченное_множество)? Какая будет сложность каждой из операций над множеством?&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 16 (до 20.04)===&lt;br /&gt;
# Решите 6 задач из первой части и 6 из второй. (Укажите какие именно.) Каждый из подпунктов является отдельной задачей.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм и теорема Форда-Фалкерсона (16.04)==&lt;br /&gt;
# Базовые определения (пропускные способности, сток, исток и пр.). Пример. &lt;br /&gt;
# Ограничения на поток (сохранение и что меньше пропускных способностей).&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, пример работы&lt;br /&gt;
# Разрез, определение, пример.&lt;br /&gt;
# Утверждение: максимальный поток &amp;lt;= любого разреза.&lt;br /&gt;
# Теорема Форда-Фалкерсона (с доказательством).&lt;br /&gt;
# Пример на котором алгоритм Форда-Фалкерсонаработает работает очень долго при неудачном выборе путей.&lt;br /&gt;
# Сложность алгоритма Форда-Фалкерсона.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №3==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
В [https://official.contest.yandex.ru/contest/1196 домашнем задании] пять задач. Они разделены на два варианта, помеченные римскими цифрами I и II. Свой вариант нужно узнать [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing здесь на вкладке HW3]. Третья задача — общая для двух вариантов; ее решение необходимо снабдить доказательством корректности алгоритма. На выполнение задания дается примерно 2 недели (см. точное время окончания в контесте). Каждую задачу можно написать на С++ или Python.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Форда-Фалкерсона и Эдмондса-Карпа (20.04)==&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, напоминание: базовые определения, пример работы, пример на котором алгоритм работает долго, сложность.&lt;br /&gt;
# Алгоритм Эдмодса-Карпа. Доказательство асимптотики времени работы.&lt;br /&gt;
&lt;br /&gt;
==(23.04)==&lt;br /&gt;
&lt;br /&gt;
==(11.05) Красно-чёрные деревья==&lt;br /&gt;
[https://ru.wikipedia.org/wiki/Красно-чёрное_дерево Красно-чёрное дерево]&lt;br /&gt;
===Домашнее задание 17 (до 18.05)===&lt;br /&gt;
# Зачем нужны красно-чёрные деревья?&lt;br /&gt;
# Благодаря какому свойству и почему красно-чёрное дерево является сбалансированным?&lt;br /&gt;
# Нарисуйте полное бинарное дерево поиска высотой 3 с ключами {1, 2, ..., 15}. Сделайте из него красно-чёрные деревья высотой 2, 3 и 4.&lt;br /&gt;
# Нарисуйте красно-чёрные деревья, получающиеся последовательной вставкой элементов 12, 10, 29, 30, 31, 32 в [https://ru.wikipedia.org/wiki/Красно-чёрное_дерево#/media/File:Red-black_tree_example.svg данное дерево]. Для вставки используйте алгоритм вставки из Википедии. Укажите какой именно функцией вы воспользовались.&lt;br /&gt;
# Определим &#039;&#039;&#039;ослабленное красно-чёрное дерево&#039;&#039;&#039; как бинарное дерево поиска, которое удовлетворяет красно-чёрным свойствам 1, 3, 4 и 5. Другими словами, корень может быть как чёрным, так и красным. Рассмотрите ослабленное красно-чёрное дерево T, корень которого красный. Если перекрасить корень дерева T в чёрный, будет ли оно красно-чёрным деревом?&lt;br /&gt;
# Покажите, что самый длинный простой нисходящий путь от вершины x к листу красно-черного дерева имеет длину, не более чем в два раза превышающую кратчайший путь от x к листу-потомку.&lt;br /&gt;
# Чему равно наибольшее возможное количество внутренних узлов в красно-чёрном дереве с чёрной высоты k? А наименьшее возможное количество?&lt;br /&gt;
# Нарисуйте красно-чёрные деревья, получающиеся последовательной вставкой ключей 41, 38, 31, 12, 19, 8 в изначально пустое дерево.&lt;br /&gt;
# Покажите какие деревья будут получаться в результате последовательного удаления ключей в порядке 8, 12, 19, 31, 38, 41.&lt;br /&gt;
&lt;br /&gt;
==(14.05) Конкурентный анализ самоорганизующихся циклов==&lt;br /&gt;
[https://vk.com/doc12518218_390369758 Лекция]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 18 (до 21.05)===&lt;br /&gt;
Все вычисления сопроводите подробными объяснениями о том, почему верно то или иное (не)равенство.&lt;br /&gt;
# Пусть имеется n-элементный список и m поисковых запросов к нему. После каждой операции поиска можно переупорядочить список. Обозначим стоимость последовательности поисков через C. Докажите, что в худшем случае C = Ω(mn).&lt;br /&gt;
#  Обозначим через c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; стоимость i-ого поискового запроса с применением эвристики перемещения в начало, которая включает стоимость поиска элемента в списке и стоимость его перемещения в начало списка путём ряда обменов соседних элементов списка. Покажите, что i-ая операция поиска находит элемент x в списке L с применением эвристики перемещения в начало, то c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = 2 * rank&amp;lt;sub&amp;gt;L&amp;lt;/sub&amp;gt;(x) - 1.&lt;br /&gt;
# Покажите, что c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = 2 * rank&amp;lt;sub&amp;gt;L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) - 1.&lt;br /&gt;
# Покажите, что c*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = rank&amp;lt;sub&amp;gt;L*&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) + t&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;.&lt;br /&gt;
# Докажите, что после одного обмена двух соседних элементов потенциал либо увеличивается на 2, либо уменьшается на 2.&lt;br /&gt;
# Докажите, что rank&amp;lt;sub&amp;gt;L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) = |A| + |B| + 1.&lt;br /&gt;
# Докажите, что rank&amp;lt;sub&amp;gt;L*&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) = |A| + |С| + 1.&lt;br /&gt;
# Покажите, что поиск i-ого элемента приводит к изменению потенциала Ф(L&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;) - Ф(L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;) &amp;lt;= 2 (|A| - |B| + t*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;), где t*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; --- это количество обменов при i-ом поиске.&lt;br /&gt;
# Во сколько раз стоимость С&amp;lt;sub&amp;gt;MFT&amp;lt;/sub&amp;gt;(S) превышает C&amp;lt;sub&amp;gt;OPT&amp;lt;/sub&amp;gt;(S)?&lt;br /&gt;
&lt;br /&gt;
== (18.05) Конечные автоматы ==&lt;br /&gt;
=== Задание 19 (до 25.05) ===&lt;br /&gt;
# Постройте автомат для языка над алфавитом Σ = {0, 1} каждое слово которого содержит хотя бы два нуля. Является ли он детерминированным?&lt;br /&gt;
# Постройте автомат над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5. Является ли он детерминированным?&lt;br /&gt;
# Постройте автомат, который допускает пустой язык (язык в котором нет ни одного слова).&lt;br /&gt;
# Постройте автомат, который допускает все слова над алфавитом Σ.&lt;br /&gt;
# Постройте ДКА над алфавитом Σ = {К, Ж, З}, который допускает слова в которых после К идёт З, после З --- Ж, после Ж --- К.&lt;br /&gt;
# * Постройте ДКА над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5, а число нулей на 3.&lt;br /&gt;
# Постройте НКА для языка над алфавитом Σ = {0, 1, 2, 3}, состоящий из слов, в которых хотя бы одна из последних пяти букв является 1.&lt;br /&gt;
# Постройте НКА над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5, а число нулей на 3.&lt;br /&gt;
# Какие языки допускают автоматы https://yadi.sk/d/fNAHbjCZghERG?&lt;br /&gt;
# Для каждого из автоматов https://yadi.sk/d/fNAHbjCZghERG постройте соответствующий ему ДКА.&lt;br /&gt;
&lt;br /&gt;
== (21.05) Регулярные выражения, КА, их эквивалентность. Лемма о накачке  ==&lt;br /&gt;
=== Задание 20 (до 28.05) ===&lt;br /&gt;
&#039;&#039;&#039;I Написать регулярные выражения&#039;&#039;&#039;&lt;br /&gt;
# Напишите регулярное выражение для языка {1, 000, 1010}.&lt;br /&gt;
# Напишите регулярное выражение для языка над алфавитом Σ = {0, 1} каждое слово которого содержит хотя бы два нуля.&lt;br /&gt;
# Напишите регулярное выражение над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5. Является ли он детерминированным?&lt;br /&gt;
# Напишите регулярное выражение, которое допускает пустой язык (язык в котором нет ни одного слова).&lt;br /&gt;
# Напишите регулярное выражение, которое допускает все слова над алфавитом Σ.&lt;br /&gt;
# Напишите регулярное выражение над алфавитом Σ = {К, Ж, З}, который допускает слова в которых после К идёт З, после З --- Ж, после Ж --- К.&lt;br /&gt;
# Напишите регулярное выражение для языка над алфавитом Σ = {0, 1, 2, 3}, состоящий из слов, в которых хотя бы одна из последних пяти букв является 1.&lt;br /&gt;
&#039;&#039;&#039;II Доказать замкнутость относительно различных операций&#039;&#039;&#039;&lt;br /&gt;
# Покажите, что если для языков L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; и L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; существует КА, который их читает, то существует КА и для их объединения L = {w | w ∈ L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; или w ∈ L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;}.&lt;br /&gt;
# Покажите, что если для языка L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; и L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; существует КА, который их читает, то существует КА и для языка L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; = {xy | x ∈ L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, y ∈ L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;}.&lt;br /&gt;
# Покажите, что если для языка L существует КА, который его читает, то существует КА и для &#039;&#039;&#039;замыкания Клини&#039;&#039;&#039; L* = {w&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; w&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; ... w&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;| w&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; ∈ L, w&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; ∈ L, ..., w&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; ∈ L}.&lt;br /&gt;
# Покажите, что если язык L регулярен, то регулярно его дополнение (т.е. язык над тем же алфавитом, которому принадлежит слово тогда и только тогда, когда оно НЕ принадлежит L) .&lt;br /&gt;
# Покажите, что если язык L регулярен, то регулярно его обращение L&amp;lt;sub&amp;gt;R&amp;lt;/sub&amp;gt; = {a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; . . . a&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; | a&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; . . . a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; ∈ L}. (L&amp;lt;sub&amp;gt;R&amp;lt;/sub&amp;gt; --- это язык в котором все слова языка L записаны наоборот.)&lt;br /&gt;
# * Покажите, что если языки L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; и L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; регулярны, то регулярно их пересечение.&lt;/div&gt;</summary>
		<author><name>Kassalanche</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=13872</id>
		<title>Алгоритмы и структуры данных. Подгруппа 105-1</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=13872"/>
		<updated>2015-05-21T04:10:13Z</updated>

		<summary type="html">&lt;p&gt;Kassalanche: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==О курсе==&lt;br /&gt;
[[Алгоритмы_и_структуры_данных|План лекций и список рекомендуемой литературы.]]&lt;br /&gt;
&lt;br /&gt;
[[Алгоритмы_и_структуры_данных._Подгруппа_105-1._FAQ|FAQ.]]&lt;br /&gt;
&lt;br /&gt;
[[Reviewboard|Инструкция по использованию Reviewboard.]]&lt;br /&gt;
&lt;br /&gt;
[[Практические_занятия_по_курсу_ОиМП/C++_check|Style guide.]]&lt;br /&gt;
&lt;br /&gt;
==Итоговая оценка за курс==&lt;br /&gt;
Итоговая оценка (ИО) зависит от&lt;br /&gt;
* оценок за пять больших домашних заданий (БДЗ1, БДЗ2, ..., БДЗ5),&lt;br /&gt;
* оценок за домашние задания (ДЗ1, ДЗ2, ...),&lt;br /&gt;
* оценки за контрольную работу (КР),&lt;br /&gt;
* оценки за экзамен (ЭКЗ),&lt;br /&gt;
и может быть вычислена по формуле:&lt;br /&gt;
 ИО = 0.7 * (0.3 * КР + 0.7 *(ИДЗ1 + ИДЗ2 + ИДЗ3 + ИДЗ4 + ИДЗ5)/5) + 0.3 * ЭКЗ =&lt;br /&gt;
    = 0.21*КР + 0.98*ИДЗ1 + 0.98*ИДЗ2 + 0.98*ИДЗ3 + 0.98*ИДЗ4 + 0.98*ИДЗ5 + 0.3*ЭКЗ,&lt;br /&gt;
где&lt;br /&gt;
 ИДЗi = min (10, 0.7 * БДЗi + 0.4 * &amp;lt;cредняя оценка за ДЗj, прошедшие с предыдущего БДЗ по i-ое&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
==Порядок сдачи домашних работ==&lt;br /&gt;
===Большие домашние работы===&lt;br /&gt;
# Получить OK за задачу в контесте.&lt;br /&gt;
# Залить исходный код на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* На каждую задачу создавайте отдельный запрос на ревью. &lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении суток приходят замечания к коду. &#039;&#039;&#039;Если в течении суток замечаний или Ship It не появилось, проверьте, что вы правильно отправили запрос и, если всё сделано правильно, спросите у семинариста получил ли он запрос.&#039;&#039;&#039;&lt;br /&gt;
# Вы их исправляете, проверяете в контесте, что программа по-прежнему проходит все тесты, заливаете новую версию в Review Board. Штрафов за посылки НЕ будет.&lt;br /&gt;
# Процесс повторяется пока остаются замечания к коду или пока не истёк дедлайн. После закрытия контеста будут ещё одни сутки на доработку замечаний в Review Board.&lt;br /&gt;
# Оценивается только последняя версия работы в Review Board.&lt;br /&gt;
&lt;br /&gt;
===Маленькие домашние работы===&lt;br /&gt;
# Залить решение на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* Желаемые форматы: txt, py, cpp, h. Допускаются любые другие.&lt;br /&gt;
#* На каждую домашнюю работу создавайте отдельный запрос на ревью. Обязательно указывайте номер домашней работы.&lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении неопределенного промежутка времени придут оценки по каждому из заданий.&lt;br /&gt;
&lt;br /&gt;
==Оценивание домашних работ==&lt;br /&gt;
* Все задания предполагаются индивидуальными. Запрещены любые заимствования без ссылки на автора.&lt;br /&gt;
* Решения после установленного дедлайна не принимаются. Дедлайн указан в заголовке каждого задания.&lt;br /&gt;
* Везде, где требуется написать алгоритм, можно использовать любой язык программирования или псевдокод.&lt;br /&gt;
* Там, где требуется построить алгоритм с заданной асимптотикой, приведите обоснование, что полученный алгоритм удовлетворяет этому условию.&lt;br /&gt;
* Эти правила не действуют, если в задании явно оговорено иное.&lt;br /&gt;
&lt;br /&gt;
==Мотивация к изучению алгоритмов. Подсчёт числа операций (12.01)==&lt;br /&gt;
# Числа Фибоначчи. Определение. Примитивный рекурсивный алгоритм вычисления i-ого числа. Оценка числа операций. Анализ причин неэффективности. Алгоритм с запоминанием вычисленных ранее значений. Оценка числа операций. Сравнение с предыдущим. (подробнее: глава 0, страницы 8-10 из книги &amp;lt;&amp;lt;Алгоритмы&amp;gt;&amp;gt;, [[Алгоритмы_и_структуры_данных|см. список рекомендованной литературы]])&lt;br /&gt;
# Задача о ханойской башне. Постановка задачи. Рекурсивный алгоритм. Рекуррентная формула для числа перемещений. Замкнутая формула для числа перемещений (+ доказательство). Доказательство того, что эту задачу нельзя решить используя меньшее число перемещений дисков. ([https://www.dropbox.com/s/t8cbs7ttu4iasvj/algo-0-recursion.pdf?dl=0 Разбор задачи о ханойской башне], автор Сергей Объедков)&lt;br /&gt;
# Сортировка пузырьком. Алгоритм. Подсчёт количество операций сравнения и обмена (swap). Анализ наилучшего и наихудшего случаев ([https://ru.wikipedia.org/wiki/Сортировка_пузырьком Википедия])&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 1 (12.01 - 26.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
Во всех задачах, если не оговорено иного, предполагаем, что работаем с целыми неотрицательными числами. Для первых 7 задач необходимо&lt;br /&gt;
* описать что можно считать наилучшим и наихудшим случаями,&lt;br /&gt;
* для каждого из двух случаев подсчитать отдельно количество операций сравнения и swap (если есть).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Даны три числа, требуется вернуть наименьшее.&lt;br /&gt;
# Даны три числа, требуется отсортировать их.&lt;br /&gt;
# Дана последовательность A из n элементов и число x, требуется найти элемент равный x. Примечание: если таких значений i несколько, вернуть любое; если такого элемента нет, функция должна сообщить об этом.&lt;br /&gt;
# * Дана упорядоченная последовательность A из n элементов и число x, требуется найти такое i, что A[i] равно x. Алгоритм должен быть эффективней, чем в предыдущем пункте и использовать то, что последовательность упорядочена.&lt;br /&gt;
# Дана последовательность из 100 000 чисел от 0 до 100. Напишите эффективный алгоритм сортировки, который бы учитывал специфику входных данных.&lt;br /&gt;
# * Дано 32 битное неотрицательное число. Требуется номер первого ненулевого бит. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения, считая, что числа распределены равномерно.&lt;br /&gt;
# * Даны 32 битные неотрицательные числа m и n. Требуется вывести True, если m &amp;lt; n, иначе False. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения битов, считая, что числа распределены равномерно.&lt;br /&gt;
# Напишите рекурсивную функцию, вычисляющую n-ое число Фибоначчи (как на занятии). Подсчитайте количество рекурсивных вызовов.&lt;br /&gt;
# * Напишите функцию, вычисляющую n-ое число Фибоначчи, у которой число операций — полином от n, и которая использует количество памяти, независящее от n.&lt;br /&gt;
&lt;br /&gt;
==O-символика и стратегия &amp;quot;разделяй и властвуй&amp;quot; (15.01)==&lt;br /&gt;
# Сортировка слиянием. Алгоритм, рекуррентное соотношение для времени сортировки, сложность. Подробнее: [https://dl.dropboxusercontent.com/u/829163/draft.pdf §2.3 Сортировка слиянием (стр. 54)].&lt;br /&gt;
# О-символика. [https://dl.dropboxusercontent.com/u/829163/draft.pdf §0.3 О-символика (стр. 10)].&lt;br /&gt;
# Задача о слиянии m упорядоченных массивов по n элементов. Три алгоритма решения: последовательное слияние, слияние &amp;quot;деревом&amp;quot; (обе функции используют Merge из MergeSort), аналог Merge для m массивов. Анализ сложности каждого из них.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 2 (15.01-29.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
* Во всех задачах, если не оговорено иного, для простоты &#039;&#039;можно&#039;&#039; считать, что n является степенью какого-либо числа, например, степенью двойки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Дана функция F, определённая ниже. Сколько строк она напечатает? Указание: для обоих подпунктов рассмотрите два случая: 1. n является степенью двойки, 2. n не является степенью двойки.&lt;br /&gt;
## Запишите рекуррентное соотношение для числа строк.&lt;br /&gt;
## Решите уравнение, полученное в предыдущем пункте, то есть, выведите замкнутую (нерекуррентную формулу). Для простоты можно считать, что n является степенью двойки.&lt;br /&gt;
# В массиве A размера n записана возрастающая последовательность целых чисел. Постройте алгоритм типа &amp;quot;разделяй и властвуй&amp;quot;, который проверяет, существует ли такой индекс i, что A[i] = i&lt;br /&gt;
## за время O(n),&lt;br /&gt;
## * за время O(log n).&lt;br /&gt;
## Какие случаи для вашего алгоритма являются наихудшими и наилучшими? Какого время работы в лучшем и худшем случаях?&lt;br /&gt;
# Дан бесконечный массив A, первые n элементов которого содержат возрастающую последовательность положительных чисел, а дальше стоят -1. Значение n не дано. Постройте алгоритм, который получает на вход целое число x и находит это x в массиве --- или говорит, что там его нет, &lt;br /&gt;
## за время O(n),&lt;br /&gt;
## за время O(log n).&lt;br /&gt;
# Рассмотрим алгоритм вычисления наибольшего общего делителя (НОД) двух положительных чисел, основанный на методе &amp;quot;разделяй и властвуй&amp;quot;.&lt;br /&gt;
## (задание не оценивается) Прочитайте [https://dl.dropboxusercontent.com/u/829163/draft.pdf §1.2.3 Алгоритм Евклида (стр. 23)].&lt;br /&gt;
## * Докажите, что определение НОД-а, приведённое ниже, корректно.&lt;br /&gt;
## Постройте алгоритм, основанный на этом определении.&lt;br /&gt;
## Какой алгоритм будет быстрее для n-битовых чисел a и b при больших значениях n --- ваш или алгоритм Евклида?&lt;br /&gt;
# * Покажите как за время O(n log n) удалить из массива размера n все дубликаты, то есть оставить каждый элемент в одном экземпляре.&lt;br /&gt;
# * Даны два упорядоченных массива размера m и n. Постройте алгоритм, находящий k-й по величине элемент в объединении этих массивов за время O(log(n+m)). &lt;br /&gt;
&lt;br /&gt;
Функция F(n).&lt;br /&gt;
  если n &amp;gt; 1:&lt;br /&gt;
    напечатать &amp;quot;всё ещё работаю&amp;quot;&lt;br /&gt;
    F(n/2)&lt;br /&gt;
    F(n/2)&lt;br /&gt;
&lt;br /&gt;
Определение НОД-а.&lt;br /&gt;
             2НОД(a/2, b/2), если а и b чётны,&lt;br /&gt;
  НОД(a,b) = НОД(a, b/2), если а нечётно, b чётно,&lt;br /&gt;
             НОД((a-b)/2, b), если а и b нечётны.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;lt;nowiki&amp;gt;Задачи взяты из книги &amp;quot;Алгоритмы&amp;quot;, глава 2 (см. список рекомендованной литературы).&amp;lt;/nowiki&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Сложение и умножение (19.01)==&lt;br /&gt;
# Алгоритм сложения, его сложность (§1.1.1 Сложение*)&lt;br /&gt;
# &amp;quot;Школьный&amp;quot; алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Рекурсивный алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Алгоритм умножения, реализующий стратегию &amp;quot;разделяй и властвуй&amp;quot;, анализ сложности (§2.1 Умножение чисел*)&lt;br /&gt;
 * [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать.]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 3 (19.01 - 2.02)===&lt;br /&gt;
* Во всех задачах для простоты можно считать, что n является степенью какого-либо числа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Найдите произведение чисел 10011011 и 10111010 (в двоичной системе счисления), используя алгоритм умножения чисел, основанный на методе «разделяй и властвуй». Необходимо не только дать ответ, но и привести ход решения.&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 3 рекурсивных вызова для подзадач размера n-1 и комбинирует из них решение исходной задачи за О(n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте три верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 10 рекурсивных вызовов для подзадач размера n/2 и комбинирует из них решение исходной задачи за О(5n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте два верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Докажите, что 3m² + m = O(m²).&lt;br /&gt;
# Докажите, что lg m = O(m/1000), где lg m — это логарифм с двоичным основанием.&lt;br /&gt;
# Докажите, что из равенства f(n) = O(g(n)) не следует, что g(n) = O(f(n)).&lt;br /&gt;
# Докажите, что O(m) содержится в O(m²).&lt;br /&gt;
&lt;br /&gt;
==Решение рекуррентных уравнений (22.01)==&lt;br /&gt;
# Примеры решений рекуррентных уравнений (см. [https://www.dropbox.com/s/6a0r410zjm9qwe7/algo-3-recurrences.pdf?dl=0 конспект]).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 4 (до 14.02)===&lt;br /&gt;
* Нельзя использовать утверждение основной теоремы о решении рекуррентных соотношений.&lt;br /&gt;
* &#039;&#039;Можно&#039;&#039; использовать метод построения дерева рекурсии или подстановку (метод с угадыванием ответа).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Какой из трёх приведённых ниже алгоритмов вы бы предпочли? Обоснуйте свой ответ.&lt;br /&gt;
#* Алгоритм A, решая задачу, производит пять рекурсивных вызовов для подзадач вдвое меньшего размера, после чего строит ответ для исходной задачи за линейное время.&lt;br /&gt;
#* Алгоритм B, решая задачу размера n, делает два рекурсивных вызова для задач размера n − 1, после чего находит ответ за время O(1).&lt;br /&gt;
#* Алгоритм C, решая задачу размера n, рекурсивно решает девять задач размера n/3 и строит ответ за время O(n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Найдите T(n) в замкнутой форме для любых 7 из 10 приведённых ниже рекуррентных соотношений:&lt;br /&gt;
## T(n) ≤ 2T(n/3) + 1;&lt;br /&gt;
## T(n) ≤ 7T(n/7) + n;&lt;br /&gt;
## T(n) ≤ 9T(n/3) + n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 8T(n/2) + n&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 49T(n/25) + n&amp;lt;sup&amp;gt;3/2&amp;lt;/sup&amp;gt;log n;&lt;br /&gt;
## T(n) ≤ T(n − 1) + 2;&lt;br /&gt;
## T(n) ≤ T(n − 1) + n&amp;lt;sup&amp;gt;c&amp;lt;/sup&amp;gt;, где c ≥ 1 –– константа;&lt;br /&gt;
## T(n) ≤ T(n − 1) + c&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;, где c &amp;gt; 1 –– константа;&lt;br /&gt;
## T(n) ≤ 2T(n − 1) + 1;&lt;br /&gt;
## T(n) ≤ T(sqrt(n)) + 1.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №1==&lt;br /&gt;
Необходимо реализовать все 6 задач из [https://official.contest.yandex.ru/contest/1002 контеста]. Каждую задачу можно писать на С++ или Python. На выполнение работы отводится две недели. Каждая задача оценивается в 10/6 балла. Оценка &#039;&#039;может&#039;&#039; быть снижена за плохой код, но не более чем на 25%.&lt;br /&gt;
&lt;br /&gt;
==Бинарное дерево поиска (26.01)==&lt;br /&gt;
# Определение. Пример.&lt;br /&gt;
# Не модифицирующие алгоритмы: поиск (рекурсивный и итеративный алгоритмы), поиск минимума, inordered обход (вывод значений узлов в отсортированном порядке), поиск следующего по возрастанию.&lt;br /&gt;
# Модифицирующие алгоритмы: вставка (рекурсивная реализация), удаление (только идея).&lt;br /&gt;
 [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 13, стр. 248]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 5 (до 16.02)===&lt;br /&gt;
* Для получения максимальной оценки можно выполнить или все задачи без звёздочки, или задачу со звёздочкой. Преподаватель понимает, что реализацию БДП сложно не найти в интернете, но от копипасты не будет никакой пользы. Напротив, самостоятельная реализация очень полезна и приветствуется, даже если не получится выполнить всех пунктов задания.&lt;br /&gt;
* Задачи с двумя звёздочками необязательны.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Нарисуйте бинарные деревья поиска высотой 2, 3, 4, 5 и 6 для множества ключей {1, 4, 5, 10, 16, 17, 21}. Корень дерева имеет высоту 0.&lt;br /&gt;
# &#039;&#039;&#039;Сортировка с использованием БДП.&#039;&#039;&#039;&lt;br /&gt;
## Какова асимптотическая сложность алгоритма вставки элемента в дерево высоты d? Почему? Назовите наилучший и наиухдший случаи.&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который строит БДП в узлах которого стоят элементы данной последовательности. Можно использовать функцию Insert. Назовите наилучший и наихудший случаи. Есть теорема о том, что полученный алгоритм будет работать в среднем случае за время O(n * log n).&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который выводит их в порядке возрастания. Используйте бинарное дерево поиска. Какова в среднем случае сложность этого алгоритма? Назовите наилучший и наихудший случаи. Какова сложность в наихудшем случае?&lt;br /&gt;
# Напишите функцию GetRoot, которой на вход подаётся указатель на произвольный узел дерева, а она возвращает указатель на корень.&lt;br /&gt;
# Напишите процедуру PrintLeafs, которой на вход подаётся указатель на корень дерева, и она печатает листья дерева&lt;br /&gt;
## по возрастанию,&lt;br /&gt;
## по убыванию.&lt;br /&gt;
# ** Альтернативный обход в порядке возрастания бинарного дерева поиска с n узлами (или центрированный (inordered) обход) можно осуществить путём поиска минимального элемента дерева с помощью функции Minimum с последующий n-1 вызовом функции Next. Каково время работы такого алгоритма?&lt;br /&gt;
# * Реализуйте на С++ структуру данных бинарное дерево поиска, [https://yadi.sk/i/gi2SEStreFfSb используя заготовку].&lt;br /&gt;
## Нарисуйте бинарное дерево поиска, которое строится в функции getTreeExample.&lt;br /&gt;
## Реализуйте следующие алгоритмы: &lt;br /&gt;
### поиск минимума, &lt;br /&gt;
### inordered обход (вывод значений узлов в отсортированном порядке),&lt;br /&gt;
### поиск следующего по возрастанию,&lt;br /&gt;
### вставка элемента в дерево,&lt;br /&gt;
### сортировка последовательности с использованием БДП (дан вектор чисел, необходимо вывести их по возрастанию),&lt;br /&gt;
### ** удаление.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Карацубы, Штрассена. Быстрая сортировка (29.01)==&lt;br /&gt;
# Алгоритм Карацубы.&lt;br /&gt;
# Алгоритм Штрассена. [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать Дасгупту и др., §2.5 Умножение матриц]&lt;br /&gt;
# Быстрая сортировка и доказательство того, что в среднем случае она работает за О(n * log n). [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 8 Быстрая сортировка, стр. 148]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 6 (до 18.02)===&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Пусть мы хотим найти двоичное представление десятичного числа 10&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;. Будем считать, что n --- степень двойки (n = 2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt;).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Pwr2Bin(n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть 1010&lt;br /&gt;
    z = ...&lt;br /&gt;
    вернуть Multiply(z, z)&amp;lt;/source&amp;gt;&lt;br /&gt;
Multiply --- функция, перемножающая два n-битовых двоичных числа x и y по алгоритму Карацубы за O(n&amp;lt;sup&amp;gt;log&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;3&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Пусть мы хотим перевести произвольное десятичное число x в записи которого n=2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; чисел в двоичную систему счисления.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Dec2Bin(x, n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть binary[x]&lt;br /&gt;
    разделить x на два десятичных числа xl и xr из n/2 цифр.&lt;br /&gt;
    вернуть ...&amp;lt;/source&amp;gt;&lt;br /&gt;
Здесь binary --- это массив, содержащий двоичное представление десятичных цифр.&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Докажите, что математическое ожидание времени работы алгоритма быстрой сортировки (усреднение по всем вариантам выбора опорного элемента) на любом входе размера n удовлетворяет соотношению: T(n) ≤ O(n) + 1/n * &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt; (T(i-1) + T(n-i)).&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Найдите решение соотношения из предыдущего пункта.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Динамическое программирование (ДП). Первые примеры (02.01)==&lt;br /&gt;
# Нахождение самой длинной возрастающей подпоследовательности.&lt;br /&gt;
# Нахождение редакционного расстояния (или редакционной стоимости, расстояния Левенштейна).&lt;br /&gt;
# Нахождение представителя большинства.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 7 (до 20.02)===&lt;br /&gt;
* В этом задании везде, где требуется реализовать алгоритм, необходимо привести код на любом языке программирования.&lt;br /&gt;
* Для получения максимальной оценки нужно решить все задачи без звёздочек. Одна решённая задача со звёздочкой заменяет одну задачу без звёздочки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения редакционного расстояния (алгоритм Вагнера — Фишера). Например, редакционное расстояние между словами &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равно 6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения длины наибольшей общей подстроки. Например, длина наибольшей общей подстроки &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равна 8 (&amp;quot;antholog&amp;quot;). Чем больше это значение, тем схожей строки.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Предположим теперь, что сравниваемые строки состоят из символов A, С, G и T; за удаление или вставку мы платим -5; за замену буквы x на y платим w[x, y], где x, y принадлежат множеству {A, С, G, T}, a w — это матрица весов:&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
!-!! A!! G!! C!! T&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! A&lt;br /&gt;
|10||-1||-3||-4&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
!G&lt;br /&gt;
||-1||7||-5||-3&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! C&lt;br /&gt;
||-3||-5||9||0&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! T&lt;br /&gt;
||-4||-3||0||8&lt;br /&gt;
|}&lt;br /&gt;
Тогда выравнивание:&lt;br /&gt;
 AGACTAGTTAC&lt;br /&gt;
 CGA‒‒‒GACGT&lt;br /&gt;
будет иметь следующую оценку:&lt;br /&gt;
 w[A,C] + w[G,G] + w[A,A] + 3*(-5) + w[G,G] + w[T,A] + w[T,C] + w[A,G] + w[C,T] = -3 + 7 + 10 - 3*5 + 7 + (-4) + 0 + (-1) + 0 = 1.&lt;br /&gt;
&lt;br /&gt;
Напишите алгоритм, который находит максимальную стоимость всех возможных выравниваний. Верно ли, что чем больше это значение, тем непохожей строки?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как давно один народ отделился от другого? Кто похожей — итальянец и китаец или якут и эфиоп? На эти вопросы можно отвечать с разных точек зрения — культурной, исторической, лингвистической, ... В последние же годы человечество научилось секвенировать геном, что позволило исследовать этот вопрос с точки зрения генетики. Секвенирование генома — это процесс записи ДНК в виде нуклеотидной последовательности, которая представляет собой последовательность из четырёх символов — A, С, G и T. Существуют базы, которые хранят генетическую информацию о людях из разных стран и континентов, например, [http://www.mtdb.igp.uu.se/ http://www.mtdb.igp.uu.se/ → Download mtDNA sequences]. Чем больше сходство между геномами, тем сильнее родственные связи между их обладателями. Используя решение предыдущего пункта, выполните задания:&lt;br /&gt;
# Определите, кто похожей — итальянец и китаец или якут и эфиоп?&lt;br /&gt;
# Найдите нескольких похожих и нескольких непохожих народностей.&lt;br /&gt;
# * Выберите одну народность. Найдите самых похожих и самых непохожих на неё.&lt;br /&gt;
# * Найдите самые похожие и самые непохожие народности.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Задача о разрезании стержня (05.01)==&lt;br /&gt;
# Постановка задачи.&lt;br /&gt;
# Решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Решение с нахождением максимума по p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Восходящий алгоритм с запоминанием. Вывод длин кусочков стержня. Оценка сложности.&lt;br /&gt;
# Нисходящий алгоритм с запоминанием. Оценка сложности.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.1 Разрезание стержня, стр. 393]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 8 (до 22.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Решая задачу о разрезании стержня мы вначале построили рекурсивное решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt; для всех 1 ≤ i &amp;lt; n. Его сложность описывалась рекуррентной формулой T(n) = n + &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n-1&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt;(T(i) + T(n-i)), T(1) = 1.&lt;br /&gt;
# Объясните эту формулу.&lt;br /&gt;
# Покажите с помощью метода подстановок, что T(n) ≤ 2&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Покажите с помощью контрпримера, что описанная далее жадная стратегия не всегда определяет оптимальный способ разрезания стержня. Определим плотность стержня длиной i как p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;/i, то есть как стоимость единицы его длины. Жадная стратегия для стержня длиной n отрезает от стержня первую часть длиной i, где 1 ≤ i ≤ n, имеющую максимальную плотность. Затем та же жадная стратегия применяется к оставшейся части длиной n-i.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Рассмотрим модификацию задачи разрезания стержня, в которой в дополнение к цене p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; каждого стержня добавляется фиксированная цена разреза c. Теперь прибыль, связанная с решением, представляет собой сумму цен частей стержня минус стоимость разрезов. Разработайте алгоритм динамического программирования для этой модифицированной задачи.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Непрерывным участком называется группа подряд идущих элементов. Например, для последовательности&lt;br /&gt;
 5, 15, −30, 10, −5, 40, 10&lt;br /&gt;
элементы 15, −30, 10 образуют непрерывный участок, а 5, 15, 40 -- нет. Постройте линейный алгоритм для следующей задачи:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Вход: список чисел a1, a2, ... ‌, an.&lt;br /&gt;
Выход: непрерывный участок с максимальной суммой (сумма участка нулевой длины равна нулю).&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Для приведённого примера ответом будет 10, −5, 40, 10 с суммой 55. Какова сложность алгоритма? Почему?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Надо заплатить v рублей, имея купюры в x1, x2, ‌..., xn рублей (купюр каждого типа сколько угодно). Это не всегда возможно (скажем, купюрами в&lt;br /&gt;
10 и 25 рублей можно заплатить 45 рублей, но не 47 и не 15). Постройте основанный на методе динамического программирования алгоритм со временем работы O(nv), выясняющий, возможна ли уплата.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как решить предыдущую задачу, если каждая купюра имеется в единственном экземпляре? (Например, купюрами в 1, 5, 10, 20 рублей можно заплатить 16 = 1 + 5 + 10 и 31 = 1 + 10 + 20 рублей, но не 40 (не хватит денег). Время работы алгоритма по-прежнему O(nv).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Ещё один вариант той же задачи: купюр каждого типа сколько угодно, но всего разрешается использовать не более k купюр. (Например, если есть купюры в 5 и 10 рублей, а k = 6, то 55 разменять можно, а 65 –– нет).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Перемножение цепочки матриц. Оптимальное бинарное дерево поиска (начало) (09.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о перемножении цепочки матриц. Постановка задачи.Пример. Нисходящий алгоритм.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.2 Перемножение цепочки матриц, стр. 403]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 9 (до 24.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Найдите оптимальную расстановку скобок в произведении последовательности матриц, размерности которых равны 5×10, 10×3, 3×12, 12×5, 5×50, 50×6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Напишите восходящий алгоритм для поиска оптимальной расстановки скобок.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Расстановка пробелов. Оптимальное бинарное дерево поиска (середина) (12.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о расстановке пробелов. Постановка задачи. Решения для трёх случаев: 1. нужно вернуть можно ли разбить текст на слова; 2. вернуть разбивку на слова; 3. слова встречаются не равновероятно, вернуть наиболее вероятную разбивку на слова.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи. Вывод математического ожидания времени поиска.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Праздничное домашнее задание 10 (до 02.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[&amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;,&amp;quot;, &amp;quot;.&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;,&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;.&amp;quot;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Подсказка:&#039;&#039;&#039; разбейте текст на слова из списка и посмотрите на азбуку Морзе.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Способы представления графов в памяти (16.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Разбор ошибок в домашнем задании.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Графы. Способы представления графов в памяти (матрица смежности, список рёбер, список соседей (список смежностей), матрица инцидентности). Зависимость сложности алгоритмов от способа представления.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §22.1 Представление графов, стр. 626]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 11 (до 02.03)===&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача A.]&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача B.]&lt;br /&gt;
# Нарисуйте неориентированный граф с 5 вершинами и 8 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Нарисуйте ориентированный граф с 4 вершинами и 3 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Дан ориентированный граф. &#039;&#039;Исходящая степень вершины v&#039;&#039; --- это количество исходящих из неё рёбер, &#039;&#039;входящая степень v&#039;&#039; --- это количество рёбер входящих в  v. Имеется представление ориентированного графа с использование списка соседей. Как долго будут вычисляться исходящие степени всех вершин графа? А входящие степени?&lt;br /&gt;
# Дан граф G = (V, E). Какие из рассмотренных способов хранения графов используют меньше всего памяти для хранения G и почему? Указание: рассмотрите случаи |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;lt; |E| и |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;gt; |E|.&lt;br /&gt;
# Пусть C --- это матрица смежности графа G.&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
# Пусть B --- это матрица инцидентности ориентированного графа G. Как связаны элементы матрицы BB&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
&lt;br /&gt;
==Реализация поиска в глубину (19.02)==&lt;br /&gt;
# Реализация поиска в глубину и смежных задач.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 12 (до 5.03)===&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Выберите любой способ хранения графа. Реализуйте поиск в глубину.&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Напишите алгоритм, который возвращает данные о том, какие вершины лежат в одной компоненте связности.&lt;br /&gt;
# &#039;&#039;(любой ЯП или псевдокод)&#039;&#039; Напишите алгоритм проверки сильной связности ориентированного графа. Какова его сложность?&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №2==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
Необходимо реализовать 3 задачи из [https://official.contest.yandex.ru/contest/1085 контеста], см. [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing распределение задач]. Каждую задачу можно написать на С++ или Python. На выполнение работы отводится две недели (см. время окончания контеста). [https://official.contest.yandex.ru/contest/1123 Дорешивание.]&lt;br /&gt;
&lt;br /&gt;
==ДП и графы (26.02)==&lt;br /&gt;
==ДП и графы (02.03)==&lt;br /&gt;
==Жадные алгоритмы (12.03)==&lt;br /&gt;
===Домашнее задание 13 (до 23.03)===&lt;br /&gt;
# Вася хочет купить по одной акции каждой компании. Все акции стоят одинаково, но дорожают по-разному. Каждый месяц акция i-ой компании дорожает в r_i раз. В один месяц можно купить только одну акцию.&lt;br /&gt;
## Напишите алгоритм, который выводит оптимальную последовательность покупок (такую, что на покупку всех акций потратится меньше денег).&lt;br /&gt;
## Докажите корректность алгоритма, то есть докажите, что последовательность покупок, которую выводит ваш алгоритм, оптимальна.&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список, очередь (16.03)==&lt;br /&gt;
# Реализация линейного двусвязного списка (С++).&lt;br /&gt;
# Реализация очереди ограниченной длины на базе вектора (С++).&lt;br /&gt;
# Реализация очереди на базе списка (С++).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14 (до 23.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте (на С++) структуру данных Стек. У стека должно быть три операции:&lt;br /&gt;
* push --- положить элемент на вершину стека;&lt;br /&gt;
* pop --- удалить верхний элемент;&lt;br /&gt;
* front --- вернуть значение верхнего элемента.&lt;br /&gt;
Оцените время работы каждой функции.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список (19.03)==&lt;br /&gt;
===Домашнее задание 13* (до 30.03)===&lt;br /&gt;
#Для приведённой реализации класса List (https://yadi.sk/i/c5r_79WdfMyNS).&lt;br /&gt;
## Допишите print, push_back и push_front.&lt;br /&gt;
## В функции insert_after и delete_node вставьте необходимые проверки так, чтобы они работали для крайних случаев.&lt;br /&gt;
## Напишите main в котором&lt;br /&gt;
### создаётся объект класса List, &lt;br /&gt;
### заполняется элементами с помощью функций push_back, push_front и insert_after и&lt;br /&gt;
### удаляется i-ый элемент.&lt;br /&gt;
&lt;br /&gt;
==Повторение (30.03)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Для данных пар функций выясните их связь в терминах O-, o-, Ω-, ω-, Θ-обозначений. Поставьте галочку в клетке с Ω, если f(x) = Ω(g(x)) и прочерк, если равенства нет. [https://ru.wikipedia.org/wiki/«O»_большое_и_«o»_малое#.D0.94.D1.80.D1.83.D0.B3.D0.B8.D0.B5_.D0.BF.D0.BE.D0.B4.D0.BE.D0.B1.D0.BD.D1.8B.D0.B5_.D0.BE.D0.B1.D0.BE.D0.B7.D0.BD.D0.B0.D1.87.D0.B5.D0.BD.D0.B8.D1.8F Википедия]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! f(x)!! g(x)!! O!! o!! Ω!! ω!! Θ&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! 2^100&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n * log(n)&lt;br /&gt;
! 2^100 * n * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n&lt;br /&gt;
! 2^100 * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n!&lt;br /&gt;
! 2^(2015n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n*2^n&lt;br /&gt;
! 3^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 5^n&lt;br /&gt;
! 5^(n+1)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n + n^2 + n^3 + ... + n^1000&lt;br /&gt;
! 7^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм Quickselect нахождения k-ого элемента по возрастанию: http://en.wikipedia.org/wiki/Quickselect&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;На улице стоит ряд домов. В каждом из домов лежит сколько-то денег. Вор хочет обокрасть дома на переулке. Он не может обокрасть два соседних дома, потому что хозяин дома, который он обокрал, сразу предупредит соседей. Нужно найти, какую максимальную сумму вор может украсть с переулка. На вход программы подается массив неотрицательных целых чисел - количество долларов в доме с номером i. Соседние дома в массиве представлены соседними элементами. Например, пусть задан массив { 1, 4, 5 } - тогда вор максимум может украсть $6, обокрав дома 1 и 3. Пусть задан массив { 1, 7, 2 } - тогда вор максимум может украсть $7, обокрав дом 2.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Алфавит из всех маленьких латинских букв и пробела закодирован числами следующим способом:&lt;br /&gt;
  &#039;a&#039; -&amp;gt; 1&lt;br /&gt;
  &#039;b&#039; -&amp;gt; 2&lt;br /&gt;
  &#039;c&#039; -&amp;gt; 3&lt;br /&gt;
  ...&lt;br /&gt;
  &#039;z&#039; -&amp;gt; 26&lt;br /&gt;
  &#039; &#039; -&amp;gt; 27&lt;br /&gt;
На вход программы подается строка из цифр. Нужно посчитать, сколькими способами можно раскодировать эту строку.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Дан граф, заданный матрицей смежности. Вывести пары вершин между которыми нет пути.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Повторение (02.04) ==&lt;br /&gt;
Решали и разбирали первые 4 задачи из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14* (до 11.03)===&lt;br /&gt;
Решите любые две задачи (подпункты НЕ считаются отдельными задачами) с предыдущей пары (Повторение (30.03)).&lt;br /&gt;
&lt;br /&gt;
== Повторение (06.04) ==&lt;br /&gt;
Будем решать вторую половину задач из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 15 (до 16.04)===&lt;br /&gt;
# Приведите пример графа, который содержит отрицательные рёбра, не содержит циклов отрицательного веса и для которого алгоритм Дейкстры возвращает неверный результат.&lt;br /&gt;
# Используется ли в алгоритме Дейкстры то, что веса рёбер неотрицательны? Если &amp;quot;да&amp;quot;, то где именно?&lt;br /&gt;
# Пусть граф содержит рёбра с весами &amp;gt;= -100. Если прибавить к каждому ребру 101 и при помощи алгоритма Дейкстры найти кратчайшие пути. Будут ли эти пути кратчайшими в исходном графе? Почему?&lt;br /&gt;
&lt;br /&gt;
== Повторение (07.04) ==&lt;br /&gt;
&#039;&#039;&#039;Решение рекуррентных соотношений&#039;&#039;&#039;&lt;br /&gt;
# Решите уравнение: T(n) = 4*T(n/2) + O(n^2) с базой T(1) = O(1)&lt;br /&gt;
## Используя основную теорему.&lt;br /&gt;
## Используя дерево рекурсий.&lt;br /&gt;
## Методом подстановки.&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2)) + n является \Theta(n lg n).&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2) + 17) + n является \Theta(n lg n).&lt;br /&gt;
# Решите уравнения, считая, что T(1) = O(1):&lt;br /&gt;
## T(n) = T(n-1) + n&lt;br /&gt;
## T(n) = 2*T(floor(sqrt(n))) + lg n. Указание: попробуйте использовать замену переменных.&lt;br /&gt;
## T(n) = 3*T(sqrt(n)) + lg n&lt;br /&gt;
# Дайте верхнюю и нижнюю оценки функции T(n). Постарайтесь, чтобы оценки были как можно более точные&lt;br /&gt;
## T(n) = 4T(n/3) + n*lg(n)&lt;br /&gt;
## T(n) = 3T(n/3) + n/lg(n)&lt;br /&gt;
## T(n) = 4T(n/2) + n^2*sqrt(n)&lt;br /&gt;
## T(n) = T(n/2) + T(n/4) + T(n/8) + n&lt;br /&gt;
## T(n) = T(n-1) + 1/n&lt;br /&gt;
## T(n) = T(n-2) + 1/lg(n)&lt;br /&gt;
## T(n) = sqrt(n) * T(sqrt(n)) + n&lt;br /&gt;
&#039;&#039;&#039;Анализ и построение алгоритмов&#039;&#039;&#039;&lt;br /&gt;
# Числа Фибоначчи F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; можно выразить через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, используя матрицу: https://yadi.sk/i/Pm_aNzHCforFU. &lt;br /&gt;
## Покажите как вычислить F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;.&lt;br /&gt;
## Как вычислить F&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;n+1&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;?&lt;br /&gt;
## Напишите алгоритм.&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
## Ускорьте его так, чтобы он работал за O(log n).&lt;br /&gt;
# Дана последовательность символов. Какое минимальное количество символов нужно удалить из неё, чтобы получить палиндром?&lt;br /&gt;
## Напишите алгоритм (на псевдокоде или на любом языке программирования).&lt;br /&gt;
## Оцените время работы алгоритма.&lt;br /&gt;
# Какую структуру данных вы бы использовали для реализации упорядоченного множества (http://neerc.ifmo.ru/wiki/index.php?title=Упорядоченное_множество)? Какая будет сложность каждой из операций над множеством?&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 16 (до 20.04)===&lt;br /&gt;
# Решите 6 задач из первой части и 6 из второй. (Укажите какие именно.) Каждый из подпунктов является отдельной задачей.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм и теорема Форда-Фалкерсона (16.04)==&lt;br /&gt;
# Базовые определения (пропускные способности, сток, исток и пр.). Пример. &lt;br /&gt;
# Ограничения на поток (сохранение и что меньше пропускных способностей).&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, пример работы&lt;br /&gt;
# Разрез, определение, пример.&lt;br /&gt;
# Утверждение: максимальный поток &amp;lt;= любого разреза.&lt;br /&gt;
# Теорема Форда-Фалкерсона (с доказательством).&lt;br /&gt;
# Пример на котором алгоритм Форда-Фалкерсонаработает работает очень долго при неудачном выборе путей.&lt;br /&gt;
# Сложность алгоритма Форда-Фалкерсона.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №3==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
В [https://official.contest.yandex.ru/contest/1196 домашнем задании] пять задач. Они разделены на два варианта, помеченные римскими цифрами I и II. Свой вариант нужно узнать [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing здесь на вкладке HW3]. Третья задача — общая для двух вариантов; ее решение необходимо снабдить доказательством корректности алгоритма. На выполнение задания дается примерно 2 недели (см. точное время окончания в контесте). Каждую задачу можно написать на С++ или Python.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Форда-Фалкерсона и Эдмондса-Карпа (20.04)==&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, напоминание: базовые определения, пример работы, пример на котором алгоритм работает долго, сложность.&lt;br /&gt;
# Алгоритм Эдмодса-Карпа. Доказательство асимптотики времени работы.&lt;br /&gt;
&lt;br /&gt;
==(23.04)==&lt;br /&gt;
&lt;br /&gt;
==(11.05) Красно-чёрные деревья==&lt;br /&gt;
[https://ru.wikipedia.org/wiki/Красно-чёрное_дерево Красно-чёрное дерево]&lt;br /&gt;
===Домашнее задание 17 (до 18.05)===&lt;br /&gt;
# Зачем нужны красно-чёрные деревья?&lt;br /&gt;
# Благодаря какому свойству и почему красно-чёрное дерево является сбалансированным?&lt;br /&gt;
# Нарисуйте полное бинарное дерево поиска высотой 3 с ключами {1, 2, ..., 15}. Сделайте из него красно-чёрные деревья высотой 2, 3 и 4.&lt;br /&gt;
# Нарисуйте красно-чёрные деревья, получающиеся последовательной вставкой элементов 12, 10, 29, 30, 31, 32 в [https://ru.wikipedia.org/wiki/Красно-чёрное_дерево#/media/File:Red-black_tree_example.svg данное дерево]. Для вставки используйте алгоритм вставки из Википедии. Укажите какой именно функцией вы воспользовались.&lt;br /&gt;
# Определим &#039;&#039;&#039;ослабленное красно-чёрное дерево&#039;&#039;&#039; как бинарное дерево поиска, которое удовлетворяет красно-чёрным свойствам 1, 3, 4 и 5. Другими словами, корень может быть как чёрным, так и красным. Рассмотрите ослабленное красно-чёрное дерево T, корень которого красный. Если перекрасить корень дерева T в чёрный, будет ли оно красно-чёрным деревом?&lt;br /&gt;
# Покажите, что самый длинный простой нисходящий путь от вершины x к листу красно-черного дерева имеет длину, не более чем в два раза превышающую кратчайший путь от x к листу-потомку.&lt;br /&gt;
# Чему равно наибольшее возможное количество внутренних узлов в красно-чёрном дереве с чёрной высоты k? А наименьшее возможное количество?&lt;br /&gt;
# Нарисуйте красно-чёрные деревья, получающиеся последовательной вставкой ключей 41, 38, 31, 12, 19, 8 в изначально пустое дерево.&lt;br /&gt;
# Покажите какие деревья будут получаться в результате последовательного удаления ключей в порядке 8, 12, 19, 31, 38, 41.&lt;br /&gt;
&lt;br /&gt;
==(14.05) Конкурентный анализ самоорганизующихся циклов==&lt;br /&gt;
[https://vk.com/doc12518218_390369758 Лекция]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 18 (до 21.05)===&lt;br /&gt;
Все вычисления сопроводите подробными объяснениями о том, почему верно то или иное (не)равенство.&lt;br /&gt;
# Пусть имеется n-элементный список и m поисковых запросов к нему. После каждой операции поиска можно переупорядочить список. Обозначим стоимость последовательности поисков через C. Докажите, что в худшем случае C = Ω(mn).&lt;br /&gt;
#  Обозначим через c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; стоимость i-ого поискового запроса с применением эвристики перемещения в начало, которая включает стоимость поиска элемента в списке и стоимость его перемещения в начало списка путём ряда обменов соседних элементов списка. Покажите, что i-ая операция поиска находит элемент x в списке L с применением эвристики перемещения в начало, то c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = 2 * rank&amp;lt;sub&amp;gt;L&amp;lt;/sub&amp;gt;(x) - 1.&lt;br /&gt;
# Покажите, что c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = 2 * rank&amp;lt;sub&amp;gt;L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) - 1.&lt;br /&gt;
# Покажите, что c*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = rank&amp;lt;sub&amp;gt;L*&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) + t&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;.&lt;br /&gt;
# Докажите, что после одного обмена двух соседних элементов потенциал либо увеличивается на 2, либо уменьшается на 2.&lt;br /&gt;
# Докажите, что rank&amp;lt;sub&amp;gt;L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) = |A| + |B| + 1.&lt;br /&gt;
# Докажите, что rank&amp;lt;sub&amp;gt;L*&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) = |A| + |С| + 1.&lt;br /&gt;
# Покажите, что поиск i-ого элемента приводит к изменению потенциала Ф(L&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;) - Ф(L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;) &amp;lt;= 2 (|A| - |B| + t*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;), где t*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; --- это количество обменов при i-ом поиске.&lt;br /&gt;
# Во сколько раз стоимость С&amp;lt;sub&amp;gt;MFT&amp;lt;/sub&amp;gt;(S) превышает C&amp;lt;sub&amp;gt;OPT&amp;lt;/sub&amp;gt;(S)?&lt;br /&gt;
&lt;br /&gt;
== (18.05) Конечные автоматы ==&lt;br /&gt;
=== Задание 19 (до 25.05) ===&lt;br /&gt;
# Постройте автомат для языка над алфавитом Σ = {0, 1} каждое слово которого содержит хотя бы два нуля. Является ли он детерминированным?&lt;br /&gt;
# Постройте автомат над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5. Является ли он детерминированным?&lt;br /&gt;
# Постройте автомат, который допускает пустой язык (язык в котором нет ни одного слова).&lt;br /&gt;
# Постройте автомат, который допускает все слова над алфавитом Σ.&lt;br /&gt;
# Постройте ДКА над алфавитом Σ = {К, Ж, З}, который допускает слова в которых после К идёт З, после З --- Ж, после Ж --- К.&lt;br /&gt;
# * Постройте ДКА над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5, а число нулей на 3.&lt;br /&gt;
# Постройте НКА для языка над алфавитом Σ = {0, 1, 2, 3}, состоящий из слов, в которых хотя бы одна из последних пяти букв является 1.&lt;br /&gt;
# Постройте НКА над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5, а число нулей на 3.&lt;br /&gt;
# Какие языки допускают автоматы https://yadi.sk/d/fNAHbjCZghERG?&lt;br /&gt;
# Для каждого из автоматов https://yadi.sk/d/fNAHbjCZghERG постройте соответствующий ему ДКА.&lt;br /&gt;
&lt;br /&gt;
== (21.05) Регулярные выражения, КА, их эквивалентность. Лемма о накачке  ==&lt;br /&gt;
=== Задание 20 (до 28.05) ===&lt;br /&gt;
# Напишите регулярное выражение для языка {1, 000, 1010}.&lt;br /&gt;
# Напишите регулярное выражение для языка над алфавитом Σ = {0, 1} каждое слово которого содержит хотя бы два нуля.&lt;br /&gt;
# Напишите регулярное выражение над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5. Является ли он детерминированным?&lt;br /&gt;
# Напишите регулярное выражение, которое допускает пустой язык (язык в котором нет ни одного слова).&lt;br /&gt;
# Напишите регулярное выражение, которое допускает все слова над алфавитом Σ.&lt;br /&gt;
# Напишите регулярное выражение над алфавитом Σ = {К, Ж, З}, который допускает слова в которых после К идёт З, после З --- Ж, после Ж --- К.&lt;br /&gt;
# Напишите регулярное выражение для языка над алфавитом Σ = {0, 1, 2, 3}, состоящий из слов, в которых хотя бы одна из последних пяти букв является 1.&lt;br /&gt;
# Покажите, что если для языков L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; и L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; существует КА, который их читает, то существует КА и для их объединения L = {w | w ∈ L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; или w ∈ L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;}.&lt;br /&gt;
# Покажите, что если для языка L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; и L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; существует КА, который их читает, то существует КА и для языка L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; = {xy | x ∈ L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, y ∈ L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;}.&lt;br /&gt;
# Покажите, что если для языка L существует КА, который его читает, то существует КА и для &#039;&#039;&#039;замыкания Клини&#039;&#039;&#039; L* = {w&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; w&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; ... w&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;| w&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; ∈ L, w&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; ∈ L, ..., w&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; ∈ L}.&lt;br /&gt;
# * Покажите, что если языки L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; и L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; регулярны, то регулярно их пересечение.&lt;br /&gt;
# Покажите, что если язык L регулярен, то регулярно его дополнение (т.е. язык над тем же алфавитом, которому принадлежит слово тогда и только тогда, когда оно НЕ принадлежит L) .&lt;br /&gt;
# Покажите, что если язык L регулярен, то регулярно его обращение L&amp;lt;sub&amp;gt;R&amp;lt;/sub&amp;gt; = {a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; . . . a&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; | a&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; . . . a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; ∈ L}. (L&amp;lt;sub&amp;gt;R&amp;lt;/sub&amp;gt; --- это язык в котором все слова языка L записаны наоборот.)&lt;br /&gt;
#&lt;/div&gt;</summary>
		<author><name>Kassalanche</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=13859</id>
		<title>Алгоритмы и структуры данных. Подгруппа 105-1</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=13859"/>
		<updated>2015-05-21T03:34:23Z</updated>

		<summary type="html">&lt;p&gt;Kassalanche: /* (18.05) Конечные автоматы */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==О курсе==&lt;br /&gt;
[[Алгоритмы_и_структуры_данных|План лекций и список рекомендуемой литературы.]]&lt;br /&gt;
&lt;br /&gt;
[[Алгоритмы_и_структуры_данных._Подгруппа_105-1._FAQ|FAQ.]]&lt;br /&gt;
&lt;br /&gt;
[[Reviewboard|Инструкция по использованию Reviewboard.]]&lt;br /&gt;
&lt;br /&gt;
[[Практические_занятия_по_курсу_ОиМП/C++_check|Style guide.]]&lt;br /&gt;
&lt;br /&gt;
==Итоговая оценка за курс==&lt;br /&gt;
Итоговая оценка (ИО) зависит от&lt;br /&gt;
* оценок за пять больших домашних заданий (БДЗ1, БДЗ2, ..., БДЗ5),&lt;br /&gt;
* оценок за домашние задания (ДЗ1, ДЗ2, ...),&lt;br /&gt;
* оценки за контрольную работу (КР),&lt;br /&gt;
* оценки за экзамен (ЭКЗ),&lt;br /&gt;
и может быть вычислена по формуле:&lt;br /&gt;
 ИО = 0.7 * (0.3 * КР + 0.7 *(ИДЗ1 + ИДЗ2 + ИДЗ3 + ИДЗ4 + ИДЗ5)/5) + 0.3 * ЭКЗ =&lt;br /&gt;
    = 0.21*КР + 0.98*ИДЗ1 + 0.98*ИДЗ2 + 0.98*ИДЗ3 + 0.98*ИДЗ4 + 0.98*ИДЗ5 + 0.3*ЭКЗ,&lt;br /&gt;
где&lt;br /&gt;
 ИДЗi = min (10, 0.7 * БДЗi + 0.4 * &amp;lt;cредняя оценка за ДЗj, прошедшие с предыдущего БДЗ по i-ое&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
==Порядок сдачи домашних работ==&lt;br /&gt;
===Большие домашние работы===&lt;br /&gt;
# Получить OK за задачу в контесте.&lt;br /&gt;
# Залить исходный код на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* На каждую задачу создавайте отдельный запрос на ревью. &lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении суток приходят замечания к коду. &#039;&#039;&#039;Если в течении суток замечаний или Ship It не появилось, проверьте, что вы правильно отправили запрос и, если всё сделано правильно, спросите у семинариста получил ли он запрос.&#039;&#039;&#039;&lt;br /&gt;
# Вы их исправляете, проверяете в контесте, что программа по-прежнему проходит все тесты, заливаете новую версию в Review Board. Штрафов за посылки НЕ будет.&lt;br /&gt;
# Процесс повторяется пока остаются замечания к коду или пока не истёк дедлайн. После закрытия контеста будут ещё одни сутки на доработку замечаний в Review Board.&lt;br /&gt;
# Оценивается только последняя версия работы в Review Board.&lt;br /&gt;
&lt;br /&gt;
===Маленькие домашние работы===&lt;br /&gt;
# Залить решение на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* Желаемые форматы: txt, py, cpp, h. Допускаются любые другие.&lt;br /&gt;
#* На каждую домашнюю работу создавайте отдельный запрос на ревью. Обязательно указывайте номер домашней работы.&lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении неопределенного промежутка времени придут оценки по каждому из заданий.&lt;br /&gt;
&lt;br /&gt;
==Оценивание домашних работ==&lt;br /&gt;
* Все задания предполагаются индивидуальными. Запрещены любые заимствования без ссылки на автора.&lt;br /&gt;
* Решения после установленного дедлайна не принимаются. Дедлайн указан в заголовке каждого задания.&lt;br /&gt;
* Везде, где требуется написать алгоритм, можно использовать любой язык программирования или псевдокод.&lt;br /&gt;
* Там, где требуется построить алгоритм с заданной асимптотикой, приведите обоснование, что полученный алгоритм удовлетворяет этому условию.&lt;br /&gt;
* Эти правила не действуют, если в задании явно оговорено иное.&lt;br /&gt;
&lt;br /&gt;
==Мотивация к изучению алгоритмов. Подсчёт числа операций (12.01)==&lt;br /&gt;
# Числа Фибоначчи. Определение. Примитивный рекурсивный алгоритм вычисления i-ого числа. Оценка числа операций. Анализ причин неэффективности. Алгоритм с запоминанием вычисленных ранее значений. Оценка числа операций. Сравнение с предыдущим. (подробнее: глава 0, страницы 8-10 из книги &amp;lt;&amp;lt;Алгоритмы&amp;gt;&amp;gt;, [[Алгоритмы_и_структуры_данных|см. список рекомендованной литературы]])&lt;br /&gt;
# Задача о ханойской башне. Постановка задачи. Рекурсивный алгоритм. Рекуррентная формула для числа перемещений. Замкнутая формула для числа перемещений (+ доказательство). Доказательство того, что эту задачу нельзя решить используя меньшее число перемещений дисков. ([https://www.dropbox.com/s/t8cbs7ttu4iasvj/algo-0-recursion.pdf?dl=0 Разбор задачи о ханойской башне], автор Сергей Объедков)&lt;br /&gt;
# Сортировка пузырьком. Алгоритм. Подсчёт количество операций сравнения и обмена (swap). Анализ наилучшего и наихудшего случаев ([https://ru.wikipedia.org/wiki/Сортировка_пузырьком Википедия])&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 1 (12.01 - 26.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
Во всех задачах, если не оговорено иного, предполагаем, что работаем с целыми неотрицательными числами. Для первых 7 задач необходимо&lt;br /&gt;
* описать что можно считать наилучшим и наихудшим случаями,&lt;br /&gt;
* для каждого из двух случаев подсчитать отдельно количество операций сравнения и swap (если есть).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Даны три числа, требуется вернуть наименьшее.&lt;br /&gt;
# Даны три числа, требуется отсортировать их.&lt;br /&gt;
# Дана последовательность A из n элементов и число x, требуется найти элемент равный x. Примечание: если таких значений i несколько, вернуть любое; если такого элемента нет, функция должна сообщить об этом.&lt;br /&gt;
# * Дана упорядоченная последовательность A из n элементов и число x, требуется найти такое i, что A[i] равно x. Алгоритм должен быть эффективней, чем в предыдущем пункте и использовать то, что последовательность упорядочена.&lt;br /&gt;
# Дана последовательность из 100 000 чисел от 0 до 100. Напишите эффективный алгоритм сортировки, который бы учитывал специфику входных данных.&lt;br /&gt;
# * Дано 32 битное неотрицательное число. Требуется номер первого ненулевого бит. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения, считая, что числа распределены равномерно.&lt;br /&gt;
# * Даны 32 битные неотрицательные числа m и n. Требуется вывести True, если m &amp;lt; n, иначе False. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения битов, считая, что числа распределены равномерно.&lt;br /&gt;
# Напишите рекурсивную функцию, вычисляющую n-ое число Фибоначчи (как на занятии). Подсчитайте количество рекурсивных вызовов.&lt;br /&gt;
# * Напишите функцию, вычисляющую n-ое число Фибоначчи, у которой число операций — полином от n, и которая использует количество памяти, независящее от n.&lt;br /&gt;
&lt;br /&gt;
==O-символика и стратегия &amp;quot;разделяй и властвуй&amp;quot; (15.01)==&lt;br /&gt;
# Сортировка слиянием. Алгоритм, рекуррентное соотношение для времени сортировки, сложность. Подробнее: [https://dl.dropboxusercontent.com/u/829163/draft.pdf §2.3 Сортировка слиянием (стр. 54)].&lt;br /&gt;
# О-символика. [https://dl.dropboxusercontent.com/u/829163/draft.pdf §0.3 О-символика (стр. 10)].&lt;br /&gt;
# Задача о слиянии m упорядоченных массивов по n элементов. Три алгоритма решения: последовательное слияние, слияние &amp;quot;деревом&amp;quot; (обе функции используют Merge из MergeSort), аналог Merge для m массивов. Анализ сложности каждого из них.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 2 (15.01-29.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
* Во всех задачах, если не оговорено иного, для простоты &#039;&#039;можно&#039;&#039; считать, что n является степенью какого-либо числа, например, степенью двойки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Дана функция F, определённая ниже. Сколько строк она напечатает? Указание: для обоих подпунктов рассмотрите два случая: 1. n является степенью двойки, 2. n не является степенью двойки.&lt;br /&gt;
## Запишите рекуррентное соотношение для числа строк.&lt;br /&gt;
## Решите уравнение, полученное в предыдущем пункте, то есть, выведите замкнутую (нерекуррентную формулу). Для простоты можно считать, что n является степенью двойки.&lt;br /&gt;
# В массиве A размера n записана возрастающая последовательность целых чисел. Постройте алгоритм типа &amp;quot;разделяй и властвуй&amp;quot;, который проверяет, существует ли такой индекс i, что A[i] = i&lt;br /&gt;
## за время O(n),&lt;br /&gt;
## * за время O(log n).&lt;br /&gt;
## Какие случаи для вашего алгоритма являются наихудшими и наилучшими? Какого время работы в лучшем и худшем случаях?&lt;br /&gt;
# Дан бесконечный массив A, первые n элементов которого содержат возрастающую последовательность положительных чисел, а дальше стоят -1. Значение n не дано. Постройте алгоритм, который получает на вход целое число x и находит это x в массиве --- или говорит, что там его нет, &lt;br /&gt;
## за время O(n),&lt;br /&gt;
## за время O(log n).&lt;br /&gt;
# Рассмотрим алгоритм вычисления наибольшего общего делителя (НОД) двух положительных чисел, основанный на методе &amp;quot;разделяй и властвуй&amp;quot;.&lt;br /&gt;
## (задание не оценивается) Прочитайте [https://dl.dropboxusercontent.com/u/829163/draft.pdf §1.2.3 Алгоритм Евклида (стр. 23)].&lt;br /&gt;
## * Докажите, что определение НОД-а, приведённое ниже, корректно.&lt;br /&gt;
## Постройте алгоритм, основанный на этом определении.&lt;br /&gt;
## Какой алгоритм будет быстрее для n-битовых чисел a и b при больших значениях n --- ваш или алгоритм Евклида?&lt;br /&gt;
# * Покажите как за время O(n log n) удалить из массива размера n все дубликаты, то есть оставить каждый элемент в одном экземпляре.&lt;br /&gt;
# * Даны два упорядоченных массива размера m и n. Постройте алгоритм, находящий k-й по величине элемент в объединении этих массивов за время O(log(n+m)). &lt;br /&gt;
&lt;br /&gt;
Функция F(n).&lt;br /&gt;
  если n &amp;gt; 1:&lt;br /&gt;
    напечатать &amp;quot;всё ещё работаю&amp;quot;&lt;br /&gt;
    F(n/2)&lt;br /&gt;
    F(n/2)&lt;br /&gt;
&lt;br /&gt;
Определение НОД-а.&lt;br /&gt;
             2НОД(a/2, b/2), если а и b чётны,&lt;br /&gt;
  НОД(a,b) = НОД(a, b/2), если а нечётно, b чётно,&lt;br /&gt;
             НОД((a-b)/2, b), если а и b нечётны.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;lt;nowiki&amp;gt;Задачи взяты из книги &amp;quot;Алгоритмы&amp;quot;, глава 2 (см. список рекомендованной литературы).&amp;lt;/nowiki&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Сложение и умножение (19.01)==&lt;br /&gt;
# Алгоритм сложения, его сложность (§1.1.1 Сложение*)&lt;br /&gt;
# &amp;quot;Школьный&amp;quot; алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Рекурсивный алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Алгоритм умножения, реализующий стратегию &amp;quot;разделяй и властвуй&amp;quot;, анализ сложности (§2.1 Умножение чисел*)&lt;br /&gt;
 * [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать.]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 3 (19.01 - 2.02)===&lt;br /&gt;
* Во всех задачах для простоты можно считать, что n является степенью какого-либо числа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Найдите произведение чисел 10011011 и 10111010 (в двоичной системе счисления), используя алгоритм умножения чисел, основанный на методе «разделяй и властвуй». Необходимо не только дать ответ, но и привести ход решения.&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 3 рекурсивных вызова для подзадач размера n-1 и комбинирует из них решение исходной задачи за О(n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте три верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 10 рекурсивных вызовов для подзадач размера n/2 и комбинирует из них решение исходной задачи за О(5n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте два верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Докажите, что 3m² + m = O(m²).&lt;br /&gt;
# Докажите, что lg m = O(m/1000), где lg m — это логарифм с двоичным основанием.&lt;br /&gt;
# Докажите, что из равенства f(n) = O(g(n)) не следует, что g(n) = O(f(n)).&lt;br /&gt;
# Докажите, что O(m) содержится в O(m²).&lt;br /&gt;
&lt;br /&gt;
==Решение рекуррентных уравнений (22.01)==&lt;br /&gt;
# Примеры решений рекуррентных уравнений (см. [https://www.dropbox.com/s/6a0r410zjm9qwe7/algo-3-recurrences.pdf?dl=0 конспект]).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 4 (до 14.02)===&lt;br /&gt;
* Нельзя использовать утверждение основной теоремы о решении рекуррентных соотношений.&lt;br /&gt;
* &#039;&#039;Можно&#039;&#039; использовать метод построения дерева рекурсии или подстановку (метод с угадыванием ответа).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Какой из трёх приведённых ниже алгоритмов вы бы предпочли? Обоснуйте свой ответ.&lt;br /&gt;
#* Алгоритм A, решая задачу, производит пять рекурсивных вызовов для подзадач вдвое меньшего размера, после чего строит ответ для исходной задачи за линейное время.&lt;br /&gt;
#* Алгоритм B, решая задачу размера n, делает два рекурсивных вызова для задач размера n − 1, после чего находит ответ за время O(1).&lt;br /&gt;
#* Алгоритм C, решая задачу размера n, рекурсивно решает девять задач размера n/3 и строит ответ за время O(n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Найдите T(n) в замкнутой форме для любых 7 из 10 приведённых ниже рекуррентных соотношений:&lt;br /&gt;
## T(n) ≤ 2T(n/3) + 1;&lt;br /&gt;
## T(n) ≤ 7T(n/7) + n;&lt;br /&gt;
## T(n) ≤ 9T(n/3) + n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 8T(n/2) + n&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 49T(n/25) + n&amp;lt;sup&amp;gt;3/2&amp;lt;/sup&amp;gt;log n;&lt;br /&gt;
## T(n) ≤ T(n − 1) + 2;&lt;br /&gt;
## T(n) ≤ T(n − 1) + n&amp;lt;sup&amp;gt;c&amp;lt;/sup&amp;gt;, где c ≥ 1 –– константа;&lt;br /&gt;
## T(n) ≤ T(n − 1) + c&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;, где c &amp;gt; 1 –– константа;&lt;br /&gt;
## T(n) ≤ 2T(n − 1) + 1;&lt;br /&gt;
## T(n) ≤ T(sqrt(n)) + 1.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №1==&lt;br /&gt;
Необходимо реализовать все 6 задач из [https://official.contest.yandex.ru/contest/1002 контеста]. Каждую задачу можно писать на С++ или Python. На выполнение работы отводится две недели. Каждая задача оценивается в 10/6 балла. Оценка &#039;&#039;может&#039;&#039; быть снижена за плохой код, но не более чем на 25%.&lt;br /&gt;
&lt;br /&gt;
==Бинарное дерево поиска (26.01)==&lt;br /&gt;
# Определение. Пример.&lt;br /&gt;
# Не модифицирующие алгоритмы: поиск (рекурсивный и итеративный алгоритмы), поиск минимума, inordered обход (вывод значений узлов в отсортированном порядке), поиск следующего по возрастанию.&lt;br /&gt;
# Модифицирующие алгоритмы: вставка (рекурсивная реализация), удаление (только идея).&lt;br /&gt;
 [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 13, стр. 248]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 5 (до 16.02)===&lt;br /&gt;
* Для получения максимальной оценки можно выполнить или все задачи без звёздочки, или задачу со звёздочкой. Преподаватель понимает, что реализацию БДП сложно не найти в интернете, но от копипасты не будет никакой пользы. Напротив, самостоятельная реализация очень полезна и приветствуется, даже если не получится выполнить всех пунктов задания.&lt;br /&gt;
* Задачи с двумя звёздочками необязательны.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Нарисуйте бинарные деревья поиска высотой 2, 3, 4, 5 и 6 для множества ключей {1, 4, 5, 10, 16, 17, 21}. Корень дерева имеет высоту 0.&lt;br /&gt;
# &#039;&#039;&#039;Сортировка с использованием БДП.&#039;&#039;&#039;&lt;br /&gt;
## Какова асимптотическая сложность алгоритма вставки элемента в дерево высоты d? Почему? Назовите наилучший и наиухдший случаи.&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который строит БДП в узлах которого стоят элементы данной последовательности. Можно использовать функцию Insert. Назовите наилучший и наихудший случаи. Есть теорема о том, что полученный алгоритм будет работать в среднем случае за время O(n * log n).&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который выводит их в порядке возрастания. Используйте бинарное дерево поиска. Какова в среднем случае сложность этого алгоритма? Назовите наилучший и наихудший случаи. Какова сложность в наихудшем случае?&lt;br /&gt;
# Напишите функцию GetRoot, которой на вход подаётся указатель на произвольный узел дерева, а она возвращает указатель на корень.&lt;br /&gt;
# Напишите процедуру PrintLeafs, которой на вход подаётся указатель на корень дерева, и она печатает листья дерева&lt;br /&gt;
## по возрастанию,&lt;br /&gt;
## по убыванию.&lt;br /&gt;
# ** Альтернативный обход в порядке возрастания бинарного дерева поиска с n узлами (или центрированный (inordered) обход) можно осуществить путём поиска минимального элемента дерева с помощью функции Minimum с последующий n-1 вызовом функции Next. Каково время работы такого алгоритма?&lt;br /&gt;
# * Реализуйте на С++ структуру данных бинарное дерево поиска, [https://yadi.sk/i/gi2SEStreFfSb используя заготовку].&lt;br /&gt;
## Нарисуйте бинарное дерево поиска, которое строится в функции getTreeExample.&lt;br /&gt;
## Реализуйте следующие алгоритмы: &lt;br /&gt;
### поиск минимума, &lt;br /&gt;
### inordered обход (вывод значений узлов в отсортированном порядке),&lt;br /&gt;
### поиск следующего по возрастанию,&lt;br /&gt;
### вставка элемента в дерево,&lt;br /&gt;
### сортировка последовательности с использованием БДП (дан вектор чисел, необходимо вывести их по возрастанию),&lt;br /&gt;
### ** удаление.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Карацубы, Штрассена. Быстрая сортировка (29.01)==&lt;br /&gt;
# Алгоритм Карацубы.&lt;br /&gt;
# Алгоритм Штрассена. [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать Дасгупту и др., §2.5 Умножение матриц]&lt;br /&gt;
# Быстрая сортировка и доказательство того, что в среднем случае она работает за О(n * log n). [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 8 Быстрая сортировка, стр. 148]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 6 (до 18.02)===&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Пусть мы хотим найти двоичное представление десятичного числа 10&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;. Будем считать, что n --- степень двойки (n = 2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt;).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Pwr2Bin(n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть 1010&lt;br /&gt;
    z = ...&lt;br /&gt;
    вернуть Multiply(z, z)&amp;lt;/source&amp;gt;&lt;br /&gt;
Multiply --- функция, перемножающая два n-битовых двоичных числа x и y по алгоритму Карацубы за O(n&amp;lt;sup&amp;gt;log&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;3&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Пусть мы хотим перевести произвольное десятичное число x в записи которого n=2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; чисел в двоичную систему счисления.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Dec2Bin(x, n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть binary[x]&lt;br /&gt;
    разделить x на два десятичных числа xl и xr из n/2 цифр.&lt;br /&gt;
    вернуть ...&amp;lt;/source&amp;gt;&lt;br /&gt;
Здесь binary --- это массив, содержащий двоичное представление десятичных цифр.&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Докажите, что математическое ожидание времени работы алгоритма быстрой сортировки (усреднение по всем вариантам выбора опорного элемента) на любом входе размера n удовлетворяет соотношению: T(n) ≤ O(n) + 1/n * &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt; (T(i-1) + T(n-i)).&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Найдите решение соотношения из предыдущего пункта.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Динамическое программирование (ДП). Первые примеры (02.01)==&lt;br /&gt;
# Нахождение самой длинной возрастающей подпоследовательности.&lt;br /&gt;
# Нахождение редакционного расстояния (или редакционной стоимости, расстояния Левенштейна).&lt;br /&gt;
# Нахождение представителя большинства.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 7 (до 20.02)===&lt;br /&gt;
* В этом задании везде, где требуется реализовать алгоритм, необходимо привести код на любом языке программирования.&lt;br /&gt;
* Для получения максимальной оценки нужно решить все задачи без звёздочек. Одна решённая задача со звёздочкой заменяет одну задачу без звёздочки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения редакционного расстояния (алгоритм Вагнера — Фишера). Например, редакционное расстояние между словами &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равно 6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения длины наибольшей общей подстроки. Например, длина наибольшей общей подстроки &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равна 8 (&amp;quot;antholog&amp;quot;). Чем больше это значение, тем схожей строки.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Предположим теперь, что сравниваемые строки состоят из символов A, С, G и T; за удаление или вставку мы платим -5; за замену буквы x на y платим w[x, y], где x, y принадлежат множеству {A, С, G, T}, a w — это матрица весов:&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
!-!! A!! G!! C!! T&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! A&lt;br /&gt;
|10||-1||-3||-4&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
!G&lt;br /&gt;
||-1||7||-5||-3&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! C&lt;br /&gt;
||-3||-5||9||0&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! T&lt;br /&gt;
||-4||-3||0||8&lt;br /&gt;
|}&lt;br /&gt;
Тогда выравнивание:&lt;br /&gt;
 AGACTAGTTAC&lt;br /&gt;
 CGA‒‒‒GACGT&lt;br /&gt;
будет иметь следующую оценку:&lt;br /&gt;
 w[A,C] + w[G,G] + w[A,A] + 3*(-5) + w[G,G] + w[T,A] + w[T,C] + w[A,G] + w[C,T] = -3 + 7 + 10 - 3*5 + 7 + (-4) + 0 + (-1) + 0 = 1.&lt;br /&gt;
&lt;br /&gt;
Напишите алгоритм, который находит максимальную стоимость всех возможных выравниваний. Верно ли, что чем больше это значение, тем непохожей строки?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как давно один народ отделился от другого? Кто похожей — итальянец и китаец или якут и эфиоп? На эти вопросы можно отвечать с разных точек зрения — культурной, исторической, лингвистической, ... В последние же годы человечество научилось секвенировать геном, что позволило исследовать этот вопрос с точки зрения генетики. Секвенирование генома — это процесс записи ДНК в виде нуклеотидной последовательности, которая представляет собой последовательность из четырёх символов — A, С, G и T. Существуют базы, которые хранят генетическую информацию о людях из разных стран и континентов, например, [http://www.mtdb.igp.uu.se/ http://www.mtdb.igp.uu.se/ → Download mtDNA sequences]. Чем больше сходство между геномами, тем сильнее родственные связи между их обладателями. Используя решение предыдущего пункта, выполните задания:&lt;br /&gt;
# Определите, кто похожей — итальянец и китаец или якут и эфиоп?&lt;br /&gt;
# Найдите нескольких похожих и нескольких непохожих народностей.&lt;br /&gt;
# * Выберите одну народность. Найдите самых похожих и самых непохожих на неё.&lt;br /&gt;
# * Найдите самые похожие и самые непохожие народности.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Задача о разрезании стержня (05.01)==&lt;br /&gt;
# Постановка задачи.&lt;br /&gt;
# Решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Решение с нахождением максимума по p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Восходящий алгоритм с запоминанием. Вывод длин кусочков стержня. Оценка сложности.&lt;br /&gt;
# Нисходящий алгоритм с запоминанием. Оценка сложности.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.1 Разрезание стержня, стр. 393]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 8 (до 22.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Решая задачу о разрезании стержня мы вначале построили рекурсивное решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt; для всех 1 ≤ i &amp;lt; n. Его сложность описывалась рекуррентной формулой T(n) = n + &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n-1&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt;(T(i) + T(n-i)), T(1) = 1.&lt;br /&gt;
# Объясните эту формулу.&lt;br /&gt;
# Покажите с помощью метода подстановок, что T(n) ≤ 2&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Покажите с помощью контрпримера, что описанная далее жадная стратегия не всегда определяет оптимальный способ разрезания стержня. Определим плотность стержня длиной i как p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;/i, то есть как стоимость единицы его длины. Жадная стратегия для стержня длиной n отрезает от стержня первую часть длиной i, где 1 ≤ i ≤ n, имеющую максимальную плотность. Затем та же жадная стратегия применяется к оставшейся части длиной n-i.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Рассмотрим модификацию задачи разрезания стержня, в которой в дополнение к цене p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; каждого стержня добавляется фиксированная цена разреза c. Теперь прибыль, связанная с решением, представляет собой сумму цен частей стержня минус стоимость разрезов. Разработайте алгоритм динамического программирования для этой модифицированной задачи.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Непрерывным участком называется группа подряд идущих элементов. Например, для последовательности&lt;br /&gt;
 5, 15, −30, 10, −5, 40, 10&lt;br /&gt;
элементы 15, −30, 10 образуют непрерывный участок, а 5, 15, 40 -- нет. Постройте линейный алгоритм для следующей задачи:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Вход: список чисел a1, a2, ... ‌, an.&lt;br /&gt;
Выход: непрерывный участок с максимальной суммой (сумма участка нулевой длины равна нулю).&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Для приведённого примера ответом будет 10, −5, 40, 10 с суммой 55. Какова сложность алгоритма? Почему?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Надо заплатить v рублей, имея купюры в x1, x2, ‌..., xn рублей (купюр каждого типа сколько угодно). Это не всегда возможно (скажем, купюрами в&lt;br /&gt;
10 и 25 рублей можно заплатить 45 рублей, но не 47 и не 15). Постройте основанный на методе динамического программирования алгоритм со временем работы O(nv), выясняющий, возможна ли уплата.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как решить предыдущую задачу, если каждая купюра имеется в единственном экземпляре? (Например, купюрами в 1, 5, 10, 20 рублей можно заплатить 16 = 1 + 5 + 10 и 31 = 1 + 10 + 20 рублей, но не 40 (не хватит денег). Время работы алгоритма по-прежнему O(nv).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Ещё один вариант той же задачи: купюр каждого типа сколько угодно, но всего разрешается использовать не более k купюр. (Например, если есть купюры в 5 и 10 рублей, а k = 6, то 55 разменять можно, а 65 –– нет).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Перемножение цепочки матриц. Оптимальное бинарное дерево поиска (начало) (09.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о перемножении цепочки матриц. Постановка задачи.Пример. Нисходящий алгоритм.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.2 Перемножение цепочки матриц, стр. 403]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 9 (до 24.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Найдите оптимальную расстановку скобок в произведении последовательности матриц, размерности которых равны 5×10, 10×3, 3×12, 12×5, 5×50, 50×6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Напишите восходящий алгоритм для поиска оптимальной расстановки скобок.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Расстановка пробелов. Оптимальное бинарное дерево поиска (середина) (12.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о расстановке пробелов. Постановка задачи. Решения для трёх случаев: 1. нужно вернуть можно ли разбить текст на слова; 2. вернуть разбивку на слова; 3. слова встречаются не равновероятно, вернуть наиболее вероятную разбивку на слова.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи. Вывод математического ожидания времени поиска.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Праздничное домашнее задание 10 (до 02.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[&amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;,&amp;quot;, &amp;quot;.&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;,&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;.&amp;quot;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Подсказка:&#039;&#039;&#039; разбейте текст на слова из списка и посмотрите на азбуку Морзе.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Способы представления графов в памяти (16.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Разбор ошибок в домашнем задании.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Графы. Способы представления графов в памяти (матрица смежности, список рёбер, список соседей (список смежностей), матрица инцидентности). Зависимость сложности алгоритмов от способа представления.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §22.1 Представление графов, стр. 626]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 11 (до 02.03)===&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача A.]&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача B.]&lt;br /&gt;
# Нарисуйте неориентированный граф с 5 вершинами и 8 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Нарисуйте ориентированный граф с 4 вершинами и 3 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Дан ориентированный граф. &#039;&#039;Исходящая степень вершины v&#039;&#039; --- это количество исходящих из неё рёбер, &#039;&#039;входящая степень v&#039;&#039; --- это количество рёбер входящих в  v. Имеется представление ориентированного графа с использование списка соседей. Как долго будут вычисляться исходящие степени всех вершин графа? А входящие степени?&lt;br /&gt;
# Дан граф G = (V, E). Какие из рассмотренных способов хранения графов используют меньше всего памяти для хранения G и почему? Указание: рассмотрите случаи |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;lt; |E| и |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;gt; |E|.&lt;br /&gt;
# Пусть C --- это матрица смежности графа G.&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
# Пусть B --- это матрица инцидентности ориентированного графа G. Как связаны элементы матрицы BB&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
&lt;br /&gt;
==Реализация поиска в глубину (19.02)==&lt;br /&gt;
# Реализация поиска в глубину и смежных задач.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 12 (до 5.03)===&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Выберите любой способ хранения графа. Реализуйте поиск в глубину.&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Напишите алгоритм, который возвращает данные о том, какие вершины лежат в одной компоненте связности.&lt;br /&gt;
# &#039;&#039;(любой ЯП или псевдокод)&#039;&#039; Напишите алгоритм проверки сильной связности ориентированного графа. Какова его сложность?&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №2==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
Необходимо реализовать 3 задачи из [https://official.contest.yandex.ru/contest/1085 контеста], см. [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing распределение задач]. Каждую задачу можно написать на С++ или Python. На выполнение работы отводится две недели (см. время окончания контеста). [https://official.contest.yandex.ru/contest/1123 Дорешивание.]&lt;br /&gt;
&lt;br /&gt;
==ДП и графы (26.02)==&lt;br /&gt;
==ДП и графы (02.03)==&lt;br /&gt;
==Жадные алгоритмы (12.03)==&lt;br /&gt;
===Домашнее задание 13 (до 23.03)===&lt;br /&gt;
# Вася хочет купить по одной акции каждой компании. Все акции стоят одинаково, но дорожают по-разному. Каждый месяц акция i-ой компании дорожает в r_i раз. В один месяц можно купить только одну акцию.&lt;br /&gt;
## Напишите алгоритм, который выводит оптимальную последовательность покупок (такую, что на покупку всех акций потратится меньше денег).&lt;br /&gt;
## Докажите корректность алгоритма, то есть докажите, что последовательность покупок, которую выводит ваш алгоритм, оптимальна.&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список, очередь (16.03)==&lt;br /&gt;
# Реализация линейного двусвязного списка (С++).&lt;br /&gt;
# Реализация очереди ограниченной длины на базе вектора (С++).&lt;br /&gt;
# Реализация очереди на базе списка (С++).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14 (до 23.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте (на С++) структуру данных Стек. У стека должно быть три операции:&lt;br /&gt;
* push --- положить элемент на вершину стека;&lt;br /&gt;
* pop --- удалить верхний элемент;&lt;br /&gt;
* front --- вернуть значение верхнего элемента.&lt;br /&gt;
Оцените время работы каждой функции.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список (19.03)==&lt;br /&gt;
===Домашнее задание 13* (до 30.03)===&lt;br /&gt;
#Для приведённой реализации класса List (https://yadi.sk/i/c5r_79WdfMyNS).&lt;br /&gt;
## Допишите print, push_back и push_front.&lt;br /&gt;
## В функции insert_after и delete_node вставьте необходимые проверки так, чтобы они работали для крайних случаев.&lt;br /&gt;
## Напишите main в котором&lt;br /&gt;
### создаётся объект класса List, &lt;br /&gt;
### заполняется элементами с помощью функций push_back, push_front и insert_after и&lt;br /&gt;
### удаляется i-ый элемент.&lt;br /&gt;
&lt;br /&gt;
==Повторение (30.03)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Для данных пар функций выясните их связь в терминах O-, o-, Ω-, ω-, Θ-обозначений. Поставьте галочку в клетке с Ω, если f(x) = Ω(g(x)) и прочерк, если равенства нет. [https://ru.wikipedia.org/wiki/«O»_большое_и_«o»_малое#.D0.94.D1.80.D1.83.D0.B3.D0.B8.D0.B5_.D0.BF.D0.BE.D0.B4.D0.BE.D0.B1.D0.BD.D1.8B.D0.B5_.D0.BE.D0.B1.D0.BE.D0.B7.D0.BD.D0.B0.D1.87.D0.B5.D0.BD.D0.B8.D1.8F Википедия]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! f(x)!! g(x)!! O!! o!! Ω!! ω!! Θ&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! 2^100&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n * log(n)&lt;br /&gt;
! 2^100 * n * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n&lt;br /&gt;
! 2^100 * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n!&lt;br /&gt;
! 2^(2015n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n*2^n&lt;br /&gt;
! 3^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 5^n&lt;br /&gt;
! 5^(n+1)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n + n^2 + n^3 + ... + n^1000&lt;br /&gt;
! 7^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм Quickselect нахождения k-ого элемента по возрастанию: http://en.wikipedia.org/wiki/Quickselect&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;На улице стоит ряд домов. В каждом из домов лежит сколько-то денег. Вор хочет обокрасть дома на переулке. Он не может обокрасть два соседних дома, потому что хозяин дома, который он обокрал, сразу предупредит соседей. Нужно найти, какую максимальную сумму вор может украсть с переулка. На вход программы подается массив неотрицательных целых чисел - количество долларов в доме с номером i. Соседние дома в массиве представлены соседними элементами. Например, пусть задан массив { 1, 4, 5 } - тогда вор максимум может украсть $6, обокрав дома 1 и 3. Пусть задан массив { 1, 7, 2 } - тогда вор максимум может украсть $7, обокрав дом 2.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Алфавит из всех маленьких латинских букв и пробела закодирован числами следующим способом:&lt;br /&gt;
  &#039;a&#039; -&amp;gt; 1&lt;br /&gt;
  &#039;b&#039; -&amp;gt; 2&lt;br /&gt;
  &#039;c&#039; -&amp;gt; 3&lt;br /&gt;
  ...&lt;br /&gt;
  &#039;z&#039; -&amp;gt; 26&lt;br /&gt;
  &#039; &#039; -&amp;gt; 27&lt;br /&gt;
На вход программы подается строка из цифр. Нужно посчитать, сколькими способами можно раскодировать эту строку.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Дан граф, заданный матрицей смежности. Вывести пары вершин между которыми нет пути.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Повторение (02.04) ==&lt;br /&gt;
Решали и разбирали первые 4 задачи из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14* (до 11.03)===&lt;br /&gt;
Решите любые две задачи (подпункты НЕ считаются отдельными задачами) с предыдущей пары (Повторение (30.03)).&lt;br /&gt;
&lt;br /&gt;
== Повторение (06.04) ==&lt;br /&gt;
Будем решать вторую половину задач из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 15 (до 16.04)===&lt;br /&gt;
# Приведите пример графа, который содержит отрицательные рёбра, не содержит циклов отрицательного веса и для которого алгоритм Дейкстры возвращает неверный результат.&lt;br /&gt;
# Используется ли в алгоритме Дейкстры то, что веса рёбер неотрицательны? Если &amp;quot;да&amp;quot;, то где именно?&lt;br /&gt;
# Пусть граф содержит рёбра с весами &amp;gt;= -100. Если прибавить к каждому ребру 101 и при помощи алгоритма Дейкстры найти кратчайшие пути. Будут ли эти пути кратчайшими в исходном графе? Почему?&lt;br /&gt;
&lt;br /&gt;
== Повторение (07.04) ==&lt;br /&gt;
&#039;&#039;&#039;Решение рекуррентных соотношений&#039;&#039;&#039;&lt;br /&gt;
# Решите уравнение: T(n) = 4*T(n/2) + O(n^2) с базой T(1) = O(1)&lt;br /&gt;
## Используя основную теорему.&lt;br /&gt;
## Используя дерево рекурсий.&lt;br /&gt;
## Методом подстановки.&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2)) + n является \Theta(n lg n).&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2) + 17) + n является \Theta(n lg n).&lt;br /&gt;
# Решите уравнения, считая, что T(1) = O(1):&lt;br /&gt;
## T(n) = T(n-1) + n&lt;br /&gt;
## T(n) = 2*T(floor(sqrt(n))) + lg n. Указание: попробуйте использовать замену переменных.&lt;br /&gt;
## T(n) = 3*T(sqrt(n)) + lg n&lt;br /&gt;
# Дайте верхнюю и нижнюю оценки функции T(n). Постарайтесь, чтобы оценки были как можно более точные&lt;br /&gt;
## T(n) = 4T(n/3) + n*lg(n)&lt;br /&gt;
## T(n) = 3T(n/3) + n/lg(n)&lt;br /&gt;
## T(n) = 4T(n/2) + n^2*sqrt(n)&lt;br /&gt;
## T(n) = T(n/2) + T(n/4) + T(n/8) + n&lt;br /&gt;
## T(n) = T(n-1) + 1/n&lt;br /&gt;
## T(n) = T(n-2) + 1/lg(n)&lt;br /&gt;
## T(n) = sqrt(n) * T(sqrt(n)) + n&lt;br /&gt;
&#039;&#039;&#039;Анализ и построение алгоритмов&#039;&#039;&#039;&lt;br /&gt;
# Числа Фибоначчи F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; можно выразить через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, используя матрицу: https://yadi.sk/i/Pm_aNzHCforFU. &lt;br /&gt;
## Покажите как вычислить F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;.&lt;br /&gt;
## Как вычислить F&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;n+1&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;?&lt;br /&gt;
## Напишите алгоритм.&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
## Ускорьте его так, чтобы он работал за O(log n).&lt;br /&gt;
# Дана последовательность символов. Какое минимальное количество символов нужно удалить из неё, чтобы получить палиндром?&lt;br /&gt;
## Напишите алгоритм (на псевдокоде или на любом языке программирования).&lt;br /&gt;
## Оцените время работы алгоритма.&lt;br /&gt;
# Какую структуру данных вы бы использовали для реализации упорядоченного множества (http://neerc.ifmo.ru/wiki/index.php?title=Упорядоченное_множество)? Какая будет сложность каждой из операций над множеством?&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 16 (до 20.04)===&lt;br /&gt;
# Решите 6 задач из первой части и 6 из второй. (Укажите какие именно.) Каждый из подпунктов является отдельной задачей.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм и теорема Форда-Фалкерсона (16.04)==&lt;br /&gt;
# Базовые определения (пропускные способности, сток, исток и пр.). Пример. &lt;br /&gt;
# Ограничения на поток (сохранение и что меньше пропускных способностей).&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, пример работы&lt;br /&gt;
# Разрез, определение, пример.&lt;br /&gt;
# Утверждение: максимальный поток &amp;lt;= любого разреза.&lt;br /&gt;
# Теорема Форда-Фалкерсона (с доказательством).&lt;br /&gt;
# Пример на котором алгоритм Форда-Фалкерсонаработает работает очень долго при неудачном выборе путей.&lt;br /&gt;
# Сложность алгоритма Форда-Фалкерсона.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №3==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
В [https://official.contest.yandex.ru/contest/1196 домашнем задании] пять задач. Они разделены на два варианта, помеченные римскими цифрами I и II. Свой вариант нужно узнать [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing здесь на вкладке HW3]. Третья задача — общая для двух вариантов; ее решение необходимо снабдить доказательством корректности алгоритма. На выполнение задания дается примерно 2 недели (см. точное время окончания в контесте). Каждую задачу можно написать на С++ или Python.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Форда-Фалкерсона и Эдмондса-Карпа (20.04)==&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, напоминание: базовые определения, пример работы, пример на котором алгоритм работает долго, сложность.&lt;br /&gt;
# Алгоритм Эдмодса-Карпа. Доказательство асимптотики времени работы.&lt;br /&gt;
&lt;br /&gt;
==(23.04)==&lt;br /&gt;
&lt;br /&gt;
==(11.05) Красно-чёрные деревья==&lt;br /&gt;
[https://ru.wikipedia.org/wiki/Красно-чёрное_дерево Красно-чёрное дерево]&lt;br /&gt;
===Домашнее задание 17 (до 18.05)===&lt;br /&gt;
# Зачем нужны красно-чёрные деревья?&lt;br /&gt;
# Благодаря какому свойству и почему красно-чёрное дерево является сбалансированным?&lt;br /&gt;
# Нарисуйте полное бинарное дерево поиска высотой 3 с ключами {1, 2, ..., 15}. Сделайте из него красно-чёрные деревья высотой 2, 3 и 4.&lt;br /&gt;
# Нарисуйте красно-чёрные деревья, получающиеся последовательной вставкой элементов 12, 10, 29, 30, 31, 32 в [https://ru.wikipedia.org/wiki/Красно-чёрное_дерево#/media/File:Red-black_tree_example.svg данное дерево]. Для вставки используйте алгоритм вставки из Википедии. Укажите какой именно функцией вы воспользовались.&lt;br /&gt;
# Определим &#039;&#039;&#039;ослабленное красно-чёрное дерево&#039;&#039;&#039; как бинарное дерево поиска, которое удовлетворяет красно-чёрным свойствам 1, 3, 4 и 5. Другими словами, корень может быть как чёрным, так и красным. Рассмотрите ослабленное красно-чёрное дерево T, корень которого красный. Если перекрасить корень дерева T в чёрный, будет ли оно красно-чёрным деревом?&lt;br /&gt;
# Покажите, что самый длинный простой нисходящий путь от вершины x к листу красно-черного дерева имеет длину, не более чем в два раза превышающую кратчайший путь от x к листу-потомку.&lt;br /&gt;
# Чему равно наибольшее возможное количество внутренних узлов в красно-чёрном дереве с чёрной высоты k? А наименьшее возможное количество?&lt;br /&gt;
# Нарисуйте красно-чёрные деревья, получающиеся последовательной вставкой ключей 41, 38, 31, 12, 19, 8 в изначально пустое дерево.&lt;br /&gt;
# Покажите какие деревья будут получаться в результате последовательного удаления ключей в порядке 8, 12, 19, 31, 38, 41.&lt;br /&gt;
&lt;br /&gt;
==(14.05) Конкурентный анализ самоорганизующихся циклов==&lt;br /&gt;
[https://vk.com/doc12518218_390369758 Лекция]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 18 (до 21.05)===&lt;br /&gt;
Все вычисления сопроводите подробными объяснениями о том, почему верно то или иное (не)равенство.&lt;br /&gt;
# Пусть имеется n-элементный список и m поисковых запросов к нему. После каждой операции поиска можно переупорядочить список. Обозначим стоимость последовательности поисков через C. Докажите, что в худшем случае C = Ω(mn).&lt;br /&gt;
#  Обозначим через c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; стоимость i-ого поискового запроса с применением эвристики перемещения в начало, которая включает стоимость поиска элемента в списке и стоимость его перемещения в начало списка путём ряда обменов соседних элементов списка. Покажите, что i-ая операция поиска находит элемент x в списке L с применением эвристики перемещения в начало, то c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = 2 * rank&amp;lt;sub&amp;gt;L&amp;lt;/sub&amp;gt;(x) - 1.&lt;br /&gt;
# Покажите, что c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = 2 * rank&amp;lt;sub&amp;gt;L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) - 1.&lt;br /&gt;
# Покажите, что c*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = rank&amp;lt;sub&amp;gt;L*&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) + t&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;.&lt;br /&gt;
# Докажите, что после одного обмена двух соседних элементов потенциал либо увеличивается на 2, либо уменьшается на 2.&lt;br /&gt;
# Докажите, что rank&amp;lt;sub&amp;gt;L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) = |A| + |B| + 1.&lt;br /&gt;
# Докажите, что rank&amp;lt;sub&amp;gt;L*&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) = |A| + |С| + 1.&lt;br /&gt;
# Покажите, что поиск i-ого элемента приводит к изменению потенциала Ф(L&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;) - Ф(L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;) &amp;lt;= 2 (|A| - |B| + t*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;), где t*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; --- это количество обменов при i-ом поиске.&lt;br /&gt;
# Во сколько раз стоимость С&amp;lt;sub&amp;gt;MFT&amp;lt;/sub&amp;gt;(S) превышает C&amp;lt;sub&amp;gt;OPT&amp;lt;/sub&amp;gt;(S)?&lt;br /&gt;
&lt;br /&gt;
== (18.05) Конечные автоматы ==&lt;br /&gt;
=== Задание 19 (до 25.05) ===&lt;br /&gt;
# Постройте автомат для языка над алфавитом Σ = {0, 1} каждое слово которого содержит хотя бы два нуля. Является ли он детерминированным?&lt;br /&gt;
# Постройте автомат над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5. Является ли он детерминированным?&lt;br /&gt;
# Постройте автомат, который допускает пустой язык (язык в котором нет ни одного слова).&lt;br /&gt;
# Постройте автомат, который допускает все слова над алфавитом Σ.&lt;br /&gt;
# Постройте ДКА над алфавитом Σ = {К, Ж, З}, который допускает слова в которых после К идёт З, после З --- Ж, после Ж --- К.&lt;br /&gt;
# * Постройте ДКА над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5, а число нулей на 3.&lt;br /&gt;
# Постройте НКА для языка над алфавитом Σ = {0, 1, 2, 3}, состоящий из слов, в которых хотя бы одна из последних пяти букв является 1.&lt;br /&gt;
# Постройте НКА над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5, а число нулей на 3.&lt;br /&gt;
# Какие языки допускают автоматы https://yadi.sk/d/fNAHbjCZghERG?&lt;br /&gt;
# Для каждого из автоматов https://yadi.sk/d/fNAHbjCZghERG постройте соответствующий ему ДКА.&lt;br /&gt;
&lt;br /&gt;
== (21.05) Регулярные выражения, КА, их эквивалентность. Лемма о накачке  ==&lt;br /&gt;
=== Задание 20 (до 28.05) ===&lt;br /&gt;
# Напишите регулярное выражение для языка {1, 000, 1010}.&lt;br /&gt;
# Напишите регулярное выражение для языка над алфавитом Σ = {0, 1} каждое слово которого содержит хотя бы два нуля.&lt;br /&gt;
# Напишите регулярное выражение над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5. Является ли он детерминированным?&lt;br /&gt;
# Напишите регулярное выражение, которое допускает пустой язык (язык в котором нет ни одного слова).&lt;br /&gt;
# Напишите регулярное выражение, которое допускает все слова над алфавитом Σ.&lt;br /&gt;
# Напишите регулярное выражение над алфавитом Σ = {К, Ж, З}, который допускает слова в которых после К идёт З, после З --- Ж, после Ж --- К.&lt;br /&gt;
# Напишите регулярное выражение для языка над алфавитом Σ = {0, 1, 2, 3}, состоящий из слов, в которых хотя бы одна из последних пяти букв является 1.&lt;br /&gt;
# * Покажите, что если языки L&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; и L&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; регулярны, то регулярно их пересечение.&lt;br /&gt;
# Покажите, что если язык L регулярен, то регулярно его дополнение (т.е. язык над тем же алфавитом, которому принадлежит слово тогда и только тогда, когда оно НЕ принадлежит L) .&lt;br /&gt;
# Покажите, что если язык L регулярен, то регулярно его обращение L&amp;lt;sub&amp;gt;R&amp;lt;/sub&amp;gt; = {a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; . . . a&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; | a&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; . . . a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; ∈ L}.&lt;/div&gt;</summary>
		<author><name>Kassalanche</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=12808</id>
		<title>Алгоритмы и структуры данных. Подгруппа 105-1</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=12808"/>
		<updated>2015-05-18T05:58:20Z</updated>

		<summary type="html">&lt;p&gt;Kassalanche: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==О курсе==&lt;br /&gt;
[[Алгоритмы_и_структуры_данных|План лекций и список рекомендуемой литературы.]]&lt;br /&gt;
&lt;br /&gt;
[[Алгоритмы_и_структуры_данных._Подгруппа_105-1._FAQ|FAQ.]]&lt;br /&gt;
&lt;br /&gt;
[[Reviewboard|Инструкция по использованию Reviewboard.]]&lt;br /&gt;
&lt;br /&gt;
[[Практические_занятия_по_курсу_ОиМП/C++_check|Style guide.]]&lt;br /&gt;
&lt;br /&gt;
==Итоговая оценка за курс==&lt;br /&gt;
Итоговая оценка (ИО) зависит от&lt;br /&gt;
* оценок за пять больших домашних заданий (БДЗ1, БДЗ2, ..., БДЗ5),&lt;br /&gt;
* оценок за домашние задания (ДЗ1, ДЗ2, ...),&lt;br /&gt;
* оценки за контрольную работу (КР),&lt;br /&gt;
* оценки за экзамен (ЭКЗ),&lt;br /&gt;
и может быть вычислена по формуле:&lt;br /&gt;
 ИО = 0.7 * (0.3 * КР + 0.7 *(ИДЗ1 + ИДЗ2 + ИДЗ3 + ИДЗ4 + ИДЗ5)/5) + 0.3 * ЭКЗ =&lt;br /&gt;
    = 0.21*КР + 0.98*ИДЗ1 + 0.98*ИДЗ2 + 0.98*ИДЗ3 + 0.98*ИДЗ4 + 0.98*ИДЗ5 + 0.3*ЭКЗ,&lt;br /&gt;
где&lt;br /&gt;
 ИДЗi = min (10, 0.7 * БДЗi + 0.4 * &amp;lt;cредняя оценка за ДЗj, прошедшие с предыдущего БДЗ по i-ое&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
==Порядок сдачи домашних работ==&lt;br /&gt;
===Большие домашние работы===&lt;br /&gt;
# Получить OK за задачу в контесте.&lt;br /&gt;
# Залить исходный код на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* На каждую задачу создавайте отдельный запрос на ревью. &lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении суток приходят замечания к коду. &#039;&#039;&#039;Если в течении суток замечаний или Ship It не появилось, проверьте, что вы правильно отправили запрос и, если всё сделано правильно, спросите у семинариста получил ли он запрос.&#039;&#039;&#039;&lt;br /&gt;
# Вы их исправляете, проверяете в контесте, что программа по-прежнему проходит все тесты, заливаете новую версию в Review Board. Штрафов за посылки НЕ будет.&lt;br /&gt;
# Процесс повторяется пока остаются замечания к коду или пока не истёк дедлайн. После закрытия контеста будут ещё одни сутки на доработку замечаний в Review Board.&lt;br /&gt;
# Оценивается только последняя версия работы в Review Board.&lt;br /&gt;
&lt;br /&gt;
===Маленькие домашние работы===&lt;br /&gt;
# Залить решение на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* Желаемые форматы: txt, py, cpp, h. Допускаются любые другие.&lt;br /&gt;
#* На каждую домашнюю работу создавайте отдельный запрос на ревью. Обязательно указывайте номер домашней работы.&lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении неопределенного промежутка времени придут оценки по каждому из заданий.&lt;br /&gt;
&lt;br /&gt;
==Оценивание домашних работ==&lt;br /&gt;
* Все задания предполагаются индивидуальными. Запрещены любые заимствования без ссылки на автора.&lt;br /&gt;
* Решения после установленного дедлайна не принимаются. Дедлайн указан в заголовке каждого задания.&lt;br /&gt;
* Везде, где требуется написать алгоритм, можно использовать любой язык программирования или псевдокод.&lt;br /&gt;
* Там, где требуется построить алгоритм с заданной асимптотикой, приведите обоснование, что полученный алгоритм удовлетворяет этому условию.&lt;br /&gt;
* Эти правила не действуют, если в задании явно оговорено иное.&lt;br /&gt;
&lt;br /&gt;
==Мотивация к изучению алгоритмов. Подсчёт числа операций (12.01)==&lt;br /&gt;
# Числа Фибоначчи. Определение. Примитивный рекурсивный алгоритм вычисления i-ого числа. Оценка числа операций. Анализ причин неэффективности. Алгоритм с запоминанием вычисленных ранее значений. Оценка числа операций. Сравнение с предыдущим. (подробнее: глава 0, страницы 8-10 из книги &amp;lt;&amp;lt;Алгоритмы&amp;gt;&amp;gt;, [[Алгоритмы_и_структуры_данных|см. список рекомендованной литературы]])&lt;br /&gt;
# Задача о ханойской башне. Постановка задачи. Рекурсивный алгоритм. Рекуррентная формула для числа перемещений. Замкнутая формула для числа перемещений (+ доказательство). Доказательство того, что эту задачу нельзя решить используя меньшее число перемещений дисков. ([https://www.dropbox.com/s/t8cbs7ttu4iasvj/algo-0-recursion.pdf?dl=0 Разбор задачи о ханойской башне], автор Сергей Объедков)&lt;br /&gt;
# Сортировка пузырьком. Алгоритм. Подсчёт количество операций сравнения и обмена (swap). Анализ наилучшего и наихудшего случаев ([https://ru.wikipedia.org/wiki/Сортировка_пузырьком Википедия])&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 1 (12.01 - 26.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
Во всех задачах, если не оговорено иного, предполагаем, что работаем с целыми неотрицательными числами. Для первых 7 задач необходимо&lt;br /&gt;
* описать что можно считать наилучшим и наихудшим случаями,&lt;br /&gt;
* для каждого из двух случаев подсчитать отдельно количество операций сравнения и swap (если есть).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Даны три числа, требуется вернуть наименьшее.&lt;br /&gt;
# Даны три числа, требуется отсортировать их.&lt;br /&gt;
# Дана последовательность A из n элементов и число x, требуется найти элемент равный x. Примечание: если таких значений i несколько, вернуть любое; если такого элемента нет, функция должна сообщить об этом.&lt;br /&gt;
# * Дана упорядоченная последовательность A из n элементов и число x, требуется найти такое i, что A[i] равно x. Алгоритм должен быть эффективней, чем в предыдущем пункте и использовать то, что последовательность упорядочена.&lt;br /&gt;
# Дана последовательность из 100 000 чисел от 0 до 100. Напишите эффективный алгоритм сортировки, который бы учитывал специфику входных данных.&lt;br /&gt;
# * Дано 32 битное неотрицательное число. Требуется номер первого ненулевого бит. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения, считая, что числа распределены равномерно.&lt;br /&gt;
# * Даны 32 битные неотрицательные числа m и n. Требуется вывести True, если m &amp;lt; n, иначе False. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения битов, считая, что числа распределены равномерно.&lt;br /&gt;
# Напишите рекурсивную функцию, вычисляющую n-ое число Фибоначчи (как на занятии). Подсчитайте количество рекурсивных вызовов.&lt;br /&gt;
# * Напишите функцию, вычисляющую n-ое число Фибоначчи, у которой число операций — полином от n, и которая использует количество памяти, независящее от n.&lt;br /&gt;
&lt;br /&gt;
==O-символика и стратегия &amp;quot;разделяй и властвуй&amp;quot; (15.01)==&lt;br /&gt;
# Сортировка слиянием. Алгоритм, рекуррентное соотношение для времени сортировки, сложность. Подробнее: [https://dl.dropboxusercontent.com/u/829163/draft.pdf §2.3 Сортировка слиянием (стр. 54)].&lt;br /&gt;
# О-символика. [https://dl.dropboxusercontent.com/u/829163/draft.pdf §0.3 О-символика (стр. 10)].&lt;br /&gt;
# Задача о слиянии m упорядоченных массивов по n элементов. Три алгоритма решения: последовательное слияние, слияние &amp;quot;деревом&amp;quot; (обе функции используют Merge из MergeSort), аналог Merge для m массивов. Анализ сложности каждого из них.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 2 (15.01-29.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
* Во всех задачах, если не оговорено иного, для простоты &#039;&#039;можно&#039;&#039; считать, что n является степенью какого-либо числа, например, степенью двойки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Дана функция F, определённая ниже. Сколько строк она напечатает? Указание: для обоих подпунктов рассмотрите два случая: 1. n является степенью двойки, 2. n не является степенью двойки.&lt;br /&gt;
## Запишите рекуррентное соотношение для числа строк.&lt;br /&gt;
## Решите уравнение, полученное в предыдущем пункте, то есть, выведите замкнутую (нерекуррентную формулу). Для простоты можно считать, что n является степенью двойки.&lt;br /&gt;
# В массиве A размера n записана возрастающая последовательность целых чисел. Постройте алгоритм типа &amp;quot;разделяй и властвуй&amp;quot;, который проверяет, существует ли такой индекс i, что A[i] = i&lt;br /&gt;
## за время O(n),&lt;br /&gt;
## * за время O(log n).&lt;br /&gt;
## Какие случаи для вашего алгоритма являются наихудшими и наилучшими? Какого время работы в лучшем и худшем случаях?&lt;br /&gt;
# Дан бесконечный массив A, первые n элементов которого содержат возрастающую последовательность положительных чисел, а дальше стоят -1. Значение n не дано. Постройте алгоритм, который получает на вход целое число x и находит это x в массиве --- или говорит, что там его нет, &lt;br /&gt;
## за время O(n),&lt;br /&gt;
## за время O(log n).&lt;br /&gt;
# Рассмотрим алгоритм вычисления наибольшего общего делителя (НОД) двух положительных чисел, основанный на методе &amp;quot;разделяй и властвуй&amp;quot;.&lt;br /&gt;
## (задание не оценивается) Прочитайте [https://dl.dropboxusercontent.com/u/829163/draft.pdf §1.2.3 Алгоритм Евклида (стр. 23)].&lt;br /&gt;
## * Докажите, что определение НОД-а, приведённое ниже, корректно.&lt;br /&gt;
## Постройте алгоритм, основанный на этом определении.&lt;br /&gt;
## Какой алгоритм будет быстрее для n-битовых чисел a и b при больших значениях n --- ваш или алгоритм Евклида?&lt;br /&gt;
# * Покажите как за время O(n log n) удалить из массива размера n все дубликаты, то есть оставить каждый элемент в одном экземпляре.&lt;br /&gt;
# * Даны два упорядоченных массива размера m и n. Постройте алгоритм, находящий k-й по величине элемент в объединении этих массивов за время O(log(n+m)). &lt;br /&gt;
&lt;br /&gt;
Функция F(n).&lt;br /&gt;
  если n &amp;gt; 1:&lt;br /&gt;
    напечатать &amp;quot;всё ещё работаю&amp;quot;&lt;br /&gt;
    F(n/2)&lt;br /&gt;
    F(n/2)&lt;br /&gt;
&lt;br /&gt;
Определение НОД-а.&lt;br /&gt;
             2НОД(a/2, b/2), если а и b чётны,&lt;br /&gt;
  НОД(a,b) = НОД(a, b/2), если а нечётно, b чётно,&lt;br /&gt;
             НОД((a-b)/2, b), если а и b нечётны.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;lt;nowiki&amp;gt;Задачи взяты из книги &amp;quot;Алгоритмы&amp;quot;, глава 2 (см. список рекомендованной литературы).&amp;lt;/nowiki&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Сложение и умножение (19.01)==&lt;br /&gt;
# Алгоритм сложения, его сложность (§1.1.1 Сложение*)&lt;br /&gt;
# &amp;quot;Школьный&amp;quot; алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Рекурсивный алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Алгоритм умножения, реализующий стратегию &amp;quot;разделяй и властвуй&amp;quot;, анализ сложности (§2.1 Умножение чисел*)&lt;br /&gt;
 * [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать.]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 3 (19.01 - 2.02)===&lt;br /&gt;
* Во всех задачах для простоты можно считать, что n является степенью какого-либо числа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Найдите произведение чисел 10011011 и 10111010 (в двоичной системе счисления), используя алгоритм умножения чисел, основанный на методе «разделяй и властвуй». Необходимо не только дать ответ, но и привести ход решения.&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 3 рекурсивных вызова для подзадач размера n-1 и комбинирует из них решение исходной задачи за О(n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте три верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 10 рекурсивных вызовов для подзадач размера n/2 и комбинирует из них решение исходной задачи за О(5n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте два верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Докажите, что 3m² + m = O(m²).&lt;br /&gt;
# Докажите, что lg m = O(m/1000), где lg m — это логарифм с двоичным основанием.&lt;br /&gt;
# Докажите, что из равенства f(n) = O(g(n)) не следует, что g(n) = O(f(n)).&lt;br /&gt;
# Докажите, что O(m) содержится в O(m²).&lt;br /&gt;
&lt;br /&gt;
==Решение рекуррентных уравнений (22.01)==&lt;br /&gt;
# Примеры решений рекуррентных уравнений (см. [https://www.dropbox.com/s/6a0r410zjm9qwe7/algo-3-recurrences.pdf?dl=0 конспект]).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 4 (до 14.02)===&lt;br /&gt;
* Нельзя использовать утверждение основной теоремы о решении рекуррентных соотношений.&lt;br /&gt;
* &#039;&#039;Можно&#039;&#039; использовать метод построения дерева рекурсии или подстановку (метод с угадыванием ответа).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Какой из трёх приведённых ниже алгоритмов вы бы предпочли? Обоснуйте свой ответ.&lt;br /&gt;
#* Алгоритм A, решая задачу, производит пять рекурсивных вызовов для подзадач вдвое меньшего размера, после чего строит ответ для исходной задачи за линейное время.&lt;br /&gt;
#* Алгоритм B, решая задачу размера n, делает два рекурсивных вызова для задач размера n − 1, после чего находит ответ за время O(1).&lt;br /&gt;
#* Алгоритм C, решая задачу размера n, рекурсивно решает девять задач размера n/3 и строит ответ за время O(n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Найдите T(n) в замкнутой форме для любых 7 из 10 приведённых ниже рекуррентных соотношений:&lt;br /&gt;
## T(n) ≤ 2T(n/3) + 1;&lt;br /&gt;
## T(n) ≤ 7T(n/7) + n;&lt;br /&gt;
## T(n) ≤ 9T(n/3) + n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 8T(n/2) + n&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 49T(n/25) + n&amp;lt;sup&amp;gt;3/2&amp;lt;/sup&amp;gt;log n;&lt;br /&gt;
## T(n) ≤ T(n − 1) + 2;&lt;br /&gt;
## T(n) ≤ T(n − 1) + n&amp;lt;sup&amp;gt;c&amp;lt;/sup&amp;gt;, где c ≥ 1 –– константа;&lt;br /&gt;
## T(n) ≤ T(n − 1) + c&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;, где c &amp;gt; 1 –– константа;&lt;br /&gt;
## T(n) ≤ 2T(n − 1) + 1;&lt;br /&gt;
## T(n) ≤ T(sqrt(n)) + 1.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №1==&lt;br /&gt;
Необходимо реализовать все 6 задач из [https://official.contest.yandex.ru/contest/1002 контеста]. Каждую задачу можно писать на С++ или Python. На выполнение работы отводится две недели. Каждая задача оценивается в 10/6 балла. Оценка &#039;&#039;может&#039;&#039; быть снижена за плохой код, но не более чем на 25%.&lt;br /&gt;
&lt;br /&gt;
==Бинарное дерево поиска (26.01)==&lt;br /&gt;
# Определение. Пример.&lt;br /&gt;
# Не модифицирующие алгоритмы: поиск (рекурсивный и итеративный алгоритмы), поиск минимума, inordered обход (вывод значений узлов в отсортированном порядке), поиск следующего по возрастанию.&lt;br /&gt;
# Модифицирующие алгоритмы: вставка (рекурсивная реализация), удаление (только идея).&lt;br /&gt;
 [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 13, стр. 248]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 5 (до 16.02)===&lt;br /&gt;
* Для получения максимальной оценки можно выполнить или все задачи без звёздочки, или задачу со звёздочкой. Преподаватель понимает, что реализацию БДП сложно не найти в интернете, но от копипасты не будет никакой пользы. Напротив, самостоятельная реализация очень полезна и приветствуется, даже если не получится выполнить всех пунктов задания.&lt;br /&gt;
* Задачи с двумя звёздочками необязательны.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Нарисуйте бинарные деревья поиска высотой 2, 3, 4, 5 и 6 для множества ключей {1, 4, 5, 10, 16, 17, 21}. Корень дерева имеет высоту 0.&lt;br /&gt;
# &#039;&#039;&#039;Сортировка с использованием БДП.&#039;&#039;&#039;&lt;br /&gt;
## Какова асимптотическая сложность алгоритма вставки элемента в дерево высоты d? Почему? Назовите наилучший и наиухдший случаи.&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который строит БДП в узлах которого стоят элементы данной последовательности. Можно использовать функцию Insert. Назовите наилучший и наихудший случаи. Есть теорема о том, что полученный алгоритм будет работать в среднем случае за время O(n * log n).&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который выводит их в порядке возрастания. Используйте бинарное дерево поиска. Какова в среднем случае сложность этого алгоритма? Назовите наилучший и наихудший случаи. Какова сложность в наихудшем случае?&lt;br /&gt;
# Напишите функцию GetRoot, которой на вход подаётся указатель на произвольный узел дерева, а она возвращает указатель на корень.&lt;br /&gt;
# Напишите процедуру PrintLeafs, которой на вход подаётся указатель на корень дерева, и она печатает листья дерева&lt;br /&gt;
## по возрастанию,&lt;br /&gt;
## по убыванию.&lt;br /&gt;
# ** Альтернативный обход в порядке возрастания бинарного дерева поиска с n узлами (или центрированный (inordered) обход) можно осуществить путём поиска минимального элемента дерева с помощью функции Minimum с последующий n-1 вызовом функции Next. Каково время работы такого алгоритма?&lt;br /&gt;
# * Реализуйте на С++ структуру данных бинарное дерево поиска, [https://yadi.sk/i/gi2SEStreFfSb используя заготовку].&lt;br /&gt;
## Нарисуйте бинарное дерево поиска, которое строится в функции getTreeExample.&lt;br /&gt;
## Реализуйте следующие алгоритмы: &lt;br /&gt;
### поиск минимума, &lt;br /&gt;
### inordered обход (вывод значений узлов в отсортированном порядке),&lt;br /&gt;
### поиск следующего по возрастанию,&lt;br /&gt;
### вставка элемента в дерево,&lt;br /&gt;
### сортировка последовательности с использованием БДП (дан вектор чисел, необходимо вывести их по возрастанию),&lt;br /&gt;
### ** удаление.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Карацубы, Штрассена. Быстрая сортировка (29.01)==&lt;br /&gt;
# Алгоритм Карацубы.&lt;br /&gt;
# Алгоритм Штрассена. [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать Дасгупту и др., §2.5 Умножение матриц]&lt;br /&gt;
# Быстрая сортировка и доказательство того, что в среднем случае она работает за О(n * log n). [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 8 Быстрая сортировка, стр. 148]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 6 (до 18.02)===&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Пусть мы хотим найти двоичное представление десятичного числа 10&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;. Будем считать, что n --- степень двойки (n = 2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt;).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Pwr2Bin(n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть 1010&lt;br /&gt;
    z = ...&lt;br /&gt;
    вернуть Multiply(z, z)&amp;lt;/source&amp;gt;&lt;br /&gt;
Multiply --- функция, перемножающая два n-битовых двоичных числа x и y по алгоритму Карацубы за O(n&amp;lt;sup&amp;gt;log&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;3&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Пусть мы хотим перевести произвольное десятичное число x в записи которого n=2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; чисел в двоичную систему счисления.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Dec2Bin(x, n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть binary[x]&lt;br /&gt;
    разделить x на два десятичных числа xl и xr из n/2 цифр.&lt;br /&gt;
    вернуть ...&amp;lt;/source&amp;gt;&lt;br /&gt;
Здесь binary --- это массив, содержащий двоичное представление десятичных цифр.&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Докажите, что математическое ожидание времени работы алгоритма быстрой сортировки (усреднение по всем вариантам выбора опорного элемента) на любом входе размера n удовлетворяет соотношению: T(n) ≤ O(n) + 1/n * &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt; (T(i-1) + T(n-i)).&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Найдите решение соотношения из предыдущего пункта.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Динамическое программирование (ДП). Первые примеры (02.01)==&lt;br /&gt;
# Нахождение самой длинной возрастающей подпоследовательности.&lt;br /&gt;
# Нахождение редакционного расстояния (или редакционной стоимости, расстояния Левенштейна).&lt;br /&gt;
# Нахождение представителя большинства.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 7 (до 20.02)===&lt;br /&gt;
* В этом задании везде, где требуется реализовать алгоритм, необходимо привести код на любом языке программирования.&lt;br /&gt;
* Для получения максимальной оценки нужно решить все задачи без звёздочек. Одна решённая задача со звёздочкой заменяет одну задачу без звёздочки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения редакционного расстояния (алгоритм Вагнера — Фишера). Например, редакционное расстояние между словами &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равно 6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения длины наибольшей общей подстроки. Например, длина наибольшей общей подстроки &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равна 8 (&amp;quot;antholog&amp;quot;). Чем больше это значение, тем схожей строки.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Предположим теперь, что сравниваемые строки состоят из символов A, С, G и T; за удаление или вставку мы платим -5; за замену буквы x на y платим w[x, y], где x, y принадлежат множеству {A, С, G, T}, a w — это матрица весов:&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
!-!! A!! G!! C!! T&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! A&lt;br /&gt;
|10||-1||-3||-4&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
!G&lt;br /&gt;
||-1||7||-5||-3&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! C&lt;br /&gt;
||-3||-5||9||0&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! T&lt;br /&gt;
||-4||-3||0||8&lt;br /&gt;
|}&lt;br /&gt;
Тогда выравнивание:&lt;br /&gt;
 AGACTAGTTAC&lt;br /&gt;
 CGA‒‒‒GACGT&lt;br /&gt;
будет иметь следующую оценку:&lt;br /&gt;
 w[A,C] + w[G,G] + w[A,A] + 3*(-5) + w[G,G] + w[T,A] + w[T,C] + w[A,G] + w[C,T] = -3 + 7 + 10 - 3*5 + 7 + (-4) + 0 + (-1) + 0 = 1.&lt;br /&gt;
&lt;br /&gt;
Напишите алгоритм, который находит максимальную стоимость всех возможных выравниваний. Верно ли, что чем больше это значение, тем непохожей строки?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как давно один народ отделился от другого? Кто похожей — итальянец и китаец или якут и эфиоп? На эти вопросы можно отвечать с разных точек зрения — культурной, исторической, лингвистической, ... В последние же годы человечество научилось секвенировать геном, что позволило исследовать этот вопрос с точки зрения генетики. Секвенирование генома — это процесс записи ДНК в виде нуклеотидной последовательности, которая представляет собой последовательность из четырёх символов — A, С, G и T. Существуют базы, которые хранят генетическую информацию о людях из разных стран и континентов, например, [http://www.mtdb.igp.uu.se/ http://www.mtdb.igp.uu.se/ → Download mtDNA sequences]. Чем больше сходство между геномами, тем сильнее родственные связи между их обладателями. Используя решение предыдущего пункта, выполните задания:&lt;br /&gt;
# Определите, кто похожей — итальянец и китаец или якут и эфиоп?&lt;br /&gt;
# Найдите нескольких похожих и нескольких непохожих народностей.&lt;br /&gt;
# * Выберите одну народность. Найдите самых похожих и самых непохожих на неё.&lt;br /&gt;
# * Найдите самые похожие и самые непохожие народности.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Задача о разрезании стержня (05.01)==&lt;br /&gt;
# Постановка задачи.&lt;br /&gt;
# Решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Решение с нахождением максимума по p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Восходящий алгоритм с запоминанием. Вывод длин кусочков стержня. Оценка сложности.&lt;br /&gt;
# Нисходящий алгоритм с запоминанием. Оценка сложности.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.1 Разрезание стержня, стр. 393]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 8 (до 22.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Решая задачу о разрезании стержня мы вначале построили рекурсивное решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt; для всех 1 ≤ i &amp;lt; n. Его сложность описывалась рекуррентной формулой T(n) = n + &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n-1&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt;(T(i) + T(n-i)), T(1) = 1.&lt;br /&gt;
# Объясните эту формулу.&lt;br /&gt;
# Покажите с помощью метода подстановок, что T(n) ≤ 2&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Покажите с помощью контрпримера, что описанная далее жадная стратегия не всегда определяет оптимальный способ разрезания стержня. Определим плотность стержня длиной i как p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;/i, то есть как стоимость единицы его длины. Жадная стратегия для стержня длиной n отрезает от стержня первую часть длиной i, где 1 ≤ i ≤ n, имеющую максимальную плотность. Затем та же жадная стратегия применяется к оставшейся части длиной n-i.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Рассмотрим модификацию задачи разрезания стержня, в которой в дополнение к цене p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; каждого стержня добавляется фиксированная цена разреза c. Теперь прибыль, связанная с решением, представляет собой сумму цен частей стержня минус стоимость разрезов. Разработайте алгоритм динамического программирования для этой модифицированной задачи.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Непрерывным участком называется группа подряд идущих элементов. Например, для последовательности&lt;br /&gt;
 5, 15, −30, 10, −5, 40, 10&lt;br /&gt;
элементы 15, −30, 10 образуют непрерывный участок, а 5, 15, 40 -- нет. Постройте линейный алгоритм для следующей задачи:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Вход: список чисел a1, a2, ... ‌, an.&lt;br /&gt;
Выход: непрерывный участок с максимальной суммой (сумма участка нулевой длины равна нулю).&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Для приведённого примера ответом будет 10, −5, 40, 10 с суммой 55. Какова сложность алгоритма? Почему?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Надо заплатить v рублей, имея купюры в x1, x2, ‌..., xn рублей (купюр каждого типа сколько угодно). Это не всегда возможно (скажем, купюрами в&lt;br /&gt;
10 и 25 рублей можно заплатить 45 рублей, но не 47 и не 15). Постройте основанный на методе динамического программирования алгоритм со временем работы O(nv), выясняющий, возможна ли уплата.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как решить предыдущую задачу, если каждая купюра имеется в единственном экземпляре? (Например, купюрами в 1, 5, 10, 20 рублей можно заплатить 16 = 1 + 5 + 10 и 31 = 1 + 10 + 20 рублей, но не 40 (не хватит денег). Время работы алгоритма по-прежнему O(nv).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Ещё один вариант той же задачи: купюр каждого типа сколько угодно, но всего разрешается использовать не более k купюр. (Например, если есть купюры в 5 и 10 рублей, а k = 6, то 55 разменять можно, а 65 –– нет).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Перемножение цепочки матриц. Оптимальное бинарное дерево поиска (начало) (09.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о перемножении цепочки матриц. Постановка задачи.Пример. Нисходящий алгоритм.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.2 Перемножение цепочки матриц, стр. 403]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 9 (до 24.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Найдите оптимальную расстановку скобок в произведении последовательности матриц, размерности которых равны 5×10, 10×3, 3×12, 12×5, 5×50, 50×6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Напишите восходящий алгоритм для поиска оптимальной расстановки скобок.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Расстановка пробелов. Оптимальное бинарное дерево поиска (середина) (12.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о расстановке пробелов. Постановка задачи. Решения для трёх случаев: 1. нужно вернуть можно ли разбить текст на слова; 2. вернуть разбивку на слова; 3. слова встречаются не равновероятно, вернуть наиболее вероятную разбивку на слова.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи. Вывод математического ожидания времени поиска.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Праздничное домашнее задание 10 (до 02.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[&amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;,&amp;quot;, &amp;quot;.&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;,&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;.&amp;quot;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Подсказка:&#039;&#039;&#039; разбейте текст на слова из списка и посмотрите на азбуку Морзе.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Способы представления графов в памяти (16.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Разбор ошибок в домашнем задании.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Графы. Способы представления графов в памяти (матрица смежности, список рёбер, список соседей (список смежностей), матрица инцидентности). Зависимость сложности алгоритмов от способа представления.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §22.1 Представление графов, стр. 626]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 11 (до 02.03)===&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача A.]&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача B.]&lt;br /&gt;
# Нарисуйте неориентированный граф с 5 вершинами и 8 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Нарисуйте ориентированный граф с 4 вершинами и 3 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Дан ориентированный граф. &#039;&#039;Исходящая степень вершины v&#039;&#039; --- это количество исходящих из неё рёбер, &#039;&#039;входящая степень v&#039;&#039; --- это количество рёбер входящих в  v. Имеется представление ориентированного графа с использование списка соседей. Как долго будут вычисляться исходящие степени всех вершин графа? А входящие степени?&lt;br /&gt;
# Дан граф G = (V, E). Какие из рассмотренных способов хранения графов используют меньше всего памяти для хранения G и почему? Указание: рассмотрите случаи |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;lt; |E| и |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;gt; |E|.&lt;br /&gt;
# Пусть C --- это матрица смежности графа G.&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
# Пусть B --- это матрица инцидентности ориентированного графа G. Как связаны элементы матрицы BB&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
&lt;br /&gt;
==Реализация поиска в глубину (19.02)==&lt;br /&gt;
# Реализация поиска в глубину и смежных задач.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 12 (до 5.03)===&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Выберите любой способ хранения графа. Реализуйте поиск в глубину.&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Напишите алгоритм, который возвращает данные о том, какие вершины лежат в одной компоненте связности.&lt;br /&gt;
# &#039;&#039;(любой ЯП или псевдокод)&#039;&#039; Напишите алгоритм проверки сильной связности ориентированного графа. Какова его сложность?&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №2==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
Необходимо реализовать 3 задачи из [https://official.contest.yandex.ru/contest/1085 контеста], см. [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing распределение задач]. Каждую задачу можно написать на С++ или Python. На выполнение работы отводится две недели (см. время окончания контеста). [https://official.contest.yandex.ru/contest/1123 Дорешивание.]&lt;br /&gt;
&lt;br /&gt;
==ДП и графы (26.02)==&lt;br /&gt;
==ДП и графы (02.03)==&lt;br /&gt;
==Жадные алгоритмы (12.03)==&lt;br /&gt;
===Домашнее задание 13 (до 23.03)===&lt;br /&gt;
# Вася хочет купить по одной акции каждой компании. Все акции стоят одинаково, но дорожают по-разному. Каждый месяц акция i-ой компании дорожает в r_i раз. В один месяц можно купить только одну акцию.&lt;br /&gt;
## Напишите алгоритм, который выводит оптимальную последовательность покупок (такую, что на покупку всех акций потратится меньше денег).&lt;br /&gt;
## Докажите корректность алгоритма, то есть докажите, что последовательность покупок, которую выводит ваш алгоритм, оптимальна.&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список, очередь (16.03)==&lt;br /&gt;
# Реализация линейного двусвязного списка (С++).&lt;br /&gt;
# Реализация очереди ограниченной длины на базе вектора (С++).&lt;br /&gt;
# Реализация очереди на базе списка (С++).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14 (до 23.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте (на С++) структуру данных Стек. У стека должно быть три операции:&lt;br /&gt;
* push --- положить элемент на вершину стека;&lt;br /&gt;
* pop --- удалить верхний элемент;&lt;br /&gt;
* front --- вернуть значение верхнего элемента.&lt;br /&gt;
Оцените время работы каждой функции.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список (19.03)==&lt;br /&gt;
===Домашнее задание 13* (до 30.03)===&lt;br /&gt;
#Для приведённой реализации класса List (https://yadi.sk/i/c5r_79WdfMyNS).&lt;br /&gt;
## Допишите print, push_back и push_front.&lt;br /&gt;
## В функции insert_after и delete_node вставьте необходимые проверки так, чтобы они работали для крайних случаев.&lt;br /&gt;
## Напишите main в котором&lt;br /&gt;
### создаётся объект класса List, &lt;br /&gt;
### заполняется элементами с помощью функций push_back, push_front и insert_after и&lt;br /&gt;
### удаляется i-ый элемент.&lt;br /&gt;
&lt;br /&gt;
==Повторение (30.03)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Для данных пар функций выясните их связь в терминах O-, o-, Ω-, ω-, Θ-обозначений. Поставьте галочку в клетке с Ω, если f(x) = Ω(g(x)) и прочерк, если равенства нет. [https://ru.wikipedia.org/wiki/«O»_большое_и_«o»_малое#.D0.94.D1.80.D1.83.D0.B3.D0.B8.D0.B5_.D0.BF.D0.BE.D0.B4.D0.BE.D0.B1.D0.BD.D1.8B.D0.B5_.D0.BE.D0.B1.D0.BE.D0.B7.D0.BD.D0.B0.D1.87.D0.B5.D0.BD.D0.B8.D1.8F Википедия]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! f(x)!! g(x)!! O!! o!! Ω!! ω!! Θ&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! 2^100&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n * log(n)&lt;br /&gt;
! 2^100 * n * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n&lt;br /&gt;
! 2^100 * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n!&lt;br /&gt;
! 2^(2015n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n*2^n&lt;br /&gt;
! 3^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 5^n&lt;br /&gt;
! 5^(n+1)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n + n^2 + n^3 + ... + n^1000&lt;br /&gt;
! 7^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм Quickselect нахождения k-ого элемента по возрастанию: http://en.wikipedia.org/wiki/Quickselect&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;На улице стоит ряд домов. В каждом из домов лежит сколько-то денег. Вор хочет обокрасть дома на переулке. Он не может обокрасть два соседних дома, потому что хозяин дома, который он обокрал, сразу предупредит соседей. Нужно найти, какую максимальную сумму вор может украсть с переулка. На вход программы подается массив неотрицательных целых чисел - количество долларов в доме с номером i. Соседние дома в массиве представлены соседними элементами. Например, пусть задан массив { 1, 4, 5 } - тогда вор максимум может украсть $6, обокрав дома 1 и 3. Пусть задан массив { 1, 7, 2 } - тогда вор максимум может украсть $7, обокрав дом 2.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Алфавит из всех маленьких латинских букв и пробела закодирован числами следующим способом:&lt;br /&gt;
  &#039;a&#039; -&amp;gt; 1&lt;br /&gt;
  &#039;b&#039; -&amp;gt; 2&lt;br /&gt;
  &#039;c&#039; -&amp;gt; 3&lt;br /&gt;
  ...&lt;br /&gt;
  &#039;z&#039; -&amp;gt; 26&lt;br /&gt;
  &#039; &#039; -&amp;gt; 27&lt;br /&gt;
На вход программы подается строка из цифр. Нужно посчитать, сколькими способами можно раскодировать эту строку.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Дан граф, заданный матрицей смежности. Вывести пары вершин между которыми нет пути.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Повторение (02.04) ==&lt;br /&gt;
Решали и разбирали первые 4 задачи из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14* (до 11.03)===&lt;br /&gt;
Решите любые две задачи (подпункты НЕ считаются отдельными задачами) с предыдущей пары (Повторение (30.03)).&lt;br /&gt;
&lt;br /&gt;
== Повторение (06.04) ==&lt;br /&gt;
Будем решать вторую половину задач из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 15 (до 16.04)===&lt;br /&gt;
# Приведите пример графа, который содержит отрицательные рёбра, не содержит циклов отрицательного веса и для которого алгоритм Дейкстры возвращает неверный результат.&lt;br /&gt;
# Используется ли в алгоритме Дейкстры то, что веса рёбер неотрицательны? Если &amp;quot;да&amp;quot;, то где именно?&lt;br /&gt;
# Пусть граф содержит рёбра с весами &amp;gt;= -100. Если прибавить к каждому ребру 101 и при помощи алгоритма Дейкстры найти кратчайшие пути. Будут ли эти пути кратчайшими в исходном графе? Почему?&lt;br /&gt;
&lt;br /&gt;
== Повторение (07.04) ==&lt;br /&gt;
&#039;&#039;&#039;Решение рекуррентных соотношений&#039;&#039;&#039;&lt;br /&gt;
# Решите уравнение: T(n) = 4*T(n/2) + O(n^2) с базой T(1) = O(1)&lt;br /&gt;
## Используя основную теорему.&lt;br /&gt;
## Используя дерево рекурсий.&lt;br /&gt;
## Методом подстановки.&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2)) + n является \Theta(n lg n).&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2) + 17) + n является \Theta(n lg n).&lt;br /&gt;
# Решите уравнения, считая, что T(1) = O(1):&lt;br /&gt;
## T(n) = T(n-1) + n&lt;br /&gt;
## T(n) = 2*T(floor(sqrt(n))) + lg n. Указание: попробуйте использовать замену переменных.&lt;br /&gt;
## T(n) = 3*T(sqrt(n)) + lg n&lt;br /&gt;
# Дайте верхнюю и нижнюю оценки функции T(n). Постарайтесь, чтобы оценки были как можно более точные&lt;br /&gt;
## T(n) = 4T(n/3) + n*lg(n)&lt;br /&gt;
## T(n) = 3T(n/3) + n/lg(n)&lt;br /&gt;
## T(n) = 4T(n/2) + n^2*sqrt(n)&lt;br /&gt;
## T(n) = T(n/2) + T(n/4) + T(n/8) + n&lt;br /&gt;
## T(n) = T(n-1) + 1/n&lt;br /&gt;
## T(n) = T(n-2) + 1/lg(n)&lt;br /&gt;
## T(n) = sqrt(n) * T(sqrt(n)) + n&lt;br /&gt;
&#039;&#039;&#039;Анализ и построение алгоритмов&#039;&#039;&#039;&lt;br /&gt;
# Числа Фибоначчи F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; можно выразить через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, используя матрицу: https://yadi.sk/i/Pm_aNzHCforFU. &lt;br /&gt;
## Покажите как вычислить F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;.&lt;br /&gt;
## Как вычислить F&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;n+1&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;?&lt;br /&gt;
## Напишите алгоритм.&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
## Ускорьте его так, чтобы он работал за O(log n).&lt;br /&gt;
# Дана последовательность символов. Какое минимальное количество символов нужно удалить из неё, чтобы получить палиндром?&lt;br /&gt;
## Напишите алгоритм (на псевдокоде или на любом языке программирования).&lt;br /&gt;
## Оцените время работы алгоритма.&lt;br /&gt;
# Какую структуру данных вы бы использовали для реализации упорядоченного множества (http://neerc.ifmo.ru/wiki/index.php?title=Упорядоченное_множество)? Какая будет сложность каждой из операций над множеством?&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 16 (до 20.04)===&lt;br /&gt;
# Решите 6 задач из первой части и 6 из второй. (Укажите какие именно.) Каждый из подпунктов является отдельной задачей.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм и теорема Форда-Фалкерсона (16.04)==&lt;br /&gt;
# Базовые определения (пропускные способности, сток, исток и пр.). Пример. &lt;br /&gt;
# Ограничения на поток (сохранение и что меньше пропускных способностей).&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, пример работы&lt;br /&gt;
# Разрез, определение, пример.&lt;br /&gt;
# Утверждение: максимальный поток &amp;lt;= любого разреза.&lt;br /&gt;
# Теорема Форда-Фалкерсона (с доказательством).&lt;br /&gt;
# Пример на котором алгоритм Форда-Фалкерсонаработает работает очень долго при неудачном выборе путей.&lt;br /&gt;
# Сложность алгоритма Форда-Фалкерсона.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №3==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
В [https://official.contest.yandex.ru/contest/1196 домашнем задании] пять задач. Они разделены на два варианта, помеченные римскими цифрами I и II. Свой вариант нужно узнать [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing здесь на вкладке HW3]. Третья задача — общая для двух вариантов; ее решение необходимо снабдить доказательством корректности алгоритма. На выполнение задания дается примерно 2 недели (см. точное время окончания в контесте). Каждую задачу можно написать на С++ или Python.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Форда-Фалкерсона и Эдмондса-Карпа (20.04)==&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, напоминание: базовые определения, пример работы, пример на котором алгоритм работает долго, сложность.&lt;br /&gt;
# Алгоритм Эдмодса-Карпа. Доказательство асимптотики времени работы.&lt;br /&gt;
&lt;br /&gt;
==(23.04)==&lt;br /&gt;
&lt;br /&gt;
==(11.05) Красно-чёрные деревья==&lt;br /&gt;
[https://ru.wikipedia.org/wiki/Красно-чёрное_дерево Красно-чёрное дерево]&lt;br /&gt;
===Домашнее задание 17 (до 18.05)===&lt;br /&gt;
# Зачем нужны красно-чёрные деревья?&lt;br /&gt;
# Благодаря какому свойству и почему красно-чёрное дерево является сбалансированным?&lt;br /&gt;
# Нарисуйте полное бинарное дерево поиска высотой 3 с ключами {1, 2, ..., 15}. Сделайте из него красно-чёрные деревья высотой 2, 3 и 4.&lt;br /&gt;
# Нарисуйте красно-чёрные деревья, получающиеся последовательной вставкой элементов 12, 10, 29, 30, 31, 32 в [https://ru.wikipedia.org/wiki/Красно-чёрное_дерево#/media/File:Red-black_tree_example.svg данное дерево]. Для вставки используйте алгоритм вставки из Википедии. Укажите какой именно функцией вы воспользовались.&lt;br /&gt;
# Определим &#039;&#039;&#039;ослабленное красно-чёрное дерево&#039;&#039;&#039; как бинарное дерево поиска, которое удовлетворяет красно-чёрным свойствам 1, 3, 4 и 5. Другими словами, корень может быть как чёрным, так и красным. Рассмотрите ослабленное красно-чёрное дерево T, корень которого красный. Если перекрасить корень дерева T в чёрный, будет ли оно красно-чёрным деревом?&lt;br /&gt;
# Покажите, что самый длинный простой нисходящий путь от вершины x к листу красно-черного дерева имеет длину, не более чем в два раза превышающую кратчайший путь от x к листу-потомку.&lt;br /&gt;
# Чему равно наибольшее возможное количество внутренних узлов в красно-чёрном дереве с чёрной высоты k? А наименьшее возможное количество?&lt;br /&gt;
# Нарисуйте красно-чёрные деревья, получающиеся последовательной вставкой ключей 41, 38, 31, 12, 19, 8 в изначально пустое дерево.&lt;br /&gt;
# Покажите какие деревья будут получаться в результате последовательного удаления ключей в порядке 8, 12, 19, 31, 38, 41.&lt;br /&gt;
&lt;br /&gt;
==(14.05) Конкурентный анализ самоорганизующихся циклов==&lt;br /&gt;
[https://vk.com/doc12518218_390369758 Лекция]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 18 (до 21.05)===&lt;br /&gt;
Все вычисления сопроводите подробными объяснениями о том, почему верно то или иное (не)равенство.&lt;br /&gt;
# Пусть имеется n-элементный список и m поисковых запросов к нему. После каждой операции поиска можно переупорядочить список. Обозначим стоимость последовательности поисков через C. Докажите, что в худшем случае C = Ω(mn).&lt;br /&gt;
#  Обозначим через c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; стоимость i-ого поискового запроса с применением эвристики перемещения в начало, которая включает стоимость поиска элемента в списке и стоимость его перемещения в начало списка путём ряда обменов соседних элементов списка. Покажите, что i-ая операция поиска находит элемент x в списке L с применением эвристики перемещения в начало, то c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = 2 * rank&amp;lt;sub&amp;gt;L&amp;lt;/sub&amp;gt;(x) - 1.&lt;br /&gt;
# Покажите, что c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = 2 * rank&amp;lt;sub&amp;gt;L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) - 1.&lt;br /&gt;
# Покажите, что c*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = rank&amp;lt;sub&amp;gt;L*&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) + t&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;.&lt;br /&gt;
# Докажите, что после одного обмена двух соседних элементов потенциал либо увеличивается на 2, либо уменьшается на 2.&lt;br /&gt;
# Докажите, что rank&amp;lt;sub&amp;gt;L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) = |A| + |B| + 1.&lt;br /&gt;
# Докажите, что rank&amp;lt;sub&amp;gt;L*&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) = |A| + |С| + 1.&lt;br /&gt;
# Покажите, что поиск i-ого элемента приводит к изменению потенциала Ф(L&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;) - Ф(L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;) &amp;lt;= 2 (|A| - |B| + t*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;), где t*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; --- это количество обменов при i-ом поиске.&lt;br /&gt;
# Во сколько раз стоимость С&amp;lt;sub&amp;gt;MFT&amp;lt;/sub&amp;gt;(S) превышает C&amp;lt;sub&amp;gt;OPT&amp;lt;/sub&amp;gt;(S)?&lt;br /&gt;
&lt;br /&gt;
== (18.05) Конечные автоматы ==&lt;br /&gt;
=== Задание 19 (до 25.05) ===&lt;br /&gt;
# Постройте автомат для языка над алфавитом Σ = {0, 1} каждое слово которого содержит хотя бы два нуля. Является ли он детерминированным?&lt;br /&gt;
# Постройте автомат над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5. Является ли он детерминированным?&lt;br /&gt;
# Постройте автомат, который допускает пустой язык (язык в котором нет ни одного слова).&lt;br /&gt;
# Постройте автомат, который допускает все слова над алфавитом Σ.&lt;br /&gt;
# Постройте ДКА над алфавитом Σ = {К, Ж, З}, который допускает слова в которых после К идёт З, после З --- Ж, после Ж --- К.&lt;br /&gt;
# * Постройте ДКА над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5, а число нулей на 3.&lt;br /&gt;
# Постройте НКА для языка над алфавитом Σ = {0, 1, 2, 3}, состоящий из слов, в которых хотя бы одна из последних пяти букв является 1.&lt;br /&gt;
# Постройте НКА над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5, а число нулей на 3.&lt;br /&gt;
# Какие языки допускают автоматы https://yadi.sk/d/fNAHbjCZghERG?&lt;br /&gt;
# Для каждого из автоматов https://yadi.sk/d/fNAHbjCZghERG постройте соответствующий ему ДКА.&lt;/div&gt;</summary>
		<author><name>Kassalanche</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=12807</id>
		<title>Алгоритмы и структуры данных. Подгруппа 105-1</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=12807"/>
		<updated>2015-05-18T05:58:06Z</updated>

		<summary type="html">&lt;p&gt;Kassalanche: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==О курсе==&lt;br /&gt;
[[Алгоритмы_и_структуры_данных|План лекций и список рекомендуемой литературы.]]&lt;br /&gt;
&lt;br /&gt;
[[Алгоритмы_и_структуры_данных._Подгруппа_105-1._FAQ|FAQ.]]&lt;br /&gt;
&lt;br /&gt;
[[Reviewboard|Инструкция по использованию Reviewboard.]]&lt;br /&gt;
&lt;br /&gt;
[[Практические_занятия_по_курсу_ОиМП/C++_check|Style guide.]]&lt;br /&gt;
&lt;br /&gt;
==Итоговая оценка за курс==&lt;br /&gt;
Итоговая оценка (ИО) зависит от&lt;br /&gt;
* оценок за пять больших домашних заданий (БДЗ1, БДЗ2, ..., БДЗ5),&lt;br /&gt;
* оценок за домашние задания (ДЗ1, ДЗ2, ...),&lt;br /&gt;
* оценки за контрольную работу (КР),&lt;br /&gt;
* оценки за экзамен (ЭКЗ),&lt;br /&gt;
и может быть вычислена по формуле:&lt;br /&gt;
 ИО = 0.7 * (0.3 * КР + 0.7 *(ИДЗ1 + ИДЗ2 + ИДЗ3 + ИДЗ4 + ИДЗ5)/5) + 0.3 * ЭКЗ =&lt;br /&gt;
    = 0.21*КР + 0.98*ИДЗ1 + 0.98*ИДЗ2 + 0.98*ИДЗ3 + 0.98*ИДЗ4 + 0.98*ИДЗ5 + 0.3*ЭКЗ,&lt;br /&gt;
где&lt;br /&gt;
 ИДЗi = min (10, 0.7 * БДЗi + 0.4 * &amp;lt;cредняя оценка за ДЗj, прошедшие с предыдущего БДЗ по i-ое&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
==Порядок сдачи домашних работ==&lt;br /&gt;
===Большие домашние работы===&lt;br /&gt;
# Получить OK за задачу в контесте.&lt;br /&gt;
# Залить исходный код на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* На каждую задачу создавайте отдельный запрос на ревью. &lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении суток приходят замечания к коду. &#039;&#039;&#039;Если в течении суток замечаний или Ship It не появилось, проверьте, что вы правильно отправили запрос и, если всё сделано правильно, спросите у семинариста получил ли он запрос.&#039;&#039;&#039;&lt;br /&gt;
# Вы их исправляете, проверяете в контесте, что программа по-прежнему проходит все тесты, заливаете новую версию в Review Board. Штрафов за посылки НЕ будет.&lt;br /&gt;
# Процесс повторяется пока остаются замечания к коду или пока не истёк дедлайн. После закрытия контеста будут ещё одни сутки на доработку замечаний в Review Board.&lt;br /&gt;
# Оценивается только последняя версия работы в Review Board.&lt;br /&gt;
&lt;br /&gt;
===Маленькие домашние работы===&lt;br /&gt;
# Залить решение на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* Желаемые форматы: txt, py, cpp, h. Допускаются любые другие.&lt;br /&gt;
#* На каждую домашнюю работу создавайте отдельный запрос на ревью. Обязательно указывайте номер домашней работы.&lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении неопределенного промежутка времени придут оценки по каждому из заданий.&lt;br /&gt;
&lt;br /&gt;
==Оценивание домашних работ==&lt;br /&gt;
* Все задания предполагаются индивидуальными. Запрещены любые заимствования без ссылки на автора.&lt;br /&gt;
* Решения после установленного дедлайна не принимаются. Дедлайн указан в заголовке каждого задания.&lt;br /&gt;
* Везде, где требуется написать алгоритм, можно использовать любой язык программирования или псевдокод.&lt;br /&gt;
* Там, где требуется построить алгоритм с заданной асимптотикой, приведите обоснование, что полученный алгоритм удовлетворяет этому условию.&lt;br /&gt;
* Эти правила не действуют, если в задании явно оговорено иное.&lt;br /&gt;
&lt;br /&gt;
==Мотивация к изучению алгоритмов. Подсчёт числа операций (12.01)==&lt;br /&gt;
# Числа Фибоначчи. Определение. Примитивный рекурсивный алгоритм вычисления i-ого числа. Оценка числа операций. Анализ причин неэффективности. Алгоритм с запоминанием вычисленных ранее значений. Оценка числа операций. Сравнение с предыдущим. (подробнее: глава 0, страницы 8-10 из книги &amp;lt;&amp;lt;Алгоритмы&amp;gt;&amp;gt;, [[Алгоритмы_и_структуры_данных|см. список рекомендованной литературы]])&lt;br /&gt;
# Задача о ханойской башне. Постановка задачи. Рекурсивный алгоритм. Рекуррентная формула для числа перемещений. Замкнутая формула для числа перемещений (+ доказательство). Доказательство того, что эту задачу нельзя решить используя меньшее число перемещений дисков. ([https://www.dropbox.com/s/t8cbs7ttu4iasvj/algo-0-recursion.pdf?dl=0 Разбор задачи о ханойской башне], автор Сергей Объедков)&lt;br /&gt;
# Сортировка пузырьком. Алгоритм. Подсчёт количество операций сравнения и обмена (swap). Анализ наилучшего и наихудшего случаев ([https://ru.wikipedia.org/wiki/Сортировка_пузырьком Википедия])&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 1 (12.01 - 26.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
Во всех задачах, если не оговорено иного, предполагаем, что работаем с целыми неотрицательными числами. Для первых 7 задач необходимо&lt;br /&gt;
* описать что можно считать наилучшим и наихудшим случаями,&lt;br /&gt;
* для каждого из двух случаев подсчитать отдельно количество операций сравнения и swap (если есть).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Даны три числа, требуется вернуть наименьшее.&lt;br /&gt;
# Даны три числа, требуется отсортировать их.&lt;br /&gt;
# Дана последовательность A из n элементов и число x, требуется найти элемент равный x. Примечание: если таких значений i несколько, вернуть любое; если такого элемента нет, функция должна сообщить об этом.&lt;br /&gt;
# * Дана упорядоченная последовательность A из n элементов и число x, требуется найти такое i, что A[i] равно x. Алгоритм должен быть эффективней, чем в предыдущем пункте и использовать то, что последовательность упорядочена.&lt;br /&gt;
# Дана последовательность из 100 000 чисел от 0 до 100. Напишите эффективный алгоритм сортировки, который бы учитывал специфику входных данных.&lt;br /&gt;
# * Дано 32 битное неотрицательное число. Требуется номер первого ненулевого бит. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения, считая, что числа распределены равномерно.&lt;br /&gt;
# * Даны 32 битные неотрицательные числа m и n. Требуется вывести True, если m &amp;lt; n, иначе False. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения битов, считая, что числа распределены равномерно.&lt;br /&gt;
# Напишите рекурсивную функцию, вычисляющую n-ое число Фибоначчи (как на занятии). Подсчитайте количество рекурсивных вызовов.&lt;br /&gt;
# * Напишите функцию, вычисляющую n-ое число Фибоначчи, у которой число операций — полином от n, и которая использует количество памяти, независящее от n.&lt;br /&gt;
&lt;br /&gt;
==O-символика и стратегия &amp;quot;разделяй и властвуй&amp;quot; (15.01)==&lt;br /&gt;
# Сортировка слиянием. Алгоритм, рекуррентное соотношение для времени сортировки, сложность. Подробнее: [https://dl.dropboxusercontent.com/u/829163/draft.pdf §2.3 Сортировка слиянием (стр. 54)].&lt;br /&gt;
# О-символика. [https://dl.dropboxusercontent.com/u/829163/draft.pdf §0.3 О-символика (стр. 10)].&lt;br /&gt;
# Задача о слиянии m упорядоченных массивов по n элементов. Три алгоритма решения: последовательное слияние, слияние &amp;quot;деревом&amp;quot; (обе функции используют Merge из MergeSort), аналог Merge для m массивов. Анализ сложности каждого из них.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 2 (15.01-29.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
* Во всех задачах, если не оговорено иного, для простоты &#039;&#039;можно&#039;&#039; считать, что n является степенью какого-либо числа, например, степенью двойки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Дана функция F, определённая ниже. Сколько строк она напечатает? Указание: для обоих подпунктов рассмотрите два случая: 1. n является степенью двойки, 2. n не является степенью двойки.&lt;br /&gt;
## Запишите рекуррентное соотношение для числа строк.&lt;br /&gt;
## Решите уравнение, полученное в предыдущем пункте, то есть, выведите замкнутую (нерекуррентную формулу). Для простоты можно считать, что n является степенью двойки.&lt;br /&gt;
# В массиве A размера n записана возрастающая последовательность целых чисел. Постройте алгоритм типа &amp;quot;разделяй и властвуй&amp;quot;, который проверяет, существует ли такой индекс i, что A[i] = i&lt;br /&gt;
## за время O(n),&lt;br /&gt;
## * за время O(log n).&lt;br /&gt;
## Какие случаи для вашего алгоритма являются наихудшими и наилучшими? Какого время работы в лучшем и худшем случаях?&lt;br /&gt;
# Дан бесконечный массив A, первые n элементов которого содержат возрастающую последовательность положительных чисел, а дальше стоят -1. Значение n не дано. Постройте алгоритм, который получает на вход целое число x и находит это x в массиве --- или говорит, что там его нет, &lt;br /&gt;
## за время O(n),&lt;br /&gt;
## за время O(log n).&lt;br /&gt;
# Рассмотрим алгоритм вычисления наибольшего общего делителя (НОД) двух положительных чисел, основанный на методе &amp;quot;разделяй и властвуй&amp;quot;.&lt;br /&gt;
## (задание не оценивается) Прочитайте [https://dl.dropboxusercontent.com/u/829163/draft.pdf §1.2.3 Алгоритм Евклида (стр. 23)].&lt;br /&gt;
## * Докажите, что определение НОД-а, приведённое ниже, корректно.&lt;br /&gt;
## Постройте алгоритм, основанный на этом определении.&lt;br /&gt;
## Какой алгоритм будет быстрее для n-битовых чисел a и b при больших значениях n --- ваш или алгоритм Евклида?&lt;br /&gt;
# * Покажите как за время O(n log n) удалить из массива размера n все дубликаты, то есть оставить каждый элемент в одном экземпляре.&lt;br /&gt;
# * Даны два упорядоченных массива размера m и n. Постройте алгоритм, находящий k-й по величине элемент в объединении этих массивов за время O(log(n+m)). &lt;br /&gt;
&lt;br /&gt;
Функция F(n).&lt;br /&gt;
  если n &amp;gt; 1:&lt;br /&gt;
    напечатать &amp;quot;всё ещё работаю&amp;quot;&lt;br /&gt;
    F(n/2)&lt;br /&gt;
    F(n/2)&lt;br /&gt;
&lt;br /&gt;
Определение НОД-а.&lt;br /&gt;
             2НОД(a/2, b/2), если а и b чётны,&lt;br /&gt;
  НОД(a,b) = НОД(a, b/2), если а нечётно, b чётно,&lt;br /&gt;
             НОД((a-b)/2, b), если а и b нечётны.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;lt;nowiki&amp;gt;Задачи взяты из книги &amp;quot;Алгоритмы&amp;quot;, глава 2 (см. список рекомендованной литературы).&amp;lt;/nowiki&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Сложение и умножение (19.01)==&lt;br /&gt;
# Алгоритм сложения, его сложность (§1.1.1 Сложение*)&lt;br /&gt;
# &amp;quot;Школьный&amp;quot; алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Рекурсивный алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Алгоритм умножения, реализующий стратегию &amp;quot;разделяй и властвуй&amp;quot;, анализ сложности (§2.1 Умножение чисел*)&lt;br /&gt;
 * [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать.]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 3 (19.01 - 2.02)===&lt;br /&gt;
* Во всех задачах для простоты можно считать, что n является степенью какого-либо числа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Найдите произведение чисел 10011011 и 10111010 (в двоичной системе счисления), используя алгоритм умножения чисел, основанный на методе «разделяй и властвуй». Необходимо не только дать ответ, но и привести ход решения.&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 3 рекурсивных вызова для подзадач размера n-1 и комбинирует из них решение исходной задачи за О(n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте три верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 10 рекурсивных вызовов для подзадач размера n/2 и комбинирует из них решение исходной задачи за О(5n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте два верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Докажите, что 3m² + m = O(m²).&lt;br /&gt;
# Докажите, что lg m = O(m/1000), где lg m — это логарифм с двоичным основанием.&lt;br /&gt;
# Докажите, что из равенства f(n) = O(g(n)) не следует, что g(n) = O(f(n)).&lt;br /&gt;
# Докажите, что O(m) содержится в O(m²).&lt;br /&gt;
&lt;br /&gt;
==Решение рекуррентных уравнений (22.01)==&lt;br /&gt;
# Примеры решений рекуррентных уравнений (см. [https://www.dropbox.com/s/6a0r410zjm9qwe7/algo-3-recurrences.pdf?dl=0 конспект]).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 4 (до 14.02)===&lt;br /&gt;
* Нельзя использовать утверждение основной теоремы о решении рекуррентных соотношений.&lt;br /&gt;
* &#039;&#039;Можно&#039;&#039; использовать метод построения дерева рекурсии или подстановку (метод с угадыванием ответа).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Какой из трёх приведённых ниже алгоритмов вы бы предпочли? Обоснуйте свой ответ.&lt;br /&gt;
#* Алгоритм A, решая задачу, производит пять рекурсивных вызовов для подзадач вдвое меньшего размера, после чего строит ответ для исходной задачи за линейное время.&lt;br /&gt;
#* Алгоритм B, решая задачу размера n, делает два рекурсивных вызова для задач размера n − 1, после чего находит ответ за время O(1).&lt;br /&gt;
#* Алгоритм C, решая задачу размера n, рекурсивно решает девять задач размера n/3 и строит ответ за время O(n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Найдите T(n) в замкнутой форме для любых 7 из 10 приведённых ниже рекуррентных соотношений:&lt;br /&gt;
## T(n) ≤ 2T(n/3) + 1;&lt;br /&gt;
## T(n) ≤ 7T(n/7) + n;&lt;br /&gt;
## T(n) ≤ 9T(n/3) + n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 8T(n/2) + n&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 49T(n/25) + n&amp;lt;sup&amp;gt;3/2&amp;lt;/sup&amp;gt;log n;&lt;br /&gt;
## T(n) ≤ T(n − 1) + 2;&lt;br /&gt;
## T(n) ≤ T(n − 1) + n&amp;lt;sup&amp;gt;c&amp;lt;/sup&amp;gt;, где c ≥ 1 –– константа;&lt;br /&gt;
## T(n) ≤ T(n − 1) + c&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;, где c &amp;gt; 1 –– константа;&lt;br /&gt;
## T(n) ≤ 2T(n − 1) + 1;&lt;br /&gt;
## T(n) ≤ T(sqrt(n)) + 1.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №1==&lt;br /&gt;
Необходимо реализовать все 6 задач из [https://official.contest.yandex.ru/contest/1002 контеста]. Каждую задачу можно писать на С++ или Python. На выполнение работы отводится две недели. Каждая задача оценивается в 10/6 балла. Оценка &#039;&#039;может&#039;&#039; быть снижена за плохой код, но не более чем на 25%.&lt;br /&gt;
&lt;br /&gt;
==Бинарное дерево поиска (26.01)==&lt;br /&gt;
# Определение. Пример.&lt;br /&gt;
# Не модифицирующие алгоритмы: поиск (рекурсивный и итеративный алгоритмы), поиск минимума, inordered обход (вывод значений узлов в отсортированном порядке), поиск следующего по возрастанию.&lt;br /&gt;
# Модифицирующие алгоритмы: вставка (рекурсивная реализация), удаление (только идея).&lt;br /&gt;
 [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 13, стр. 248]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 5 (до 16.02)===&lt;br /&gt;
* Для получения максимальной оценки можно выполнить или все задачи без звёздочки, или задачу со звёздочкой. Преподаватель понимает, что реализацию БДП сложно не найти в интернете, но от копипасты не будет никакой пользы. Напротив, самостоятельная реализация очень полезна и приветствуется, даже если не получится выполнить всех пунктов задания.&lt;br /&gt;
* Задачи с двумя звёздочками необязательны.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Нарисуйте бинарные деревья поиска высотой 2, 3, 4, 5 и 6 для множества ключей {1, 4, 5, 10, 16, 17, 21}. Корень дерева имеет высоту 0.&lt;br /&gt;
# &#039;&#039;&#039;Сортировка с использованием БДП.&#039;&#039;&#039;&lt;br /&gt;
## Какова асимптотическая сложность алгоритма вставки элемента в дерево высоты d? Почему? Назовите наилучший и наиухдший случаи.&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который строит БДП в узлах которого стоят элементы данной последовательности. Можно использовать функцию Insert. Назовите наилучший и наихудший случаи. Есть теорема о том, что полученный алгоритм будет работать в среднем случае за время O(n * log n).&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который выводит их в порядке возрастания. Используйте бинарное дерево поиска. Какова в среднем случае сложность этого алгоритма? Назовите наилучший и наихудший случаи. Какова сложность в наихудшем случае?&lt;br /&gt;
# Напишите функцию GetRoot, которой на вход подаётся указатель на произвольный узел дерева, а она возвращает указатель на корень.&lt;br /&gt;
# Напишите процедуру PrintLeafs, которой на вход подаётся указатель на корень дерева, и она печатает листья дерева&lt;br /&gt;
## по возрастанию,&lt;br /&gt;
## по убыванию.&lt;br /&gt;
# ** Альтернативный обход в порядке возрастания бинарного дерева поиска с n узлами (или центрированный (inordered) обход) можно осуществить путём поиска минимального элемента дерева с помощью функции Minimum с последующий n-1 вызовом функции Next. Каково время работы такого алгоритма?&lt;br /&gt;
# * Реализуйте на С++ структуру данных бинарное дерево поиска, [https://yadi.sk/i/gi2SEStreFfSb используя заготовку].&lt;br /&gt;
## Нарисуйте бинарное дерево поиска, которое строится в функции getTreeExample.&lt;br /&gt;
## Реализуйте следующие алгоритмы: &lt;br /&gt;
### поиск минимума, &lt;br /&gt;
### inordered обход (вывод значений узлов в отсортированном порядке),&lt;br /&gt;
### поиск следующего по возрастанию,&lt;br /&gt;
### вставка элемента в дерево,&lt;br /&gt;
### сортировка последовательности с использованием БДП (дан вектор чисел, необходимо вывести их по возрастанию),&lt;br /&gt;
### ** удаление.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Карацубы, Штрассена. Быстрая сортировка (29.01)==&lt;br /&gt;
# Алгоритм Карацубы.&lt;br /&gt;
# Алгоритм Штрассена. [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать Дасгупту и др., §2.5 Умножение матриц]&lt;br /&gt;
# Быстрая сортировка и доказательство того, что в среднем случае она работает за О(n * log n). [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 8 Быстрая сортировка, стр. 148]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 6 (до 18.02)===&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Пусть мы хотим найти двоичное представление десятичного числа 10&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;. Будем считать, что n --- степень двойки (n = 2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt;).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Pwr2Bin(n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть 1010&lt;br /&gt;
    z = ...&lt;br /&gt;
    вернуть Multiply(z, z)&amp;lt;/source&amp;gt;&lt;br /&gt;
Multiply --- функция, перемножающая два n-битовых двоичных числа x и y по алгоритму Карацубы за O(n&amp;lt;sup&amp;gt;log&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;3&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Пусть мы хотим перевести произвольное десятичное число x в записи которого n=2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; чисел в двоичную систему счисления.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Dec2Bin(x, n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть binary[x]&lt;br /&gt;
    разделить x на два десятичных числа xl и xr из n/2 цифр.&lt;br /&gt;
    вернуть ...&amp;lt;/source&amp;gt;&lt;br /&gt;
Здесь binary --- это массив, содержащий двоичное представление десятичных цифр.&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Докажите, что математическое ожидание времени работы алгоритма быстрой сортировки (усреднение по всем вариантам выбора опорного элемента) на любом входе размера n удовлетворяет соотношению: T(n) ≤ O(n) + 1/n * &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt; (T(i-1) + T(n-i)).&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Найдите решение соотношения из предыдущего пункта.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Динамическое программирование (ДП). Первые примеры (02.01)==&lt;br /&gt;
# Нахождение самой длинной возрастающей подпоследовательности.&lt;br /&gt;
# Нахождение редакционного расстояния (или редакционной стоимости, расстояния Левенштейна).&lt;br /&gt;
# Нахождение представителя большинства.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 7 (до 20.02)===&lt;br /&gt;
* В этом задании везде, где требуется реализовать алгоритм, необходимо привести код на любом языке программирования.&lt;br /&gt;
* Для получения максимальной оценки нужно решить все задачи без звёздочек. Одна решённая задача со звёздочкой заменяет одну задачу без звёздочки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения редакционного расстояния (алгоритм Вагнера — Фишера). Например, редакционное расстояние между словами &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равно 6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения длины наибольшей общей подстроки. Например, длина наибольшей общей подстроки &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равна 8 (&amp;quot;antholog&amp;quot;). Чем больше это значение, тем схожей строки.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Предположим теперь, что сравниваемые строки состоят из символов A, С, G и T; за удаление или вставку мы платим -5; за замену буквы x на y платим w[x, y], где x, y принадлежат множеству {A, С, G, T}, a w — это матрица весов:&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
!-!! A!! G!! C!! T&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! A&lt;br /&gt;
|10||-1||-3||-4&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
!G&lt;br /&gt;
||-1||7||-5||-3&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! C&lt;br /&gt;
||-3||-5||9||0&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! T&lt;br /&gt;
||-4||-3||0||8&lt;br /&gt;
|}&lt;br /&gt;
Тогда выравнивание:&lt;br /&gt;
 AGACTAGTTAC&lt;br /&gt;
 CGA‒‒‒GACGT&lt;br /&gt;
будет иметь следующую оценку:&lt;br /&gt;
 w[A,C] + w[G,G] + w[A,A] + 3*(-5) + w[G,G] + w[T,A] + w[T,C] + w[A,G] + w[C,T] = -3 + 7 + 10 - 3*5 + 7 + (-4) + 0 + (-1) + 0 = 1.&lt;br /&gt;
&lt;br /&gt;
Напишите алгоритм, который находит максимальную стоимость всех возможных выравниваний. Верно ли, что чем больше это значение, тем непохожей строки?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как давно один народ отделился от другого? Кто похожей — итальянец и китаец или якут и эфиоп? На эти вопросы можно отвечать с разных точек зрения — культурной, исторической, лингвистической, ... В последние же годы человечество научилось секвенировать геном, что позволило исследовать этот вопрос с точки зрения генетики. Секвенирование генома — это процесс записи ДНК в виде нуклеотидной последовательности, которая представляет собой последовательность из четырёх символов — A, С, G и T. Существуют базы, которые хранят генетическую информацию о людях из разных стран и континентов, например, [http://www.mtdb.igp.uu.se/ http://www.mtdb.igp.uu.se/ → Download mtDNA sequences]. Чем больше сходство между геномами, тем сильнее родственные связи между их обладателями. Используя решение предыдущего пункта, выполните задания:&lt;br /&gt;
# Определите, кто похожей — итальянец и китаец или якут и эфиоп?&lt;br /&gt;
# Найдите нескольких похожих и нескольких непохожих народностей.&lt;br /&gt;
# * Выберите одну народность. Найдите самых похожих и самых непохожих на неё.&lt;br /&gt;
# * Найдите самые похожие и самые непохожие народности.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Задача о разрезании стержня (05.01)==&lt;br /&gt;
# Постановка задачи.&lt;br /&gt;
# Решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Решение с нахождением максимума по p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Восходящий алгоритм с запоминанием. Вывод длин кусочков стержня. Оценка сложности.&lt;br /&gt;
# Нисходящий алгоритм с запоминанием. Оценка сложности.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.1 Разрезание стержня, стр. 393]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 8 (до 22.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Решая задачу о разрезании стержня мы вначале построили рекурсивное решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt; для всех 1 ≤ i &amp;lt; n. Его сложность описывалась рекуррентной формулой T(n) = n + &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n-1&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt;(T(i) + T(n-i)), T(1) = 1.&lt;br /&gt;
# Объясните эту формулу.&lt;br /&gt;
# Покажите с помощью метода подстановок, что T(n) ≤ 2&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Покажите с помощью контрпримера, что описанная далее жадная стратегия не всегда определяет оптимальный способ разрезания стержня. Определим плотность стержня длиной i как p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;/i, то есть как стоимость единицы его длины. Жадная стратегия для стержня длиной n отрезает от стержня первую часть длиной i, где 1 ≤ i ≤ n, имеющую максимальную плотность. Затем та же жадная стратегия применяется к оставшейся части длиной n-i.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Рассмотрим модификацию задачи разрезания стержня, в которой в дополнение к цене p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; каждого стержня добавляется фиксированная цена разреза c. Теперь прибыль, связанная с решением, представляет собой сумму цен частей стержня минус стоимость разрезов. Разработайте алгоритм динамического программирования для этой модифицированной задачи.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Непрерывным участком называется группа подряд идущих элементов. Например, для последовательности&lt;br /&gt;
 5, 15, −30, 10, −5, 40, 10&lt;br /&gt;
элементы 15, −30, 10 образуют непрерывный участок, а 5, 15, 40 -- нет. Постройте линейный алгоритм для следующей задачи:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Вход: список чисел a1, a2, ... ‌, an.&lt;br /&gt;
Выход: непрерывный участок с максимальной суммой (сумма участка нулевой длины равна нулю).&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Для приведённого примера ответом будет 10, −5, 40, 10 с суммой 55. Какова сложность алгоритма? Почему?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Надо заплатить v рублей, имея купюры в x1, x2, ‌..., xn рублей (купюр каждого типа сколько угодно). Это не всегда возможно (скажем, купюрами в&lt;br /&gt;
10 и 25 рублей можно заплатить 45 рублей, но не 47 и не 15). Постройте основанный на методе динамического программирования алгоритм со временем работы O(nv), выясняющий, возможна ли уплата.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как решить предыдущую задачу, если каждая купюра имеется в единственном экземпляре? (Например, купюрами в 1, 5, 10, 20 рублей можно заплатить 16 = 1 + 5 + 10 и 31 = 1 + 10 + 20 рублей, но не 40 (не хватит денег). Время работы алгоритма по-прежнему O(nv).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Ещё один вариант той же задачи: купюр каждого типа сколько угодно, но всего разрешается использовать не более k купюр. (Например, если есть купюры в 5 и 10 рублей, а k = 6, то 55 разменять можно, а 65 –– нет).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Перемножение цепочки матриц. Оптимальное бинарное дерево поиска (начало) (09.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о перемножении цепочки матриц. Постановка задачи.Пример. Нисходящий алгоритм.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.2 Перемножение цепочки матриц, стр. 403]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 9 (до 24.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Найдите оптимальную расстановку скобок в произведении последовательности матриц, размерности которых равны 5×10, 10×3, 3×12, 12×5, 5×50, 50×6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Напишите восходящий алгоритм для поиска оптимальной расстановки скобок.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Расстановка пробелов. Оптимальное бинарное дерево поиска (середина) (12.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о расстановке пробелов. Постановка задачи. Решения для трёх случаев: 1. нужно вернуть можно ли разбить текст на слова; 2. вернуть разбивку на слова; 3. слова встречаются не равновероятно, вернуть наиболее вероятную разбивку на слова.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи. Вывод математического ожидания времени поиска.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Праздничное домашнее задание 10 (до 02.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[&amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;,&amp;quot;, &amp;quot;.&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;,&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;.&amp;quot;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Подсказка:&#039;&#039;&#039; разбейте текст на слова из списка и посмотрите на азбуку Морзе.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Способы представления графов в памяти (16.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Разбор ошибок в домашнем задании.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Графы. Способы представления графов в памяти (матрица смежности, список рёбер, список соседей (список смежностей), матрица инцидентности). Зависимость сложности алгоритмов от способа представления.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §22.1 Представление графов, стр. 626]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 11 (до 02.03)===&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача A.]&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача B.]&lt;br /&gt;
# Нарисуйте неориентированный граф с 5 вершинами и 8 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Нарисуйте ориентированный граф с 4 вершинами и 3 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Дан ориентированный граф. &#039;&#039;Исходящая степень вершины v&#039;&#039; --- это количество исходящих из неё рёбер, &#039;&#039;входящая степень v&#039;&#039; --- это количество рёбер входящих в  v. Имеется представление ориентированного графа с использование списка соседей. Как долго будут вычисляться исходящие степени всех вершин графа? А входящие степени?&lt;br /&gt;
# Дан граф G = (V, E). Какие из рассмотренных способов хранения графов используют меньше всего памяти для хранения G и почему? Указание: рассмотрите случаи |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;lt; |E| и |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;gt; |E|.&lt;br /&gt;
# Пусть C --- это матрица смежности графа G.&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
# Пусть B --- это матрица инцидентности ориентированного графа G. Как связаны элементы матрицы BB&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
&lt;br /&gt;
==Реализация поиска в глубину (19.02)==&lt;br /&gt;
# Реализация поиска в глубину и смежных задач.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 12 (до 5.03)===&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Выберите любой способ хранения графа. Реализуйте поиск в глубину.&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Напишите алгоритм, который возвращает данные о том, какие вершины лежат в одной компоненте связности.&lt;br /&gt;
# &#039;&#039;(любой ЯП или псевдокод)&#039;&#039; Напишите алгоритм проверки сильной связности ориентированного графа. Какова его сложность?&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №2==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
Необходимо реализовать 3 задачи из [https://official.contest.yandex.ru/contest/1085 контеста], см. [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing распределение задач]. Каждую задачу можно написать на С++ или Python. На выполнение работы отводится две недели (см. время окончания контеста). [https://official.contest.yandex.ru/contest/1123 Дорешивание.]&lt;br /&gt;
&lt;br /&gt;
==ДП и графы (26.02)==&lt;br /&gt;
==ДП и графы (02.03)==&lt;br /&gt;
==Жадные алгоритмы (12.03)==&lt;br /&gt;
===Домашнее задание 13 (до 23.03)===&lt;br /&gt;
# Вася хочет купить по одной акции каждой компании. Все акции стоят одинаково, но дорожают по-разному. Каждый месяц акция i-ой компании дорожает в r_i раз. В один месяц можно купить только одну акцию.&lt;br /&gt;
## Напишите алгоритм, который выводит оптимальную последовательность покупок (такую, что на покупку всех акций потратится меньше денег).&lt;br /&gt;
## Докажите корректность алгоритма, то есть докажите, что последовательность покупок, которую выводит ваш алгоритм, оптимальна.&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список, очередь (16.03)==&lt;br /&gt;
# Реализация линейного двусвязного списка (С++).&lt;br /&gt;
# Реализация очереди ограниченной длины на базе вектора (С++).&lt;br /&gt;
# Реализация очереди на базе списка (С++).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14 (до 23.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте (на С++) структуру данных Стек. У стека должно быть три операции:&lt;br /&gt;
* push --- положить элемент на вершину стека;&lt;br /&gt;
* pop --- удалить верхний элемент;&lt;br /&gt;
* front --- вернуть значение верхнего элемента.&lt;br /&gt;
Оцените время работы каждой функции.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список (19.03)==&lt;br /&gt;
===Домашнее задание 13* (до 30.03)===&lt;br /&gt;
#Для приведённой реализации класса List (https://yadi.sk/i/c5r_79WdfMyNS).&lt;br /&gt;
## Допишите print, push_back и push_front.&lt;br /&gt;
## В функции insert_after и delete_node вставьте необходимые проверки так, чтобы они работали для крайних случаев.&lt;br /&gt;
## Напишите main в котором&lt;br /&gt;
### создаётся объект класса List, &lt;br /&gt;
### заполняется элементами с помощью функций push_back, push_front и insert_after и&lt;br /&gt;
### удаляется i-ый элемент.&lt;br /&gt;
&lt;br /&gt;
==Повторение (30.03)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Для данных пар функций выясните их связь в терминах O-, o-, Ω-, ω-, Θ-обозначений. Поставьте галочку в клетке с Ω, если f(x) = Ω(g(x)) и прочерк, если равенства нет. [https://ru.wikipedia.org/wiki/«O»_большое_и_«o»_малое#.D0.94.D1.80.D1.83.D0.B3.D0.B8.D0.B5_.D0.BF.D0.BE.D0.B4.D0.BE.D0.B1.D0.BD.D1.8B.D0.B5_.D0.BE.D0.B1.D0.BE.D0.B7.D0.BD.D0.B0.D1.87.D0.B5.D0.BD.D0.B8.D1.8F Википедия]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! f(x)!! g(x)!! O!! o!! Ω!! ω!! Θ&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! 2^100&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n * log(n)&lt;br /&gt;
! 2^100 * n * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n&lt;br /&gt;
! 2^100 * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n!&lt;br /&gt;
! 2^(2015n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n*2^n&lt;br /&gt;
! 3^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 5^n&lt;br /&gt;
! 5^(n+1)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n + n^2 + n^3 + ... + n^1000&lt;br /&gt;
! 7^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм Quickselect нахождения k-ого элемента по возрастанию: http://en.wikipedia.org/wiki/Quickselect&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;На улице стоит ряд домов. В каждом из домов лежит сколько-то денег. Вор хочет обокрасть дома на переулке. Он не может обокрасть два соседних дома, потому что хозяин дома, который он обокрал, сразу предупредит соседей. Нужно найти, какую максимальную сумму вор может украсть с переулка. На вход программы подается массив неотрицательных целых чисел - количество долларов в доме с номером i. Соседние дома в массиве представлены соседними элементами. Например, пусть задан массив { 1, 4, 5 } - тогда вор максимум может украсть $6, обокрав дома 1 и 3. Пусть задан массив { 1, 7, 2 } - тогда вор максимум может украсть $7, обокрав дом 2.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Алфавит из всех маленьких латинских букв и пробела закодирован числами следующим способом:&lt;br /&gt;
  &#039;a&#039; -&amp;gt; 1&lt;br /&gt;
  &#039;b&#039; -&amp;gt; 2&lt;br /&gt;
  &#039;c&#039; -&amp;gt; 3&lt;br /&gt;
  ...&lt;br /&gt;
  &#039;z&#039; -&amp;gt; 26&lt;br /&gt;
  &#039; &#039; -&amp;gt; 27&lt;br /&gt;
На вход программы подается строка из цифр. Нужно посчитать, сколькими способами можно раскодировать эту строку.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Дан граф, заданный матрицей смежности. Вывести пары вершин между которыми нет пути.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Повторение (02.04) ==&lt;br /&gt;
Решали и разбирали первые 4 задачи из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14* (до 11.03)===&lt;br /&gt;
Решите любые две задачи (подпункты НЕ считаются отдельными задачами) с предыдущей пары (Повторение (30.03)).&lt;br /&gt;
&lt;br /&gt;
== Повторение (06.04) ==&lt;br /&gt;
Будем решать вторую половину задач из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 15 (до 16.04)===&lt;br /&gt;
# Приведите пример графа, который содержит отрицательные рёбра, не содержит циклов отрицательного веса и для которого алгоритм Дейкстры возвращает неверный результат.&lt;br /&gt;
# Используется ли в алгоритме Дейкстры то, что веса рёбер неотрицательны? Если &amp;quot;да&amp;quot;, то где именно?&lt;br /&gt;
# Пусть граф содержит рёбра с весами &amp;gt;= -100. Если прибавить к каждому ребру 101 и при помощи алгоритма Дейкстры найти кратчайшие пути. Будут ли эти пути кратчайшими в исходном графе? Почему?&lt;br /&gt;
&lt;br /&gt;
== Повторение (07.04) ==&lt;br /&gt;
&#039;&#039;&#039;Решение рекуррентных соотношений&#039;&#039;&#039;&lt;br /&gt;
# Решите уравнение: T(n) = 4*T(n/2) + O(n^2) с базой T(1) = O(1)&lt;br /&gt;
## Используя основную теорему.&lt;br /&gt;
## Используя дерево рекурсий.&lt;br /&gt;
## Методом подстановки.&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2)) + n является \Theta(n lg n).&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2) + 17) + n является \Theta(n lg n).&lt;br /&gt;
# Решите уравнения, считая, что T(1) = O(1):&lt;br /&gt;
## T(n) = T(n-1) + n&lt;br /&gt;
## T(n) = 2*T(floor(sqrt(n))) + lg n. Указание: попробуйте использовать замену переменных.&lt;br /&gt;
## T(n) = 3*T(sqrt(n)) + lg n&lt;br /&gt;
# Дайте верхнюю и нижнюю оценки функции T(n). Постарайтесь, чтобы оценки были как можно более точные&lt;br /&gt;
## T(n) = 4T(n/3) + n*lg(n)&lt;br /&gt;
## T(n) = 3T(n/3) + n/lg(n)&lt;br /&gt;
## T(n) = 4T(n/2) + n^2*sqrt(n)&lt;br /&gt;
## T(n) = T(n/2) + T(n/4) + T(n/8) + n&lt;br /&gt;
## T(n) = T(n-1) + 1/n&lt;br /&gt;
## T(n) = T(n-2) + 1/lg(n)&lt;br /&gt;
## T(n) = sqrt(n) * T(sqrt(n)) + n&lt;br /&gt;
&#039;&#039;&#039;Анализ и построение алгоритмов&#039;&#039;&#039;&lt;br /&gt;
# Числа Фибоначчи F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; можно выразить через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, используя матрицу: https://yadi.sk/i/Pm_aNzHCforFU. &lt;br /&gt;
## Покажите как вычислить F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;.&lt;br /&gt;
## Как вычислить F&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;n+1&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;?&lt;br /&gt;
## Напишите алгоритм.&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
## Ускорьте его так, чтобы он работал за O(log n).&lt;br /&gt;
# Дана последовательность символов. Какое минимальное количество символов нужно удалить из неё, чтобы получить палиндром?&lt;br /&gt;
## Напишите алгоритм (на псевдокоде или на любом языке программирования).&lt;br /&gt;
## Оцените время работы алгоритма.&lt;br /&gt;
# Какую структуру данных вы бы использовали для реализации упорядоченного множества (http://neerc.ifmo.ru/wiki/index.php?title=Упорядоченное_множество)? Какая будет сложность каждой из операций над множеством?&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 16 (до 20.04)===&lt;br /&gt;
# Решите 6 задач из первой части и 6 из второй. (Укажите какие именно.) Каждый из подпунктов является отдельной задачей.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм и теорема Форда-Фалкерсона (16.04)==&lt;br /&gt;
# Базовые определения (пропускные способности, сток, исток и пр.). Пример. &lt;br /&gt;
# Ограничения на поток (сохранение и что меньше пропускных способностей).&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, пример работы&lt;br /&gt;
# Разрез, определение, пример.&lt;br /&gt;
# Утверждение: максимальный поток &amp;lt;= любого разреза.&lt;br /&gt;
# Теорема Форда-Фалкерсона (с доказательством).&lt;br /&gt;
# Пример на котором алгоритм Форда-Фалкерсонаработает работает очень долго при неудачном выборе путей.&lt;br /&gt;
# Сложность алгоритма Форда-Фалкерсона.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №3==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
В [https://official.contest.yandex.ru/contest/1196 домашнем задании] пять задач. Они разделены на два варианта, помеченные римскими цифрами I и II. Свой вариант нужно узнать [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing здесь на вкладке HW3]. Третья задача — общая для двух вариантов; ее решение необходимо снабдить доказательством корректности алгоритма. На выполнение задания дается примерно 2 недели (см. точное время окончания в контесте). Каждую задачу можно написать на С++ или Python.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Форда-Фалкерсона и Эдмондса-Карпа (20.04)==&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, напоминание: базовые определения, пример работы, пример на котором алгоритм работает долго, сложность.&lt;br /&gt;
# Алгоритм Эдмодса-Карпа. Доказательство асимптотики времени работы.&lt;br /&gt;
&lt;br /&gt;
==(23.04)==&lt;br /&gt;
&lt;br /&gt;
==(11.05) Красно-чёрные деревья==&lt;br /&gt;
[https://ru.wikipedia.org/wiki/Красно-чёрное_дерево Красно-чёрное дерево]&lt;br /&gt;
===Домашнее задание 17 (до 18.05)===&lt;br /&gt;
# Зачем нужны красно-чёрные деревья?&lt;br /&gt;
# Благодаря какому свойству и почему красно-чёрное дерево является сбалансированным?&lt;br /&gt;
# Нарисуйте полное бинарное дерево поиска высотой 3 с ключами {1, 2, ..., 15}. Сделайте из него красно-чёрные деревья высотой 2, 3 и 4.&lt;br /&gt;
# Нарисуйте красно-чёрные деревья, получающиеся последовательной вставкой элементов 12, 10, 29, 30, 31, 32 в [https://ru.wikipedia.org/wiki/Красно-чёрное_дерево#/media/File:Red-black_tree_example.svg данное дерево]. Для вставки используйте алгоритм вставки из Википедии. Укажите какой именно функцией вы воспользовались.&lt;br /&gt;
# Определим &#039;&#039;&#039;ослабленное красно-чёрное дерево&#039;&#039;&#039; как бинарное дерево поиска, которое удовлетворяет красно-чёрным свойствам 1, 3, 4 и 5. Другими словами, корень может быть как чёрным, так и красным. Рассмотрите ослабленное красно-чёрное дерево T, корень которого красный. Если перекрасить корень дерева T в чёрный, будет ли оно красно-чёрным деревом?&lt;br /&gt;
# Покажите, что самый длинный простой нисходящий путь от вершины x к листу красно-черного дерева имеет длину, не более чем в два раза превышающую кратчайший путь от x к листу-потомку.&lt;br /&gt;
# Чему равно наибольшее возможное количество внутренних узлов в красно-чёрном дереве с чёрной высоты k? А наименьшее возможное количество?&lt;br /&gt;
# Нарисуйте красно-чёрные деревья, получающиеся последовательной вставкой ключей 41, 38, 31, 12, 19, 8 в изначально пустое дерево.&lt;br /&gt;
# Покажите какие деревья будут получаться в результате последовательного удаления ключей в порядке 8, 12, 19, 31, 38, 41.&lt;br /&gt;
&lt;br /&gt;
==(14.05) Конкурентный анализ самоорганизующихся циклов==&lt;br /&gt;
[https://vk.com/doc12518218_390369758 Лекция]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 18 (до 21.05)===&lt;br /&gt;
Все вычисления сопроводите подробными объяснениями о том, почему верно то или иное (не)равенство.&lt;br /&gt;
# Пусть имеется n-элементный список и m поисковых запросов к нему. После каждой операции поиска можно переупорядочить список. Обозначим стоимость последовательности поисков через C. Докажите, что в худшем случае C = Ω(mn).&lt;br /&gt;
#  Обозначим через c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; стоимость i-ого поискового запроса с применением эвристики перемещения в начало, которая включает стоимость поиска элемента в списке и стоимость его перемещения в начало списка путём ряда обменов соседних элементов списка. Покажите, что i-ая операция поиска находит элемент x в списке L с применением эвристики перемещения в начало, то c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = 2 * rank&amp;lt;sub&amp;gt;L&amp;lt;/sub&amp;gt;(x) - 1.&lt;br /&gt;
# Покажите, что c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = 2 * rank&amp;lt;sub&amp;gt;L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) - 1.&lt;br /&gt;
# Покажите, что c*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = rank&amp;lt;sub&amp;gt;L*&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) + t&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;.&lt;br /&gt;
# Докажите, что после одного обмена двух соседних элементов потенциал либо увеличивается на 2, либо уменьшается на 2.&lt;br /&gt;
# Докажите, что rank&amp;lt;sub&amp;gt;L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) = |A| + |B| + 1.&lt;br /&gt;
# Докажите, что rank&amp;lt;sub&amp;gt;L*&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) = |A| + |С| + 1.&lt;br /&gt;
# Покажите, что поиск i-ого элемента приводит к изменению потенциала Ф(L&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;) - Ф(L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;) &amp;lt;= 2 (|A| - |B| + t*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;), где t*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; --- это количество обменов при i-ом поиске.&lt;br /&gt;
# Во сколько раз стоимость С&amp;lt;sub&amp;gt;MFT&amp;lt;/sub&amp;gt;(S) превышает C&amp;lt;sub&amp;gt;OPT&amp;lt;/sub&amp;gt;(S)?&lt;br /&gt;
&lt;br /&gt;
== (18.05) Конечные автоматы ==&lt;br /&gt;
=== Задание 19 (до 25.05) ===&lt;br /&gt;
# Постройте автомат для языка над алфавитом Σ = {0, 1} каждое слово которого содержит хотя бы два нуля. Является ли он детерминированным?&lt;br /&gt;
# Постройте автомат над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5. Является ли он детерминированным?&lt;br /&gt;
# Постройте автомат, который допускает пустой язык (язык в котором нет ни одного слова).&lt;br /&gt;
# Постройте автомат, который допускает все слова над алфавитом Σ.&lt;br /&gt;
# Постройте ДКА над алфавитом Σ = {К, Ж, З}, который допускает слова в которых после К идёт З, после З --- Ж, после Ж --- К.&lt;br /&gt;
#* Постройте ДКА над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5, а число нулей на 3.&lt;br /&gt;
# Постройте НКА для языка над алфавитом Σ = {0, 1, 2, 3}, состоящий из слов, в которых хотя бы одна из последних пяти букв является 1.&lt;br /&gt;
# Постройте НКА над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5, а число нулей на 3.&lt;br /&gt;
# Какие языки допускают автоматы https://yadi.sk/d/fNAHbjCZghERG?&lt;br /&gt;
# Для каждого из автоматов https://yadi.sk/d/fNAHbjCZghERG постройте соответствующий ему ДКА.&lt;/div&gt;</summary>
		<author><name>Kassalanche</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=12803</id>
		<title>Алгоритмы и структуры данных. Подгруппа 105-1</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=12803"/>
		<updated>2015-05-18T05:55:24Z</updated>

		<summary type="html">&lt;p&gt;Kassalanche: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==О курсе==&lt;br /&gt;
[[Алгоритмы_и_структуры_данных|План лекций и список рекомендуемой литературы.]]&lt;br /&gt;
&lt;br /&gt;
[[Алгоритмы_и_структуры_данных._Подгруппа_105-1._FAQ|FAQ.]]&lt;br /&gt;
&lt;br /&gt;
[[Reviewboard|Инструкция по использованию Reviewboard.]]&lt;br /&gt;
&lt;br /&gt;
[[Практические_занятия_по_курсу_ОиМП/C++_check|Style guide.]]&lt;br /&gt;
&lt;br /&gt;
==Итоговая оценка за курс==&lt;br /&gt;
Итоговая оценка (ИО) зависит от&lt;br /&gt;
* оценок за пять больших домашних заданий (БДЗ1, БДЗ2, ..., БДЗ5),&lt;br /&gt;
* оценок за домашние задания (ДЗ1, ДЗ2, ...),&lt;br /&gt;
* оценки за контрольную работу (КР),&lt;br /&gt;
* оценки за экзамен (ЭКЗ),&lt;br /&gt;
и может быть вычислена по формуле:&lt;br /&gt;
 ИО = 0.7 * (0.3 * КР + 0.7 *(ИДЗ1 + ИДЗ2 + ИДЗ3 + ИДЗ4 + ИДЗ5)/5) + 0.3 * ЭКЗ =&lt;br /&gt;
    = 0.21*КР + 0.98*ИДЗ1 + 0.98*ИДЗ2 + 0.98*ИДЗ3 + 0.98*ИДЗ4 + 0.98*ИДЗ5 + 0.3*ЭКЗ,&lt;br /&gt;
где&lt;br /&gt;
 ИДЗi = min (10, 0.7 * БДЗi + 0.4 * &amp;lt;cредняя оценка за ДЗj, прошедшие с предыдущего БДЗ по i-ое&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
==Порядок сдачи домашних работ==&lt;br /&gt;
===Большие домашние работы===&lt;br /&gt;
# Получить OK за задачу в контесте.&lt;br /&gt;
# Залить исходный код на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* На каждую задачу создавайте отдельный запрос на ревью. &lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении суток приходят замечания к коду. &#039;&#039;&#039;Если в течении суток замечаний или Ship It не появилось, проверьте, что вы правильно отправили запрос и, если всё сделано правильно, спросите у семинариста получил ли он запрос.&#039;&#039;&#039;&lt;br /&gt;
# Вы их исправляете, проверяете в контесте, что программа по-прежнему проходит все тесты, заливаете новую версию в Review Board. Штрафов за посылки НЕ будет.&lt;br /&gt;
# Процесс повторяется пока остаются замечания к коду или пока не истёк дедлайн. После закрытия контеста будут ещё одни сутки на доработку замечаний в Review Board.&lt;br /&gt;
# Оценивается только последняя версия работы в Review Board.&lt;br /&gt;
&lt;br /&gt;
===Маленькие домашние работы===&lt;br /&gt;
# Залить решение на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* Желаемые форматы: txt, py, cpp, h. Допускаются любые другие.&lt;br /&gt;
#* На каждую домашнюю работу создавайте отдельный запрос на ревью. Обязательно указывайте номер домашней работы.&lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении неопределенного промежутка времени придут оценки по каждому из заданий.&lt;br /&gt;
&lt;br /&gt;
==Оценивание домашних работ==&lt;br /&gt;
* Все задания предполагаются индивидуальными. Запрещены любые заимствования без ссылки на автора.&lt;br /&gt;
* Решения после установленного дедлайна не принимаются. Дедлайн указан в заголовке каждого задания.&lt;br /&gt;
* Везде, где требуется написать алгоритм, можно использовать любой язык программирования или псевдокод.&lt;br /&gt;
* Там, где требуется построить алгоритм с заданной асимптотикой, приведите обоснование, что полученный алгоритм удовлетворяет этому условию.&lt;br /&gt;
* Эти правила не действуют, если в задании явно оговорено иное.&lt;br /&gt;
&lt;br /&gt;
==Мотивация к изучению алгоритмов. Подсчёт числа операций (12.01)==&lt;br /&gt;
# Числа Фибоначчи. Определение. Примитивный рекурсивный алгоритм вычисления i-ого числа. Оценка числа операций. Анализ причин неэффективности. Алгоритм с запоминанием вычисленных ранее значений. Оценка числа операций. Сравнение с предыдущим. (подробнее: глава 0, страницы 8-10 из книги &amp;lt;&amp;lt;Алгоритмы&amp;gt;&amp;gt;, [[Алгоритмы_и_структуры_данных|см. список рекомендованной литературы]])&lt;br /&gt;
# Задача о ханойской башне. Постановка задачи. Рекурсивный алгоритм. Рекуррентная формула для числа перемещений. Замкнутая формула для числа перемещений (+ доказательство). Доказательство того, что эту задачу нельзя решить используя меньшее число перемещений дисков. ([https://www.dropbox.com/s/t8cbs7ttu4iasvj/algo-0-recursion.pdf?dl=0 Разбор задачи о ханойской башне], автор Сергей Объедков)&lt;br /&gt;
# Сортировка пузырьком. Алгоритм. Подсчёт количество операций сравнения и обмена (swap). Анализ наилучшего и наихудшего случаев ([https://ru.wikipedia.org/wiki/Сортировка_пузырьком Википедия])&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 1 (12.01 - 26.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
Во всех задачах, если не оговорено иного, предполагаем, что работаем с целыми неотрицательными числами. Для первых 7 задач необходимо&lt;br /&gt;
* описать что можно считать наилучшим и наихудшим случаями,&lt;br /&gt;
* для каждого из двух случаев подсчитать отдельно количество операций сравнения и swap (если есть).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Даны три числа, требуется вернуть наименьшее.&lt;br /&gt;
# Даны три числа, требуется отсортировать их.&lt;br /&gt;
# Дана последовательность A из n элементов и число x, требуется найти элемент равный x. Примечание: если таких значений i несколько, вернуть любое; если такого элемента нет, функция должна сообщить об этом.&lt;br /&gt;
# * Дана упорядоченная последовательность A из n элементов и число x, требуется найти такое i, что A[i] равно x. Алгоритм должен быть эффективней, чем в предыдущем пункте и использовать то, что последовательность упорядочена.&lt;br /&gt;
# Дана последовательность из 100 000 чисел от 0 до 100. Напишите эффективный алгоритм сортировки, который бы учитывал специфику входных данных.&lt;br /&gt;
# * Дано 32 битное неотрицательное число. Требуется номер первого ненулевого бит. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения, считая, что числа распределены равномерно.&lt;br /&gt;
# * Даны 32 битные неотрицательные числа m и n. Требуется вывести True, если m &amp;lt; n, иначе False. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения битов, считая, что числа распределены равномерно.&lt;br /&gt;
# Напишите рекурсивную функцию, вычисляющую n-ое число Фибоначчи (как на занятии). Подсчитайте количество рекурсивных вызовов.&lt;br /&gt;
# * Напишите функцию, вычисляющую n-ое число Фибоначчи, у которой число операций — полином от n, и которая использует количество памяти, независящее от n.&lt;br /&gt;
&lt;br /&gt;
==O-символика и стратегия &amp;quot;разделяй и властвуй&amp;quot; (15.01)==&lt;br /&gt;
# Сортировка слиянием. Алгоритм, рекуррентное соотношение для времени сортировки, сложность. Подробнее: [https://dl.dropboxusercontent.com/u/829163/draft.pdf §2.3 Сортировка слиянием (стр. 54)].&lt;br /&gt;
# О-символика. [https://dl.dropboxusercontent.com/u/829163/draft.pdf §0.3 О-символика (стр. 10)].&lt;br /&gt;
# Задача о слиянии m упорядоченных массивов по n элементов. Три алгоритма решения: последовательное слияние, слияние &amp;quot;деревом&amp;quot; (обе функции используют Merge из MergeSort), аналог Merge для m массивов. Анализ сложности каждого из них.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 2 (15.01-29.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
* Во всех задачах, если не оговорено иного, для простоты &#039;&#039;можно&#039;&#039; считать, что n является степенью какого-либо числа, например, степенью двойки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Дана функция F, определённая ниже. Сколько строк она напечатает? Указание: для обоих подпунктов рассмотрите два случая: 1. n является степенью двойки, 2. n не является степенью двойки.&lt;br /&gt;
## Запишите рекуррентное соотношение для числа строк.&lt;br /&gt;
## Решите уравнение, полученное в предыдущем пункте, то есть, выведите замкнутую (нерекуррентную формулу). Для простоты можно считать, что n является степенью двойки.&lt;br /&gt;
# В массиве A размера n записана возрастающая последовательность целых чисел. Постройте алгоритм типа &amp;quot;разделяй и властвуй&amp;quot;, который проверяет, существует ли такой индекс i, что A[i] = i&lt;br /&gt;
## за время O(n),&lt;br /&gt;
## * за время O(log n).&lt;br /&gt;
## Какие случаи для вашего алгоритма являются наихудшими и наилучшими? Какого время работы в лучшем и худшем случаях?&lt;br /&gt;
# Дан бесконечный массив A, первые n элементов которого содержат возрастающую последовательность положительных чисел, а дальше стоят -1. Значение n не дано. Постройте алгоритм, который получает на вход целое число x и находит это x в массиве --- или говорит, что там его нет, &lt;br /&gt;
## за время O(n),&lt;br /&gt;
## за время O(log n).&lt;br /&gt;
# Рассмотрим алгоритм вычисления наибольшего общего делителя (НОД) двух положительных чисел, основанный на методе &amp;quot;разделяй и властвуй&amp;quot;.&lt;br /&gt;
## (задание не оценивается) Прочитайте [https://dl.dropboxusercontent.com/u/829163/draft.pdf §1.2.3 Алгоритм Евклида (стр. 23)].&lt;br /&gt;
## * Докажите, что определение НОД-а, приведённое ниже, корректно.&lt;br /&gt;
## Постройте алгоритм, основанный на этом определении.&lt;br /&gt;
## Какой алгоритм будет быстрее для n-битовых чисел a и b при больших значениях n --- ваш или алгоритм Евклида?&lt;br /&gt;
# * Покажите как за время O(n log n) удалить из массива размера n все дубликаты, то есть оставить каждый элемент в одном экземпляре.&lt;br /&gt;
# * Даны два упорядоченных массива размера m и n. Постройте алгоритм, находящий k-й по величине элемент в объединении этих массивов за время O(log(n+m)). &lt;br /&gt;
&lt;br /&gt;
Функция F(n).&lt;br /&gt;
  если n &amp;gt; 1:&lt;br /&gt;
    напечатать &amp;quot;всё ещё работаю&amp;quot;&lt;br /&gt;
    F(n/2)&lt;br /&gt;
    F(n/2)&lt;br /&gt;
&lt;br /&gt;
Определение НОД-а.&lt;br /&gt;
             2НОД(a/2, b/2), если а и b чётны,&lt;br /&gt;
  НОД(a,b) = НОД(a, b/2), если а нечётно, b чётно,&lt;br /&gt;
             НОД((a-b)/2, b), если а и b нечётны.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;lt;nowiki&amp;gt;Задачи взяты из книги &amp;quot;Алгоритмы&amp;quot;, глава 2 (см. список рекомендованной литературы).&amp;lt;/nowiki&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Сложение и умножение (19.01)==&lt;br /&gt;
# Алгоритм сложения, его сложность (§1.1.1 Сложение*)&lt;br /&gt;
# &amp;quot;Школьный&amp;quot; алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Рекурсивный алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Алгоритм умножения, реализующий стратегию &amp;quot;разделяй и властвуй&amp;quot;, анализ сложности (§2.1 Умножение чисел*)&lt;br /&gt;
 * [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать.]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 3 (19.01 - 2.02)===&lt;br /&gt;
* Во всех задачах для простоты можно считать, что n является степенью какого-либо числа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Найдите произведение чисел 10011011 и 10111010 (в двоичной системе счисления), используя алгоритм умножения чисел, основанный на методе «разделяй и властвуй». Необходимо не только дать ответ, но и привести ход решения.&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 3 рекурсивных вызова для подзадач размера n-1 и комбинирует из них решение исходной задачи за О(n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте три верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 10 рекурсивных вызовов для подзадач размера n/2 и комбинирует из них решение исходной задачи за О(5n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте два верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Докажите, что 3m² + m = O(m²).&lt;br /&gt;
# Докажите, что lg m = O(m/1000), где lg m — это логарифм с двоичным основанием.&lt;br /&gt;
# Докажите, что из равенства f(n) = O(g(n)) не следует, что g(n) = O(f(n)).&lt;br /&gt;
# Докажите, что O(m) содержится в O(m²).&lt;br /&gt;
&lt;br /&gt;
==Решение рекуррентных уравнений (22.01)==&lt;br /&gt;
# Примеры решений рекуррентных уравнений (см. [https://www.dropbox.com/s/6a0r410zjm9qwe7/algo-3-recurrences.pdf?dl=0 конспект]).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 4 (до 14.02)===&lt;br /&gt;
* Нельзя использовать утверждение основной теоремы о решении рекуррентных соотношений.&lt;br /&gt;
* &#039;&#039;Можно&#039;&#039; использовать метод построения дерева рекурсии или подстановку (метод с угадыванием ответа).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Какой из трёх приведённых ниже алгоритмов вы бы предпочли? Обоснуйте свой ответ.&lt;br /&gt;
#* Алгоритм A, решая задачу, производит пять рекурсивных вызовов для подзадач вдвое меньшего размера, после чего строит ответ для исходной задачи за линейное время.&lt;br /&gt;
#* Алгоритм B, решая задачу размера n, делает два рекурсивных вызова для задач размера n − 1, после чего находит ответ за время O(1).&lt;br /&gt;
#* Алгоритм C, решая задачу размера n, рекурсивно решает девять задач размера n/3 и строит ответ за время O(n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Найдите T(n) в замкнутой форме для любых 7 из 10 приведённых ниже рекуррентных соотношений:&lt;br /&gt;
## T(n) ≤ 2T(n/3) + 1;&lt;br /&gt;
## T(n) ≤ 7T(n/7) + n;&lt;br /&gt;
## T(n) ≤ 9T(n/3) + n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 8T(n/2) + n&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 49T(n/25) + n&amp;lt;sup&amp;gt;3/2&amp;lt;/sup&amp;gt;log n;&lt;br /&gt;
## T(n) ≤ T(n − 1) + 2;&lt;br /&gt;
## T(n) ≤ T(n − 1) + n&amp;lt;sup&amp;gt;c&amp;lt;/sup&amp;gt;, где c ≥ 1 –– константа;&lt;br /&gt;
## T(n) ≤ T(n − 1) + c&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;, где c &amp;gt; 1 –– константа;&lt;br /&gt;
## T(n) ≤ 2T(n − 1) + 1;&lt;br /&gt;
## T(n) ≤ T(sqrt(n)) + 1.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №1==&lt;br /&gt;
Необходимо реализовать все 6 задач из [https://official.contest.yandex.ru/contest/1002 контеста]. Каждую задачу можно писать на С++ или Python. На выполнение работы отводится две недели. Каждая задача оценивается в 10/6 балла. Оценка &#039;&#039;может&#039;&#039; быть снижена за плохой код, но не более чем на 25%.&lt;br /&gt;
&lt;br /&gt;
==Бинарное дерево поиска (26.01)==&lt;br /&gt;
# Определение. Пример.&lt;br /&gt;
# Не модифицирующие алгоритмы: поиск (рекурсивный и итеративный алгоритмы), поиск минимума, inordered обход (вывод значений узлов в отсортированном порядке), поиск следующего по возрастанию.&lt;br /&gt;
# Модифицирующие алгоритмы: вставка (рекурсивная реализация), удаление (только идея).&lt;br /&gt;
 [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 13, стр. 248]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 5 (до 16.02)===&lt;br /&gt;
* Для получения максимальной оценки можно выполнить или все задачи без звёздочки, или задачу со звёздочкой. Преподаватель понимает, что реализацию БДП сложно не найти в интернете, но от копипасты не будет никакой пользы. Напротив, самостоятельная реализация очень полезна и приветствуется, даже если не получится выполнить всех пунктов задания.&lt;br /&gt;
* Задачи с двумя звёздочками необязательны.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Нарисуйте бинарные деревья поиска высотой 2, 3, 4, 5 и 6 для множества ключей {1, 4, 5, 10, 16, 17, 21}. Корень дерева имеет высоту 0.&lt;br /&gt;
# &#039;&#039;&#039;Сортировка с использованием БДП.&#039;&#039;&#039;&lt;br /&gt;
## Какова асимптотическая сложность алгоритма вставки элемента в дерево высоты d? Почему? Назовите наилучший и наиухдший случаи.&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который строит БДП в узлах которого стоят элементы данной последовательности. Можно использовать функцию Insert. Назовите наилучший и наихудший случаи. Есть теорема о том, что полученный алгоритм будет работать в среднем случае за время O(n * log n).&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который выводит их в порядке возрастания. Используйте бинарное дерево поиска. Какова в среднем случае сложность этого алгоритма? Назовите наилучший и наихудший случаи. Какова сложность в наихудшем случае?&lt;br /&gt;
# Напишите функцию GetRoot, которой на вход подаётся указатель на произвольный узел дерева, а она возвращает указатель на корень.&lt;br /&gt;
# Напишите процедуру PrintLeafs, которой на вход подаётся указатель на корень дерева, и она печатает листья дерева&lt;br /&gt;
## по возрастанию,&lt;br /&gt;
## по убыванию.&lt;br /&gt;
# ** Альтернативный обход в порядке возрастания бинарного дерева поиска с n узлами (или центрированный (inordered) обход) можно осуществить путём поиска минимального элемента дерева с помощью функции Minimum с последующий n-1 вызовом функции Next. Каково время работы такого алгоритма?&lt;br /&gt;
# * Реализуйте на С++ структуру данных бинарное дерево поиска, [https://yadi.sk/i/gi2SEStreFfSb используя заготовку].&lt;br /&gt;
## Нарисуйте бинарное дерево поиска, которое строится в функции getTreeExample.&lt;br /&gt;
## Реализуйте следующие алгоритмы: &lt;br /&gt;
### поиск минимума, &lt;br /&gt;
### inordered обход (вывод значений узлов в отсортированном порядке),&lt;br /&gt;
### поиск следующего по возрастанию,&lt;br /&gt;
### вставка элемента в дерево,&lt;br /&gt;
### сортировка последовательности с использованием БДП (дан вектор чисел, необходимо вывести их по возрастанию),&lt;br /&gt;
### ** удаление.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Карацубы, Штрассена. Быстрая сортировка (29.01)==&lt;br /&gt;
# Алгоритм Карацубы.&lt;br /&gt;
# Алгоритм Штрассена. [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать Дасгупту и др., §2.5 Умножение матриц]&lt;br /&gt;
# Быстрая сортировка и доказательство того, что в среднем случае она работает за О(n * log n). [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 8 Быстрая сортировка, стр. 148]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 6 (до 18.02)===&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Пусть мы хотим найти двоичное представление десятичного числа 10&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;. Будем считать, что n --- степень двойки (n = 2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt;).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Pwr2Bin(n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть 1010&lt;br /&gt;
    z = ...&lt;br /&gt;
    вернуть Multiply(z, z)&amp;lt;/source&amp;gt;&lt;br /&gt;
Multiply --- функция, перемножающая два n-битовых двоичных числа x и y по алгоритму Карацубы за O(n&amp;lt;sup&amp;gt;log&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;3&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Пусть мы хотим перевести произвольное десятичное число x в записи которого n=2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; чисел в двоичную систему счисления.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Dec2Bin(x, n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть binary[x]&lt;br /&gt;
    разделить x на два десятичных числа xl и xr из n/2 цифр.&lt;br /&gt;
    вернуть ...&amp;lt;/source&amp;gt;&lt;br /&gt;
Здесь binary --- это массив, содержащий двоичное представление десятичных цифр.&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Докажите, что математическое ожидание времени работы алгоритма быстрой сортировки (усреднение по всем вариантам выбора опорного элемента) на любом входе размера n удовлетворяет соотношению: T(n) ≤ O(n) + 1/n * &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt; (T(i-1) + T(n-i)).&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Найдите решение соотношения из предыдущего пункта.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Динамическое программирование (ДП). Первые примеры (02.01)==&lt;br /&gt;
# Нахождение самой длинной возрастающей подпоследовательности.&lt;br /&gt;
# Нахождение редакционного расстояния (или редакционной стоимости, расстояния Левенштейна).&lt;br /&gt;
# Нахождение представителя большинства.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 7 (до 20.02)===&lt;br /&gt;
* В этом задании везде, где требуется реализовать алгоритм, необходимо привести код на любом языке программирования.&lt;br /&gt;
* Для получения максимальной оценки нужно решить все задачи без звёздочек. Одна решённая задача со звёздочкой заменяет одну задачу без звёздочки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения редакционного расстояния (алгоритм Вагнера — Фишера). Например, редакционное расстояние между словами &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равно 6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения длины наибольшей общей подстроки. Например, длина наибольшей общей подстроки &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равна 8 (&amp;quot;antholog&amp;quot;). Чем больше это значение, тем схожей строки.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Предположим теперь, что сравниваемые строки состоят из символов A, С, G и T; за удаление или вставку мы платим -5; за замену буквы x на y платим w[x, y], где x, y принадлежат множеству {A, С, G, T}, a w — это матрица весов:&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
!-!! A!! G!! C!! T&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! A&lt;br /&gt;
|10||-1||-3||-4&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
!G&lt;br /&gt;
||-1||7||-5||-3&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! C&lt;br /&gt;
||-3||-5||9||0&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! T&lt;br /&gt;
||-4||-3||0||8&lt;br /&gt;
|}&lt;br /&gt;
Тогда выравнивание:&lt;br /&gt;
 AGACTAGTTAC&lt;br /&gt;
 CGA‒‒‒GACGT&lt;br /&gt;
будет иметь следующую оценку:&lt;br /&gt;
 w[A,C] + w[G,G] + w[A,A] + 3*(-5) + w[G,G] + w[T,A] + w[T,C] + w[A,G] + w[C,T] = -3 + 7 + 10 - 3*5 + 7 + (-4) + 0 + (-1) + 0 = 1.&lt;br /&gt;
&lt;br /&gt;
Напишите алгоритм, который находит максимальную стоимость всех возможных выравниваний. Верно ли, что чем больше это значение, тем непохожей строки?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как давно один народ отделился от другого? Кто похожей — итальянец и китаец или якут и эфиоп? На эти вопросы можно отвечать с разных точек зрения — культурной, исторической, лингвистической, ... В последние же годы человечество научилось секвенировать геном, что позволило исследовать этот вопрос с точки зрения генетики. Секвенирование генома — это процесс записи ДНК в виде нуклеотидной последовательности, которая представляет собой последовательность из четырёх символов — A, С, G и T. Существуют базы, которые хранят генетическую информацию о людях из разных стран и континентов, например, [http://www.mtdb.igp.uu.se/ http://www.mtdb.igp.uu.se/ → Download mtDNA sequences]. Чем больше сходство между геномами, тем сильнее родственные связи между их обладателями. Используя решение предыдущего пункта, выполните задания:&lt;br /&gt;
# Определите, кто похожей — итальянец и китаец или якут и эфиоп?&lt;br /&gt;
# Найдите нескольких похожих и нескольких непохожих народностей.&lt;br /&gt;
# * Выберите одну народность. Найдите самых похожих и самых непохожих на неё.&lt;br /&gt;
# * Найдите самые похожие и самые непохожие народности.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Задача о разрезании стержня (05.01)==&lt;br /&gt;
# Постановка задачи.&lt;br /&gt;
# Решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Решение с нахождением максимума по p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Восходящий алгоритм с запоминанием. Вывод длин кусочков стержня. Оценка сложности.&lt;br /&gt;
# Нисходящий алгоритм с запоминанием. Оценка сложности.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.1 Разрезание стержня, стр. 393]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 8 (до 22.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Решая задачу о разрезании стержня мы вначале построили рекурсивное решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt; для всех 1 ≤ i &amp;lt; n. Его сложность описывалась рекуррентной формулой T(n) = n + &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n-1&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt;(T(i) + T(n-i)), T(1) = 1.&lt;br /&gt;
# Объясните эту формулу.&lt;br /&gt;
# Покажите с помощью метода подстановок, что T(n) ≤ 2&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Покажите с помощью контрпримера, что описанная далее жадная стратегия не всегда определяет оптимальный способ разрезания стержня. Определим плотность стержня длиной i как p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;/i, то есть как стоимость единицы его длины. Жадная стратегия для стержня длиной n отрезает от стержня первую часть длиной i, где 1 ≤ i ≤ n, имеющую максимальную плотность. Затем та же жадная стратегия применяется к оставшейся части длиной n-i.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Рассмотрим модификацию задачи разрезания стержня, в которой в дополнение к цене p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; каждого стержня добавляется фиксированная цена разреза c. Теперь прибыль, связанная с решением, представляет собой сумму цен частей стержня минус стоимость разрезов. Разработайте алгоритм динамического программирования для этой модифицированной задачи.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Непрерывным участком называется группа подряд идущих элементов. Например, для последовательности&lt;br /&gt;
 5, 15, −30, 10, −5, 40, 10&lt;br /&gt;
элементы 15, −30, 10 образуют непрерывный участок, а 5, 15, 40 -- нет. Постройте линейный алгоритм для следующей задачи:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Вход: список чисел a1, a2, ... ‌, an.&lt;br /&gt;
Выход: непрерывный участок с максимальной суммой (сумма участка нулевой длины равна нулю).&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Для приведённого примера ответом будет 10, −5, 40, 10 с суммой 55. Какова сложность алгоритма? Почему?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Надо заплатить v рублей, имея купюры в x1, x2, ‌..., xn рублей (купюр каждого типа сколько угодно). Это не всегда возможно (скажем, купюрами в&lt;br /&gt;
10 и 25 рублей можно заплатить 45 рублей, но не 47 и не 15). Постройте основанный на методе динамического программирования алгоритм со временем работы O(nv), выясняющий, возможна ли уплата.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как решить предыдущую задачу, если каждая купюра имеется в единственном экземпляре? (Например, купюрами в 1, 5, 10, 20 рублей можно заплатить 16 = 1 + 5 + 10 и 31 = 1 + 10 + 20 рублей, но не 40 (не хватит денег). Время работы алгоритма по-прежнему O(nv).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Ещё один вариант той же задачи: купюр каждого типа сколько угодно, но всего разрешается использовать не более k купюр. (Например, если есть купюры в 5 и 10 рублей, а k = 6, то 55 разменять можно, а 65 –– нет).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Перемножение цепочки матриц. Оптимальное бинарное дерево поиска (начало) (09.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о перемножении цепочки матриц. Постановка задачи.Пример. Нисходящий алгоритм.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.2 Перемножение цепочки матриц, стр. 403]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 9 (до 24.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Найдите оптимальную расстановку скобок в произведении последовательности матриц, размерности которых равны 5×10, 10×3, 3×12, 12×5, 5×50, 50×6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Напишите восходящий алгоритм для поиска оптимальной расстановки скобок.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Расстановка пробелов. Оптимальное бинарное дерево поиска (середина) (12.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о расстановке пробелов. Постановка задачи. Решения для трёх случаев: 1. нужно вернуть можно ли разбить текст на слова; 2. вернуть разбивку на слова; 3. слова встречаются не равновероятно, вернуть наиболее вероятную разбивку на слова.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи. Вывод математического ожидания времени поиска.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Праздничное домашнее задание 10 (до 02.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[&amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;,&amp;quot;, &amp;quot;.&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;,&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;.&amp;quot;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Подсказка:&#039;&#039;&#039; разбейте текст на слова из списка и посмотрите на азбуку Морзе.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Способы представления графов в памяти (16.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Разбор ошибок в домашнем задании.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Графы. Способы представления графов в памяти (матрица смежности, список рёбер, список соседей (список смежностей), матрица инцидентности). Зависимость сложности алгоритмов от способа представления.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §22.1 Представление графов, стр. 626]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 11 (до 02.03)===&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача A.]&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача B.]&lt;br /&gt;
# Нарисуйте неориентированный граф с 5 вершинами и 8 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Нарисуйте ориентированный граф с 4 вершинами и 3 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Дан ориентированный граф. &#039;&#039;Исходящая степень вершины v&#039;&#039; --- это количество исходящих из неё рёбер, &#039;&#039;входящая степень v&#039;&#039; --- это количество рёбер входящих в  v. Имеется представление ориентированного графа с использование списка соседей. Как долго будут вычисляться исходящие степени всех вершин графа? А входящие степени?&lt;br /&gt;
# Дан граф G = (V, E). Какие из рассмотренных способов хранения графов используют меньше всего памяти для хранения G и почему? Указание: рассмотрите случаи |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;lt; |E| и |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;gt; |E|.&lt;br /&gt;
# Пусть C --- это матрица смежности графа G.&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
# Пусть B --- это матрица инцидентности ориентированного графа G. Как связаны элементы матрицы BB&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
&lt;br /&gt;
==Реализация поиска в глубину (19.02)==&lt;br /&gt;
# Реализация поиска в глубину и смежных задач.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 12 (до 5.03)===&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Выберите любой способ хранения графа. Реализуйте поиск в глубину.&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Напишите алгоритм, который возвращает данные о том, какие вершины лежат в одной компоненте связности.&lt;br /&gt;
# &#039;&#039;(любой ЯП или псевдокод)&#039;&#039; Напишите алгоритм проверки сильной связности ориентированного графа. Какова его сложность?&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №2==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
Необходимо реализовать 3 задачи из [https://official.contest.yandex.ru/contest/1085 контеста], см. [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing распределение задач]. Каждую задачу можно написать на С++ или Python. На выполнение работы отводится две недели (см. время окончания контеста). [https://official.contest.yandex.ru/contest/1123 Дорешивание.]&lt;br /&gt;
&lt;br /&gt;
==ДП и графы (26.02)==&lt;br /&gt;
==ДП и графы (02.03)==&lt;br /&gt;
==Жадные алгоритмы (12.03)==&lt;br /&gt;
===Домашнее задание 13 (до 23.03)===&lt;br /&gt;
# Вася хочет купить по одной акции каждой компании. Все акции стоят одинаково, но дорожают по-разному. Каждый месяц акция i-ой компании дорожает в r_i раз. В один месяц можно купить только одну акцию.&lt;br /&gt;
## Напишите алгоритм, который выводит оптимальную последовательность покупок (такую, что на покупку всех акций потратится меньше денег).&lt;br /&gt;
## Докажите корректность алгоритма, то есть докажите, что последовательность покупок, которую выводит ваш алгоритм, оптимальна.&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список, очередь (16.03)==&lt;br /&gt;
# Реализация линейного двусвязного списка (С++).&lt;br /&gt;
# Реализация очереди ограниченной длины на базе вектора (С++).&lt;br /&gt;
# Реализация очереди на базе списка (С++).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14 (до 23.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте (на С++) структуру данных Стек. У стека должно быть три операции:&lt;br /&gt;
* push --- положить элемент на вершину стека;&lt;br /&gt;
* pop --- удалить верхний элемент;&lt;br /&gt;
* front --- вернуть значение верхнего элемента.&lt;br /&gt;
Оцените время работы каждой функции.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список (19.03)==&lt;br /&gt;
===Домашнее задание 13* (до 30.03)===&lt;br /&gt;
#Для приведённой реализации класса List (https://yadi.sk/i/c5r_79WdfMyNS).&lt;br /&gt;
## Допишите print, push_back и push_front.&lt;br /&gt;
## В функции insert_after и delete_node вставьте необходимые проверки так, чтобы они работали для крайних случаев.&lt;br /&gt;
## Напишите main в котором&lt;br /&gt;
### создаётся объект класса List, &lt;br /&gt;
### заполняется элементами с помощью функций push_back, push_front и insert_after и&lt;br /&gt;
### удаляется i-ый элемент.&lt;br /&gt;
&lt;br /&gt;
==Повторение (30.03)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Для данных пар функций выясните их связь в терминах O-, o-, Ω-, ω-, Θ-обозначений. Поставьте галочку в клетке с Ω, если f(x) = Ω(g(x)) и прочерк, если равенства нет. [https://ru.wikipedia.org/wiki/«O»_большое_и_«o»_малое#.D0.94.D1.80.D1.83.D0.B3.D0.B8.D0.B5_.D0.BF.D0.BE.D0.B4.D0.BE.D0.B1.D0.BD.D1.8B.D0.B5_.D0.BE.D0.B1.D0.BE.D0.B7.D0.BD.D0.B0.D1.87.D0.B5.D0.BD.D0.B8.D1.8F Википедия]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! f(x)!! g(x)!! O!! o!! Ω!! ω!! Θ&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! 2^100&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n * log(n)&lt;br /&gt;
! 2^100 * n * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n&lt;br /&gt;
! 2^100 * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n!&lt;br /&gt;
! 2^(2015n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n*2^n&lt;br /&gt;
! 3^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 5^n&lt;br /&gt;
! 5^(n+1)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n + n^2 + n^3 + ... + n^1000&lt;br /&gt;
! 7^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм Quickselect нахождения k-ого элемента по возрастанию: http://en.wikipedia.org/wiki/Quickselect&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;На улице стоит ряд домов. В каждом из домов лежит сколько-то денег. Вор хочет обокрасть дома на переулке. Он не может обокрасть два соседних дома, потому что хозяин дома, который он обокрал, сразу предупредит соседей. Нужно найти, какую максимальную сумму вор может украсть с переулка. На вход программы подается массив неотрицательных целых чисел - количество долларов в доме с номером i. Соседние дома в массиве представлены соседними элементами. Например, пусть задан массив { 1, 4, 5 } - тогда вор максимум может украсть $6, обокрав дома 1 и 3. Пусть задан массив { 1, 7, 2 } - тогда вор максимум может украсть $7, обокрав дом 2.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Алфавит из всех маленьких латинских букв и пробела закодирован числами следующим способом:&lt;br /&gt;
  &#039;a&#039; -&amp;gt; 1&lt;br /&gt;
  &#039;b&#039; -&amp;gt; 2&lt;br /&gt;
  &#039;c&#039; -&amp;gt; 3&lt;br /&gt;
  ...&lt;br /&gt;
  &#039;z&#039; -&amp;gt; 26&lt;br /&gt;
  &#039; &#039; -&amp;gt; 27&lt;br /&gt;
На вход программы подается строка из цифр. Нужно посчитать, сколькими способами можно раскодировать эту строку.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Дан граф, заданный матрицей смежности. Вывести пары вершин между которыми нет пути.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Повторение (02.04) ==&lt;br /&gt;
Решали и разбирали первые 4 задачи из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14* (до 11.03)===&lt;br /&gt;
Решите любые две задачи (подпункты НЕ считаются отдельными задачами) с предыдущей пары (Повторение (30.03)).&lt;br /&gt;
&lt;br /&gt;
== Повторение (06.04) ==&lt;br /&gt;
Будем решать вторую половину задач из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 15 (до 16.04)===&lt;br /&gt;
# Приведите пример графа, который содержит отрицательные рёбра, не содержит циклов отрицательного веса и для которого алгоритм Дейкстры возвращает неверный результат.&lt;br /&gt;
# Используется ли в алгоритме Дейкстры то, что веса рёбер неотрицательны? Если &amp;quot;да&amp;quot;, то где именно?&lt;br /&gt;
# Пусть граф содержит рёбра с весами &amp;gt;= -100. Если прибавить к каждому ребру 101 и при помощи алгоритма Дейкстры найти кратчайшие пути. Будут ли эти пути кратчайшими в исходном графе? Почему?&lt;br /&gt;
&lt;br /&gt;
== Повторение (07.04) ==&lt;br /&gt;
&#039;&#039;&#039;Решение рекуррентных соотношений&#039;&#039;&#039;&lt;br /&gt;
# Решите уравнение: T(n) = 4*T(n/2) + O(n^2) с базой T(1) = O(1)&lt;br /&gt;
## Используя основную теорему.&lt;br /&gt;
## Используя дерево рекурсий.&lt;br /&gt;
## Методом подстановки.&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2)) + n является \Theta(n lg n).&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2) + 17) + n является \Theta(n lg n).&lt;br /&gt;
# Решите уравнения, считая, что T(1) = O(1):&lt;br /&gt;
## T(n) = T(n-1) + n&lt;br /&gt;
## T(n) = 2*T(floor(sqrt(n))) + lg n. Указание: попробуйте использовать замену переменных.&lt;br /&gt;
## T(n) = 3*T(sqrt(n)) + lg n&lt;br /&gt;
# Дайте верхнюю и нижнюю оценки функции T(n). Постарайтесь, чтобы оценки были как можно более точные&lt;br /&gt;
## T(n) = 4T(n/3) + n*lg(n)&lt;br /&gt;
## T(n) = 3T(n/3) + n/lg(n)&lt;br /&gt;
## T(n) = 4T(n/2) + n^2*sqrt(n)&lt;br /&gt;
## T(n) = T(n/2) + T(n/4) + T(n/8) + n&lt;br /&gt;
## T(n) = T(n-1) + 1/n&lt;br /&gt;
## T(n) = T(n-2) + 1/lg(n)&lt;br /&gt;
## T(n) = sqrt(n) * T(sqrt(n)) + n&lt;br /&gt;
&#039;&#039;&#039;Анализ и построение алгоритмов&#039;&#039;&#039;&lt;br /&gt;
# Числа Фибоначчи F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; можно выразить через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, используя матрицу: https://yadi.sk/i/Pm_aNzHCforFU. &lt;br /&gt;
## Покажите как вычислить F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;.&lt;br /&gt;
## Как вычислить F&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;n+1&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;?&lt;br /&gt;
## Напишите алгоритм.&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
## Ускорьте его так, чтобы он работал за O(log n).&lt;br /&gt;
# Дана последовательность символов. Какое минимальное количество символов нужно удалить из неё, чтобы получить палиндром?&lt;br /&gt;
## Напишите алгоритм (на псевдокоде или на любом языке программирования).&lt;br /&gt;
## Оцените время работы алгоритма.&lt;br /&gt;
# Какую структуру данных вы бы использовали для реализации упорядоченного множества (http://neerc.ifmo.ru/wiki/index.php?title=Упорядоченное_множество)? Какая будет сложность каждой из операций над множеством?&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 16 (до 20.04)===&lt;br /&gt;
# Решите 6 задач из первой части и 6 из второй. (Укажите какие именно.) Каждый из подпунктов является отдельной задачей.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм и теорема Форда-Фалкерсона (16.04)==&lt;br /&gt;
# Базовые определения (пропускные способности, сток, исток и пр.). Пример. &lt;br /&gt;
# Ограничения на поток (сохранение и что меньше пропускных способностей).&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, пример работы&lt;br /&gt;
# Разрез, определение, пример.&lt;br /&gt;
# Утверждение: максимальный поток &amp;lt;= любого разреза.&lt;br /&gt;
# Теорема Форда-Фалкерсона (с доказательством).&lt;br /&gt;
# Пример на котором алгоритм Форда-Фалкерсонаработает работает очень долго при неудачном выборе путей.&lt;br /&gt;
# Сложность алгоритма Форда-Фалкерсона.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №3==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
В [https://official.contest.yandex.ru/contest/1196 домашнем задании] пять задач. Они разделены на два варианта, помеченные римскими цифрами I и II. Свой вариант нужно узнать [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing здесь на вкладке HW3]. Третья задача — общая для двух вариантов; ее решение необходимо снабдить доказательством корректности алгоритма. На выполнение задания дается примерно 2 недели (см. точное время окончания в контесте). Каждую задачу можно написать на С++ или Python.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Форда-Фалкерсона и Эдмондса-Карпа (20.04)==&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, напоминание: базовые определения, пример работы, пример на котором алгоритм работает долго, сложность.&lt;br /&gt;
# Алгоритм Эдмодса-Карпа. Доказательство асимптотики времени работы.&lt;br /&gt;
&lt;br /&gt;
==(23.04)==&lt;br /&gt;
&lt;br /&gt;
==(11.05) Красно-чёрные деревья==&lt;br /&gt;
[https://ru.wikipedia.org/wiki/Красно-чёрное_дерево Красно-чёрное дерево]&lt;br /&gt;
===Домашнее задание 17 (до 18.05)===&lt;br /&gt;
# Зачем нужны красно-чёрные деревья?&lt;br /&gt;
# Благодаря какому свойству и почему красно-чёрное дерево является сбалансированным?&lt;br /&gt;
# Нарисуйте полное бинарное дерево поиска высотой 3 с ключами {1, 2, ..., 15}. Сделайте из него красно-чёрные деревья высотой 2, 3 и 4.&lt;br /&gt;
# Нарисуйте красно-чёрные деревья, получающиеся последовательной вставкой элементов 12, 10, 29, 30, 31, 32 в [https://ru.wikipedia.org/wiki/Красно-чёрное_дерево#/media/File:Red-black_tree_example.svg данное дерево]. Для вставки используйте алгоритм вставки из Википедии. Укажите какой именно функцией вы воспользовались.&lt;br /&gt;
# Определим &#039;&#039;&#039;ослабленное красно-чёрное дерево&#039;&#039;&#039; как бинарное дерево поиска, которое удовлетворяет красно-чёрным свойствам 1, 3, 4 и 5. Другими словами, корень может быть как чёрным, так и красным. Рассмотрите ослабленное красно-чёрное дерево T, корень которого красный. Если перекрасить корень дерева T в чёрный, будет ли оно красно-чёрным деревом?&lt;br /&gt;
# Покажите, что самый длинный простой нисходящий путь от вершины x к листу красно-черного дерева имеет длину, не более чем в два раза превышающую кратчайший путь от x к листу-потомку.&lt;br /&gt;
# Чему равно наибольшее возможное количество внутренних узлов в красно-чёрном дереве с чёрной высоты k? А наименьшее возможное количество?&lt;br /&gt;
# Нарисуйте красно-чёрные деревья, получающиеся последовательной вставкой ключей 41, 38, 31, 12, 19, 8 в изначально пустое дерево.&lt;br /&gt;
# Покажите какие деревья будут получаться в результате последовательного удаления ключей в порядке 8, 12, 19, 31, 38, 41.&lt;br /&gt;
&lt;br /&gt;
==(14.05) Конкурентный анализ самоорганизующихся циклов==&lt;br /&gt;
[https://vk.com/doc12518218_390369758 Лекция]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 18 (до 21.05)===&lt;br /&gt;
Все вычисления сопроводите подробными объяснениями о том, почему верно то или иное (не)равенство.&lt;br /&gt;
# Пусть имеется n-элементный список и m поисковых запросов к нему. После каждой операции поиска можно переупорядочить список. Обозначим стоимость последовательности поисков через C. Докажите, что в худшем случае C = Ω(mn).&lt;br /&gt;
#  Обозначим через c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; стоимость i-ого поискового запроса с применением эвристики перемещения в начало, которая включает стоимость поиска элемента в списке и стоимость его перемещения в начало списка путём ряда обменов соседних элементов списка. Покажите, что i-ая операция поиска находит элемент x в списке L с применением эвристики перемещения в начало, то c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = 2 * rank&amp;lt;sub&amp;gt;L&amp;lt;/sub&amp;gt;(x) - 1.&lt;br /&gt;
# Покажите, что c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = 2 * rank&amp;lt;sub&amp;gt;L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) - 1.&lt;br /&gt;
# Покажите, что c*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = rank&amp;lt;sub&amp;gt;L*&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) + t&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;.&lt;br /&gt;
# Докажите, что после одного обмена двух соседних элементов потенциал либо увеличивается на 2, либо уменьшается на 2.&lt;br /&gt;
# Докажите, что rank&amp;lt;sub&amp;gt;L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) = |A| + |B| + 1.&lt;br /&gt;
# Докажите, что rank&amp;lt;sub&amp;gt;L*&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) = |A| + |С| + 1.&lt;br /&gt;
# Покажите, что поиск i-ого элемента приводит к изменению потенциала Ф(L&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;) - Ф(L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;) &amp;lt;= 2 (|A| - |B| + t*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;), где t*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; --- это количество обменов при i-ом поиске.&lt;br /&gt;
# Во сколько раз стоимость С&amp;lt;sub&amp;gt;MFT&amp;lt;/sub&amp;gt;(S) превышает C&amp;lt;sub&amp;gt;OPT&amp;lt;/sub&amp;gt;(S)?&lt;br /&gt;
&lt;br /&gt;
== (18.05) Конечные автоматы ==&lt;br /&gt;
=== Задание 19 (до 25.05) ===&lt;br /&gt;
# Постройте автомат для языка над алфавитом Σ = {0, 1} каждое слово которого содержит хотя бы два нуля. Является ли он детерминированным?&lt;br /&gt;
# Постройте автомат над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5. Является ли он детерминированным?&lt;br /&gt;
# Постройте автомат, который допускает пустой язык (язык в котором нет ни одного слова).&lt;br /&gt;
# Постройте автомат, который допускает все слова над алфавитом Σ.&lt;br /&gt;
# Постройте ДКА над алфавитом Σ = {К, Ж, З}, который допускает слова в которых после К идёт З, после З --- Ж, после Ж --- К.&lt;br /&gt;
# Постройте ДКА над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5, а число нулей на 3.&lt;br /&gt;
# Постройте НКА для языка над алфавитом Σ = {0, 1, 2, 3}, состоящий из слов, в которых хотя бы одна из последних пяти букв является 1.&lt;br /&gt;
# Постройте НКА над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5, а число нулей на 3.&lt;br /&gt;
# Какие языки допускают автоматы https://yadi.sk/d/fNAHbjCZghERG?&lt;br /&gt;
# Для каждого из автоматов https://yadi.sk/d/fNAHbjCZghERG постройте соответствующий ему ДКА.&lt;/div&gt;</summary>
		<author><name>Kassalanche</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=12798</id>
		<title>Алгоритмы и структуры данных. Подгруппа 105-1</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=12798"/>
		<updated>2015-05-18T05:39:50Z</updated>

		<summary type="html">&lt;p&gt;Kassalanche: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==О курсе==&lt;br /&gt;
[[Алгоритмы_и_структуры_данных|План лекций и список рекомендуемой литературы.]]&lt;br /&gt;
&lt;br /&gt;
[[Алгоритмы_и_структуры_данных._Подгруппа_105-1._FAQ|FAQ.]]&lt;br /&gt;
&lt;br /&gt;
[[Reviewboard|Инструкция по использованию Reviewboard.]]&lt;br /&gt;
&lt;br /&gt;
[[Практические_занятия_по_курсу_ОиМП/C++_check|Style guide.]]&lt;br /&gt;
&lt;br /&gt;
==Итоговая оценка за курс==&lt;br /&gt;
Итоговая оценка (ИО) зависит от&lt;br /&gt;
* оценок за пять больших домашних заданий (БДЗ1, БДЗ2, ..., БДЗ5),&lt;br /&gt;
* оценок за домашние задания (ДЗ1, ДЗ2, ...),&lt;br /&gt;
* оценки за контрольную работу (КР),&lt;br /&gt;
* оценки за экзамен (ЭКЗ),&lt;br /&gt;
и может быть вычислена по формуле:&lt;br /&gt;
 ИО = 0.7 * (0.3 * КР + 0.7 *(ИДЗ1 + ИДЗ2 + ИДЗ3 + ИДЗ4 + ИДЗ5)/5) + 0.3 * ЭКЗ =&lt;br /&gt;
    = 0.21*КР + 0.98*ИДЗ1 + 0.98*ИДЗ2 + 0.98*ИДЗ3 + 0.98*ИДЗ4 + 0.98*ИДЗ5 + 0.3*ЭКЗ,&lt;br /&gt;
где&lt;br /&gt;
 ИДЗi = min (10, 0.7 * БДЗi + 0.4 * &amp;lt;cредняя оценка за ДЗj, прошедшие с предыдущего БДЗ по i-ое&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
==Порядок сдачи домашних работ==&lt;br /&gt;
===Большие домашние работы===&lt;br /&gt;
# Получить OK за задачу в контесте.&lt;br /&gt;
# Залить исходный код на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* На каждую задачу создавайте отдельный запрос на ревью. &lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении суток приходят замечания к коду. &#039;&#039;&#039;Если в течении суток замечаний или Ship It не появилось, проверьте, что вы правильно отправили запрос и, если всё сделано правильно, спросите у семинариста получил ли он запрос.&#039;&#039;&#039;&lt;br /&gt;
# Вы их исправляете, проверяете в контесте, что программа по-прежнему проходит все тесты, заливаете новую версию в Review Board. Штрафов за посылки НЕ будет.&lt;br /&gt;
# Процесс повторяется пока остаются замечания к коду или пока не истёк дедлайн. После закрытия контеста будут ещё одни сутки на доработку замечаний в Review Board.&lt;br /&gt;
# Оценивается только последняя версия работы в Review Board.&lt;br /&gt;
&lt;br /&gt;
===Маленькие домашние работы===&lt;br /&gt;
# Залить решение на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* Желаемые форматы: txt, py, cpp, h. Допускаются любые другие.&lt;br /&gt;
#* На каждую домашнюю работу создавайте отдельный запрос на ревью. Обязательно указывайте номер домашней работы.&lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении неопределенного промежутка времени придут оценки по каждому из заданий.&lt;br /&gt;
&lt;br /&gt;
==Оценивание домашних работ==&lt;br /&gt;
* Все задания предполагаются индивидуальными. Запрещены любые заимствования без ссылки на автора.&lt;br /&gt;
* Решения после установленного дедлайна не принимаются. Дедлайн указан в заголовке каждого задания.&lt;br /&gt;
* Везде, где требуется написать алгоритм, можно использовать любой язык программирования или псевдокод.&lt;br /&gt;
* Там, где требуется построить алгоритм с заданной асимптотикой, приведите обоснование, что полученный алгоритм удовлетворяет этому условию.&lt;br /&gt;
* Эти правила не действуют, если в задании явно оговорено иное.&lt;br /&gt;
&lt;br /&gt;
==Мотивация к изучению алгоритмов. Подсчёт числа операций (12.01)==&lt;br /&gt;
# Числа Фибоначчи. Определение. Примитивный рекурсивный алгоритм вычисления i-ого числа. Оценка числа операций. Анализ причин неэффективности. Алгоритм с запоминанием вычисленных ранее значений. Оценка числа операций. Сравнение с предыдущим. (подробнее: глава 0, страницы 8-10 из книги &amp;lt;&amp;lt;Алгоритмы&amp;gt;&amp;gt;, [[Алгоритмы_и_структуры_данных|см. список рекомендованной литературы]])&lt;br /&gt;
# Задача о ханойской башне. Постановка задачи. Рекурсивный алгоритм. Рекуррентная формула для числа перемещений. Замкнутая формула для числа перемещений (+ доказательство). Доказательство того, что эту задачу нельзя решить используя меньшее число перемещений дисков. ([https://www.dropbox.com/s/t8cbs7ttu4iasvj/algo-0-recursion.pdf?dl=0 Разбор задачи о ханойской башне], автор Сергей Объедков)&lt;br /&gt;
# Сортировка пузырьком. Алгоритм. Подсчёт количество операций сравнения и обмена (swap). Анализ наилучшего и наихудшего случаев ([https://ru.wikipedia.org/wiki/Сортировка_пузырьком Википедия])&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 1 (12.01 - 26.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
Во всех задачах, если не оговорено иного, предполагаем, что работаем с целыми неотрицательными числами. Для первых 7 задач необходимо&lt;br /&gt;
* описать что можно считать наилучшим и наихудшим случаями,&lt;br /&gt;
* для каждого из двух случаев подсчитать отдельно количество операций сравнения и swap (если есть).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Даны три числа, требуется вернуть наименьшее.&lt;br /&gt;
# Даны три числа, требуется отсортировать их.&lt;br /&gt;
# Дана последовательность A из n элементов и число x, требуется найти элемент равный x. Примечание: если таких значений i несколько, вернуть любое; если такого элемента нет, функция должна сообщить об этом.&lt;br /&gt;
# * Дана упорядоченная последовательность A из n элементов и число x, требуется найти такое i, что A[i] равно x. Алгоритм должен быть эффективней, чем в предыдущем пункте и использовать то, что последовательность упорядочена.&lt;br /&gt;
# Дана последовательность из 100 000 чисел от 0 до 100. Напишите эффективный алгоритм сортировки, который бы учитывал специфику входных данных.&lt;br /&gt;
# * Дано 32 битное неотрицательное число. Требуется номер первого ненулевого бит. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения, считая, что числа распределены равномерно.&lt;br /&gt;
# * Даны 32 битные неотрицательные числа m и n. Требуется вывести True, если m &amp;lt; n, иначе False. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения битов, считая, что числа распределены равномерно.&lt;br /&gt;
# Напишите рекурсивную функцию, вычисляющую n-ое число Фибоначчи (как на занятии). Подсчитайте количество рекурсивных вызовов.&lt;br /&gt;
# * Напишите функцию, вычисляющую n-ое число Фибоначчи, у которой число операций — полином от n, и которая использует количество памяти, независящее от n.&lt;br /&gt;
&lt;br /&gt;
==O-символика и стратегия &amp;quot;разделяй и властвуй&amp;quot; (15.01)==&lt;br /&gt;
# Сортировка слиянием. Алгоритм, рекуррентное соотношение для времени сортировки, сложность. Подробнее: [https://dl.dropboxusercontent.com/u/829163/draft.pdf §2.3 Сортировка слиянием (стр. 54)].&lt;br /&gt;
# О-символика. [https://dl.dropboxusercontent.com/u/829163/draft.pdf §0.3 О-символика (стр. 10)].&lt;br /&gt;
# Задача о слиянии m упорядоченных массивов по n элементов. Три алгоритма решения: последовательное слияние, слияние &amp;quot;деревом&amp;quot; (обе функции используют Merge из MergeSort), аналог Merge для m массивов. Анализ сложности каждого из них.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 2 (15.01-29.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
* Во всех задачах, если не оговорено иного, для простоты &#039;&#039;можно&#039;&#039; считать, что n является степенью какого-либо числа, например, степенью двойки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Дана функция F, определённая ниже. Сколько строк она напечатает? Указание: для обоих подпунктов рассмотрите два случая: 1. n является степенью двойки, 2. n не является степенью двойки.&lt;br /&gt;
## Запишите рекуррентное соотношение для числа строк.&lt;br /&gt;
## Решите уравнение, полученное в предыдущем пункте, то есть, выведите замкнутую (нерекуррентную формулу). Для простоты можно считать, что n является степенью двойки.&lt;br /&gt;
# В массиве A размера n записана возрастающая последовательность целых чисел. Постройте алгоритм типа &amp;quot;разделяй и властвуй&amp;quot;, который проверяет, существует ли такой индекс i, что A[i] = i&lt;br /&gt;
## за время O(n),&lt;br /&gt;
## * за время O(log n).&lt;br /&gt;
## Какие случаи для вашего алгоритма являются наихудшими и наилучшими? Какого время работы в лучшем и худшем случаях?&lt;br /&gt;
# Дан бесконечный массив A, первые n элементов которого содержат возрастающую последовательность положительных чисел, а дальше стоят -1. Значение n не дано. Постройте алгоритм, который получает на вход целое число x и находит это x в массиве --- или говорит, что там его нет, &lt;br /&gt;
## за время O(n),&lt;br /&gt;
## за время O(log n).&lt;br /&gt;
# Рассмотрим алгоритм вычисления наибольшего общего делителя (НОД) двух положительных чисел, основанный на методе &amp;quot;разделяй и властвуй&amp;quot;.&lt;br /&gt;
## (задание не оценивается) Прочитайте [https://dl.dropboxusercontent.com/u/829163/draft.pdf §1.2.3 Алгоритм Евклида (стр. 23)].&lt;br /&gt;
## * Докажите, что определение НОД-а, приведённое ниже, корректно.&lt;br /&gt;
## Постройте алгоритм, основанный на этом определении.&lt;br /&gt;
## Какой алгоритм будет быстрее для n-битовых чисел a и b при больших значениях n --- ваш или алгоритм Евклида?&lt;br /&gt;
# * Покажите как за время O(n log n) удалить из массива размера n все дубликаты, то есть оставить каждый элемент в одном экземпляре.&lt;br /&gt;
# * Даны два упорядоченных массива размера m и n. Постройте алгоритм, находящий k-й по величине элемент в объединении этих массивов за время O(log(n+m)). &lt;br /&gt;
&lt;br /&gt;
Функция F(n).&lt;br /&gt;
  если n &amp;gt; 1:&lt;br /&gt;
    напечатать &amp;quot;всё ещё работаю&amp;quot;&lt;br /&gt;
    F(n/2)&lt;br /&gt;
    F(n/2)&lt;br /&gt;
&lt;br /&gt;
Определение НОД-а.&lt;br /&gt;
             2НОД(a/2, b/2), если а и b чётны,&lt;br /&gt;
  НОД(a,b) = НОД(a, b/2), если а нечётно, b чётно,&lt;br /&gt;
             НОД((a-b)/2, b), если а и b нечётны.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;lt;nowiki&amp;gt;Задачи взяты из книги &amp;quot;Алгоритмы&amp;quot;, глава 2 (см. список рекомендованной литературы).&amp;lt;/nowiki&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Сложение и умножение (19.01)==&lt;br /&gt;
# Алгоритм сложения, его сложность (§1.1.1 Сложение*)&lt;br /&gt;
# &amp;quot;Школьный&amp;quot; алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Рекурсивный алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Алгоритм умножения, реализующий стратегию &amp;quot;разделяй и властвуй&amp;quot;, анализ сложности (§2.1 Умножение чисел*)&lt;br /&gt;
 * [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать.]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 3 (19.01 - 2.02)===&lt;br /&gt;
* Во всех задачах для простоты можно считать, что n является степенью какого-либо числа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Найдите произведение чисел 10011011 и 10111010 (в двоичной системе счисления), используя алгоритм умножения чисел, основанный на методе «разделяй и властвуй». Необходимо не только дать ответ, но и привести ход решения.&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 3 рекурсивных вызова для подзадач размера n-1 и комбинирует из них решение исходной задачи за О(n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте три верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 10 рекурсивных вызовов для подзадач размера n/2 и комбинирует из них решение исходной задачи за О(5n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте два верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Докажите, что 3m² + m = O(m²).&lt;br /&gt;
# Докажите, что lg m = O(m/1000), где lg m — это логарифм с двоичным основанием.&lt;br /&gt;
# Докажите, что из равенства f(n) = O(g(n)) не следует, что g(n) = O(f(n)).&lt;br /&gt;
# Докажите, что O(m) содержится в O(m²).&lt;br /&gt;
&lt;br /&gt;
==Решение рекуррентных уравнений (22.01)==&lt;br /&gt;
# Примеры решений рекуррентных уравнений (см. [https://www.dropbox.com/s/6a0r410zjm9qwe7/algo-3-recurrences.pdf?dl=0 конспект]).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 4 (до 14.02)===&lt;br /&gt;
* Нельзя использовать утверждение основной теоремы о решении рекуррентных соотношений.&lt;br /&gt;
* &#039;&#039;Можно&#039;&#039; использовать метод построения дерева рекурсии или подстановку (метод с угадыванием ответа).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Какой из трёх приведённых ниже алгоритмов вы бы предпочли? Обоснуйте свой ответ.&lt;br /&gt;
#* Алгоритм A, решая задачу, производит пять рекурсивных вызовов для подзадач вдвое меньшего размера, после чего строит ответ для исходной задачи за линейное время.&lt;br /&gt;
#* Алгоритм B, решая задачу размера n, делает два рекурсивных вызова для задач размера n − 1, после чего находит ответ за время O(1).&lt;br /&gt;
#* Алгоритм C, решая задачу размера n, рекурсивно решает девять задач размера n/3 и строит ответ за время O(n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Найдите T(n) в замкнутой форме для любых 7 из 10 приведённых ниже рекуррентных соотношений:&lt;br /&gt;
## T(n) ≤ 2T(n/3) + 1;&lt;br /&gt;
## T(n) ≤ 7T(n/7) + n;&lt;br /&gt;
## T(n) ≤ 9T(n/3) + n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 8T(n/2) + n&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 49T(n/25) + n&amp;lt;sup&amp;gt;3/2&amp;lt;/sup&amp;gt;log n;&lt;br /&gt;
## T(n) ≤ T(n − 1) + 2;&lt;br /&gt;
## T(n) ≤ T(n − 1) + n&amp;lt;sup&amp;gt;c&amp;lt;/sup&amp;gt;, где c ≥ 1 –– константа;&lt;br /&gt;
## T(n) ≤ T(n − 1) + c&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;, где c &amp;gt; 1 –– константа;&lt;br /&gt;
## T(n) ≤ 2T(n − 1) + 1;&lt;br /&gt;
## T(n) ≤ T(sqrt(n)) + 1.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №1==&lt;br /&gt;
Необходимо реализовать все 6 задач из [https://official.contest.yandex.ru/contest/1002 контеста]. Каждую задачу можно писать на С++ или Python. На выполнение работы отводится две недели. Каждая задача оценивается в 10/6 балла. Оценка &#039;&#039;может&#039;&#039; быть снижена за плохой код, но не более чем на 25%.&lt;br /&gt;
&lt;br /&gt;
==Бинарное дерево поиска (26.01)==&lt;br /&gt;
# Определение. Пример.&lt;br /&gt;
# Не модифицирующие алгоритмы: поиск (рекурсивный и итеративный алгоритмы), поиск минимума, inordered обход (вывод значений узлов в отсортированном порядке), поиск следующего по возрастанию.&lt;br /&gt;
# Модифицирующие алгоритмы: вставка (рекурсивная реализация), удаление (только идея).&lt;br /&gt;
 [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 13, стр. 248]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 5 (до 16.02)===&lt;br /&gt;
* Для получения максимальной оценки можно выполнить или все задачи без звёздочки, или задачу со звёздочкой. Преподаватель понимает, что реализацию БДП сложно не найти в интернете, но от копипасты не будет никакой пользы. Напротив, самостоятельная реализация очень полезна и приветствуется, даже если не получится выполнить всех пунктов задания.&lt;br /&gt;
* Задачи с двумя звёздочками необязательны.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Нарисуйте бинарные деревья поиска высотой 2, 3, 4, 5 и 6 для множества ключей {1, 4, 5, 10, 16, 17, 21}. Корень дерева имеет высоту 0.&lt;br /&gt;
# &#039;&#039;&#039;Сортировка с использованием БДП.&#039;&#039;&#039;&lt;br /&gt;
## Какова асимптотическая сложность алгоритма вставки элемента в дерево высоты d? Почему? Назовите наилучший и наиухдший случаи.&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который строит БДП в узлах которого стоят элементы данной последовательности. Можно использовать функцию Insert. Назовите наилучший и наихудший случаи. Есть теорема о том, что полученный алгоритм будет работать в среднем случае за время O(n * log n).&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который выводит их в порядке возрастания. Используйте бинарное дерево поиска. Какова в среднем случае сложность этого алгоритма? Назовите наилучший и наихудший случаи. Какова сложность в наихудшем случае?&lt;br /&gt;
# Напишите функцию GetRoot, которой на вход подаётся указатель на произвольный узел дерева, а она возвращает указатель на корень.&lt;br /&gt;
# Напишите процедуру PrintLeafs, которой на вход подаётся указатель на корень дерева, и она печатает листья дерева&lt;br /&gt;
## по возрастанию,&lt;br /&gt;
## по убыванию.&lt;br /&gt;
# ** Альтернативный обход в порядке возрастания бинарного дерева поиска с n узлами (или центрированный (inordered) обход) можно осуществить путём поиска минимального элемента дерева с помощью функции Minimum с последующий n-1 вызовом функции Next. Каково время работы такого алгоритма?&lt;br /&gt;
# * Реализуйте на С++ структуру данных бинарное дерево поиска, [https://yadi.sk/i/gi2SEStreFfSb используя заготовку].&lt;br /&gt;
## Нарисуйте бинарное дерево поиска, которое строится в функции getTreeExample.&lt;br /&gt;
## Реализуйте следующие алгоритмы: &lt;br /&gt;
### поиск минимума, &lt;br /&gt;
### inordered обход (вывод значений узлов в отсортированном порядке),&lt;br /&gt;
### поиск следующего по возрастанию,&lt;br /&gt;
### вставка элемента в дерево,&lt;br /&gt;
### сортировка последовательности с использованием БДП (дан вектор чисел, необходимо вывести их по возрастанию),&lt;br /&gt;
### ** удаление.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Карацубы, Штрассена. Быстрая сортировка (29.01)==&lt;br /&gt;
# Алгоритм Карацубы.&lt;br /&gt;
# Алгоритм Штрассена. [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать Дасгупту и др., §2.5 Умножение матриц]&lt;br /&gt;
# Быстрая сортировка и доказательство того, что в среднем случае она работает за О(n * log n). [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 8 Быстрая сортировка, стр. 148]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 6 (до 18.02)===&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Пусть мы хотим найти двоичное представление десятичного числа 10&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;. Будем считать, что n --- степень двойки (n = 2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt;).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Pwr2Bin(n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть 1010&lt;br /&gt;
    z = ...&lt;br /&gt;
    вернуть Multiply(z, z)&amp;lt;/source&amp;gt;&lt;br /&gt;
Multiply --- функция, перемножающая два n-битовых двоичных числа x и y по алгоритму Карацубы за O(n&amp;lt;sup&amp;gt;log&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;3&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Пусть мы хотим перевести произвольное десятичное число x в записи которого n=2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; чисел в двоичную систему счисления.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Dec2Bin(x, n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть binary[x]&lt;br /&gt;
    разделить x на два десятичных числа xl и xr из n/2 цифр.&lt;br /&gt;
    вернуть ...&amp;lt;/source&amp;gt;&lt;br /&gt;
Здесь binary --- это массив, содержащий двоичное представление десятичных цифр.&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Докажите, что математическое ожидание времени работы алгоритма быстрой сортировки (усреднение по всем вариантам выбора опорного элемента) на любом входе размера n удовлетворяет соотношению: T(n) ≤ O(n) + 1/n * &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt; (T(i-1) + T(n-i)).&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Найдите решение соотношения из предыдущего пункта.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Динамическое программирование (ДП). Первые примеры (02.01)==&lt;br /&gt;
# Нахождение самой длинной возрастающей подпоследовательности.&lt;br /&gt;
# Нахождение редакционного расстояния (или редакционной стоимости, расстояния Левенштейна).&lt;br /&gt;
# Нахождение представителя большинства.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 7 (до 20.02)===&lt;br /&gt;
* В этом задании везде, где требуется реализовать алгоритм, необходимо привести код на любом языке программирования.&lt;br /&gt;
* Для получения максимальной оценки нужно решить все задачи без звёздочек. Одна решённая задача со звёздочкой заменяет одну задачу без звёздочки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения редакционного расстояния (алгоритм Вагнера — Фишера). Например, редакционное расстояние между словами &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равно 6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения длины наибольшей общей подстроки. Например, длина наибольшей общей подстроки &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равна 8 (&amp;quot;antholog&amp;quot;). Чем больше это значение, тем схожей строки.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Предположим теперь, что сравниваемые строки состоят из символов A, С, G и T; за удаление или вставку мы платим -5; за замену буквы x на y платим w[x, y], где x, y принадлежат множеству {A, С, G, T}, a w — это матрица весов:&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
!-!! A!! G!! C!! T&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! A&lt;br /&gt;
|10||-1||-3||-4&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
!G&lt;br /&gt;
||-1||7||-5||-3&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! C&lt;br /&gt;
||-3||-5||9||0&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! T&lt;br /&gt;
||-4||-3||0||8&lt;br /&gt;
|}&lt;br /&gt;
Тогда выравнивание:&lt;br /&gt;
 AGACTAGTTAC&lt;br /&gt;
 CGA‒‒‒GACGT&lt;br /&gt;
будет иметь следующую оценку:&lt;br /&gt;
 w[A,C] + w[G,G] + w[A,A] + 3*(-5) + w[G,G] + w[T,A] + w[T,C] + w[A,G] + w[C,T] = -3 + 7 + 10 - 3*5 + 7 + (-4) + 0 + (-1) + 0 = 1.&lt;br /&gt;
&lt;br /&gt;
Напишите алгоритм, который находит максимальную стоимость всех возможных выравниваний. Верно ли, что чем больше это значение, тем непохожей строки?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как давно один народ отделился от другого? Кто похожей — итальянец и китаец или якут и эфиоп? На эти вопросы можно отвечать с разных точек зрения — культурной, исторической, лингвистической, ... В последние же годы человечество научилось секвенировать геном, что позволило исследовать этот вопрос с точки зрения генетики. Секвенирование генома — это процесс записи ДНК в виде нуклеотидной последовательности, которая представляет собой последовательность из четырёх символов — A, С, G и T. Существуют базы, которые хранят генетическую информацию о людях из разных стран и континентов, например, [http://www.mtdb.igp.uu.se/ http://www.mtdb.igp.uu.se/ → Download mtDNA sequences]. Чем больше сходство между геномами, тем сильнее родственные связи между их обладателями. Используя решение предыдущего пункта, выполните задания:&lt;br /&gt;
# Определите, кто похожей — итальянец и китаец или якут и эфиоп?&lt;br /&gt;
# Найдите нескольких похожих и нескольких непохожих народностей.&lt;br /&gt;
# * Выберите одну народность. Найдите самых похожих и самых непохожих на неё.&lt;br /&gt;
# * Найдите самые похожие и самые непохожие народности.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Задача о разрезании стержня (05.01)==&lt;br /&gt;
# Постановка задачи.&lt;br /&gt;
# Решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Решение с нахождением максимума по p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Восходящий алгоритм с запоминанием. Вывод длин кусочков стержня. Оценка сложности.&lt;br /&gt;
# Нисходящий алгоритм с запоминанием. Оценка сложности.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.1 Разрезание стержня, стр. 393]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 8 (до 22.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Решая задачу о разрезании стержня мы вначале построили рекурсивное решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt; для всех 1 ≤ i &amp;lt; n. Его сложность описывалась рекуррентной формулой T(n) = n + &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n-1&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt;(T(i) + T(n-i)), T(1) = 1.&lt;br /&gt;
# Объясните эту формулу.&lt;br /&gt;
# Покажите с помощью метода подстановок, что T(n) ≤ 2&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Покажите с помощью контрпримера, что описанная далее жадная стратегия не всегда определяет оптимальный способ разрезания стержня. Определим плотность стержня длиной i как p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;/i, то есть как стоимость единицы его длины. Жадная стратегия для стержня длиной n отрезает от стержня первую часть длиной i, где 1 ≤ i ≤ n, имеющую максимальную плотность. Затем та же жадная стратегия применяется к оставшейся части длиной n-i.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Рассмотрим модификацию задачи разрезания стержня, в которой в дополнение к цене p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; каждого стержня добавляется фиксированная цена разреза c. Теперь прибыль, связанная с решением, представляет собой сумму цен частей стержня минус стоимость разрезов. Разработайте алгоритм динамического программирования для этой модифицированной задачи.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Непрерывным участком называется группа подряд идущих элементов. Например, для последовательности&lt;br /&gt;
 5, 15, −30, 10, −5, 40, 10&lt;br /&gt;
элементы 15, −30, 10 образуют непрерывный участок, а 5, 15, 40 -- нет. Постройте линейный алгоритм для следующей задачи:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Вход: список чисел a1, a2, ... ‌, an.&lt;br /&gt;
Выход: непрерывный участок с максимальной суммой (сумма участка нулевой длины равна нулю).&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Для приведённого примера ответом будет 10, −5, 40, 10 с суммой 55. Какова сложность алгоритма? Почему?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Надо заплатить v рублей, имея купюры в x1, x2, ‌..., xn рублей (купюр каждого типа сколько угодно). Это не всегда возможно (скажем, купюрами в&lt;br /&gt;
10 и 25 рублей можно заплатить 45 рублей, но не 47 и не 15). Постройте основанный на методе динамического программирования алгоритм со временем работы O(nv), выясняющий, возможна ли уплата.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как решить предыдущую задачу, если каждая купюра имеется в единственном экземпляре? (Например, купюрами в 1, 5, 10, 20 рублей можно заплатить 16 = 1 + 5 + 10 и 31 = 1 + 10 + 20 рублей, но не 40 (не хватит денег). Время работы алгоритма по-прежнему O(nv).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Ещё один вариант той же задачи: купюр каждого типа сколько угодно, но всего разрешается использовать не более k купюр. (Например, если есть купюры в 5 и 10 рублей, а k = 6, то 55 разменять можно, а 65 –– нет).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Перемножение цепочки матриц. Оптимальное бинарное дерево поиска (начало) (09.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о перемножении цепочки матриц. Постановка задачи.Пример. Нисходящий алгоритм.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.2 Перемножение цепочки матриц, стр. 403]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 9 (до 24.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Найдите оптимальную расстановку скобок в произведении последовательности матриц, размерности которых равны 5×10, 10×3, 3×12, 12×5, 5×50, 50×6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Напишите восходящий алгоритм для поиска оптимальной расстановки скобок.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Расстановка пробелов. Оптимальное бинарное дерево поиска (середина) (12.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о расстановке пробелов. Постановка задачи. Решения для трёх случаев: 1. нужно вернуть можно ли разбить текст на слова; 2. вернуть разбивку на слова; 3. слова встречаются не равновероятно, вернуть наиболее вероятную разбивку на слова.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи. Вывод математического ожидания времени поиска.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Праздничное домашнее задание 10 (до 02.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[&amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;,&amp;quot;, &amp;quot;.&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;,&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;.&amp;quot;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Подсказка:&#039;&#039;&#039; разбейте текст на слова из списка и посмотрите на азбуку Морзе.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Способы представления графов в памяти (16.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Разбор ошибок в домашнем задании.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Графы. Способы представления графов в памяти (матрица смежности, список рёбер, список соседей (список смежностей), матрица инцидентности). Зависимость сложности алгоритмов от способа представления.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §22.1 Представление графов, стр. 626]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 11 (до 02.03)===&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача A.]&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача B.]&lt;br /&gt;
# Нарисуйте неориентированный граф с 5 вершинами и 8 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Нарисуйте ориентированный граф с 4 вершинами и 3 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Дан ориентированный граф. &#039;&#039;Исходящая степень вершины v&#039;&#039; --- это количество исходящих из неё рёбер, &#039;&#039;входящая степень v&#039;&#039; --- это количество рёбер входящих в  v. Имеется представление ориентированного графа с использование списка соседей. Как долго будут вычисляться исходящие степени всех вершин графа? А входящие степени?&lt;br /&gt;
# Дан граф G = (V, E). Какие из рассмотренных способов хранения графов используют меньше всего памяти для хранения G и почему? Указание: рассмотрите случаи |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;lt; |E| и |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;gt; |E|.&lt;br /&gt;
# Пусть C --- это матрица смежности графа G.&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
# Пусть B --- это матрица инцидентности ориентированного графа G. Как связаны элементы матрицы BB&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
&lt;br /&gt;
==Реализация поиска в глубину (19.02)==&lt;br /&gt;
# Реализация поиска в глубину и смежных задач.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 12 (до 5.03)===&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Выберите любой способ хранения графа. Реализуйте поиск в глубину.&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Напишите алгоритм, который возвращает данные о том, какие вершины лежат в одной компоненте связности.&lt;br /&gt;
# &#039;&#039;(любой ЯП или псевдокод)&#039;&#039; Напишите алгоритм проверки сильной связности ориентированного графа. Какова его сложность?&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №2==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
Необходимо реализовать 3 задачи из [https://official.contest.yandex.ru/contest/1085 контеста], см. [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing распределение задач]. Каждую задачу можно написать на С++ или Python. На выполнение работы отводится две недели (см. время окончания контеста). [https://official.contest.yandex.ru/contest/1123 Дорешивание.]&lt;br /&gt;
&lt;br /&gt;
==ДП и графы (26.02)==&lt;br /&gt;
==ДП и графы (02.03)==&lt;br /&gt;
==Жадные алгоритмы (12.03)==&lt;br /&gt;
===Домашнее задание 13 (до 23.03)===&lt;br /&gt;
# Вася хочет купить по одной акции каждой компании. Все акции стоят одинаково, но дорожают по-разному. Каждый месяц акция i-ой компании дорожает в r_i раз. В один месяц можно купить только одну акцию.&lt;br /&gt;
## Напишите алгоритм, который выводит оптимальную последовательность покупок (такую, что на покупку всех акций потратится меньше денег).&lt;br /&gt;
## Докажите корректность алгоритма, то есть докажите, что последовательность покупок, которую выводит ваш алгоритм, оптимальна.&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список, очередь (16.03)==&lt;br /&gt;
# Реализация линейного двусвязного списка (С++).&lt;br /&gt;
# Реализация очереди ограниченной длины на базе вектора (С++).&lt;br /&gt;
# Реализация очереди на базе списка (С++).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14 (до 23.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте (на С++) структуру данных Стек. У стека должно быть три операции:&lt;br /&gt;
* push --- положить элемент на вершину стека;&lt;br /&gt;
* pop --- удалить верхний элемент;&lt;br /&gt;
* front --- вернуть значение верхнего элемента.&lt;br /&gt;
Оцените время работы каждой функции.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список (19.03)==&lt;br /&gt;
===Домашнее задание 13* (до 30.03)===&lt;br /&gt;
#Для приведённой реализации класса List (https://yadi.sk/i/c5r_79WdfMyNS).&lt;br /&gt;
## Допишите print, push_back и push_front.&lt;br /&gt;
## В функции insert_after и delete_node вставьте необходимые проверки так, чтобы они работали для крайних случаев.&lt;br /&gt;
## Напишите main в котором&lt;br /&gt;
### создаётся объект класса List, &lt;br /&gt;
### заполняется элементами с помощью функций push_back, push_front и insert_after и&lt;br /&gt;
### удаляется i-ый элемент.&lt;br /&gt;
&lt;br /&gt;
==Повторение (30.03)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Для данных пар функций выясните их связь в терминах O-, o-, Ω-, ω-, Θ-обозначений. Поставьте галочку в клетке с Ω, если f(x) = Ω(g(x)) и прочерк, если равенства нет. [https://ru.wikipedia.org/wiki/«O»_большое_и_«o»_малое#.D0.94.D1.80.D1.83.D0.B3.D0.B8.D0.B5_.D0.BF.D0.BE.D0.B4.D0.BE.D0.B1.D0.BD.D1.8B.D0.B5_.D0.BE.D0.B1.D0.BE.D0.B7.D0.BD.D0.B0.D1.87.D0.B5.D0.BD.D0.B8.D1.8F Википедия]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! f(x)!! g(x)!! O!! o!! Ω!! ω!! Θ&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! 2^100&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n * log(n)&lt;br /&gt;
! 2^100 * n * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n&lt;br /&gt;
! 2^100 * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n!&lt;br /&gt;
! 2^(2015n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n*2^n&lt;br /&gt;
! 3^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 5^n&lt;br /&gt;
! 5^(n+1)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n + n^2 + n^3 + ... + n^1000&lt;br /&gt;
! 7^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм Quickselect нахождения k-ого элемента по возрастанию: http://en.wikipedia.org/wiki/Quickselect&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;На улице стоит ряд домов. В каждом из домов лежит сколько-то денег. Вор хочет обокрасть дома на переулке. Он не может обокрасть два соседних дома, потому что хозяин дома, который он обокрал, сразу предупредит соседей. Нужно найти, какую максимальную сумму вор может украсть с переулка. На вход программы подается массив неотрицательных целых чисел - количество долларов в доме с номером i. Соседние дома в массиве представлены соседними элементами. Например, пусть задан массив { 1, 4, 5 } - тогда вор максимум может украсть $6, обокрав дома 1 и 3. Пусть задан массив { 1, 7, 2 } - тогда вор максимум может украсть $7, обокрав дом 2.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Алфавит из всех маленьких латинских букв и пробела закодирован числами следующим способом:&lt;br /&gt;
  &#039;a&#039; -&amp;gt; 1&lt;br /&gt;
  &#039;b&#039; -&amp;gt; 2&lt;br /&gt;
  &#039;c&#039; -&amp;gt; 3&lt;br /&gt;
  ...&lt;br /&gt;
  &#039;z&#039; -&amp;gt; 26&lt;br /&gt;
  &#039; &#039; -&amp;gt; 27&lt;br /&gt;
На вход программы подается строка из цифр. Нужно посчитать, сколькими способами можно раскодировать эту строку.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Дан граф, заданный матрицей смежности. Вывести пары вершин между которыми нет пути.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Повторение (02.04) ==&lt;br /&gt;
Решали и разбирали первые 4 задачи из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14* (до 11.03)===&lt;br /&gt;
Решите любые две задачи (подпункты НЕ считаются отдельными задачами) с предыдущей пары (Повторение (30.03)).&lt;br /&gt;
&lt;br /&gt;
== Повторение (06.04) ==&lt;br /&gt;
Будем решать вторую половину задач из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 15 (до 16.04)===&lt;br /&gt;
# Приведите пример графа, который содержит отрицательные рёбра, не содержит циклов отрицательного веса и для которого алгоритм Дейкстры возвращает неверный результат.&lt;br /&gt;
# Используется ли в алгоритме Дейкстры то, что веса рёбер неотрицательны? Если &amp;quot;да&amp;quot;, то где именно?&lt;br /&gt;
# Пусть граф содержит рёбра с весами &amp;gt;= -100. Если прибавить к каждому ребру 101 и при помощи алгоритма Дейкстры найти кратчайшие пути. Будут ли эти пути кратчайшими в исходном графе? Почему?&lt;br /&gt;
&lt;br /&gt;
== Повторение (07.04) ==&lt;br /&gt;
&#039;&#039;&#039;Решение рекуррентных соотношений&#039;&#039;&#039;&lt;br /&gt;
# Решите уравнение: T(n) = 4*T(n/2) + O(n^2) с базой T(1) = O(1)&lt;br /&gt;
## Используя основную теорему.&lt;br /&gt;
## Используя дерево рекурсий.&lt;br /&gt;
## Методом подстановки.&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2)) + n является \Theta(n lg n).&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2) + 17) + n является \Theta(n lg n).&lt;br /&gt;
# Решите уравнения, считая, что T(1) = O(1):&lt;br /&gt;
## T(n) = T(n-1) + n&lt;br /&gt;
## T(n) = 2*T(floor(sqrt(n))) + lg n. Указание: попробуйте использовать замену переменных.&lt;br /&gt;
## T(n) = 3*T(sqrt(n)) + lg n&lt;br /&gt;
# Дайте верхнюю и нижнюю оценки функции T(n). Постарайтесь, чтобы оценки были как можно более точные&lt;br /&gt;
## T(n) = 4T(n/3) + n*lg(n)&lt;br /&gt;
## T(n) = 3T(n/3) + n/lg(n)&lt;br /&gt;
## T(n) = 4T(n/2) + n^2*sqrt(n)&lt;br /&gt;
## T(n) = T(n/2) + T(n/4) + T(n/8) + n&lt;br /&gt;
## T(n) = T(n-1) + 1/n&lt;br /&gt;
## T(n) = T(n-2) + 1/lg(n)&lt;br /&gt;
## T(n) = sqrt(n) * T(sqrt(n)) + n&lt;br /&gt;
&#039;&#039;&#039;Анализ и построение алгоритмов&#039;&#039;&#039;&lt;br /&gt;
# Числа Фибоначчи F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; можно выразить через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, используя матрицу: https://yadi.sk/i/Pm_aNzHCforFU. &lt;br /&gt;
## Покажите как вычислить F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;.&lt;br /&gt;
## Как вычислить F&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;n+1&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;?&lt;br /&gt;
## Напишите алгоритм.&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
## Ускорьте его так, чтобы он работал за O(log n).&lt;br /&gt;
# Дана последовательность символов. Какое минимальное количество символов нужно удалить из неё, чтобы получить палиндром?&lt;br /&gt;
## Напишите алгоритм (на псевдокоде или на любом языке программирования).&lt;br /&gt;
## Оцените время работы алгоритма.&lt;br /&gt;
# Какую структуру данных вы бы использовали для реализации упорядоченного множества (http://neerc.ifmo.ru/wiki/index.php?title=Упорядоченное_множество)? Какая будет сложность каждой из операций над множеством?&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 16 (до 20.04)===&lt;br /&gt;
# Решите 6 задач из первой части и 6 из второй. (Укажите какие именно.) Каждый из подпунктов является отдельной задачей.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм и теорема Форда-Фалкерсона (16.04)==&lt;br /&gt;
# Базовые определения (пропускные способности, сток, исток и пр.). Пример. &lt;br /&gt;
# Ограничения на поток (сохранение и что меньше пропускных способностей).&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, пример работы&lt;br /&gt;
# Разрез, определение, пример.&lt;br /&gt;
# Утверждение: максимальный поток &amp;lt;= любого разреза.&lt;br /&gt;
# Теорема Форда-Фалкерсона (с доказательством).&lt;br /&gt;
# Пример на котором алгоритм Форда-Фалкерсонаработает работает очень долго при неудачном выборе путей.&lt;br /&gt;
# Сложность алгоритма Форда-Фалкерсона.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №3==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
В [https://official.contest.yandex.ru/contest/1196 домашнем задании] пять задач. Они разделены на два варианта, помеченные римскими цифрами I и II. Свой вариант нужно узнать [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing здесь на вкладке HW3]. Третья задача — общая для двух вариантов; ее решение необходимо снабдить доказательством корректности алгоритма. На выполнение задания дается примерно 2 недели (см. точное время окончания в контесте). Каждую задачу можно написать на С++ или Python.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Форда-Фалкерсона и Эдмондса-Карпа (20.04)==&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, напоминание: базовые определения, пример работы, пример на котором алгоритм работает долго, сложность.&lt;br /&gt;
# Алгоритм Эдмодса-Карпа. Доказательство асимптотики времени работы.&lt;br /&gt;
&lt;br /&gt;
==(23.04)==&lt;br /&gt;
&lt;br /&gt;
==(11.05) Красно-чёрные деревья==&lt;br /&gt;
[https://ru.wikipedia.org/wiki/Красно-чёрное_дерево Красно-чёрное дерево]&lt;br /&gt;
===Домашнее задание 17 (до 18.05)===&lt;br /&gt;
# Зачем нужны красно-чёрные деревья?&lt;br /&gt;
# Благодаря какому свойству и почему красно-чёрное дерево является сбалансированным?&lt;br /&gt;
# Нарисуйте полное бинарное дерево поиска высотой 3 с ключами {1, 2, ..., 15}. Сделайте из него красно-чёрные деревья высотой 2, 3 и 4.&lt;br /&gt;
# Нарисуйте красно-чёрные деревья, получающиеся последовательной вставкой элементов 12, 10, 29, 30, 31, 32 в [https://ru.wikipedia.org/wiki/Красно-чёрное_дерево#/media/File:Red-black_tree_example.svg данное дерево]. Для вставки используйте алгоритм вставки из Википедии. Укажите какой именно функцией вы воспользовались.&lt;br /&gt;
# Определим &#039;&#039;&#039;ослабленное красно-чёрное дерево&#039;&#039;&#039; как бинарное дерево поиска, которое удовлетворяет красно-чёрным свойствам 1, 3, 4 и 5. Другими словами, корень может быть как чёрным, так и красным. Рассмотрите ослабленное красно-чёрное дерево T, корень которого красный. Если перекрасить корень дерева T в чёрный, будет ли оно красно-чёрным деревом?&lt;br /&gt;
# Покажите, что самый длинный простой нисходящий путь от вершины x к листу красно-черного дерева имеет длину, не более чем в два раза превышающую кратчайший путь от x к листу-потомку.&lt;br /&gt;
# Чему равно наибольшее возможное количество внутренних узлов в красно-чёрном дереве с чёрной высоты k? А наименьшее возможное количество?&lt;br /&gt;
# Нарисуйте красно-чёрные деревья, получающиеся последовательной вставкой ключей 41, 38, 31, 12, 19, 8 в изначально пустое дерево.&lt;br /&gt;
# Покажите какие деревья будут получаться в результате последовательного удаления ключей в порядке 8, 12, 19, 31, 38, 41.&lt;br /&gt;
&lt;br /&gt;
==(14.05) Конкурентный анализ самоорганизующихся циклов==&lt;br /&gt;
[https://vk.com/doc12518218_390369758 Лекция]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 18 (до 21.05)===&lt;br /&gt;
Все вычисления сопроводите подробными объяснениями о том, почему верно то или иное (не)равенство.&lt;br /&gt;
# Пусть имеется n-элементный список и m поисковых запросов к нему. После каждой операции поиска можно переупорядочить список. Обозначим стоимость последовательности поисков через C. Докажите, что в худшем случае C = Ω(mn).&lt;br /&gt;
#  Обозначим через c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; стоимость i-ого поискового запроса с применением эвристики перемещения в начало, которая включает стоимость поиска элемента в списке и стоимость его перемещения в начало списка путём ряда обменов соседних элементов списка. Покажите, что i-ая операция поиска находит элемент x в списке L с применением эвристики перемещения в начало, то c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = 2 * rank&amp;lt;sub&amp;gt;L&amp;lt;/sub&amp;gt;(x) - 1.&lt;br /&gt;
# Покажите, что c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = 2 * rank&amp;lt;sub&amp;gt;L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) - 1.&lt;br /&gt;
# Покажите, что c*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = rank&amp;lt;sub&amp;gt;L*&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) + t&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;.&lt;br /&gt;
# Докажите, что после одного обмена двух соседних элементов потенциал либо увеличивается на 2, либо уменьшается на 2.&lt;br /&gt;
# Докажите, что rank&amp;lt;sub&amp;gt;L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) = |A| + |B| + 1.&lt;br /&gt;
# Докажите, что rank&amp;lt;sub&amp;gt;L*&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) = |A| + |С| + 1.&lt;br /&gt;
# Покажите, что поиск i-ого элемента приводит к изменению потенциала Ф(L&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;) - Ф(L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;) &amp;lt;= 2 (|A| - |B| + t*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;), где t*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; --- это количество обменов при i-ом поиске.&lt;br /&gt;
# Во сколько раз стоимость С&amp;lt;sub&amp;gt;MFT&amp;lt;/sub&amp;gt;(S) превышает C&amp;lt;sub&amp;gt;OPT&amp;lt;/sub&amp;gt;(S)?&lt;br /&gt;
&lt;br /&gt;
== (18.05) Конечные автоматы ==&lt;br /&gt;
=== Задание 19 (до 25.05) ===&lt;br /&gt;
# Постройте автомат для языка над алфавитом Σ = {0, 1} каждое слово которого содержит хотя бы два нуля. Является ли он детерминированным?&lt;br /&gt;
# Постройте автомат над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5. Является ли он детерминированным?&lt;br /&gt;
# Постройте автомат, который допускает пустой язык (язык в котором нет ни одного слова).&lt;br /&gt;
# Постройте автомат, который допускает все слова над алфавитом Σ.&lt;br /&gt;
# Постройте ДКА над алфавитом Σ = {К, Ж, З}, который допускает слова в которых после К идёт З, после З --- Ж, после Ж --- К.&lt;br /&gt;
# Постройте ДКА над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5, а число нулей на 3.&lt;br /&gt;
# Постройте НКА для языка над алфавитом Σ = {0, 1, 2, 3}, состоящий из слов, в которых хотя бы одна из последних пяти букв является 1.&lt;br /&gt;
# Постройте НКА над алфавитом Σ = {0, 1}, который допускает слова в которых число единиц делится на 5, а число нулей на 3.&lt;br /&gt;
# Постройте ДКА по заданному НКА.&lt;br /&gt;
# Какие языки допускают автоматы ниже?&lt;br /&gt;
https://encrypted-tbn3.gstatic.com/images?q=tbn:ANd9GcQK87LnQWyoatHIAu1TmslG6on0G-XAIkYv7znZ7uVIVBAv_fHoQA&lt;/div&gt;</summary>
		<author><name>Kassalanche</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=12338</id>
		<title>Алгоритмы и структуры данных. Подгруппа 105-1</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=12338"/>
		<updated>2015-05-14T15:46:08Z</updated>

		<summary type="html">&lt;p&gt;Kassalanche: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==О курсе==&lt;br /&gt;
[[Алгоритмы_и_структуры_данных|План лекций и список рекомендуемой литературы.]]&lt;br /&gt;
&lt;br /&gt;
[[Алгоритмы_и_структуры_данных._Подгруппа_105-1._FAQ|FAQ.]]&lt;br /&gt;
&lt;br /&gt;
[[Reviewboard|Инструкция по использованию Reviewboard.]]&lt;br /&gt;
&lt;br /&gt;
[[Практические_занятия_по_курсу_ОиМП/C++_check|Style guide.]]&lt;br /&gt;
&lt;br /&gt;
==Итоговая оценка за курс==&lt;br /&gt;
Итоговая оценка (ИО) зависит от&lt;br /&gt;
* оценок за пять больших домашних заданий (БДЗ1, БДЗ2, ..., БДЗ5),&lt;br /&gt;
* оценок за домашние задания (ДЗ1, ДЗ2, ...),&lt;br /&gt;
* оценки за контрольную работу (КР),&lt;br /&gt;
* оценки за экзамен (ЭКЗ),&lt;br /&gt;
и может быть вычислена по формуле:&lt;br /&gt;
 ИО = 0.7 * (0.3 * КР + 0.7 *(ИДЗ1 + ИДЗ2 + ИДЗ3 + ИДЗ4 + ИДЗ5)/5) + 0.3 * ЭКЗ =&lt;br /&gt;
    = 0.21*КР + 0.98*ИДЗ1 + 0.98*ИДЗ2 + 0.98*ИДЗ3 + 0.98*ИДЗ4 + 0.98*ИДЗ5 + 0.3*ЭКЗ,&lt;br /&gt;
где&lt;br /&gt;
 ИДЗi = min (10, 0.7 * БДЗi + 0.4 * &amp;lt;cредняя оценка за ДЗj, прошедшие с предыдущего БДЗ по i-ое&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
==Порядок сдачи домашних работ==&lt;br /&gt;
===Большие домашние работы===&lt;br /&gt;
# Получить OK за задачу в контесте.&lt;br /&gt;
# Залить исходный код на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* На каждую задачу создавайте отдельный запрос на ревью. &lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении суток приходят замечания к коду. &#039;&#039;&#039;Если в течении суток замечаний или Ship It не появилось, проверьте, что вы правильно отправили запрос и, если всё сделано правильно, спросите у семинариста получил ли он запрос.&#039;&#039;&#039;&lt;br /&gt;
# Вы их исправляете, проверяете в контесте, что программа по-прежнему проходит все тесты, заливаете новую версию в Review Board. Штрафов за посылки НЕ будет.&lt;br /&gt;
# Процесс повторяется пока остаются замечания к коду или пока не истёк дедлайн. После закрытия контеста будут ещё одни сутки на доработку замечаний в Review Board.&lt;br /&gt;
# Оценивается только последняя версия работы в Review Board.&lt;br /&gt;
&lt;br /&gt;
===Маленькие домашние работы===&lt;br /&gt;
# Залить решение на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* Желаемые форматы: txt, py, cpp, h. Допускаются любые другие.&lt;br /&gt;
#* На каждую домашнюю работу создавайте отдельный запрос на ревью. Обязательно указывайте номер домашней работы.&lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении неопределенного промежутка времени придут оценки по каждому из заданий.&lt;br /&gt;
&lt;br /&gt;
==Оценивание домашних работ==&lt;br /&gt;
* Все задания предполагаются индивидуальными. Запрещены любые заимствования без ссылки на автора.&lt;br /&gt;
* Решения после установленного дедлайна не принимаются. Дедлайн указан в заголовке каждого задания.&lt;br /&gt;
* Везде, где требуется написать алгоритм, можно использовать любой язык программирования или псевдокод.&lt;br /&gt;
* Там, где требуется построить алгоритм с заданной асимптотикой, приведите обоснование, что полученный алгоритм удовлетворяет этому условию.&lt;br /&gt;
* Эти правила не действуют, если в задании явно оговорено иное.&lt;br /&gt;
&lt;br /&gt;
==Мотивация к изучению алгоритмов. Подсчёт числа операций (12.01)==&lt;br /&gt;
# Числа Фибоначчи. Определение. Примитивный рекурсивный алгоритм вычисления i-ого числа. Оценка числа операций. Анализ причин неэффективности. Алгоритм с запоминанием вычисленных ранее значений. Оценка числа операций. Сравнение с предыдущим. (подробнее: глава 0, страницы 8-10 из книги &amp;lt;&amp;lt;Алгоритмы&amp;gt;&amp;gt;, [[Алгоритмы_и_структуры_данных|см. список рекомендованной литературы]])&lt;br /&gt;
# Задача о ханойской башне. Постановка задачи. Рекурсивный алгоритм. Рекуррентная формула для числа перемещений. Замкнутая формула для числа перемещений (+ доказательство). Доказательство того, что эту задачу нельзя решить используя меньшее число перемещений дисков. ([https://www.dropbox.com/s/t8cbs7ttu4iasvj/algo-0-recursion.pdf?dl=0 Разбор задачи о ханойской башне], автор Сергей Объедков)&lt;br /&gt;
# Сортировка пузырьком. Алгоритм. Подсчёт количество операций сравнения и обмена (swap). Анализ наилучшего и наихудшего случаев ([https://ru.wikipedia.org/wiki/Сортировка_пузырьком Википедия])&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 1 (12.01 - 26.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
Во всех задачах, если не оговорено иного, предполагаем, что работаем с целыми неотрицательными числами. Для первых 7 задач необходимо&lt;br /&gt;
* описать что можно считать наилучшим и наихудшим случаями,&lt;br /&gt;
* для каждого из двух случаев подсчитать отдельно количество операций сравнения и swap (если есть).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Даны три числа, требуется вернуть наименьшее.&lt;br /&gt;
# Даны три числа, требуется отсортировать их.&lt;br /&gt;
# Дана последовательность A из n элементов и число x, требуется найти элемент равный x. Примечание: если таких значений i несколько, вернуть любое; если такого элемента нет, функция должна сообщить об этом.&lt;br /&gt;
# * Дана упорядоченная последовательность A из n элементов и число x, требуется найти такое i, что A[i] равно x. Алгоритм должен быть эффективней, чем в предыдущем пункте и использовать то, что последовательность упорядочена.&lt;br /&gt;
# Дана последовательность из 100 000 чисел от 0 до 100. Напишите эффективный алгоритм сортировки, который бы учитывал специфику входных данных.&lt;br /&gt;
# * Дано 32 битное неотрицательное число. Требуется номер первого ненулевого бит. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения, считая, что числа распределены равномерно.&lt;br /&gt;
# * Даны 32 битные неотрицательные числа m и n. Требуется вывести True, если m &amp;lt; n, иначе False. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения битов, считая, что числа распределены равномерно.&lt;br /&gt;
# Напишите рекурсивную функцию, вычисляющую n-ое число Фибоначчи (как на занятии). Подсчитайте количество рекурсивных вызовов.&lt;br /&gt;
# * Напишите функцию, вычисляющую n-ое число Фибоначчи, у которой число операций — полином от n, и которая использует количество памяти, независящее от n.&lt;br /&gt;
&lt;br /&gt;
==O-символика и стратегия &amp;quot;разделяй и властвуй&amp;quot; (15.01)==&lt;br /&gt;
# Сортировка слиянием. Алгоритм, рекуррентное соотношение для времени сортировки, сложность. Подробнее: [https://dl.dropboxusercontent.com/u/829163/draft.pdf §2.3 Сортировка слиянием (стр. 54)].&lt;br /&gt;
# О-символика. [https://dl.dropboxusercontent.com/u/829163/draft.pdf §0.3 О-символика (стр. 10)].&lt;br /&gt;
# Задача о слиянии m упорядоченных массивов по n элементов. Три алгоритма решения: последовательное слияние, слияние &amp;quot;деревом&amp;quot; (обе функции используют Merge из MergeSort), аналог Merge для m массивов. Анализ сложности каждого из них.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 2 (15.01-29.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
* Во всех задачах, если не оговорено иного, для простоты &#039;&#039;можно&#039;&#039; считать, что n является степенью какого-либо числа, например, степенью двойки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Дана функция F, определённая ниже. Сколько строк она напечатает? Указание: для обоих подпунктов рассмотрите два случая: 1. n является степенью двойки, 2. n не является степенью двойки.&lt;br /&gt;
## Запишите рекуррентное соотношение для числа строк.&lt;br /&gt;
## Решите уравнение, полученное в предыдущем пункте, то есть, выведите замкнутую (нерекуррентную формулу). Для простоты можно считать, что n является степенью двойки.&lt;br /&gt;
# В массиве A размера n записана возрастающая последовательность целых чисел. Постройте алгоритм типа &amp;quot;разделяй и властвуй&amp;quot;, который проверяет, существует ли такой индекс i, что A[i] = i&lt;br /&gt;
## за время O(n),&lt;br /&gt;
## * за время O(log n).&lt;br /&gt;
## Какие случаи для вашего алгоритма являются наихудшими и наилучшими? Какого время работы в лучшем и худшем случаях?&lt;br /&gt;
# Дан бесконечный массив A, первые n элементов которого содержат возрастающую последовательность положительных чисел, а дальше стоят -1. Значение n не дано. Постройте алгоритм, который получает на вход целое число x и находит это x в массиве --- или говорит, что там его нет, &lt;br /&gt;
## за время O(n),&lt;br /&gt;
## за время O(log n).&lt;br /&gt;
# Рассмотрим алгоритм вычисления наибольшего общего делителя (НОД) двух положительных чисел, основанный на методе &amp;quot;разделяй и властвуй&amp;quot;.&lt;br /&gt;
## (задание не оценивается) Прочитайте [https://dl.dropboxusercontent.com/u/829163/draft.pdf §1.2.3 Алгоритм Евклида (стр. 23)].&lt;br /&gt;
## * Докажите, что определение НОД-а, приведённое ниже, корректно.&lt;br /&gt;
## Постройте алгоритм, основанный на этом определении.&lt;br /&gt;
## Какой алгоритм будет быстрее для n-битовых чисел a и b при больших значениях n --- ваш или алгоритм Евклида?&lt;br /&gt;
# * Покажите как за время O(n log n) удалить из массива размера n все дубликаты, то есть оставить каждый элемент в одном экземпляре.&lt;br /&gt;
# * Даны два упорядоченных массива размера m и n. Постройте алгоритм, находящий k-й по величине элемент в объединении этих массивов за время O(log(n+m)). &lt;br /&gt;
&lt;br /&gt;
Функция F(n).&lt;br /&gt;
  если n &amp;gt; 1:&lt;br /&gt;
    напечатать &amp;quot;всё ещё работаю&amp;quot;&lt;br /&gt;
    F(n/2)&lt;br /&gt;
    F(n/2)&lt;br /&gt;
&lt;br /&gt;
Определение НОД-а.&lt;br /&gt;
             2НОД(a/2, b/2), если а и b чётны,&lt;br /&gt;
  НОД(a,b) = НОД(a, b/2), если а нечётно, b чётно,&lt;br /&gt;
             НОД((a-b)/2, b), если а и b нечётны.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;lt;nowiki&amp;gt;Задачи взяты из книги &amp;quot;Алгоритмы&amp;quot;, глава 2 (см. список рекомендованной литературы).&amp;lt;/nowiki&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Сложение и умножение (19.01)==&lt;br /&gt;
# Алгоритм сложения, его сложность (§1.1.1 Сложение*)&lt;br /&gt;
# &amp;quot;Школьный&amp;quot; алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Рекурсивный алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Алгоритм умножения, реализующий стратегию &amp;quot;разделяй и властвуй&amp;quot;, анализ сложности (§2.1 Умножение чисел*)&lt;br /&gt;
 * [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать.]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 3 (19.01 - 2.02)===&lt;br /&gt;
* Во всех задачах для простоты можно считать, что n является степенью какого-либо числа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Найдите произведение чисел 10011011 и 10111010 (в двоичной системе счисления), используя алгоритм умножения чисел, основанный на методе «разделяй и властвуй». Необходимо не только дать ответ, но и привести ход решения.&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 3 рекурсивных вызова для подзадач размера n-1 и комбинирует из них решение исходной задачи за О(n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте три верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 10 рекурсивных вызовов для подзадач размера n/2 и комбинирует из них решение исходной задачи за О(5n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте два верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Докажите, что 3m² + m = O(m²).&lt;br /&gt;
# Докажите, что lg m = O(m/1000), где lg m — это логарифм с двоичным основанием.&lt;br /&gt;
# Докажите, что из равенства f(n) = O(g(n)) не следует, что g(n) = O(f(n)).&lt;br /&gt;
# Докажите, что O(m) содержится в O(m²).&lt;br /&gt;
&lt;br /&gt;
==Решение рекуррентных уравнений (22.01)==&lt;br /&gt;
# Примеры решений рекуррентных уравнений (см. [https://www.dropbox.com/s/6a0r410zjm9qwe7/algo-3-recurrences.pdf?dl=0 конспект]).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 4 (до 14.02)===&lt;br /&gt;
* Нельзя использовать утверждение основной теоремы о решении рекуррентных соотношений.&lt;br /&gt;
* &#039;&#039;Можно&#039;&#039; использовать метод построения дерева рекурсии или подстановку (метод с угадыванием ответа).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Какой из трёх приведённых ниже алгоритмов вы бы предпочли? Обоснуйте свой ответ.&lt;br /&gt;
#* Алгоритм A, решая задачу, производит пять рекурсивных вызовов для подзадач вдвое меньшего размера, после чего строит ответ для исходной задачи за линейное время.&lt;br /&gt;
#* Алгоритм B, решая задачу размера n, делает два рекурсивных вызова для задач размера n − 1, после чего находит ответ за время O(1).&lt;br /&gt;
#* Алгоритм C, решая задачу размера n, рекурсивно решает девять задач размера n/3 и строит ответ за время O(n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Найдите T(n) в замкнутой форме для любых 7 из 10 приведённых ниже рекуррентных соотношений:&lt;br /&gt;
## T(n) ≤ 2T(n/3) + 1;&lt;br /&gt;
## T(n) ≤ 7T(n/7) + n;&lt;br /&gt;
## T(n) ≤ 9T(n/3) + n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 8T(n/2) + n&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 49T(n/25) + n&amp;lt;sup&amp;gt;3/2&amp;lt;/sup&amp;gt;log n;&lt;br /&gt;
## T(n) ≤ T(n − 1) + 2;&lt;br /&gt;
## T(n) ≤ T(n − 1) + n&amp;lt;sup&amp;gt;c&amp;lt;/sup&amp;gt;, где c ≥ 1 –– константа;&lt;br /&gt;
## T(n) ≤ T(n − 1) + c&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;, где c &amp;gt; 1 –– константа;&lt;br /&gt;
## T(n) ≤ 2T(n − 1) + 1;&lt;br /&gt;
## T(n) ≤ T(sqrt(n)) + 1.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №1==&lt;br /&gt;
Необходимо реализовать все 6 задач из [https://official.contest.yandex.ru/contest/1002 контеста]. Каждую задачу можно писать на С++ или Python. На выполнение работы отводится две недели. Каждая задача оценивается в 10/6 балла. Оценка &#039;&#039;может&#039;&#039; быть снижена за плохой код, но не более чем на 25%.&lt;br /&gt;
&lt;br /&gt;
==Бинарное дерево поиска (26.01)==&lt;br /&gt;
# Определение. Пример.&lt;br /&gt;
# Не модифицирующие алгоритмы: поиск (рекурсивный и итеративный алгоритмы), поиск минимума, inordered обход (вывод значений узлов в отсортированном порядке), поиск следующего по возрастанию.&lt;br /&gt;
# Модифицирующие алгоритмы: вставка (рекурсивная реализация), удаление (только идея).&lt;br /&gt;
 [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 13, стр. 248]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 5 (до 16.02)===&lt;br /&gt;
* Для получения максимальной оценки можно выполнить или все задачи без звёздочки, или задачу со звёздочкой. Преподаватель понимает, что реализацию БДП сложно не найти в интернете, но от копипасты не будет никакой пользы. Напротив, самостоятельная реализация очень полезна и приветствуется, даже если не получится выполнить всех пунктов задания.&lt;br /&gt;
* Задачи с двумя звёздочками необязательны.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Нарисуйте бинарные деревья поиска высотой 2, 3, 4, 5 и 6 для множества ключей {1, 4, 5, 10, 16, 17, 21}. Корень дерева имеет высоту 0.&lt;br /&gt;
# &#039;&#039;&#039;Сортировка с использованием БДП.&#039;&#039;&#039;&lt;br /&gt;
## Какова асимптотическая сложность алгоритма вставки элемента в дерево высоты d? Почему? Назовите наилучший и наиухдший случаи.&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который строит БДП в узлах которого стоят элементы данной последовательности. Можно использовать функцию Insert. Назовите наилучший и наихудший случаи. Есть теорема о том, что полученный алгоритм будет работать в среднем случае за время O(n * log n).&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который выводит их в порядке возрастания. Используйте бинарное дерево поиска. Какова в среднем случае сложность этого алгоритма? Назовите наилучший и наихудший случаи. Какова сложность в наихудшем случае?&lt;br /&gt;
# Напишите функцию GetRoot, которой на вход подаётся указатель на произвольный узел дерева, а она возвращает указатель на корень.&lt;br /&gt;
# Напишите процедуру PrintLeafs, которой на вход подаётся указатель на корень дерева, и она печатает листья дерева&lt;br /&gt;
## по возрастанию,&lt;br /&gt;
## по убыванию.&lt;br /&gt;
# ** Альтернативный обход в порядке возрастания бинарного дерева поиска с n узлами (или центрированный (inordered) обход) можно осуществить путём поиска минимального элемента дерева с помощью функции Minimum с последующий n-1 вызовом функции Next. Каково время работы такого алгоритма?&lt;br /&gt;
# * Реализуйте на С++ структуру данных бинарное дерево поиска, [https://yadi.sk/i/gi2SEStreFfSb используя заготовку].&lt;br /&gt;
## Нарисуйте бинарное дерево поиска, которое строится в функции getTreeExample.&lt;br /&gt;
## Реализуйте следующие алгоритмы: &lt;br /&gt;
### поиск минимума, &lt;br /&gt;
### inordered обход (вывод значений узлов в отсортированном порядке),&lt;br /&gt;
### поиск следующего по возрастанию,&lt;br /&gt;
### вставка элемента в дерево,&lt;br /&gt;
### сортировка последовательности с использованием БДП (дан вектор чисел, необходимо вывести их по возрастанию),&lt;br /&gt;
### ** удаление.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Карацубы, Штрассена. Быстрая сортировка (29.01)==&lt;br /&gt;
# Алгоритм Карацубы.&lt;br /&gt;
# Алгоритм Штрассена. [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать Дасгупту и др., §2.5 Умножение матриц]&lt;br /&gt;
# Быстрая сортировка и доказательство того, что в среднем случае она работает за О(n * log n). [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 8 Быстрая сортировка, стр. 148]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 6 (до 18.02)===&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Пусть мы хотим найти двоичное представление десятичного числа 10&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;. Будем считать, что n --- степень двойки (n = 2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt;).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Pwr2Bin(n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть 1010&lt;br /&gt;
    z = ...&lt;br /&gt;
    вернуть Multiply(z, z)&amp;lt;/source&amp;gt;&lt;br /&gt;
Multiply --- функция, перемножающая два n-битовых двоичных числа x и y по алгоритму Карацубы за O(n&amp;lt;sup&amp;gt;log&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;3&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Пусть мы хотим перевести произвольное десятичное число x в записи которого n=2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; чисел в двоичную систему счисления.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Dec2Bin(x, n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть binary[x]&lt;br /&gt;
    разделить x на два десятичных числа xl и xr из n/2 цифр.&lt;br /&gt;
    вернуть ...&amp;lt;/source&amp;gt;&lt;br /&gt;
Здесь binary --- это массив, содержащий двоичное представление десятичных цифр.&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Докажите, что математическое ожидание времени работы алгоритма быстрой сортировки (усреднение по всем вариантам выбора опорного элемента) на любом входе размера n удовлетворяет соотношению: T(n) ≤ O(n) + 1/n * &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt; (T(i-1) + T(n-i)).&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Найдите решение соотношения из предыдущего пункта.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Динамическое программирование (ДП). Первые примеры (02.01)==&lt;br /&gt;
# Нахождение самой длинной возрастающей подпоследовательности.&lt;br /&gt;
# Нахождение редакционного расстояния (или редакционной стоимости, расстояния Левенштейна).&lt;br /&gt;
# Нахождение представителя большинства.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 7 (до 20.02)===&lt;br /&gt;
* В этом задании везде, где требуется реализовать алгоритм, необходимо привести код на любом языке программирования.&lt;br /&gt;
* Для получения максимальной оценки нужно решить все задачи без звёздочек. Одна решённая задача со звёздочкой заменяет одну задачу без звёздочки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения редакционного расстояния (алгоритм Вагнера — Фишера). Например, редакционное расстояние между словами &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равно 6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения длины наибольшей общей подстроки. Например, длина наибольшей общей подстроки &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равна 8 (&amp;quot;antholog&amp;quot;). Чем больше это значение, тем схожей строки.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Предположим теперь, что сравниваемые строки состоят из символов A, С, G и T; за удаление или вставку мы платим -5; за замену буквы x на y платим w[x, y], где x, y принадлежат множеству {A, С, G, T}, a w — это матрица весов:&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
!-!! A!! G!! C!! T&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! A&lt;br /&gt;
|10||-1||-3||-4&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
!G&lt;br /&gt;
||-1||7||-5||-3&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! C&lt;br /&gt;
||-3||-5||9||0&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! T&lt;br /&gt;
||-4||-3||0||8&lt;br /&gt;
|}&lt;br /&gt;
Тогда выравнивание:&lt;br /&gt;
 AGACTAGTTAC&lt;br /&gt;
 CGA‒‒‒GACGT&lt;br /&gt;
будет иметь следующую оценку:&lt;br /&gt;
 w[A,C] + w[G,G] + w[A,A] + 3*(-5) + w[G,G] + w[T,A] + w[T,C] + w[A,G] + w[C,T] = -3 + 7 + 10 - 3*5 + 7 + (-4) + 0 + (-1) + 0 = 1.&lt;br /&gt;
&lt;br /&gt;
Напишите алгоритм, который находит максимальную стоимость всех возможных выравниваний. Верно ли, что чем больше это значение, тем непохожей строки?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как давно один народ отделился от другого? Кто похожей — итальянец и китаец или якут и эфиоп? На эти вопросы можно отвечать с разных точек зрения — культурной, исторической, лингвистической, ... В последние же годы человечество научилось секвенировать геном, что позволило исследовать этот вопрос с точки зрения генетики. Секвенирование генома — это процесс записи ДНК в виде нуклеотидной последовательности, которая представляет собой последовательность из четырёх символов — A, С, G и T. Существуют базы, которые хранят генетическую информацию о людях из разных стран и континентов, например, [http://www.mtdb.igp.uu.se/ http://www.mtdb.igp.uu.se/ → Download mtDNA sequences]. Чем больше сходство между геномами, тем сильнее родственные связи между их обладателями. Используя решение предыдущего пункта, выполните задания:&lt;br /&gt;
# Определите, кто похожей — итальянец и китаец или якут и эфиоп?&lt;br /&gt;
# Найдите нескольких похожих и нескольких непохожих народностей.&lt;br /&gt;
# * Выберите одну народность. Найдите самых похожих и самых непохожих на неё.&lt;br /&gt;
# * Найдите самые похожие и самые непохожие народности.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Задача о разрезании стержня (05.01)==&lt;br /&gt;
# Постановка задачи.&lt;br /&gt;
# Решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Решение с нахождением максимума по p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Восходящий алгоритм с запоминанием. Вывод длин кусочков стержня. Оценка сложности.&lt;br /&gt;
# Нисходящий алгоритм с запоминанием. Оценка сложности.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.1 Разрезание стержня, стр. 393]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 8 (до 22.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Решая задачу о разрезании стержня мы вначале построили рекурсивное решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt; для всех 1 ≤ i &amp;lt; n. Его сложность описывалась рекуррентной формулой T(n) = n + &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n-1&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt;(T(i) + T(n-i)), T(1) = 1.&lt;br /&gt;
# Объясните эту формулу.&lt;br /&gt;
# Покажите с помощью метода подстановок, что T(n) ≤ 2&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Покажите с помощью контрпримера, что описанная далее жадная стратегия не всегда определяет оптимальный способ разрезания стержня. Определим плотность стержня длиной i как p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;/i, то есть как стоимость единицы его длины. Жадная стратегия для стержня длиной n отрезает от стержня первую часть длиной i, где 1 ≤ i ≤ n, имеющую максимальную плотность. Затем та же жадная стратегия применяется к оставшейся части длиной n-i.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Рассмотрим модификацию задачи разрезания стержня, в которой в дополнение к цене p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; каждого стержня добавляется фиксированная цена разреза c. Теперь прибыль, связанная с решением, представляет собой сумму цен частей стержня минус стоимость разрезов. Разработайте алгоритм динамического программирования для этой модифицированной задачи.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Непрерывным участком называется группа подряд идущих элементов. Например, для последовательности&lt;br /&gt;
 5, 15, −30, 10, −5, 40, 10&lt;br /&gt;
элементы 15, −30, 10 образуют непрерывный участок, а 5, 15, 40 -- нет. Постройте линейный алгоритм для следующей задачи:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Вход: список чисел a1, a2, ... ‌, an.&lt;br /&gt;
Выход: непрерывный участок с максимальной суммой (сумма участка нулевой длины равна нулю).&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Для приведённого примера ответом будет 10, −5, 40, 10 с суммой 55. Какова сложность алгоритма? Почему?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Надо заплатить v рублей, имея купюры в x1, x2, ‌..., xn рублей (купюр каждого типа сколько угодно). Это не всегда возможно (скажем, купюрами в&lt;br /&gt;
10 и 25 рублей можно заплатить 45 рублей, но не 47 и не 15). Постройте основанный на методе динамического программирования алгоритм со временем работы O(nv), выясняющий, возможна ли уплата.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как решить предыдущую задачу, если каждая купюра имеется в единственном экземпляре? (Например, купюрами в 1, 5, 10, 20 рублей можно заплатить 16 = 1 + 5 + 10 и 31 = 1 + 10 + 20 рублей, но не 40 (не хватит денег). Время работы алгоритма по-прежнему O(nv).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Ещё один вариант той же задачи: купюр каждого типа сколько угодно, но всего разрешается использовать не более k купюр. (Например, если есть купюры в 5 и 10 рублей, а k = 6, то 55 разменять можно, а 65 –– нет).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Перемножение цепочки матриц. Оптимальное бинарное дерево поиска (начало) (09.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о перемножении цепочки матриц. Постановка задачи.Пример. Нисходящий алгоритм.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.2 Перемножение цепочки матриц, стр. 403]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 9 (до 24.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Найдите оптимальную расстановку скобок в произведении последовательности матриц, размерности которых равны 5×10, 10×3, 3×12, 12×5, 5×50, 50×6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Напишите восходящий алгоритм для поиска оптимальной расстановки скобок.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Расстановка пробелов. Оптимальное бинарное дерево поиска (середина) (12.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о расстановке пробелов. Постановка задачи. Решения для трёх случаев: 1. нужно вернуть можно ли разбить текст на слова; 2. вернуть разбивку на слова; 3. слова встречаются не равновероятно, вернуть наиболее вероятную разбивку на слова.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи. Вывод математического ожидания времени поиска.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Праздничное домашнее задание 10 (до 02.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[&amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;,&amp;quot;, &amp;quot;.&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;,&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;.&amp;quot;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Подсказка:&#039;&#039;&#039; разбейте текст на слова из списка и посмотрите на азбуку Морзе.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Способы представления графов в памяти (16.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Разбор ошибок в домашнем задании.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Графы. Способы представления графов в памяти (матрица смежности, список рёбер, список соседей (список смежностей), матрица инцидентности). Зависимость сложности алгоритмов от способа представления.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §22.1 Представление графов, стр. 626]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 11 (до 02.03)===&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача A.]&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача B.]&lt;br /&gt;
# Нарисуйте неориентированный граф с 5 вершинами и 8 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Нарисуйте ориентированный граф с 4 вершинами и 3 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Дан ориентированный граф. &#039;&#039;Исходящая степень вершины v&#039;&#039; --- это количество исходящих из неё рёбер, &#039;&#039;входящая степень v&#039;&#039; --- это количество рёбер входящих в  v. Имеется представление ориентированного графа с использование списка соседей. Как долго будут вычисляться исходящие степени всех вершин графа? А входящие степени?&lt;br /&gt;
# Дан граф G = (V, E). Какие из рассмотренных способов хранения графов используют меньше всего памяти для хранения G и почему? Указание: рассмотрите случаи |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;lt; |E| и |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;gt; |E|.&lt;br /&gt;
# Пусть C --- это матрица смежности графа G.&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
# Пусть B --- это матрица инцидентности ориентированного графа G. Как связаны элементы матрицы BB&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
&lt;br /&gt;
==Реализация поиска в глубину (19.02)==&lt;br /&gt;
# Реализация поиска в глубину и смежных задач.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 12 (до 5.03)===&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Выберите любой способ хранения графа. Реализуйте поиск в глубину.&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Напишите алгоритм, который возвращает данные о том, какие вершины лежат в одной компоненте связности.&lt;br /&gt;
# &#039;&#039;(любой ЯП или псевдокод)&#039;&#039; Напишите алгоритм проверки сильной связности ориентированного графа. Какова его сложность?&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №2==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
Необходимо реализовать 3 задачи из [https://official.contest.yandex.ru/contest/1085 контеста], см. [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing распределение задач]. Каждую задачу можно написать на С++ или Python. На выполнение работы отводится две недели (см. время окончания контеста). [https://official.contest.yandex.ru/contest/1123 Дорешивание.]&lt;br /&gt;
&lt;br /&gt;
==ДП и графы (26.02)==&lt;br /&gt;
==ДП и графы (02.03)==&lt;br /&gt;
==Жадные алгоритмы (12.03)==&lt;br /&gt;
===Домашнее задание 13 (до 23.03)===&lt;br /&gt;
# Вася хочет купить по одной акции каждой компании. Все акции стоят одинаково, но дорожают по-разному. Каждый месяц акция i-ой компании дорожает в r_i раз. В один месяц можно купить только одну акцию.&lt;br /&gt;
## Напишите алгоритм, который выводит оптимальную последовательность покупок (такую, что на покупку всех акций потратится меньше денег).&lt;br /&gt;
## Докажите корректность алгоритма, то есть докажите, что последовательность покупок, которую выводит ваш алгоритм, оптимальна.&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список, очередь (16.03)==&lt;br /&gt;
# Реализация линейного двусвязного списка (С++).&lt;br /&gt;
# Реализация очереди ограниченной длины на базе вектора (С++).&lt;br /&gt;
# Реализация очереди на базе списка (С++).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14 (до 23.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте (на С++) структуру данных Стек. У стека должно быть три операции:&lt;br /&gt;
* push --- положить элемент на вершину стека;&lt;br /&gt;
* pop --- удалить верхний элемент;&lt;br /&gt;
* front --- вернуть значение верхнего элемента.&lt;br /&gt;
Оцените время работы каждой функции.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список (19.03)==&lt;br /&gt;
===Домашнее задание 13* (до 30.03)===&lt;br /&gt;
#Для приведённой реализации класса List (https://yadi.sk/i/c5r_79WdfMyNS).&lt;br /&gt;
## Допишите print, push_back и push_front.&lt;br /&gt;
## В функции insert_after и delete_node вставьте необходимые проверки так, чтобы они работали для крайних случаев.&lt;br /&gt;
## Напишите main в котором&lt;br /&gt;
### создаётся объект класса List, &lt;br /&gt;
### заполняется элементами с помощью функций push_back, push_front и insert_after и&lt;br /&gt;
### удаляется i-ый элемент.&lt;br /&gt;
&lt;br /&gt;
==Повторение (30.03)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Для данных пар функций выясните их связь в терминах O-, o-, Ω-, ω-, Θ-обозначений. Поставьте галочку в клетке с Ω, если f(x) = Ω(g(x)) и прочерк, если равенства нет. [https://ru.wikipedia.org/wiki/«O»_большое_и_«o»_малое#.D0.94.D1.80.D1.83.D0.B3.D0.B8.D0.B5_.D0.BF.D0.BE.D0.B4.D0.BE.D0.B1.D0.BD.D1.8B.D0.B5_.D0.BE.D0.B1.D0.BE.D0.B7.D0.BD.D0.B0.D1.87.D0.B5.D0.BD.D0.B8.D1.8F Википедия]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! f(x)!! g(x)!! O!! o!! Ω!! ω!! Θ&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! 2^100&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n * log(n)&lt;br /&gt;
! 2^100 * n * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n&lt;br /&gt;
! 2^100 * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n!&lt;br /&gt;
! 2^(2015n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n*2^n&lt;br /&gt;
! 3^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 5^n&lt;br /&gt;
! 5^(n+1)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n + n^2 + n^3 + ... + n^1000&lt;br /&gt;
! 7^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм Quickselect нахождения k-ого элемента по возрастанию: http://en.wikipedia.org/wiki/Quickselect&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;На улице стоит ряд домов. В каждом из домов лежит сколько-то денег. Вор хочет обокрасть дома на переулке. Он не может обокрасть два соседних дома, потому что хозяин дома, который он обокрал, сразу предупредит соседей. Нужно найти, какую максимальную сумму вор может украсть с переулка. На вход программы подается массив неотрицательных целых чисел - количество долларов в доме с номером i. Соседние дома в массиве представлены соседними элементами. Например, пусть задан массив { 1, 4, 5 } - тогда вор максимум может украсть $6, обокрав дома 1 и 3. Пусть задан массив { 1, 7, 2 } - тогда вор максимум может украсть $7, обокрав дом 2.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Алфавит из всех маленьких латинских букв и пробела закодирован числами следующим способом:&lt;br /&gt;
  &#039;a&#039; -&amp;gt; 1&lt;br /&gt;
  &#039;b&#039; -&amp;gt; 2&lt;br /&gt;
  &#039;c&#039; -&amp;gt; 3&lt;br /&gt;
  ...&lt;br /&gt;
  &#039;z&#039; -&amp;gt; 26&lt;br /&gt;
  &#039; &#039; -&amp;gt; 27&lt;br /&gt;
На вход программы подается строка из цифр. Нужно посчитать, сколькими способами можно раскодировать эту строку.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Дан граф, заданный матрицей смежности. Вывести пары вершин между которыми нет пути.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Повторение (02.04) ==&lt;br /&gt;
Решали и разбирали первые 4 задачи из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14* (до 11.03)===&lt;br /&gt;
Решите любые две задачи (подпункты НЕ считаются отдельными задачами) с предыдущей пары (Повторение (30.03)).&lt;br /&gt;
&lt;br /&gt;
== Повторение (06.04) ==&lt;br /&gt;
Будем решать вторую половину задач из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 15 (до 16.04)===&lt;br /&gt;
# Приведите пример графа, который содержит отрицательные рёбра, не содержит циклов отрицательного веса и для которого алгоритм Дейкстры возвращает неверный результат.&lt;br /&gt;
# Используется ли в алгоритме Дейкстры то, что веса рёбер неотрицательны? Если &amp;quot;да&amp;quot;, то где именно?&lt;br /&gt;
# Пусть граф содержит рёбра с весами &amp;gt;= -100. Если прибавить к каждому ребру 101 и при помощи алгоритма Дейкстры найти кратчайшие пути. Будут ли эти пути кратчайшими в исходном графе? Почему?&lt;br /&gt;
&lt;br /&gt;
== Повторение (07.04) ==&lt;br /&gt;
&#039;&#039;&#039;Решение рекуррентных соотношений&#039;&#039;&#039;&lt;br /&gt;
# Решите уравнение: T(n) = 4*T(n/2) + O(n^2) с базой T(1) = O(1)&lt;br /&gt;
## Используя основную теорему.&lt;br /&gt;
## Используя дерево рекурсий.&lt;br /&gt;
## Методом подстановки.&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2)) + n является \Theta(n lg n).&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2) + 17) + n является \Theta(n lg n).&lt;br /&gt;
# Решите уравнения, считая, что T(1) = O(1):&lt;br /&gt;
## T(n) = T(n-1) + n&lt;br /&gt;
## T(n) = 2*T(floor(sqrt(n))) + lg n. Указание: попробуйте использовать замену переменных.&lt;br /&gt;
## T(n) = 3*T(sqrt(n)) + lg n&lt;br /&gt;
# Дайте верхнюю и нижнюю оценки функции T(n). Постарайтесь, чтобы оценки были как можно более точные&lt;br /&gt;
## T(n) = 4T(n/3) + n*lg(n)&lt;br /&gt;
## T(n) = 3T(n/3) + n/lg(n)&lt;br /&gt;
## T(n) = 4T(n/2) + n^2*sqrt(n)&lt;br /&gt;
## T(n) = T(n/2) + T(n/4) + T(n/8) + n&lt;br /&gt;
## T(n) = T(n-1) + 1/n&lt;br /&gt;
## T(n) = T(n-2) + 1/lg(n)&lt;br /&gt;
## T(n) = sqrt(n) * T(sqrt(n)) + n&lt;br /&gt;
&#039;&#039;&#039;Анализ и построение алгоритмов&#039;&#039;&#039;&lt;br /&gt;
# Числа Фибоначчи F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; можно выразить через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, используя матрицу: https://yadi.sk/i/Pm_aNzHCforFU. &lt;br /&gt;
## Покажите как вычислить F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;.&lt;br /&gt;
## Как вычислить F&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;n+1&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;?&lt;br /&gt;
## Напишите алгоритм.&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
## Ускорьте его так, чтобы он работал за O(log n).&lt;br /&gt;
# Дана последовательность символов. Какое минимальное количество символов нужно удалить из неё, чтобы получить палиндром?&lt;br /&gt;
## Напишите алгоритм (на псевдокоде или на любом языке программирования).&lt;br /&gt;
## Оцените время работы алгоритма.&lt;br /&gt;
# Какую структуру данных вы бы использовали для реализации упорядоченного множества (http://neerc.ifmo.ru/wiki/index.php?title=Упорядоченное_множество)? Какая будет сложность каждой из операций над множеством?&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 16 (до 20.04)===&lt;br /&gt;
# Решите 6 задач из первой части и 6 из второй. (Укажите какие именно.) Каждый из подпунктов является отдельной задачей.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм и теорема Форда-Фалкерсона (16.04)==&lt;br /&gt;
# Базовые определения (пропускные способности, сток, исток и пр.). Пример. &lt;br /&gt;
# Ограничения на поток (сохранение и что меньше пропускных способностей).&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, пример работы&lt;br /&gt;
# Разрез, определение, пример.&lt;br /&gt;
# Утверждение: максимальный поток &amp;lt;= любого разреза.&lt;br /&gt;
# Теорема Форда-Фалкерсона (с доказательством).&lt;br /&gt;
# Пример на котором алгоритм Форда-Фалкерсонаработает работает очень долго при неудачном выборе путей.&lt;br /&gt;
# Сложность алгоритма Форда-Фалкерсона.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №3==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
В [https://official.contest.yandex.ru/contest/1196 домашнем задании] пять задач. Они разделены на два варианта, помеченные римскими цифрами I и II. Свой вариант нужно узнать [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing здесь на вкладке HW3]. Третья задача — общая для двух вариантов; ее решение необходимо снабдить доказательством корректности алгоритма. На выполнение задания дается примерно 2 недели (см. точное время окончания в контесте). Каждую задачу можно написать на С++ или Python.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Форда-Фалкерсона и Эдмондса-Карпа (20.04)==&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, напоминание: базовые определения, пример работы, пример на котором алгоритм работает долго, сложность.&lt;br /&gt;
# Алгоритм Эдмодса-Карпа. Доказательство асимптотики времени работы.&lt;br /&gt;
&lt;br /&gt;
==(23.04)==&lt;br /&gt;
&lt;br /&gt;
==(11.05) Красно-чёрные деревья==&lt;br /&gt;
[https://ru.wikipedia.org/wiki/Красно-чёрное_дерево Красно-чёрное дерево]&lt;br /&gt;
===Домашнее задание 17 (до 18.05)===&lt;br /&gt;
# Зачем нужны красно-чёрные деревья?&lt;br /&gt;
# Благодаря какому свойству и почему красно-чёрное дерево является сбалансированным?&lt;br /&gt;
# Нарисуйте полное бинарное дерево поиска высотой 3 с ключами {1, 2, ..., 15}. Сделайте из него красно-чёрные деревья высотой 2, 3 и 4.&lt;br /&gt;
# Нарисуйте красно-чёрные деревья, получающиеся последовательной вставкой элементов 12, 10, 29, 30, 31, 32 в [https://ru.wikipedia.org/wiki/Красно-чёрное_дерево#/media/File:Red-black_tree_example.svg данное дерево]. Для вставки используйте алгоритм вставки из Википедии. Укажите какой именно функцией вы воспользовались.&lt;br /&gt;
# Определим &#039;&#039;&#039;ослабленное красно-чёрное дерево&#039;&#039;&#039; как бинарное дерево поиска, которое удовлетворяет красно-чёрным свойствам 1, 3, 4 и 5. Другими словами, корень может быть как чёрным, так и красным. Рассмотрите ослабленное красно-чёрное дерево T, корень которого красный. Если перекрасить корень дерева T в чёрный, будет ли оно красно-чёрным деревом?&lt;br /&gt;
# Покажите, что самый длинный простой нисходящий путь от вершины x к листу красно-черного дерева имеет длину, не более чем в два раза превышающую кратчайший путь от x к листу-потомку.&lt;br /&gt;
# Чему равно наибольшее возможное количество внутренних узлов в красно-чёрном дереве с чёрной высоты k? А наименьшее возможное количество?&lt;br /&gt;
# Нарисуйте красно-чёрные деревья, получающиеся последовательной вставкой ключей 41, 38, 31, 12, 19, 8 в изначально пустое дерево.&lt;br /&gt;
# Покажите какие деревья будут получаться в результате последовательного удаления ключей в порядке 8, 12, 19, 31, 38, 41.&lt;br /&gt;
&lt;br /&gt;
==(14.05) Конкурентный анализ самоорганизующихся циклов==&lt;br /&gt;
[https://vk.com/doc12518218_390369758 Лекция]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 18 (до 21.05)===&lt;br /&gt;
Все вычисления сопроводите подробными объяснениями о том, почему верно то или иное (не)равенство.&lt;br /&gt;
# Пусть имеется n-элементный список и m поисковых запросов к нему. После каждой операции поиска можно переупорядочить список. Обозначим стоимость последовательности поисков через C. Докажите, что в худшем случае C = Ω(mn).&lt;br /&gt;
#  Обозначим через c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; стоимость i-ого поискового запроса с применением эвристики перемещения в начало, которая включает стоимость поиска элемента в списке и стоимость его перемещения в начало списка путём ряда обменов соседних элементов списка. Покажите, что i-ая операция поиска находит элемент x в списке L с применением эвристики перемещения в начало, то c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = 2 * rank&amp;lt;sub&amp;gt;L&amp;lt;/sub&amp;gt;(x) - 1.&lt;br /&gt;
# Покажите, что c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = 2 * rank&amp;lt;sub&amp;gt;L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) - 1.&lt;br /&gt;
# Покажите, что c*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = rank&amp;lt;sub&amp;gt;L*&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) + t&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;.&lt;br /&gt;
# Докажите, что после одного обмена двух соседних элементов потенциал либо увеличивается на 2, либо уменьшается на 2.&lt;br /&gt;
# Докажите, что rank&amp;lt;sub&amp;gt;L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) = |A| + |B| + 1.&lt;br /&gt;
# Докажите, что rank&amp;lt;sub&amp;gt;L*&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) = |A| + |С| + 1.&lt;br /&gt;
# Покажите, что поиск i-ого элемента приводит к изменению потенциала Ф(L&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;) - Ф(L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;) &amp;lt;= 2 (|A| - |B| + t*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;), где t*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; --- это количество обменов при i-ом поиске.&lt;br /&gt;
# Во сколько раз стоимость С&amp;lt;sub&amp;gt;MFT&amp;lt;/sub&amp;gt;(S) превышает C&amp;lt;sub&amp;gt;OPT&amp;lt;/sub&amp;gt;(S)?&lt;/div&gt;</summary>
		<author><name>Kassalanche</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=12236</id>
		<title>Алгоритмы и структуры данных. Подгруппа 105-1</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=12236"/>
		<updated>2015-05-14T08:00:06Z</updated>

		<summary type="html">&lt;p&gt;Kassalanche: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==О курсе==&lt;br /&gt;
[[Алгоритмы_и_структуры_данных|План лекций и список рекомендуемой литературы.]]&lt;br /&gt;
&lt;br /&gt;
[[Алгоритмы_и_структуры_данных._Подгруппа_105-1._FAQ|FAQ.]]&lt;br /&gt;
&lt;br /&gt;
[[Reviewboard|Инструкция по использованию Reviewboard.]]&lt;br /&gt;
&lt;br /&gt;
[[Практические_занятия_по_курсу_ОиМП/C++_check|Style guide.]]&lt;br /&gt;
&lt;br /&gt;
==Итоговая оценка за курс==&lt;br /&gt;
Итоговая оценка (ИО) зависит от&lt;br /&gt;
* оценок за пять больших домашних заданий (БДЗ1, БДЗ2, ..., БДЗ5),&lt;br /&gt;
* оценок за домашние задания (ДЗ1, ДЗ2, ...),&lt;br /&gt;
* оценки за контрольную работу (КР),&lt;br /&gt;
* оценки за экзамен (ЭКЗ),&lt;br /&gt;
и может быть вычислена по формуле:&lt;br /&gt;
 ИО = 0.7 * (0.3 * КР + 0.7 *(ИДЗ1 + ИДЗ2 + ИДЗ3 + ИДЗ4 + ИДЗ5)/5) + 0.3 * ЭКЗ =&lt;br /&gt;
    = 0.21*КР + 0.98*ИДЗ1 + 0.98*ИДЗ2 + 0.98*ИДЗ3 + 0.98*ИДЗ4 + 0.98*ИДЗ5 + 0.3*ЭКЗ,&lt;br /&gt;
где&lt;br /&gt;
 ИДЗi = min (10, 0.7 * БДЗi + 0.4 * &amp;lt;cредняя оценка за ДЗj, прошедшие с предыдущего БДЗ по i-ое&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
==Порядок сдачи домашних работ==&lt;br /&gt;
===Большие домашние работы===&lt;br /&gt;
# Получить OK за задачу в контесте.&lt;br /&gt;
# Залить исходный код на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* На каждую задачу создавайте отдельный запрос на ревью. &lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении суток приходят замечания к коду. &#039;&#039;&#039;Если в течении суток замечаний или Ship It не появилось, проверьте, что вы правильно отправили запрос и, если всё сделано правильно, спросите у семинариста получил ли он запрос.&#039;&#039;&#039;&lt;br /&gt;
# Вы их исправляете, проверяете в контесте, что программа по-прежнему проходит все тесты, заливаете новую версию в Review Board. Штрафов за посылки НЕ будет.&lt;br /&gt;
# Процесс повторяется пока остаются замечания к коду или пока не истёк дедлайн. После закрытия контеста будут ещё одни сутки на доработку замечаний в Review Board.&lt;br /&gt;
# Оценивается только последняя версия работы в Review Board.&lt;br /&gt;
&lt;br /&gt;
===Маленькие домашние работы===&lt;br /&gt;
# Залить решение на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* Желаемые форматы: txt, py, cpp, h. Допускаются любые другие.&lt;br /&gt;
#* На каждую домашнюю работу создавайте отдельный запрос на ревью. Обязательно указывайте номер домашней работы.&lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении неопределенного промежутка времени придут оценки по каждому из заданий.&lt;br /&gt;
&lt;br /&gt;
==Оценивание домашних работ==&lt;br /&gt;
* Все задания предполагаются индивидуальными. Запрещены любые заимствования без ссылки на автора.&lt;br /&gt;
* Решения после установленного дедлайна не принимаются. Дедлайн указан в заголовке каждого задания.&lt;br /&gt;
* Везде, где требуется написать алгоритм, можно использовать любой язык программирования или псевдокод.&lt;br /&gt;
* Там, где требуется построить алгоритм с заданной асимптотикой, приведите обоснование, что полученный алгоритм удовлетворяет этому условию.&lt;br /&gt;
* Эти правила не действуют, если в задании явно оговорено иное.&lt;br /&gt;
&lt;br /&gt;
==Мотивация к изучению алгоритмов. Подсчёт числа операций (12.01)==&lt;br /&gt;
# Числа Фибоначчи. Определение. Примитивный рекурсивный алгоритм вычисления i-ого числа. Оценка числа операций. Анализ причин неэффективности. Алгоритм с запоминанием вычисленных ранее значений. Оценка числа операций. Сравнение с предыдущим. (подробнее: глава 0, страницы 8-10 из книги &amp;lt;&amp;lt;Алгоритмы&amp;gt;&amp;gt;, [[Алгоритмы_и_структуры_данных|см. список рекомендованной литературы]])&lt;br /&gt;
# Задача о ханойской башне. Постановка задачи. Рекурсивный алгоритм. Рекуррентная формула для числа перемещений. Замкнутая формула для числа перемещений (+ доказательство). Доказательство того, что эту задачу нельзя решить используя меньшее число перемещений дисков. ([https://www.dropbox.com/s/t8cbs7ttu4iasvj/algo-0-recursion.pdf?dl=0 Разбор задачи о ханойской башне], автор Сергей Объедков)&lt;br /&gt;
# Сортировка пузырьком. Алгоритм. Подсчёт количество операций сравнения и обмена (swap). Анализ наилучшего и наихудшего случаев ([https://ru.wikipedia.org/wiki/Сортировка_пузырьком Википедия])&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 1 (12.01 - 26.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
Во всех задачах, если не оговорено иного, предполагаем, что работаем с целыми неотрицательными числами. Для первых 7 задач необходимо&lt;br /&gt;
* описать что можно считать наилучшим и наихудшим случаями,&lt;br /&gt;
* для каждого из двух случаев подсчитать отдельно количество операций сравнения и swap (если есть).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Даны три числа, требуется вернуть наименьшее.&lt;br /&gt;
# Даны три числа, требуется отсортировать их.&lt;br /&gt;
# Дана последовательность A из n элементов и число x, требуется найти элемент равный x. Примечание: если таких значений i несколько, вернуть любое; если такого элемента нет, функция должна сообщить об этом.&lt;br /&gt;
# * Дана упорядоченная последовательность A из n элементов и число x, требуется найти такое i, что A[i] равно x. Алгоритм должен быть эффективней, чем в предыдущем пункте и использовать то, что последовательность упорядочена.&lt;br /&gt;
# Дана последовательность из 100 000 чисел от 0 до 100. Напишите эффективный алгоритм сортировки, который бы учитывал специфику входных данных.&lt;br /&gt;
# * Дано 32 битное неотрицательное число. Требуется номер первого ненулевого бит. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения, считая, что числа распределены равномерно.&lt;br /&gt;
# * Даны 32 битные неотрицательные числа m и n. Требуется вывести True, если m &amp;lt; n, иначе False. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения битов, считая, что числа распределены равномерно.&lt;br /&gt;
# Напишите рекурсивную функцию, вычисляющую n-ое число Фибоначчи (как на занятии). Подсчитайте количество рекурсивных вызовов.&lt;br /&gt;
# * Напишите функцию, вычисляющую n-ое число Фибоначчи, у которой число операций — полином от n, и которая использует количество памяти, независящее от n.&lt;br /&gt;
&lt;br /&gt;
==O-символика и стратегия &amp;quot;разделяй и властвуй&amp;quot; (15.01)==&lt;br /&gt;
# Сортировка слиянием. Алгоритм, рекуррентное соотношение для времени сортировки, сложность. Подробнее: [https://dl.dropboxusercontent.com/u/829163/draft.pdf §2.3 Сортировка слиянием (стр. 54)].&lt;br /&gt;
# О-символика. [https://dl.dropboxusercontent.com/u/829163/draft.pdf §0.3 О-символика (стр. 10)].&lt;br /&gt;
# Задача о слиянии m упорядоченных массивов по n элементов. Три алгоритма решения: последовательное слияние, слияние &amp;quot;деревом&amp;quot; (обе функции используют Merge из MergeSort), аналог Merge для m массивов. Анализ сложности каждого из них.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 2 (15.01-29.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
* Во всех задачах, если не оговорено иного, для простоты &#039;&#039;можно&#039;&#039; считать, что n является степенью какого-либо числа, например, степенью двойки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Дана функция F, определённая ниже. Сколько строк она напечатает? Указание: для обоих подпунктов рассмотрите два случая: 1. n является степенью двойки, 2. n не является степенью двойки.&lt;br /&gt;
## Запишите рекуррентное соотношение для числа строк.&lt;br /&gt;
## Решите уравнение, полученное в предыдущем пункте, то есть, выведите замкнутую (нерекуррентную формулу). Для простоты можно считать, что n является степенью двойки.&lt;br /&gt;
# В массиве A размера n записана возрастающая последовательность целых чисел. Постройте алгоритм типа &amp;quot;разделяй и властвуй&amp;quot;, который проверяет, существует ли такой индекс i, что A[i] = i&lt;br /&gt;
## за время O(n),&lt;br /&gt;
## * за время O(log n).&lt;br /&gt;
## Какие случаи для вашего алгоритма являются наихудшими и наилучшими? Какого время работы в лучшем и худшем случаях?&lt;br /&gt;
# Дан бесконечный массив A, первые n элементов которого содержат возрастающую последовательность положительных чисел, а дальше стоят -1. Значение n не дано. Постройте алгоритм, который получает на вход целое число x и находит это x в массиве --- или говорит, что там его нет, &lt;br /&gt;
## за время O(n),&lt;br /&gt;
## за время O(log n).&lt;br /&gt;
# Рассмотрим алгоритм вычисления наибольшего общего делителя (НОД) двух положительных чисел, основанный на методе &amp;quot;разделяй и властвуй&amp;quot;.&lt;br /&gt;
## (задание не оценивается) Прочитайте [https://dl.dropboxusercontent.com/u/829163/draft.pdf §1.2.3 Алгоритм Евклида (стр. 23)].&lt;br /&gt;
## * Докажите, что определение НОД-а, приведённое ниже, корректно.&lt;br /&gt;
## Постройте алгоритм, основанный на этом определении.&lt;br /&gt;
## Какой алгоритм будет быстрее для n-битовых чисел a и b при больших значениях n --- ваш или алгоритм Евклида?&lt;br /&gt;
# * Покажите как за время O(n log n) удалить из массива размера n все дубликаты, то есть оставить каждый элемент в одном экземпляре.&lt;br /&gt;
# * Даны два упорядоченных массива размера m и n. Постройте алгоритм, находящий k-й по величине элемент в объединении этих массивов за время O(log(n+m)). &lt;br /&gt;
&lt;br /&gt;
Функция F(n).&lt;br /&gt;
  если n &amp;gt; 1:&lt;br /&gt;
    напечатать &amp;quot;всё ещё работаю&amp;quot;&lt;br /&gt;
    F(n/2)&lt;br /&gt;
    F(n/2)&lt;br /&gt;
&lt;br /&gt;
Определение НОД-а.&lt;br /&gt;
             2НОД(a/2, b/2), если а и b чётны,&lt;br /&gt;
  НОД(a,b) = НОД(a, b/2), если а нечётно, b чётно,&lt;br /&gt;
             НОД((a-b)/2, b), если а и b нечётны.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;lt;nowiki&amp;gt;Задачи взяты из книги &amp;quot;Алгоритмы&amp;quot;, глава 2 (см. список рекомендованной литературы).&amp;lt;/nowiki&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Сложение и умножение (19.01)==&lt;br /&gt;
# Алгоритм сложения, его сложность (§1.1.1 Сложение*)&lt;br /&gt;
# &amp;quot;Школьный&amp;quot; алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Рекурсивный алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Алгоритм умножения, реализующий стратегию &amp;quot;разделяй и властвуй&amp;quot;, анализ сложности (§2.1 Умножение чисел*)&lt;br /&gt;
 * [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать.]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 3 (19.01 - 2.02)===&lt;br /&gt;
* Во всех задачах для простоты можно считать, что n является степенью какого-либо числа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Найдите произведение чисел 10011011 и 10111010 (в двоичной системе счисления), используя алгоритм умножения чисел, основанный на методе «разделяй и властвуй». Необходимо не только дать ответ, но и привести ход решения.&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 3 рекурсивных вызова для подзадач размера n-1 и комбинирует из них решение исходной задачи за О(n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте три верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 10 рекурсивных вызовов для подзадач размера n/2 и комбинирует из них решение исходной задачи за О(5n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте два верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Докажите, что 3m² + m = O(m²).&lt;br /&gt;
# Докажите, что lg m = O(m/1000), где lg m — это логарифм с двоичным основанием.&lt;br /&gt;
# Докажите, что из равенства f(n) = O(g(n)) не следует, что g(n) = O(f(n)).&lt;br /&gt;
# Докажите, что O(m) содержится в O(m²).&lt;br /&gt;
&lt;br /&gt;
==Решение рекуррентных уравнений (22.01)==&lt;br /&gt;
# Примеры решений рекуррентных уравнений (см. [https://www.dropbox.com/s/6a0r410zjm9qwe7/algo-3-recurrences.pdf?dl=0 конспект]).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 4 (до 14.02)===&lt;br /&gt;
* Нельзя использовать утверждение основной теоремы о решении рекуррентных соотношений.&lt;br /&gt;
* &#039;&#039;Можно&#039;&#039; использовать метод построения дерева рекурсии или подстановку (метод с угадыванием ответа).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Какой из трёх приведённых ниже алгоритмов вы бы предпочли? Обоснуйте свой ответ.&lt;br /&gt;
#* Алгоритм A, решая задачу, производит пять рекурсивных вызовов для подзадач вдвое меньшего размера, после чего строит ответ для исходной задачи за линейное время.&lt;br /&gt;
#* Алгоритм B, решая задачу размера n, делает два рекурсивных вызова для задач размера n − 1, после чего находит ответ за время O(1).&lt;br /&gt;
#* Алгоритм C, решая задачу размера n, рекурсивно решает девять задач размера n/3 и строит ответ за время O(n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Найдите T(n) в замкнутой форме для любых 7 из 10 приведённых ниже рекуррентных соотношений:&lt;br /&gt;
## T(n) ≤ 2T(n/3) + 1;&lt;br /&gt;
## T(n) ≤ 7T(n/7) + n;&lt;br /&gt;
## T(n) ≤ 9T(n/3) + n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 8T(n/2) + n&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 49T(n/25) + n&amp;lt;sup&amp;gt;3/2&amp;lt;/sup&amp;gt;log n;&lt;br /&gt;
## T(n) ≤ T(n − 1) + 2;&lt;br /&gt;
## T(n) ≤ T(n − 1) + n&amp;lt;sup&amp;gt;c&amp;lt;/sup&amp;gt;, где c ≥ 1 –– константа;&lt;br /&gt;
## T(n) ≤ T(n − 1) + c&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;, где c &amp;gt; 1 –– константа;&lt;br /&gt;
## T(n) ≤ 2T(n − 1) + 1;&lt;br /&gt;
## T(n) ≤ T(sqrt(n)) + 1.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №1==&lt;br /&gt;
Необходимо реализовать все 6 задач из [https://official.contest.yandex.ru/contest/1002 контеста]. Каждую задачу можно писать на С++ или Python. На выполнение работы отводится две недели. Каждая задача оценивается в 10/6 балла. Оценка &#039;&#039;может&#039;&#039; быть снижена за плохой код, но не более чем на 25%.&lt;br /&gt;
&lt;br /&gt;
==Бинарное дерево поиска (26.01)==&lt;br /&gt;
# Определение. Пример.&lt;br /&gt;
# Не модифицирующие алгоритмы: поиск (рекурсивный и итеративный алгоритмы), поиск минимума, inordered обход (вывод значений узлов в отсортированном порядке), поиск следующего по возрастанию.&lt;br /&gt;
# Модифицирующие алгоритмы: вставка (рекурсивная реализация), удаление (только идея).&lt;br /&gt;
 [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 13, стр. 248]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 5 (до 16.02)===&lt;br /&gt;
* Для получения максимальной оценки можно выполнить или все задачи без звёздочки, или задачу со звёздочкой. Преподаватель понимает, что реализацию БДП сложно не найти в интернете, но от копипасты не будет никакой пользы. Напротив, самостоятельная реализация очень полезна и приветствуется, даже если не получится выполнить всех пунктов задания.&lt;br /&gt;
* Задачи с двумя звёздочками необязательны.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Нарисуйте бинарные деревья поиска высотой 2, 3, 4, 5 и 6 для множества ключей {1, 4, 5, 10, 16, 17, 21}. Корень дерева имеет высоту 0.&lt;br /&gt;
# &#039;&#039;&#039;Сортировка с использованием БДП.&#039;&#039;&#039;&lt;br /&gt;
## Какова асимптотическая сложность алгоритма вставки элемента в дерево высоты d? Почему? Назовите наилучший и наиухдший случаи.&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который строит БДП в узлах которого стоят элементы данной последовательности. Можно использовать функцию Insert. Назовите наилучший и наихудший случаи. Есть теорема о том, что полученный алгоритм будет работать в среднем случае за время O(n * log n).&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который выводит их в порядке возрастания. Используйте бинарное дерево поиска. Какова в среднем случае сложность этого алгоритма? Назовите наилучший и наихудший случаи. Какова сложность в наихудшем случае?&lt;br /&gt;
# Напишите функцию GetRoot, которой на вход подаётся указатель на произвольный узел дерева, а она возвращает указатель на корень.&lt;br /&gt;
# Напишите процедуру PrintLeafs, которой на вход подаётся указатель на корень дерева, и она печатает листья дерева&lt;br /&gt;
## по возрастанию,&lt;br /&gt;
## по убыванию.&lt;br /&gt;
# ** Альтернативный обход в порядке возрастания бинарного дерева поиска с n узлами (или центрированный (inordered) обход) можно осуществить путём поиска минимального элемента дерева с помощью функции Minimum с последующий n-1 вызовом функции Next. Каково время работы такого алгоритма?&lt;br /&gt;
# * Реализуйте на С++ структуру данных бинарное дерево поиска, [https://yadi.sk/i/gi2SEStreFfSb используя заготовку].&lt;br /&gt;
## Нарисуйте бинарное дерево поиска, которое строится в функции getTreeExample.&lt;br /&gt;
## Реализуйте следующие алгоритмы: &lt;br /&gt;
### поиск минимума, &lt;br /&gt;
### inordered обход (вывод значений узлов в отсортированном порядке),&lt;br /&gt;
### поиск следующего по возрастанию,&lt;br /&gt;
### вставка элемента в дерево,&lt;br /&gt;
### сортировка последовательности с использованием БДП (дан вектор чисел, необходимо вывести их по возрастанию),&lt;br /&gt;
### ** удаление.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Карацубы, Штрассена. Быстрая сортировка (29.01)==&lt;br /&gt;
# Алгоритм Карацубы.&lt;br /&gt;
# Алгоритм Штрассена. [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать Дасгупту и др., §2.5 Умножение матриц]&lt;br /&gt;
# Быстрая сортировка и доказательство того, что в среднем случае она работает за О(n * log n). [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 8 Быстрая сортировка, стр. 148]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 6 (до 18.02)===&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Пусть мы хотим найти двоичное представление десятичного числа 10&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;. Будем считать, что n --- степень двойки (n = 2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt;).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Pwr2Bin(n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть 1010&lt;br /&gt;
    z = ...&lt;br /&gt;
    вернуть Multiply(z, z)&amp;lt;/source&amp;gt;&lt;br /&gt;
Multiply --- функция, перемножающая два n-битовых двоичных числа x и y по алгоритму Карацубы за O(n&amp;lt;sup&amp;gt;log&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;3&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Пусть мы хотим перевести произвольное десятичное число x в записи которого n=2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; чисел в двоичную систему счисления.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Dec2Bin(x, n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть binary[x]&lt;br /&gt;
    разделить x на два десятичных числа xl и xr из n/2 цифр.&lt;br /&gt;
    вернуть ...&amp;lt;/source&amp;gt;&lt;br /&gt;
Здесь binary --- это массив, содержащий двоичное представление десятичных цифр.&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Докажите, что математическое ожидание времени работы алгоритма быстрой сортировки (усреднение по всем вариантам выбора опорного элемента) на любом входе размера n удовлетворяет соотношению: T(n) ≤ O(n) + 1/n * &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt; (T(i-1) + T(n-i)).&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Найдите решение соотношения из предыдущего пункта.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Динамическое программирование (ДП). Первые примеры (02.01)==&lt;br /&gt;
# Нахождение самой длинной возрастающей подпоследовательности.&lt;br /&gt;
# Нахождение редакционного расстояния (или редакционной стоимости, расстояния Левенштейна).&lt;br /&gt;
# Нахождение представителя большинства.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 7 (до 20.02)===&lt;br /&gt;
* В этом задании везде, где требуется реализовать алгоритм, необходимо привести код на любом языке программирования.&lt;br /&gt;
* Для получения максимальной оценки нужно решить все задачи без звёздочек. Одна решённая задача со звёздочкой заменяет одну задачу без звёздочки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения редакционного расстояния (алгоритм Вагнера — Фишера). Например, редакционное расстояние между словами &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равно 6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения длины наибольшей общей подстроки. Например, длина наибольшей общей подстроки &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равна 8 (&amp;quot;antholog&amp;quot;). Чем больше это значение, тем схожей строки.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Предположим теперь, что сравниваемые строки состоят из символов A, С, G и T; за удаление или вставку мы платим -5; за замену буквы x на y платим w[x, y], где x, y принадлежат множеству {A, С, G, T}, a w — это матрица весов:&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
!-!! A!! G!! C!! T&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! A&lt;br /&gt;
|10||-1||-3||-4&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
!G&lt;br /&gt;
||-1||7||-5||-3&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! C&lt;br /&gt;
||-3||-5||9||0&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! T&lt;br /&gt;
||-4||-3||0||8&lt;br /&gt;
|}&lt;br /&gt;
Тогда выравнивание:&lt;br /&gt;
 AGACTAGTTAC&lt;br /&gt;
 CGA‒‒‒GACGT&lt;br /&gt;
будет иметь следующую оценку:&lt;br /&gt;
 w[A,C] + w[G,G] + w[A,A] + 3*(-5) + w[G,G] + w[T,A] + w[T,C] + w[A,G] + w[C,T] = -3 + 7 + 10 - 3*5 + 7 + (-4) + 0 + (-1) + 0 = 1.&lt;br /&gt;
&lt;br /&gt;
Напишите алгоритм, который находит максимальную стоимость всех возможных выравниваний. Верно ли, что чем больше это значение, тем непохожей строки?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как давно один народ отделился от другого? Кто похожей — итальянец и китаец или якут и эфиоп? На эти вопросы можно отвечать с разных точек зрения — культурной, исторической, лингвистической, ... В последние же годы человечество научилось секвенировать геном, что позволило исследовать этот вопрос с точки зрения генетики. Секвенирование генома — это процесс записи ДНК в виде нуклеотидной последовательности, которая представляет собой последовательность из четырёх символов — A, С, G и T. Существуют базы, которые хранят генетическую информацию о людях из разных стран и континентов, например, [http://www.mtdb.igp.uu.se/ http://www.mtdb.igp.uu.se/ → Download mtDNA sequences]. Чем больше сходство между геномами, тем сильнее родственные связи между их обладателями. Используя решение предыдущего пункта, выполните задания:&lt;br /&gt;
# Определите, кто похожей — итальянец и китаец или якут и эфиоп?&lt;br /&gt;
# Найдите нескольких похожих и нескольких непохожих народностей.&lt;br /&gt;
# * Выберите одну народность. Найдите самых похожих и самых непохожих на неё.&lt;br /&gt;
# * Найдите самые похожие и самые непохожие народности.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Задача о разрезании стержня (05.01)==&lt;br /&gt;
# Постановка задачи.&lt;br /&gt;
# Решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Решение с нахождением максимума по p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Восходящий алгоритм с запоминанием. Вывод длин кусочков стержня. Оценка сложности.&lt;br /&gt;
# Нисходящий алгоритм с запоминанием. Оценка сложности.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.1 Разрезание стержня, стр. 393]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 8 (до 22.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Решая задачу о разрезании стержня мы вначале построили рекурсивное решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt; для всех 1 ≤ i &amp;lt; n. Его сложность описывалась рекуррентной формулой T(n) = n + &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n-1&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt;(T(i) + T(n-i)), T(1) = 1.&lt;br /&gt;
# Объясните эту формулу.&lt;br /&gt;
# Покажите с помощью метода подстановок, что T(n) ≤ 2&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Покажите с помощью контрпримера, что описанная далее жадная стратегия не всегда определяет оптимальный способ разрезания стержня. Определим плотность стержня длиной i как p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;/i, то есть как стоимость единицы его длины. Жадная стратегия для стержня длиной n отрезает от стержня первую часть длиной i, где 1 ≤ i ≤ n, имеющую максимальную плотность. Затем та же жадная стратегия применяется к оставшейся части длиной n-i.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Рассмотрим модификацию задачи разрезания стержня, в которой в дополнение к цене p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; каждого стержня добавляется фиксированная цена разреза c. Теперь прибыль, связанная с решением, представляет собой сумму цен частей стержня минус стоимость разрезов. Разработайте алгоритм динамического программирования для этой модифицированной задачи.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Непрерывным участком называется группа подряд идущих элементов. Например, для последовательности&lt;br /&gt;
 5, 15, −30, 10, −5, 40, 10&lt;br /&gt;
элементы 15, −30, 10 образуют непрерывный участок, а 5, 15, 40 -- нет. Постройте линейный алгоритм для следующей задачи:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Вход: список чисел a1, a2, ... ‌, an.&lt;br /&gt;
Выход: непрерывный участок с максимальной суммой (сумма участка нулевой длины равна нулю).&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Для приведённого примера ответом будет 10, −5, 40, 10 с суммой 55. Какова сложность алгоритма? Почему?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Надо заплатить v рублей, имея купюры в x1, x2, ‌..., xn рублей (купюр каждого типа сколько угодно). Это не всегда возможно (скажем, купюрами в&lt;br /&gt;
10 и 25 рублей можно заплатить 45 рублей, но не 47 и не 15). Постройте основанный на методе динамического программирования алгоритм со временем работы O(nv), выясняющий, возможна ли уплата.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как решить предыдущую задачу, если каждая купюра имеется в единственном экземпляре? (Например, купюрами в 1, 5, 10, 20 рублей можно заплатить 16 = 1 + 5 + 10 и 31 = 1 + 10 + 20 рублей, но не 40 (не хватит денег). Время работы алгоритма по-прежнему O(nv).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Ещё один вариант той же задачи: купюр каждого типа сколько угодно, но всего разрешается использовать не более k купюр. (Например, если есть купюры в 5 и 10 рублей, а k = 6, то 55 разменять можно, а 65 –– нет).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Перемножение цепочки матриц. Оптимальное бинарное дерево поиска (начало) (09.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о перемножении цепочки матриц. Постановка задачи.Пример. Нисходящий алгоритм.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.2 Перемножение цепочки матриц, стр. 403]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 9 (до 24.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Найдите оптимальную расстановку скобок в произведении последовательности матриц, размерности которых равны 5×10, 10×3, 3×12, 12×5, 5×50, 50×6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Напишите восходящий алгоритм для поиска оптимальной расстановки скобок.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Расстановка пробелов. Оптимальное бинарное дерево поиска (середина) (12.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о расстановке пробелов. Постановка задачи. Решения для трёх случаев: 1. нужно вернуть можно ли разбить текст на слова; 2. вернуть разбивку на слова; 3. слова встречаются не равновероятно, вернуть наиболее вероятную разбивку на слова.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи. Вывод математического ожидания времени поиска.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Праздничное домашнее задание 10 (до 02.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[&amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;,&amp;quot;, &amp;quot;.&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;,&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;.&amp;quot;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Подсказка:&#039;&#039;&#039; разбейте текст на слова из списка и посмотрите на азбуку Морзе.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Способы представления графов в памяти (16.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Разбор ошибок в домашнем задании.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Графы. Способы представления графов в памяти (матрица смежности, список рёбер, список соседей (список смежностей), матрица инцидентности). Зависимость сложности алгоритмов от способа представления.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §22.1 Представление графов, стр. 626]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 11 (до 02.03)===&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача A.]&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача B.]&lt;br /&gt;
# Нарисуйте неориентированный граф с 5 вершинами и 8 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Нарисуйте ориентированный граф с 4 вершинами и 3 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Дан ориентированный граф. &#039;&#039;Исходящая степень вершины v&#039;&#039; --- это количество исходящих из неё рёбер, &#039;&#039;входящая степень v&#039;&#039; --- это количество рёбер входящих в  v. Имеется представление ориентированного графа с использование списка соседей. Как долго будут вычисляться исходящие степени всех вершин графа? А входящие степени?&lt;br /&gt;
# Дан граф G = (V, E). Какие из рассмотренных способов хранения графов используют меньше всего памяти для хранения G и почему? Указание: рассмотрите случаи |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;lt; |E| и |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;gt; |E|.&lt;br /&gt;
# Пусть C --- это матрица смежности графа G.&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
# Пусть B --- это матрица инцидентности ориентированного графа G. Как связаны элементы матрицы BB&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
&lt;br /&gt;
==Реализация поиска в глубину (19.02)==&lt;br /&gt;
# Реализация поиска в глубину и смежных задач.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 12 (до 5.03)===&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Выберите любой способ хранения графа. Реализуйте поиск в глубину.&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Напишите алгоритм, который возвращает данные о том, какие вершины лежат в одной компоненте связности.&lt;br /&gt;
# &#039;&#039;(любой ЯП или псевдокод)&#039;&#039; Напишите алгоритм проверки сильной связности ориентированного графа. Какова его сложность?&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №2==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
Необходимо реализовать 3 задачи из [https://official.contest.yandex.ru/contest/1085 контеста], см. [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing распределение задач]. Каждую задачу можно написать на С++ или Python. На выполнение работы отводится две недели (см. время окончания контеста). [https://official.contest.yandex.ru/contest/1123 Дорешивание.]&lt;br /&gt;
&lt;br /&gt;
==ДП и графы (26.02)==&lt;br /&gt;
==ДП и графы (02.03)==&lt;br /&gt;
==Жадные алгоритмы (12.03)==&lt;br /&gt;
===Домашнее задание 13 (до 23.03)===&lt;br /&gt;
# Вася хочет купить по одной акции каждой компании. Все акции стоят одинаково, но дорожают по-разному. Каждый месяц акция i-ой компании дорожает в r_i раз. В один месяц можно купить только одну акцию.&lt;br /&gt;
## Напишите алгоритм, который выводит оптимальную последовательность покупок (такую, что на покупку всех акций потратится меньше денег).&lt;br /&gt;
## Докажите корректность алгоритма, то есть докажите, что последовательность покупок, которую выводит ваш алгоритм, оптимальна.&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список, очередь (16.03)==&lt;br /&gt;
# Реализация линейного двусвязного списка (С++).&lt;br /&gt;
# Реализация очереди ограниченной длины на базе вектора (С++).&lt;br /&gt;
# Реализация очереди на базе списка (С++).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14 (до 23.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте (на С++) структуру данных Стек. У стека должно быть три операции:&lt;br /&gt;
* push --- положить элемент на вершину стека;&lt;br /&gt;
* pop --- удалить верхний элемент;&lt;br /&gt;
* front --- вернуть значение верхнего элемента.&lt;br /&gt;
Оцените время работы каждой функции.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список (19.03)==&lt;br /&gt;
===Домашнее задание 13* (до 30.03)===&lt;br /&gt;
#Для приведённой реализации класса List (https://yadi.sk/i/c5r_79WdfMyNS).&lt;br /&gt;
## Допишите print, push_back и push_front.&lt;br /&gt;
## В функции insert_after и delete_node вставьте необходимые проверки так, чтобы они работали для крайних случаев.&lt;br /&gt;
## Напишите main в котором&lt;br /&gt;
### создаётся объект класса List, &lt;br /&gt;
### заполняется элементами с помощью функций push_back, push_front и insert_after и&lt;br /&gt;
### удаляется i-ый элемент.&lt;br /&gt;
&lt;br /&gt;
==Повторение (30.03)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Для данных пар функций выясните их связь в терминах O-, o-, Ω-, ω-, Θ-обозначений. Поставьте галочку в клетке с Ω, если f(x) = Ω(g(x)) и прочерк, если равенства нет. [https://ru.wikipedia.org/wiki/«O»_большое_и_«o»_малое#.D0.94.D1.80.D1.83.D0.B3.D0.B8.D0.B5_.D0.BF.D0.BE.D0.B4.D0.BE.D0.B1.D0.BD.D1.8B.D0.B5_.D0.BE.D0.B1.D0.BE.D0.B7.D0.BD.D0.B0.D1.87.D0.B5.D0.BD.D0.B8.D1.8F Википедия]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! f(x)!! g(x)!! O!! o!! Ω!! ω!! Θ&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! 2^100&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n * log(n)&lt;br /&gt;
! 2^100 * n * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n&lt;br /&gt;
! 2^100 * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n!&lt;br /&gt;
! 2^(2015n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n*2^n&lt;br /&gt;
! 3^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 5^n&lt;br /&gt;
! 5^(n+1)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n + n^2 + n^3 + ... + n^1000&lt;br /&gt;
! 7^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм Quickselect нахождения k-ого элемента по возрастанию: http://en.wikipedia.org/wiki/Quickselect&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;На улице стоит ряд домов. В каждом из домов лежит сколько-то денег. Вор хочет обокрасть дома на переулке. Он не может обокрасть два соседних дома, потому что хозяин дома, который он обокрал, сразу предупредит соседей. Нужно найти, какую максимальную сумму вор может украсть с переулка. На вход программы подается массив неотрицательных целых чисел - количество долларов в доме с номером i. Соседние дома в массиве представлены соседними элементами. Например, пусть задан массив { 1, 4, 5 } - тогда вор максимум может украсть $6, обокрав дома 1 и 3. Пусть задан массив { 1, 7, 2 } - тогда вор максимум может украсть $7, обокрав дом 2.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Алфавит из всех маленьких латинских букв и пробела закодирован числами следующим способом:&lt;br /&gt;
  &#039;a&#039; -&amp;gt; 1&lt;br /&gt;
  &#039;b&#039; -&amp;gt; 2&lt;br /&gt;
  &#039;c&#039; -&amp;gt; 3&lt;br /&gt;
  ...&lt;br /&gt;
  &#039;z&#039; -&amp;gt; 26&lt;br /&gt;
  &#039; &#039; -&amp;gt; 27&lt;br /&gt;
На вход программы подается строка из цифр. Нужно посчитать, сколькими способами можно раскодировать эту строку.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Дан граф, заданный матрицей смежности. Вывести пары вершин между которыми нет пути.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Повторение (02.04) ==&lt;br /&gt;
Решали и разбирали первые 4 задачи из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14* (до 11.03)===&lt;br /&gt;
Решите любые две задачи (подпункты НЕ считаются отдельными задачами) с предыдущей пары (Повторение (30.03)).&lt;br /&gt;
&lt;br /&gt;
== Повторение (06.04) ==&lt;br /&gt;
Будем решать вторую половину задач из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 15 (до 16.04)===&lt;br /&gt;
# Приведите пример графа, который содержит отрицательные рёбра, не содержит циклов отрицательного веса и для которого алгоритм Дейкстры возвращает неверный результат.&lt;br /&gt;
# Используется ли в алгоритме Дейкстры то, что веса рёбер неотрицательны? Если &amp;quot;да&amp;quot;, то где именно?&lt;br /&gt;
# Пусть граф содержит рёбра с весами &amp;gt;= -100. Если прибавить к каждому ребру 101 и при помощи алгоритма Дейкстры найти кратчайшие пути. Будут ли эти пути кратчайшими в исходном графе? Почему?&lt;br /&gt;
&lt;br /&gt;
== Повторение (07.04) ==&lt;br /&gt;
&#039;&#039;&#039;Решение рекуррентных соотношений&#039;&#039;&#039;&lt;br /&gt;
# Решите уравнение: T(n) = 4*T(n/2) + O(n^2) с базой T(1) = O(1)&lt;br /&gt;
## Используя основную теорему.&lt;br /&gt;
## Используя дерево рекурсий.&lt;br /&gt;
## Методом подстановки.&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2)) + n является \Theta(n lg n).&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2) + 17) + n является \Theta(n lg n).&lt;br /&gt;
# Решите уравнения, считая, что T(1) = O(1):&lt;br /&gt;
## T(n) = T(n-1) + n&lt;br /&gt;
## T(n) = 2*T(floor(sqrt(n))) + lg n. Указание: попробуйте использовать замену переменных.&lt;br /&gt;
## T(n) = 3*T(sqrt(n)) + lg n&lt;br /&gt;
# Дайте верхнюю и нижнюю оценки функции T(n). Постарайтесь, чтобы оценки были как можно более точные&lt;br /&gt;
## T(n) = 4T(n/3) + n*lg(n)&lt;br /&gt;
## T(n) = 3T(n/3) + n/lg(n)&lt;br /&gt;
## T(n) = 4T(n/2) + n^2*sqrt(n)&lt;br /&gt;
## T(n) = T(n/2) + T(n/4) + T(n/8) + n&lt;br /&gt;
## T(n) = T(n-1) + 1/n&lt;br /&gt;
## T(n) = T(n-2) + 1/lg(n)&lt;br /&gt;
## T(n) = sqrt(n) * T(sqrt(n)) + n&lt;br /&gt;
&#039;&#039;&#039;Анализ и построение алгоритмов&#039;&#039;&#039;&lt;br /&gt;
# Числа Фибоначчи F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; можно выразить через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, используя матрицу: https://yadi.sk/i/Pm_aNzHCforFU. &lt;br /&gt;
## Покажите как вычислить F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;.&lt;br /&gt;
## Как вычислить F&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;n+1&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;?&lt;br /&gt;
## Напишите алгоритм.&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
## Ускорьте его так, чтобы он работал за O(log n).&lt;br /&gt;
# Дана последовательность символов. Какое минимальное количество символов нужно удалить из неё, чтобы получить палиндром?&lt;br /&gt;
## Напишите алгоритм (на псевдокоде или на любом языке программирования).&lt;br /&gt;
## Оцените время работы алгоритма.&lt;br /&gt;
# Какую структуру данных вы бы использовали для реализации упорядоченного множества (http://neerc.ifmo.ru/wiki/index.php?title=Упорядоченное_множество)? Какая будет сложность каждой из операций над множеством?&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 16 (до 20.04)===&lt;br /&gt;
# Решите 6 задач из первой части и 6 из второй. (Укажите какие именно.) Каждый из подпунктов является отдельной задачей.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм и теорема Форда-Фалкерсона (16.04)==&lt;br /&gt;
# Базовые определения (пропускные способности, сток, исток и пр.). Пример. &lt;br /&gt;
# Ограничения на поток (сохранение и что меньше пропускных способностей).&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, пример работы&lt;br /&gt;
# Разрез, определение, пример.&lt;br /&gt;
# Утверждение: максимальный поток &amp;lt;= любого разреза.&lt;br /&gt;
# Теорема Форда-Фалкерсона (с доказательством).&lt;br /&gt;
# Пример на котором алгоритм Форда-Фалкерсонаработает работает очень долго при неудачном выборе путей.&lt;br /&gt;
# Сложность алгоритма Форда-Фалкерсона.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №3==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
В [https://official.contest.yandex.ru/contest/1196 домашнем задании] пять задач. Они разделены на два варианта, помеченные римскими цифрами I и II. Свой вариант нужно узнать [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing здесь на вкладке HW3]. Третья задача — общая для двух вариантов; ее решение необходимо снабдить доказательством корректности алгоритма. На выполнение задания дается примерно 2 недели (см. точное время окончания в контесте). Каждую задачу можно написать на С++ или Python.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Форда-Фалкерсона и Эдмондса-Карпа (20.04)==&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, напоминание: базовые определения, пример работы, пример на котором алгоритм работает долго, сложность.&lt;br /&gt;
# Алгоритм Эдмодса-Карпа. Доказательство асимптотики времени работы.&lt;br /&gt;
&lt;br /&gt;
==(23.04)==&lt;br /&gt;
&lt;br /&gt;
==(11.05) Красно-чёрные деревья==&lt;br /&gt;
[https://ru.wikipedia.org/wiki/Красно-чёрное_дерево Красно-чёрное дерево]&lt;br /&gt;
===Домашнее задание 17 (до 18.05)===&lt;br /&gt;
# Зачем нужны красно-чёрные деревья?&lt;br /&gt;
# Благодаря какому свойству и почему красно-чёрное дерево является сбалансированным?&lt;br /&gt;
# Нарисуйте полное бинарное дерево поиска высотой 3 с ключами {1, 2, ..., 15}. Сделайте из него красно-чёрные деревья высотой 2, 3 и 4.&lt;br /&gt;
# Нарисуйте красно-чёрные деревья, получающиеся последовательной вставкой элементов 12, 10, 29, 30, 31, 32 в [https://ru.wikipedia.org/wiki/Красно-чёрное_дерево#/media/File:Red-black_tree_example.svg данное дерево]. Для вставки используйте алгоритм вставки из Википедии. Укажите какой именно функцией вы воспользовались.&lt;br /&gt;
# Определим &#039;&#039;&#039;ослабленное красно-чёрное дерево&#039;&#039;&#039; как бинарное дерево поиска, которое удовлетворяет красно-чёрным свойствам 1, 3, 4 и 5. Другими словами, корень может быть как чёрным, так и красным. Рассмотрите ослабленное красно-чёрное дерево T, корень которого красный. Если перекрасить корень дерева T в чёрный, будет ли оно красно-чёрным деревом?&lt;br /&gt;
# Покажите, что самый длинный простой нисходящий путь от вершины x к листу красно-черного дерева имеет длину, не более чем в два раза превышающую кратчайший путь от x к листу-потомку.&lt;br /&gt;
# Чему равно наибольшее возможное количество внутренних узлов в красно-чёрном дереве с чёрной высоты k? А наименьшее возможное количество?&lt;br /&gt;
# Нарисуйте красно-чёрные деревья, получающиеся последовательной вставкой ключей 41, 38, 31, 12, 19, 8 в изначально пустое дерево.&lt;br /&gt;
# Покажите какие деревья будут получаться в результате последовательного удаления ключей в порядке 8, 12, 19, 31, 38, 41.&lt;br /&gt;
&lt;br /&gt;
==(14.05) Конкурентный анализ самоорганизующихся циклов==&lt;br /&gt;
[https://vk.com/doc12518218_390369758 Лекция]&lt;br /&gt;
&lt;br /&gt;
===Задание 18 (до 21.05)===&lt;br /&gt;
Все вычисления сопроводите подробными объяснениями о том, почему верно то или иное (не)равенство.&lt;br /&gt;
# Пусть имеется n-элементный список и m поисковых запросов к нему. После каждой операции поиска можно переупорядочить список. Обозначим стоимость последовательности поисков через C. Докажите, что в худшем случае C = Ω(mn).&lt;br /&gt;
#  Обозначим через c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; стоимость i-ого поискового запроса с применением эвристики перемещения в начало, которая включает стоимость поиска элемента в списке и стоимость его перемещения в начало списка путём ряда обменов соседних элементов списка. Покажите, что i-ая операция поиска находит элемент x в списке L с применением эвристики перемещения в начало, то c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = 2 * rank&amp;lt;sub&amp;gt;L&amp;lt;/sub&amp;gt;(x) - 1.&lt;br /&gt;
# Покажите, что c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = 2 * rank&amp;lt;sub&amp;gt;L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) - 1.&lt;br /&gt;
# Покажите, что c*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = rank&amp;lt;sub&amp;gt;L*&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) + t&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;.&lt;br /&gt;
# Докажите, что после одного обмена двух соседних элементов потенциал либо увеличивается на 2, либо уменьшается на 2.&lt;br /&gt;
# Докажите, что rank&amp;lt;sub&amp;gt;L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) = |A| + |B| + 1.&lt;br /&gt;
# Докажите, что rank&amp;lt;sub&amp;gt;L*&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) = |A| + |С| + 1.&lt;br /&gt;
# Покажите, что поиск i-ого элемента приводит к изменению потенциала Ф(L&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;) - Ф(L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;) &amp;lt;= 2 (|A| - |B| + t*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;), где t*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; --- это количество обменов при i-ом поиске.&lt;br /&gt;
# Во сколько раз стоимость С&amp;lt;sub&amp;gt;MFT&amp;lt;/sub&amp;gt;(S) превышает C&amp;lt;sub&amp;gt;OPT&amp;lt;/sub&amp;gt;(S)?&lt;/div&gt;</summary>
		<author><name>Kassalanche</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=12232</id>
		<title>Алгоритмы и структуры данных. Подгруппа 105-1</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=12232"/>
		<updated>2015-05-14T07:51:16Z</updated>

		<summary type="html">&lt;p&gt;Kassalanche: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==О курсе==&lt;br /&gt;
[[Алгоритмы_и_структуры_данных|План лекций и список рекомендуемой литературы.]]&lt;br /&gt;
&lt;br /&gt;
[[Алгоритмы_и_структуры_данных._Подгруппа_105-1._FAQ|FAQ.]]&lt;br /&gt;
&lt;br /&gt;
[[Reviewboard|Инструкция по использованию Reviewboard.]]&lt;br /&gt;
&lt;br /&gt;
[[Практические_занятия_по_курсу_ОиМП/C++_check|Style guide.]]&lt;br /&gt;
&lt;br /&gt;
==Итоговая оценка за курс==&lt;br /&gt;
Итоговая оценка (ИО) зависит от&lt;br /&gt;
* оценок за пять больших домашних заданий (БДЗ1, БДЗ2, ..., БДЗ5),&lt;br /&gt;
* оценок за домашние задания (ДЗ1, ДЗ2, ...),&lt;br /&gt;
* оценки за контрольную работу (КР),&lt;br /&gt;
* оценки за экзамен (ЭКЗ),&lt;br /&gt;
и может быть вычислена по формуле:&lt;br /&gt;
 ИО = 0.7 * (0.3 * КР + 0.7 *(ИДЗ1 + ИДЗ2 + ИДЗ3 + ИДЗ4 + ИДЗ5)/5) + 0.3 * ЭКЗ =&lt;br /&gt;
    = 0.21*КР + 0.98*ИДЗ1 + 0.98*ИДЗ2 + 0.98*ИДЗ3 + 0.98*ИДЗ4 + 0.98*ИДЗ5 + 0.3*ЭКЗ,&lt;br /&gt;
где&lt;br /&gt;
 ИДЗi = min (10, 0.7 * БДЗi + 0.4 * &amp;lt;cредняя оценка за ДЗj, прошедшие с предыдущего БДЗ по i-ое&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
==Порядок сдачи домашних работ==&lt;br /&gt;
===Большие домашние работы===&lt;br /&gt;
# Получить OK за задачу в контесте.&lt;br /&gt;
# Залить исходный код на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* На каждую задачу создавайте отдельный запрос на ревью. &lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении суток приходят замечания к коду. &#039;&#039;&#039;Если в течении суток замечаний или Ship It не появилось, проверьте, что вы правильно отправили запрос и, если всё сделано правильно, спросите у семинариста получил ли он запрос.&#039;&#039;&#039;&lt;br /&gt;
# Вы их исправляете, проверяете в контесте, что программа по-прежнему проходит все тесты, заливаете новую версию в Review Board. Штрафов за посылки НЕ будет.&lt;br /&gt;
# Процесс повторяется пока остаются замечания к коду или пока не истёк дедлайн. После закрытия контеста будут ещё одни сутки на доработку замечаний в Review Board.&lt;br /&gt;
# Оценивается только последняя версия работы в Review Board.&lt;br /&gt;
&lt;br /&gt;
===Маленькие домашние работы===&lt;br /&gt;
# Залить решение на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* Желаемые форматы: txt, py, cpp, h. Допускаются любые другие.&lt;br /&gt;
#* На каждую домашнюю работу создавайте отдельный запрос на ревью. Обязательно указывайте номер домашней работы.&lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении неопределенного промежутка времени придут оценки по каждому из заданий.&lt;br /&gt;
&lt;br /&gt;
==Оценивание домашних работ==&lt;br /&gt;
* Все задания предполагаются индивидуальными. Запрещены любые заимствования без ссылки на автора.&lt;br /&gt;
* Решения после установленного дедлайна не принимаются. Дедлайн указан в заголовке каждого задания.&lt;br /&gt;
* Везде, где требуется написать алгоритм, можно использовать любой язык программирования или псевдокод.&lt;br /&gt;
* Там, где требуется построить алгоритм с заданной асимптотикой, приведите обоснование, что полученный алгоритм удовлетворяет этому условию.&lt;br /&gt;
* Эти правила не действуют, если в задании явно оговорено иное.&lt;br /&gt;
&lt;br /&gt;
==Мотивация к изучению алгоритмов. Подсчёт числа операций (12.01)==&lt;br /&gt;
# Числа Фибоначчи. Определение. Примитивный рекурсивный алгоритм вычисления i-ого числа. Оценка числа операций. Анализ причин неэффективности. Алгоритм с запоминанием вычисленных ранее значений. Оценка числа операций. Сравнение с предыдущим. (подробнее: глава 0, страницы 8-10 из книги &amp;lt;&amp;lt;Алгоритмы&amp;gt;&amp;gt;, [[Алгоритмы_и_структуры_данных|см. список рекомендованной литературы]])&lt;br /&gt;
# Задача о ханойской башне. Постановка задачи. Рекурсивный алгоритм. Рекуррентная формула для числа перемещений. Замкнутая формула для числа перемещений (+ доказательство). Доказательство того, что эту задачу нельзя решить используя меньшее число перемещений дисков. ([https://www.dropbox.com/s/t8cbs7ttu4iasvj/algo-0-recursion.pdf?dl=0 Разбор задачи о ханойской башне], автор Сергей Объедков)&lt;br /&gt;
# Сортировка пузырьком. Алгоритм. Подсчёт количество операций сравнения и обмена (swap). Анализ наилучшего и наихудшего случаев ([https://ru.wikipedia.org/wiki/Сортировка_пузырьком Википедия])&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 1 (12.01 - 26.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
Во всех задачах, если не оговорено иного, предполагаем, что работаем с целыми неотрицательными числами. Для первых 7 задач необходимо&lt;br /&gt;
* описать что можно считать наилучшим и наихудшим случаями,&lt;br /&gt;
* для каждого из двух случаев подсчитать отдельно количество операций сравнения и swap (если есть).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Даны три числа, требуется вернуть наименьшее.&lt;br /&gt;
# Даны три числа, требуется отсортировать их.&lt;br /&gt;
# Дана последовательность A из n элементов и число x, требуется найти элемент равный x. Примечание: если таких значений i несколько, вернуть любое; если такого элемента нет, функция должна сообщить об этом.&lt;br /&gt;
# * Дана упорядоченная последовательность A из n элементов и число x, требуется найти такое i, что A[i] равно x. Алгоритм должен быть эффективней, чем в предыдущем пункте и использовать то, что последовательность упорядочена.&lt;br /&gt;
# Дана последовательность из 100 000 чисел от 0 до 100. Напишите эффективный алгоритм сортировки, который бы учитывал специфику входных данных.&lt;br /&gt;
# * Дано 32 битное неотрицательное число. Требуется номер первого ненулевого бит. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения, считая, что числа распределены равномерно.&lt;br /&gt;
# * Даны 32 битные неотрицательные числа m и n. Требуется вывести True, если m &amp;lt; n, иначе False. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения битов, считая, что числа распределены равномерно.&lt;br /&gt;
# Напишите рекурсивную функцию, вычисляющую n-ое число Фибоначчи (как на занятии). Подсчитайте количество рекурсивных вызовов.&lt;br /&gt;
# * Напишите функцию, вычисляющую n-ое число Фибоначчи, у которой число операций — полином от n, и которая использует количество памяти, независящее от n.&lt;br /&gt;
&lt;br /&gt;
==O-символика и стратегия &amp;quot;разделяй и властвуй&amp;quot; (15.01)==&lt;br /&gt;
# Сортировка слиянием. Алгоритм, рекуррентное соотношение для времени сортировки, сложность. Подробнее: [https://dl.dropboxusercontent.com/u/829163/draft.pdf §2.3 Сортировка слиянием (стр. 54)].&lt;br /&gt;
# О-символика. [https://dl.dropboxusercontent.com/u/829163/draft.pdf §0.3 О-символика (стр. 10)].&lt;br /&gt;
# Задача о слиянии m упорядоченных массивов по n элементов. Три алгоритма решения: последовательное слияние, слияние &amp;quot;деревом&amp;quot; (обе функции используют Merge из MergeSort), аналог Merge для m массивов. Анализ сложности каждого из них.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 2 (15.01-29.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
* Во всех задачах, если не оговорено иного, для простоты &#039;&#039;можно&#039;&#039; считать, что n является степенью какого-либо числа, например, степенью двойки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Дана функция F, определённая ниже. Сколько строк она напечатает? Указание: для обоих подпунктов рассмотрите два случая: 1. n является степенью двойки, 2. n не является степенью двойки.&lt;br /&gt;
## Запишите рекуррентное соотношение для числа строк.&lt;br /&gt;
## Решите уравнение, полученное в предыдущем пункте, то есть, выведите замкнутую (нерекуррентную формулу). Для простоты можно считать, что n является степенью двойки.&lt;br /&gt;
# В массиве A размера n записана возрастающая последовательность целых чисел. Постройте алгоритм типа &amp;quot;разделяй и властвуй&amp;quot;, который проверяет, существует ли такой индекс i, что A[i] = i&lt;br /&gt;
## за время O(n),&lt;br /&gt;
## * за время O(log n).&lt;br /&gt;
## Какие случаи для вашего алгоритма являются наихудшими и наилучшими? Какого время работы в лучшем и худшем случаях?&lt;br /&gt;
# Дан бесконечный массив A, первые n элементов которого содержат возрастающую последовательность положительных чисел, а дальше стоят -1. Значение n не дано. Постройте алгоритм, который получает на вход целое число x и находит это x в массиве --- или говорит, что там его нет, &lt;br /&gt;
## за время O(n),&lt;br /&gt;
## за время O(log n).&lt;br /&gt;
# Рассмотрим алгоритм вычисления наибольшего общего делителя (НОД) двух положительных чисел, основанный на методе &amp;quot;разделяй и властвуй&amp;quot;.&lt;br /&gt;
## (задание не оценивается) Прочитайте [https://dl.dropboxusercontent.com/u/829163/draft.pdf §1.2.3 Алгоритм Евклида (стр. 23)].&lt;br /&gt;
## * Докажите, что определение НОД-а, приведённое ниже, корректно.&lt;br /&gt;
## Постройте алгоритм, основанный на этом определении.&lt;br /&gt;
## Какой алгоритм будет быстрее для n-битовых чисел a и b при больших значениях n --- ваш или алгоритм Евклида?&lt;br /&gt;
# * Покажите как за время O(n log n) удалить из массива размера n все дубликаты, то есть оставить каждый элемент в одном экземпляре.&lt;br /&gt;
# * Даны два упорядоченных массива размера m и n. Постройте алгоритм, находящий k-й по величине элемент в объединении этих массивов за время O(log(n+m)). &lt;br /&gt;
&lt;br /&gt;
Функция F(n).&lt;br /&gt;
  если n &amp;gt; 1:&lt;br /&gt;
    напечатать &amp;quot;всё ещё работаю&amp;quot;&lt;br /&gt;
    F(n/2)&lt;br /&gt;
    F(n/2)&lt;br /&gt;
&lt;br /&gt;
Определение НОД-а.&lt;br /&gt;
             2НОД(a/2, b/2), если а и b чётны,&lt;br /&gt;
  НОД(a,b) = НОД(a, b/2), если а нечётно, b чётно,&lt;br /&gt;
             НОД((a-b)/2, b), если а и b нечётны.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;lt;nowiki&amp;gt;Задачи взяты из книги &amp;quot;Алгоритмы&amp;quot;, глава 2 (см. список рекомендованной литературы).&amp;lt;/nowiki&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Сложение и умножение (19.01)==&lt;br /&gt;
# Алгоритм сложения, его сложность (§1.1.1 Сложение*)&lt;br /&gt;
# &amp;quot;Школьный&amp;quot; алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Рекурсивный алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Алгоритм умножения, реализующий стратегию &amp;quot;разделяй и властвуй&amp;quot;, анализ сложности (§2.1 Умножение чисел*)&lt;br /&gt;
 * [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать.]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 3 (19.01 - 2.02)===&lt;br /&gt;
* Во всех задачах для простоты можно считать, что n является степенью какого-либо числа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Найдите произведение чисел 10011011 и 10111010 (в двоичной системе счисления), используя алгоритм умножения чисел, основанный на методе «разделяй и властвуй». Необходимо не только дать ответ, но и привести ход решения.&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 3 рекурсивных вызова для подзадач размера n-1 и комбинирует из них решение исходной задачи за О(n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте три верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 10 рекурсивных вызовов для подзадач размера n/2 и комбинирует из них решение исходной задачи за О(5n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте два верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Докажите, что 3m² + m = O(m²).&lt;br /&gt;
# Докажите, что lg m = O(m/1000), где lg m — это логарифм с двоичным основанием.&lt;br /&gt;
# Докажите, что из равенства f(n) = O(g(n)) не следует, что g(n) = O(f(n)).&lt;br /&gt;
# Докажите, что O(m) содержится в O(m²).&lt;br /&gt;
&lt;br /&gt;
==Решение рекуррентных уравнений (22.01)==&lt;br /&gt;
# Примеры решений рекуррентных уравнений (см. [https://www.dropbox.com/s/6a0r410zjm9qwe7/algo-3-recurrences.pdf?dl=0 конспект]).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 4 (до 14.02)===&lt;br /&gt;
* Нельзя использовать утверждение основной теоремы о решении рекуррентных соотношений.&lt;br /&gt;
* &#039;&#039;Можно&#039;&#039; использовать метод построения дерева рекурсии или подстановку (метод с угадыванием ответа).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Какой из трёх приведённых ниже алгоритмов вы бы предпочли? Обоснуйте свой ответ.&lt;br /&gt;
#* Алгоритм A, решая задачу, производит пять рекурсивных вызовов для подзадач вдвое меньшего размера, после чего строит ответ для исходной задачи за линейное время.&lt;br /&gt;
#* Алгоритм B, решая задачу размера n, делает два рекурсивных вызова для задач размера n − 1, после чего находит ответ за время O(1).&lt;br /&gt;
#* Алгоритм C, решая задачу размера n, рекурсивно решает девять задач размера n/3 и строит ответ за время O(n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Найдите T(n) в замкнутой форме для любых 7 из 10 приведённых ниже рекуррентных соотношений:&lt;br /&gt;
## T(n) ≤ 2T(n/3) + 1;&lt;br /&gt;
## T(n) ≤ 7T(n/7) + n;&lt;br /&gt;
## T(n) ≤ 9T(n/3) + n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 8T(n/2) + n&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 49T(n/25) + n&amp;lt;sup&amp;gt;3/2&amp;lt;/sup&amp;gt;log n;&lt;br /&gt;
## T(n) ≤ T(n − 1) + 2;&lt;br /&gt;
## T(n) ≤ T(n − 1) + n&amp;lt;sup&amp;gt;c&amp;lt;/sup&amp;gt;, где c ≥ 1 –– константа;&lt;br /&gt;
## T(n) ≤ T(n − 1) + c&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;, где c &amp;gt; 1 –– константа;&lt;br /&gt;
## T(n) ≤ 2T(n − 1) + 1;&lt;br /&gt;
## T(n) ≤ T(sqrt(n)) + 1.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №1==&lt;br /&gt;
Необходимо реализовать все 6 задач из [https://official.contest.yandex.ru/contest/1002 контеста]. Каждую задачу можно писать на С++ или Python. На выполнение работы отводится две недели. Каждая задача оценивается в 10/6 балла. Оценка &#039;&#039;может&#039;&#039; быть снижена за плохой код, но не более чем на 25%.&lt;br /&gt;
&lt;br /&gt;
==Бинарное дерево поиска (26.01)==&lt;br /&gt;
# Определение. Пример.&lt;br /&gt;
# Не модифицирующие алгоритмы: поиск (рекурсивный и итеративный алгоритмы), поиск минимума, inordered обход (вывод значений узлов в отсортированном порядке), поиск следующего по возрастанию.&lt;br /&gt;
# Модифицирующие алгоритмы: вставка (рекурсивная реализация), удаление (только идея).&lt;br /&gt;
 [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 13, стр. 248]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 5 (до 16.02)===&lt;br /&gt;
* Для получения максимальной оценки можно выполнить или все задачи без звёздочки, или задачу со звёздочкой. Преподаватель понимает, что реализацию БДП сложно не найти в интернете, но от копипасты не будет никакой пользы. Напротив, самостоятельная реализация очень полезна и приветствуется, даже если не получится выполнить всех пунктов задания.&lt;br /&gt;
* Задачи с двумя звёздочками необязательны.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Нарисуйте бинарные деревья поиска высотой 2, 3, 4, 5 и 6 для множества ключей {1, 4, 5, 10, 16, 17, 21}. Корень дерева имеет высоту 0.&lt;br /&gt;
# &#039;&#039;&#039;Сортировка с использованием БДП.&#039;&#039;&#039;&lt;br /&gt;
## Какова асимптотическая сложность алгоритма вставки элемента в дерево высоты d? Почему? Назовите наилучший и наиухдший случаи.&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который строит БДП в узлах которого стоят элементы данной последовательности. Можно использовать функцию Insert. Назовите наилучший и наихудший случаи. Есть теорема о том, что полученный алгоритм будет работать в среднем случае за время O(n * log n).&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который выводит их в порядке возрастания. Используйте бинарное дерево поиска. Какова в среднем случае сложность этого алгоритма? Назовите наилучший и наихудший случаи. Какова сложность в наихудшем случае?&lt;br /&gt;
# Напишите функцию GetRoot, которой на вход подаётся указатель на произвольный узел дерева, а она возвращает указатель на корень.&lt;br /&gt;
# Напишите процедуру PrintLeafs, которой на вход подаётся указатель на корень дерева, и она печатает листья дерева&lt;br /&gt;
## по возрастанию,&lt;br /&gt;
## по убыванию.&lt;br /&gt;
# ** Альтернативный обход в порядке возрастания бинарного дерева поиска с n узлами (или центрированный (inordered) обход) можно осуществить путём поиска минимального элемента дерева с помощью функции Minimum с последующий n-1 вызовом функции Next. Каково время работы такого алгоритма?&lt;br /&gt;
# * Реализуйте на С++ структуру данных бинарное дерево поиска, [https://yadi.sk/i/gi2SEStreFfSb используя заготовку].&lt;br /&gt;
## Нарисуйте бинарное дерево поиска, которое строится в функции getTreeExample.&lt;br /&gt;
## Реализуйте следующие алгоритмы: &lt;br /&gt;
### поиск минимума, &lt;br /&gt;
### inordered обход (вывод значений узлов в отсортированном порядке),&lt;br /&gt;
### поиск следующего по возрастанию,&lt;br /&gt;
### вставка элемента в дерево,&lt;br /&gt;
### сортировка последовательности с использованием БДП (дан вектор чисел, необходимо вывести их по возрастанию),&lt;br /&gt;
### ** удаление.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Карацубы, Штрассена. Быстрая сортировка (29.01)==&lt;br /&gt;
# Алгоритм Карацубы.&lt;br /&gt;
# Алгоритм Штрассена. [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать Дасгупту и др., §2.5 Умножение матриц]&lt;br /&gt;
# Быстрая сортировка и доказательство того, что в среднем случае она работает за О(n * log n). [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 8 Быстрая сортировка, стр. 148]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 6 (до 18.02)===&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Пусть мы хотим найти двоичное представление десятичного числа 10&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;. Будем считать, что n --- степень двойки (n = 2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt;).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Pwr2Bin(n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть 1010&lt;br /&gt;
    z = ...&lt;br /&gt;
    вернуть Multiply(z, z)&amp;lt;/source&amp;gt;&lt;br /&gt;
Multiply --- функция, перемножающая два n-битовых двоичных числа x и y по алгоритму Карацубы за O(n&amp;lt;sup&amp;gt;log&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;3&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Пусть мы хотим перевести произвольное десятичное число x в записи которого n=2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; чисел в двоичную систему счисления.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Dec2Bin(x, n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть binary[x]&lt;br /&gt;
    разделить x на два десятичных числа xl и xr из n/2 цифр.&lt;br /&gt;
    вернуть ...&amp;lt;/source&amp;gt;&lt;br /&gt;
Здесь binary --- это массив, содержащий двоичное представление десятичных цифр.&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Докажите, что математическое ожидание времени работы алгоритма быстрой сортировки (усреднение по всем вариантам выбора опорного элемента) на любом входе размера n удовлетворяет соотношению: T(n) ≤ O(n) + 1/n * &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt; (T(i-1) + T(n-i)).&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Найдите решение соотношения из предыдущего пункта.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Динамическое программирование (ДП). Первые примеры (02.01)==&lt;br /&gt;
# Нахождение самой длинной возрастающей подпоследовательности.&lt;br /&gt;
# Нахождение редакционного расстояния (или редакционной стоимости, расстояния Левенштейна).&lt;br /&gt;
# Нахождение представителя большинства.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 7 (до 20.02)===&lt;br /&gt;
* В этом задании везде, где требуется реализовать алгоритм, необходимо привести код на любом языке программирования.&lt;br /&gt;
* Для получения максимальной оценки нужно решить все задачи без звёздочек. Одна решённая задача со звёздочкой заменяет одну задачу без звёздочки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения редакционного расстояния (алгоритм Вагнера — Фишера). Например, редакционное расстояние между словами &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равно 6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения длины наибольшей общей подстроки. Например, длина наибольшей общей подстроки &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равна 8 (&amp;quot;antholog&amp;quot;). Чем больше это значение, тем схожей строки.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Предположим теперь, что сравниваемые строки состоят из символов A, С, G и T; за удаление или вставку мы платим -5; за замену буквы x на y платим w[x, y], где x, y принадлежат множеству {A, С, G, T}, a w — это матрица весов:&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
!-!! A!! G!! C!! T&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! A&lt;br /&gt;
|10||-1||-3||-4&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
!G&lt;br /&gt;
||-1||7||-5||-3&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! C&lt;br /&gt;
||-3||-5||9||0&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! T&lt;br /&gt;
||-4||-3||0||8&lt;br /&gt;
|}&lt;br /&gt;
Тогда выравнивание:&lt;br /&gt;
 AGACTAGTTAC&lt;br /&gt;
 CGA‒‒‒GACGT&lt;br /&gt;
будет иметь следующую оценку:&lt;br /&gt;
 w[A,C] + w[G,G] + w[A,A] + 3*(-5) + w[G,G] + w[T,A] + w[T,C] + w[A,G] + w[C,T] = -3 + 7 + 10 - 3*5 + 7 + (-4) + 0 + (-1) + 0 = 1.&lt;br /&gt;
&lt;br /&gt;
Напишите алгоритм, который находит максимальную стоимость всех возможных выравниваний. Верно ли, что чем больше это значение, тем непохожей строки?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как давно один народ отделился от другого? Кто похожей — итальянец и китаец или якут и эфиоп? На эти вопросы можно отвечать с разных точек зрения — культурной, исторической, лингвистической, ... В последние же годы человечество научилось секвенировать геном, что позволило исследовать этот вопрос с точки зрения генетики. Секвенирование генома — это процесс записи ДНК в виде нуклеотидной последовательности, которая представляет собой последовательность из четырёх символов — A, С, G и T. Существуют базы, которые хранят генетическую информацию о людях из разных стран и континентов, например, [http://www.mtdb.igp.uu.se/ http://www.mtdb.igp.uu.se/ → Download mtDNA sequences]. Чем больше сходство между геномами, тем сильнее родственные связи между их обладателями. Используя решение предыдущего пункта, выполните задания:&lt;br /&gt;
# Определите, кто похожей — итальянец и китаец или якут и эфиоп?&lt;br /&gt;
# Найдите нескольких похожих и нескольких непохожих народностей.&lt;br /&gt;
# * Выберите одну народность. Найдите самых похожих и самых непохожих на неё.&lt;br /&gt;
# * Найдите самые похожие и самые непохожие народности.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Задача о разрезании стержня (05.01)==&lt;br /&gt;
# Постановка задачи.&lt;br /&gt;
# Решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Решение с нахождением максимума по p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Восходящий алгоритм с запоминанием. Вывод длин кусочков стержня. Оценка сложности.&lt;br /&gt;
# Нисходящий алгоритм с запоминанием. Оценка сложности.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.1 Разрезание стержня, стр. 393]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 8 (до 22.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Решая задачу о разрезании стержня мы вначале построили рекурсивное решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt; для всех 1 ≤ i &amp;lt; n. Его сложность описывалась рекуррентной формулой T(n) = n + &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n-1&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt;(T(i) + T(n-i)), T(1) = 1.&lt;br /&gt;
# Объясните эту формулу.&lt;br /&gt;
# Покажите с помощью метода подстановок, что T(n) ≤ 2&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Покажите с помощью контрпримера, что описанная далее жадная стратегия не всегда определяет оптимальный способ разрезания стержня. Определим плотность стержня длиной i как p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;/i, то есть как стоимость единицы его длины. Жадная стратегия для стержня длиной n отрезает от стержня первую часть длиной i, где 1 ≤ i ≤ n, имеющую максимальную плотность. Затем та же жадная стратегия применяется к оставшейся части длиной n-i.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Рассмотрим модификацию задачи разрезания стержня, в которой в дополнение к цене p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; каждого стержня добавляется фиксированная цена разреза c. Теперь прибыль, связанная с решением, представляет собой сумму цен частей стержня минус стоимость разрезов. Разработайте алгоритм динамического программирования для этой модифицированной задачи.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Непрерывным участком называется группа подряд идущих элементов. Например, для последовательности&lt;br /&gt;
 5, 15, −30, 10, −5, 40, 10&lt;br /&gt;
элементы 15, −30, 10 образуют непрерывный участок, а 5, 15, 40 -- нет. Постройте линейный алгоритм для следующей задачи:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Вход: список чисел a1, a2, ... ‌, an.&lt;br /&gt;
Выход: непрерывный участок с максимальной суммой (сумма участка нулевой длины равна нулю).&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Для приведённого примера ответом будет 10, −5, 40, 10 с суммой 55. Какова сложность алгоритма? Почему?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Надо заплатить v рублей, имея купюры в x1, x2, ‌..., xn рублей (купюр каждого типа сколько угодно). Это не всегда возможно (скажем, купюрами в&lt;br /&gt;
10 и 25 рублей можно заплатить 45 рублей, но не 47 и не 15). Постройте основанный на методе динамического программирования алгоритм со временем работы O(nv), выясняющий, возможна ли уплата.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как решить предыдущую задачу, если каждая купюра имеется в единственном экземпляре? (Например, купюрами в 1, 5, 10, 20 рублей можно заплатить 16 = 1 + 5 + 10 и 31 = 1 + 10 + 20 рублей, но не 40 (не хватит денег). Время работы алгоритма по-прежнему O(nv).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Ещё один вариант той же задачи: купюр каждого типа сколько угодно, но всего разрешается использовать не более k купюр. (Например, если есть купюры в 5 и 10 рублей, а k = 6, то 55 разменять можно, а 65 –– нет).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Перемножение цепочки матриц. Оптимальное бинарное дерево поиска (начало) (09.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о перемножении цепочки матриц. Постановка задачи.Пример. Нисходящий алгоритм.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.2 Перемножение цепочки матриц, стр. 403]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 9 (до 24.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Найдите оптимальную расстановку скобок в произведении последовательности матриц, размерности которых равны 5×10, 10×3, 3×12, 12×5, 5×50, 50×6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Напишите восходящий алгоритм для поиска оптимальной расстановки скобок.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Расстановка пробелов. Оптимальное бинарное дерево поиска (середина) (12.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о расстановке пробелов. Постановка задачи. Решения для трёх случаев: 1. нужно вернуть можно ли разбить текст на слова; 2. вернуть разбивку на слова; 3. слова встречаются не равновероятно, вернуть наиболее вероятную разбивку на слова.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи. Вывод математического ожидания времени поиска.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Праздничное домашнее задание 10 (до 02.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[&amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;,&amp;quot;, &amp;quot;.&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;,&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;.&amp;quot;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Подсказка:&#039;&#039;&#039; разбейте текст на слова из списка и посмотрите на азбуку Морзе.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Способы представления графов в памяти (16.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Разбор ошибок в домашнем задании.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Графы. Способы представления графов в памяти (матрица смежности, список рёбер, список соседей (список смежностей), матрица инцидентности). Зависимость сложности алгоритмов от способа представления.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §22.1 Представление графов, стр. 626]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 11 (до 02.03)===&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача A.]&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача B.]&lt;br /&gt;
# Нарисуйте неориентированный граф с 5 вершинами и 8 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Нарисуйте ориентированный граф с 4 вершинами и 3 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Дан ориентированный граф. &#039;&#039;Исходящая степень вершины v&#039;&#039; --- это количество исходящих из неё рёбер, &#039;&#039;входящая степень v&#039;&#039; --- это количество рёбер входящих в  v. Имеется представление ориентированного графа с использование списка соседей. Как долго будут вычисляться исходящие степени всех вершин графа? А входящие степени?&lt;br /&gt;
# Дан граф G = (V, E). Какие из рассмотренных способов хранения графов используют меньше всего памяти для хранения G и почему? Указание: рассмотрите случаи |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;lt; |E| и |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;gt; |E|.&lt;br /&gt;
# Пусть C --- это матрица смежности графа G.&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
# Пусть B --- это матрица инцидентности ориентированного графа G. Как связаны элементы матрицы BB&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
&lt;br /&gt;
==Реализация поиска в глубину (19.02)==&lt;br /&gt;
# Реализация поиска в глубину и смежных задач.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 12 (до 5.03)===&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Выберите любой способ хранения графа. Реализуйте поиск в глубину.&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Напишите алгоритм, который возвращает данные о том, какие вершины лежат в одной компоненте связности.&lt;br /&gt;
# &#039;&#039;(любой ЯП или псевдокод)&#039;&#039; Напишите алгоритм проверки сильной связности ориентированного графа. Какова его сложность?&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №2==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
Необходимо реализовать 3 задачи из [https://official.contest.yandex.ru/contest/1085 контеста], см. [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing распределение задач]. Каждую задачу можно написать на С++ или Python. На выполнение работы отводится две недели (см. время окончания контеста). [https://official.contest.yandex.ru/contest/1123 Дорешивание.]&lt;br /&gt;
&lt;br /&gt;
==ДП и графы (26.02)==&lt;br /&gt;
==ДП и графы (02.03)==&lt;br /&gt;
==Жадные алгоритмы (12.03)==&lt;br /&gt;
===Домашнее задание 13 (до 23.03)===&lt;br /&gt;
# Вася хочет купить по одной акции каждой компании. Все акции стоят одинаково, но дорожают по-разному. Каждый месяц акция i-ой компании дорожает в r_i раз. В один месяц можно купить только одну акцию.&lt;br /&gt;
## Напишите алгоритм, который выводит оптимальную последовательность покупок (такую, что на покупку всех акций потратится меньше денег).&lt;br /&gt;
## Докажите корректность алгоритма, то есть докажите, что последовательность покупок, которую выводит ваш алгоритм, оптимальна.&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список, очередь (16.03)==&lt;br /&gt;
# Реализация линейного двусвязного списка (С++).&lt;br /&gt;
# Реализация очереди ограниченной длины на базе вектора (С++).&lt;br /&gt;
# Реализация очереди на базе списка (С++).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14 (до 23.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте (на С++) структуру данных Стек. У стека должно быть три операции:&lt;br /&gt;
* push --- положить элемент на вершину стека;&lt;br /&gt;
* pop --- удалить верхний элемент;&lt;br /&gt;
* front --- вернуть значение верхнего элемента.&lt;br /&gt;
Оцените время работы каждой функции.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список (19.03)==&lt;br /&gt;
===Домашнее задание 13* (до 30.03)===&lt;br /&gt;
#Для приведённой реализации класса List (https://yadi.sk/i/c5r_79WdfMyNS).&lt;br /&gt;
## Допишите print, push_back и push_front.&lt;br /&gt;
## В функции insert_after и delete_node вставьте необходимые проверки так, чтобы они работали для крайних случаев.&lt;br /&gt;
## Напишите main в котором&lt;br /&gt;
### создаётся объект класса List, &lt;br /&gt;
### заполняется элементами с помощью функций push_back, push_front и insert_after и&lt;br /&gt;
### удаляется i-ый элемент.&lt;br /&gt;
&lt;br /&gt;
==Повторение (30.03)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Для данных пар функций выясните их связь в терминах O-, o-, Ω-, ω-, Θ-обозначений. Поставьте галочку в клетке с Ω, если f(x) = Ω(g(x)) и прочерк, если равенства нет. [https://ru.wikipedia.org/wiki/«O»_большое_и_«o»_малое#.D0.94.D1.80.D1.83.D0.B3.D0.B8.D0.B5_.D0.BF.D0.BE.D0.B4.D0.BE.D0.B1.D0.BD.D1.8B.D0.B5_.D0.BE.D0.B1.D0.BE.D0.B7.D0.BD.D0.B0.D1.87.D0.B5.D0.BD.D0.B8.D1.8F Википедия]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! f(x)!! g(x)!! O!! o!! Ω!! ω!! Θ&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! 2^100&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n * log(n)&lt;br /&gt;
! 2^100 * n * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n&lt;br /&gt;
! 2^100 * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n!&lt;br /&gt;
! 2^(2015n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n*2^n&lt;br /&gt;
! 3^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 5^n&lt;br /&gt;
! 5^(n+1)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n + n^2 + n^3 + ... + n^1000&lt;br /&gt;
! 7^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм Quickselect нахождения k-ого элемента по возрастанию: http://en.wikipedia.org/wiki/Quickselect&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;На улице стоит ряд домов. В каждом из домов лежит сколько-то денег. Вор хочет обокрасть дома на переулке. Он не может обокрасть два соседних дома, потому что хозяин дома, который он обокрал, сразу предупредит соседей. Нужно найти, какую максимальную сумму вор может украсть с переулка. На вход программы подается массив неотрицательных целых чисел - количество долларов в доме с номером i. Соседние дома в массиве представлены соседними элементами. Например, пусть задан массив { 1, 4, 5 } - тогда вор максимум может украсть $6, обокрав дома 1 и 3. Пусть задан массив { 1, 7, 2 } - тогда вор максимум может украсть $7, обокрав дом 2.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Алфавит из всех маленьких латинских букв и пробела закодирован числами следующим способом:&lt;br /&gt;
  &#039;a&#039; -&amp;gt; 1&lt;br /&gt;
  &#039;b&#039; -&amp;gt; 2&lt;br /&gt;
  &#039;c&#039; -&amp;gt; 3&lt;br /&gt;
  ...&lt;br /&gt;
  &#039;z&#039; -&amp;gt; 26&lt;br /&gt;
  &#039; &#039; -&amp;gt; 27&lt;br /&gt;
На вход программы подается строка из цифр. Нужно посчитать, сколькими способами можно раскодировать эту строку.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Дан граф, заданный матрицей смежности. Вывести пары вершин между которыми нет пути.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Повторение (02.04) ==&lt;br /&gt;
Решали и разбирали первые 4 задачи из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14* (до 11.03)===&lt;br /&gt;
Решите любые две задачи (подпункты НЕ считаются отдельными задачами) с предыдущей пары (Повторение (30.03)).&lt;br /&gt;
&lt;br /&gt;
== Повторение (06.04) ==&lt;br /&gt;
Будем решать вторую половину задач из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 15 (до 16.04)===&lt;br /&gt;
# Приведите пример графа, который содержит отрицательные рёбра, не содержит циклов отрицательного веса и для которого алгоритм Дейкстры возвращает неверный результат.&lt;br /&gt;
# Используется ли в алгоритме Дейкстры то, что веса рёбер неотрицательны? Если &amp;quot;да&amp;quot;, то где именно?&lt;br /&gt;
# Пусть граф содержит рёбра с весами &amp;gt;= -100. Если прибавить к каждому ребру 101 и при помощи алгоритма Дейкстры найти кратчайшие пути. Будут ли эти пути кратчайшими в исходном графе? Почему?&lt;br /&gt;
&lt;br /&gt;
== Повторение (07.04) ==&lt;br /&gt;
&#039;&#039;&#039;Решение рекуррентных соотношений&#039;&#039;&#039;&lt;br /&gt;
# Решите уравнение: T(n) = 4*T(n/2) + O(n^2) с базой T(1) = O(1)&lt;br /&gt;
## Используя основную теорему.&lt;br /&gt;
## Используя дерево рекурсий.&lt;br /&gt;
## Методом подстановки.&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2)) + n является \Theta(n lg n).&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2) + 17) + n является \Theta(n lg n).&lt;br /&gt;
# Решите уравнения, считая, что T(1) = O(1):&lt;br /&gt;
## T(n) = T(n-1) + n&lt;br /&gt;
## T(n) = 2*T(floor(sqrt(n))) + lg n. Указание: попробуйте использовать замену переменных.&lt;br /&gt;
## T(n) = 3*T(sqrt(n)) + lg n&lt;br /&gt;
# Дайте верхнюю и нижнюю оценки функции T(n). Постарайтесь, чтобы оценки были как можно более точные&lt;br /&gt;
## T(n) = 4T(n/3) + n*lg(n)&lt;br /&gt;
## T(n) = 3T(n/3) + n/lg(n)&lt;br /&gt;
## T(n) = 4T(n/2) + n^2*sqrt(n)&lt;br /&gt;
## T(n) = T(n/2) + T(n/4) + T(n/8) + n&lt;br /&gt;
## T(n) = T(n-1) + 1/n&lt;br /&gt;
## T(n) = T(n-2) + 1/lg(n)&lt;br /&gt;
## T(n) = sqrt(n) * T(sqrt(n)) + n&lt;br /&gt;
&#039;&#039;&#039;Анализ и построение алгоритмов&#039;&#039;&#039;&lt;br /&gt;
# Числа Фибоначчи F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; можно выразить через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, используя матрицу: https://yadi.sk/i/Pm_aNzHCforFU. &lt;br /&gt;
## Покажите как вычислить F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;.&lt;br /&gt;
## Как вычислить F&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;n+1&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;?&lt;br /&gt;
## Напишите алгоритм.&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
## Ускорьте его так, чтобы он работал за O(log n).&lt;br /&gt;
# Дана последовательность символов. Какое минимальное количество символов нужно удалить из неё, чтобы получить палиндром?&lt;br /&gt;
## Напишите алгоритм (на псевдокоде или на любом языке программирования).&lt;br /&gt;
## Оцените время работы алгоритма.&lt;br /&gt;
# Какую структуру данных вы бы использовали для реализации упорядоченного множества (http://neerc.ifmo.ru/wiki/index.php?title=Упорядоченное_множество)? Какая будет сложность каждой из операций над множеством?&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 16 (до 20.04)===&lt;br /&gt;
# Решите 6 задач из первой части и 6 из второй. (Укажите какие именно.) Каждый из подпунктов является отдельной задачей.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм и теорема Форда-Фалкерсона (16.04)==&lt;br /&gt;
# Базовые определения (пропускные способности, сток, исток и пр.). Пример. &lt;br /&gt;
# Ограничения на поток (сохранение и что меньше пропускных способностей).&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, пример работы&lt;br /&gt;
# Разрез, определение, пример.&lt;br /&gt;
# Утверждение: максимальный поток &amp;lt;= любого разреза.&lt;br /&gt;
# Теорема Форда-Фалкерсона (с доказательством).&lt;br /&gt;
# Пример на котором алгоритм Форда-Фалкерсонаработает работает очень долго при неудачном выборе путей.&lt;br /&gt;
# Сложность алгоритма Форда-Фалкерсона.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №3==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
В [https://official.contest.yandex.ru/contest/1196 домашнем задании] пять задач. Они разделены на два варианта, помеченные римскими цифрами I и II. Свой вариант нужно узнать [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing здесь на вкладке HW3]. Третья задача — общая для двух вариантов; ее решение необходимо снабдить доказательством корректности алгоритма. На выполнение задания дается примерно 2 недели (см. точное время окончания в контесте). Каждую задачу можно написать на С++ или Python.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Форда-Фалкерсона и Эдмондса-Карпа (20.04)==&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, напоминание: базовые определения, пример работы, пример на котором алгоритм работает долго, сложность.&lt;br /&gt;
# Алгоритм Эдмодса-Карпа. Доказательство асимптотики времени работы.&lt;br /&gt;
&lt;br /&gt;
==(23.04)==&lt;br /&gt;
&lt;br /&gt;
==(11.05) Красно-чёрные деревья==&lt;br /&gt;
[https://ru.wikipedia.org/wiki/Красно-чёрное_дерево Красно-чёрное дерево]&lt;br /&gt;
===Домашнее задание 17 (до 18.05)===&lt;br /&gt;
# Зачем нужны красно-чёрные деревья?&lt;br /&gt;
# Благодаря какому свойству и почему красно-чёрное дерево является сбалансированным?&lt;br /&gt;
# Нарисуйте полное бинарное дерево поиска высотой 3 с ключами {1, 2, ..., 15}. Сделайте из него красно-чёрные деревья высотой 2, 3 и 4.&lt;br /&gt;
# Нарисуйте красно-чёрные деревья, получающиеся последовательной вставкой элементов 12, 10, 29, 30, 31, 32 в [https://ru.wikipedia.org/wiki/Красно-чёрное_дерево#/media/File:Red-black_tree_example.svg данное дерево]. Для вставки используйте алгоритм вставки из Википедии. Укажите какой именно функцией вы воспользовались.&lt;br /&gt;
# Определим &#039;&#039;&#039;ослабленное красно-чёрное дерево&#039;&#039;&#039; как бинарное дерево поиска, которое удовлетворяет красно-чёрным свойствам 1, 3, 4 и 5. Другими словами, корень может быть как чёрным, так и красным. Рассмотрите ослабленное красно-чёрное дерево T, корень которого красный. Если перекрасить корень дерева T в чёрный, будет ли оно красно-чёрным деревом?&lt;br /&gt;
# Покажите, что самый длинный простой нисходящий путь от вершины x к листу красно-черного дерева имеет длину, не более чем в два раза превышающую кратчайший путь от x к листу-потомку.&lt;br /&gt;
# Чему равно наибольшее возможное количество внутренних узлов в красно-чёрном дереве с чёрной высоты k? А наименьшее возможное количество?&lt;br /&gt;
# Нарисуйте красно-чёрные деревья, получающиеся последовательной вставкой ключей 41, 38, 31, 12, 19, 8 в изначально пустое дерево.&lt;br /&gt;
# Покажите какие деревья будут получаться в результате последовательного удаления ключей в порядке 8, 12, 19, 31, 38, 41.&lt;br /&gt;
&lt;br /&gt;
==(14.05) Конкурентный анализ самоорганизующихся циклов==&lt;br /&gt;
[https://vk.com/doc12518218_390369758 Конспект лекций]&lt;br /&gt;
&lt;br /&gt;
===Задание 18 (до 21.05)===&lt;br /&gt;
Все вычисления сопроводите подробными объяснениями о том, почему верно то или иное (не)равенство.&lt;br /&gt;
# Пусть имеется n-элементный список и m поисковых запросов к нему. После каждой операции поиска можно переупорядочить список. Обозначим стоимость последовательности поисков через C. Докажите, что в худшем случае C = Ω(mn).&lt;br /&gt;
#  Обозначим через c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; стоимость i-ого поискового запроса с применением эвристики перемещения в начало, которая включает стоимость поиска элемента в списке и стоимость его перемещения в начало списка путём ряда обменов соседних элементов списка. Покажите, что i-ая операция поиска находит элемент x в списке L с применением эвристики перемещения в начало, то c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = 2 * rank&amp;lt;sub&amp;gt;L&amp;lt;/sub&amp;gt;(x) - 1.&lt;br /&gt;
# Покажите, что c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = 2 * rank&amp;lt;sub&amp;gt;L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) - 1.&lt;br /&gt;
# Покажите, что c*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = rank&amp;lt;sub&amp;gt;L*&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) + t&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;.&lt;br /&gt;
# Докажите, что после одного обмена двух соседних элементов потенциал либо увеличивается на 2, либо уменьшается на 2.&lt;br /&gt;
# Докажите, что rank&amp;lt;sub&amp;gt;L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) = |A| + |B| + 1.&lt;br /&gt;
# Докажите, что rank&amp;lt;sub&amp;gt;L*&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) = |A| + |С| + 1.&lt;br /&gt;
# Покажите, что поиск i-ого элемента приводит к изменению потенциала Ф(L&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;) - Ф(L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;) &amp;lt;= 2 (|A| - |B| + t*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;), где t*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; --- это количество обменов при i-ом поиске.&lt;br /&gt;
# Во сколько раз стоимость С&amp;lt;sub&amp;gt;MFT&amp;lt;/sub&amp;gt;(S) превышает C&amp;lt;sub&amp;gt;OPT&amp;lt;/sub&amp;gt;(S)?&lt;/div&gt;</summary>
		<author><name>Kassalanche</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=12228</id>
		<title>Алгоритмы и структуры данных. Подгруппа 105-1</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=12228"/>
		<updated>2015-05-14T07:41:33Z</updated>

		<summary type="html">&lt;p&gt;Kassalanche: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==О курсе==&lt;br /&gt;
[[Алгоритмы_и_структуры_данных|План лекций и список рекомендуемой литературы.]]&lt;br /&gt;
&lt;br /&gt;
[[Алгоритмы_и_структуры_данных._Подгруппа_105-1._FAQ|FAQ.]]&lt;br /&gt;
&lt;br /&gt;
[[Reviewboard|Инструкция по использованию Reviewboard.]]&lt;br /&gt;
&lt;br /&gt;
[[Практические_занятия_по_курсу_ОиМП/C++_check|Style guide.]]&lt;br /&gt;
&lt;br /&gt;
==Итоговая оценка за курс==&lt;br /&gt;
Итоговая оценка (ИО) зависит от&lt;br /&gt;
* оценок за пять больших домашних заданий (БДЗ1, БДЗ2, ..., БДЗ5),&lt;br /&gt;
* оценок за домашние задания (ДЗ1, ДЗ2, ...),&lt;br /&gt;
* оценки за контрольную работу (КР),&lt;br /&gt;
* оценки за экзамен (ЭКЗ),&lt;br /&gt;
и может быть вычислена по формуле:&lt;br /&gt;
 ИО = 0.7 * (0.3 * КР + 0.7 *(ИДЗ1 + ИДЗ2 + ИДЗ3 + ИДЗ4 + ИДЗ5)/5) + 0.3 * ЭКЗ =&lt;br /&gt;
    = 0.21*КР + 0.98*ИДЗ1 + 0.98*ИДЗ2 + 0.98*ИДЗ3 + 0.98*ИДЗ4 + 0.98*ИДЗ5 + 0.3*ЭКЗ,&lt;br /&gt;
где&lt;br /&gt;
 ИДЗi = min (10, 0.7 * БДЗi + 0.4 * &amp;lt;cредняя оценка за ДЗj, прошедшие с предыдущего БДЗ по i-ое&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
==Порядок сдачи домашних работ==&lt;br /&gt;
===Большие домашние работы===&lt;br /&gt;
# Получить OK за задачу в контесте.&lt;br /&gt;
# Залить исходный код на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* На каждую задачу создавайте отдельный запрос на ревью. &lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении суток приходят замечания к коду. &#039;&#039;&#039;Если в течении суток замечаний или Ship It не появилось, проверьте, что вы правильно отправили запрос и, если всё сделано правильно, спросите у семинариста получил ли он запрос.&#039;&#039;&#039;&lt;br /&gt;
# Вы их исправляете, проверяете в контесте, что программа по-прежнему проходит все тесты, заливаете новую версию в Review Board. Штрафов за посылки НЕ будет.&lt;br /&gt;
# Процесс повторяется пока остаются замечания к коду или пока не истёк дедлайн. После закрытия контеста будут ещё одни сутки на доработку замечаний в Review Board.&lt;br /&gt;
# Оценивается только последняя версия работы в Review Board.&lt;br /&gt;
&lt;br /&gt;
===Маленькие домашние работы===&lt;br /&gt;
# Залить решение на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* Желаемые форматы: txt, py, cpp, h. Допускаются любые другие.&lt;br /&gt;
#* На каждую домашнюю работу создавайте отдельный запрос на ревью. Обязательно указывайте номер домашней работы.&lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении неопределенного промежутка времени придут оценки по каждому из заданий.&lt;br /&gt;
&lt;br /&gt;
==Оценивание домашних работ==&lt;br /&gt;
* Все задания предполагаются индивидуальными. Запрещены любые заимствования без ссылки на автора.&lt;br /&gt;
* Решения после установленного дедлайна не принимаются. Дедлайн указан в заголовке каждого задания.&lt;br /&gt;
* Везде, где требуется написать алгоритм, можно использовать любой язык программирования или псевдокод.&lt;br /&gt;
* Там, где требуется построить алгоритм с заданной асимптотикой, приведите обоснование, что полученный алгоритм удовлетворяет этому условию.&lt;br /&gt;
* Эти правила не действуют, если в задании явно оговорено иное.&lt;br /&gt;
&lt;br /&gt;
==Мотивация к изучению алгоритмов. Подсчёт числа операций (12.01)==&lt;br /&gt;
# Числа Фибоначчи. Определение. Примитивный рекурсивный алгоритм вычисления i-ого числа. Оценка числа операций. Анализ причин неэффективности. Алгоритм с запоминанием вычисленных ранее значений. Оценка числа операций. Сравнение с предыдущим. (подробнее: глава 0, страницы 8-10 из книги &amp;lt;&amp;lt;Алгоритмы&amp;gt;&amp;gt;, [[Алгоритмы_и_структуры_данных|см. список рекомендованной литературы]])&lt;br /&gt;
# Задача о ханойской башне. Постановка задачи. Рекурсивный алгоритм. Рекуррентная формула для числа перемещений. Замкнутая формула для числа перемещений (+ доказательство). Доказательство того, что эту задачу нельзя решить используя меньшее число перемещений дисков. ([https://www.dropbox.com/s/t8cbs7ttu4iasvj/algo-0-recursion.pdf?dl=0 Разбор задачи о ханойской башне], автор Сергей Объедков)&lt;br /&gt;
# Сортировка пузырьком. Алгоритм. Подсчёт количество операций сравнения и обмена (swap). Анализ наилучшего и наихудшего случаев ([https://ru.wikipedia.org/wiki/Сортировка_пузырьком Википедия])&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 1 (12.01 - 26.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
Во всех задачах, если не оговорено иного, предполагаем, что работаем с целыми неотрицательными числами. Для первых 7 задач необходимо&lt;br /&gt;
* описать что можно считать наилучшим и наихудшим случаями,&lt;br /&gt;
* для каждого из двух случаев подсчитать отдельно количество операций сравнения и swap (если есть).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Даны три числа, требуется вернуть наименьшее.&lt;br /&gt;
# Даны три числа, требуется отсортировать их.&lt;br /&gt;
# Дана последовательность A из n элементов и число x, требуется найти элемент равный x. Примечание: если таких значений i несколько, вернуть любое; если такого элемента нет, функция должна сообщить об этом.&lt;br /&gt;
# * Дана упорядоченная последовательность A из n элементов и число x, требуется найти такое i, что A[i] равно x. Алгоритм должен быть эффективней, чем в предыдущем пункте и использовать то, что последовательность упорядочена.&lt;br /&gt;
# Дана последовательность из 100 000 чисел от 0 до 100. Напишите эффективный алгоритм сортировки, который бы учитывал специфику входных данных.&lt;br /&gt;
# * Дано 32 битное неотрицательное число. Требуется номер первого ненулевого бит. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения, считая, что числа распределены равномерно.&lt;br /&gt;
# * Даны 32 битные неотрицательные числа m и n. Требуется вывести True, если m &amp;lt; n, иначе False. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения битов, считая, что числа распределены равномерно.&lt;br /&gt;
# Напишите рекурсивную функцию, вычисляющую n-ое число Фибоначчи (как на занятии). Подсчитайте количество рекурсивных вызовов.&lt;br /&gt;
# * Напишите функцию, вычисляющую n-ое число Фибоначчи, у которой число операций — полином от n, и которая использует количество памяти, независящее от n.&lt;br /&gt;
&lt;br /&gt;
==O-символика и стратегия &amp;quot;разделяй и властвуй&amp;quot; (15.01)==&lt;br /&gt;
# Сортировка слиянием. Алгоритм, рекуррентное соотношение для времени сортировки, сложность. Подробнее: [https://dl.dropboxusercontent.com/u/829163/draft.pdf §2.3 Сортировка слиянием (стр. 54)].&lt;br /&gt;
# О-символика. [https://dl.dropboxusercontent.com/u/829163/draft.pdf §0.3 О-символика (стр. 10)].&lt;br /&gt;
# Задача о слиянии m упорядоченных массивов по n элементов. Три алгоритма решения: последовательное слияние, слияние &amp;quot;деревом&amp;quot; (обе функции используют Merge из MergeSort), аналог Merge для m массивов. Анализ сложности каждого из них.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 2 (15.01-29.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
* Во всех задачах, если не оговорено иного, для простоты &#039;&#039;можно&#039;&#039; считать, что n является степенью какого-либо числа, например, степенью двойки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Дана функция F, определённая ниже. Сколько строк она напечатает? Указание: для обоих подпунктов рассмотрите два случая: 1. n является степенью двойки, 2. n не является степенью двойки.&lt;br /&gt;
## Запишите рекуррентное соотношение для числа строк.&lt;br /&gt;
## Решите уравнение, полученное в предыдущем пункте, то есть, выведите замкнутую (нерекуррентную формулу). Для простоты можно считать, что n является степенью двойки.&lt;br /&gt;
# В массиве A размера n записана возрастающая последовательность целых чисел. Постройте алгоритм типа &amp;quot;разделяй и властвуй&amp;quot;, который проверяет, существует ли такой индекс i, что A[i] = i&lt;br /&gt;
## за время O(n),&lt;br /&gt;
## * за время O(log n).&lt;br /&gt;
## Какие случаи для вашего алгоритма являются наихудшими и наилучшими? Какого время работы в лучшем и худшем случаях?&lt;br /&gt;
# Дан бесконечный массив A, первые n элементов которого содержат возрастающую последовательность положительных чисел, а дальше стоят -1. Значение n не дано. Постройте алгоритм, который получает на вход целое число x и находит это x в массиве --- или говорит, что там его нет, &lt;br /&gt;
## за время O(n),&lt;br /&gt;
## за время O(log n).&lt;br /&gt;
# Рассмотрим алгоритм вычисления наибольшего общего делителя (НОД) двух положительных чисел, основанный на методе &amp;quot;разделяй и властвуй&amp;quot;.&lt;br /&gt;
## (задание не оценивается) Прочитайте [https://dl.dropboxusercontent.com/u/829163/draft.pdf §1.2.3 Алгоритм Евклида (стр. 23)].&lt;br /&gt;
## * Докажите, что определение НОД-а, приведённое ниже, корректно.&lt;br /&gt;
## Постройте алгоритм, основанный на этом определении.&lt;br /&gt;
## Какой алгоритм будет быстрее для n-битовых чисел a и b при больших значениях n --- ваш или алгоритм Евклида?&lt;br /&gt;
# * Покажите как за время O(n log n) удалить из массива размера n все дубликаты, то есть оставить каждый элемент в одном экземпляре.&lt;br /&gt;
# * Даны два упорядоченных массива размера m и n. Постройте алгоритм, находящий k-й по величине элемент в объединении этих массивов за время O(log(n+m)). &lt;br /&gt;
&lt;br /&gt;
Функция F(n).&lt;br /&gt;
  если n &amp;gt; 1:&lt;br /&gt;
    напечатать &amp;quot;всё ещё работаю&amp;quot;&lt;br /&gt;
    F(n/2)&lt;br /&gt;
    F(n/2)&lt;br /&gt;
&lt;br /&gt;
Определение НОД-а.&lt;br /&gt;
             2НОД(a/2, b/2), если а и b чётны,&lt;br /&gt;
  НОД(a,b) = НОД(a, b/2), если а нечётно, b чётно,&lt;br /&gt;
             НОД((a-b)/2, b), если а и b нечётны.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;lt;nowiki&amp;gt;Задачи взяты из книги &amp;quot;Алгоритмы&amp;quot;, глава 2 (см. список рекомендованной литературы).&amp;lt;/nowiki&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Сложение и умножение (19.01)==&lt;br /&gt;
# Алгоритм сложения, его сложность (§1.1.1 Сложение*)&lt;br /&gt;
# &amp;quot;Школьный&amp;quot; алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Рекурсивный алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Алгоритм умножения, реализующий стратегию &amp;quot;разделяй и властвуй&amp;quot;, анализ сложности (§2.1 Умножение чисел*)&lt;br /&gt;
 * [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать.]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 3 (19.01 - 2.02)===&lt;br /&gt;
* Во всех задачах для простоты можно считать, что n является степенью какого-либо числа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Найдите произведение чисел 10011011 и 10111010 (в двоичной системе счисления), используя алгоритм умножения чисел, основанный на методе «разделяй и властвуй». Необходимо не только дать ответ, но и привести ход решения.&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 3 рекурсивных вызова для подзадач размера n-1 и комбинирует из них решение исходной задачи за О(n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте три верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 10 рекурсивных вызовов для подзадач размера n/2 и комбинирует из них решение исходной задачи за О(5n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте два верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Докажите, что 3m² + m = O(m²).&lt;br /&gt;
# Докажите, что lg m = O(m/1000), где lg m — это логарифм с двоичным основанием.&lt;br /&gt;
# Докажите, что из равенства f(n) = O(g(n)) не следует, что g(n) = O(f(n)).&lt;br /&gt;
# Докажите, что O(m) содержится в O(m²).&lt;br /&gt;
&lt;br /&gt;
==Решение рекуррентных уравнений (22.01)==&lt;br /&gt;
# Примеры решений рекуррентных уравнений (см. [https://www.dropbox.com/s/6a0r410zjm9qwe7/algo-3-recurrences.pdf?dl=0 конспект]).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 4 (до 14.02)===&lt;br /&gt;
* Нельзя использовать утверждение основной теоремы о решении рекуррентных соотношений.&lt;br /&gt;
* &#039;&#039;Можно&#039;&#039; использовать метод построения дерева рекурсии или подстановку (метод с угадыванием ответа).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Какой из трёх приведённых ниже алгоритмов вы бы предпочли? Обоснуйте свой ответ.&lt;br /&gt;
#* Алгоритм A, решая задачу, производит пять рекурсивных вызовов для подзадач вдвое меньшего размера, после чего строит ответ для исходной задачи за линейное время.&lt;br /&gt;
#* Алгоритм B, решая задачу размера n, делает два рекурсивных вызова для задач размера n − 1, после чего находит ответ за время O(1).&lt;br /&gt;
#* Алгоритм C, решая задачу размера n, рекурсивно решает девять задач размера n/3 и строит ответ за время O(n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Найдите T(n) в замкнутой форме для любых 7 из 10 приведённых ниже рекуррентных соотношений:&lt;br /&gt;
## T(n) ≤ 2T(n/3) + 1;&lt;br /&gt;
## T(n) ≤ 7T(n/7) + n;&lt;br /&gt;
## T(n) ≤ 9T(n/3) + n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 8T(n/2) + n&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 49T(n/25) + n&amp;lt;sup&amp;gt;3/2&amp;lt;/sup&amp;gt;log n;&lt;br /&gt;
## T(n) ≤ T(n − 1) + 2;&lt;br /&gt;
## T(n) ≤ T(n − 1) + n&amp;lt;sup&amp;gt;c&amp;lt;/sup&amp;gt;, где c ≥ 1 –– константа;&lt;br /&gt;
## T(n) ≤ T(n − 1) + c&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;, где c &amp;gt; 1 –– константа;&lt;br /&gt;
## T(n) ≤ 2T(n − 1) + 1;&lt;br /&gt;
## T(n) ≤ T(sqrt(n)) + 1.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №1==&lt;br /&gt;
Необходимо реализовать все 6 задач из [https://official.contest.yandex.ru/contest/1002 контеста]. Каждую задачу можно писать на С++ или Python. На выполнение работы отводится две недели. Каждая задача оценивается в 10/6 балла. Оценка &#039;&#039;может&#039;&#039; быть снижена за плохой код, но не более чем на 25%.&lt;br /&gt;
&lt;br /&gt;
==Бинарное дерево поиска (26.01)==&lt;br /&gt;
# Определение. Пример.&lt;br /&gt;
# Не модифицирующие алгоритмы: поиск (рекурсивный и итеративный алгоритмы), поиск минимума, inordered обход (вывод значений узлов в отсортированном порядке), поиск следующего по возрастанию.&lt;br /&gt;
# Модифицирующие алгоритмы: вставка (рекурсивная реализация), удаление (только идея).&lt;br /&gt;
 [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 13, стр. 248]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 5 (до 16.02)===&lt;br /&gt;
* Для получения максимальной оценки можно выполнить или все задачи без звёздочки, или задачу со звёздочкой. Преподаватель понимает, что реализацию БДП сложно не найти в интернете, но от копипасты не будет никакой пользы. Напротив, самостоятельная реализация очень полезна и приветствуется, даже если не получится выполнить всех пунктов задания.&lt;br /&gt;
* Задачи с двумя звёздочками необязательны.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Нарисуйте бинарные деревья поиска высотой 2, 3, 4, 5 и 6 для множества ключей {1, 4, 5, 10, 16, 17, 21}. Корень дерева имеет высоту 0.&lt;br /&gt;
# &#039;&#039;&#039;Сортировка с использованием БДП.&#039;&#039;&#039;&lt;br /&gt;
## Какова асимптотическая сложность алгоритма вставки элемента в дерево высоты d? Почему? Назовите наилучший и наиухдший случаи.&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который строит БДП в узлах которого стоят элементы данной последовательности. Можно использовать функцию Insert. Назовите наилучший и наихудший случаи. Есть теорема о том, что полученный алгоритм будет работать в среднем случае за время O(n * log n).&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который выводит их в порядке возрастания. Используйте бинарное дерево поиска. Какова в среднем случае сложность этого алгоритма? Назовите наилучший и наихудший случаи. Какова сложность в наихудшем случае?&lt;br /&gt;
# Напишите функцию GetRoot, которой на вход подаётся указатель на произвольный узел дерева, а она возвращает указатель на корень.&lt;br /&gt;
# Напишите процедуру PrintLeafs, которой на вход подаётся указатель на корень дерева, и она печатает листья дерева&lt;br /&gt;
## по возрастанию,&lt;br /&gt;
## по убыванию.&lt;br /&gt;
# ** Альтернативный обход в порядке возрастания бинарного дерева поиска с n узлами (или центрированный (inordered) обход) можно осуществить путём поиска минимального элемента дерева с помощью функции Minimum с последующий n-1 вызовом функции Next. Каково время работы такого алгоритма?&lt;br /&gt;
# * Реализуйте на С++ структуру данных бинарное дерево поиска, [https://yadi.sk/i/gi2SEStreFfSb используя заготовку].&lt;br /&gt;
## Нарисуйте бинарное дерево поиска, которое строится в функции getTreeExample.&lt;br /&gt;
## Реализуйте следующие алгоритмы: &lt;br /&gt;
### поиск минимума, &lt;br /&gt;
### inordered обход (вывод значений узлов в отсортированном порядке),&lt;br /&gt;
### поиск следующего по возрастанию,&lt;br /&gt;
### вставка элемента в дерево,&lt;br /&gt;
### сортировка последовательности с использованием БДП (дан вектор чисел, необходимо вывести их по возрастанию),&lt;br /&gt;
### ** удаление.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Карацубы, Штрассена. Быстрая сортировка (29.01)==&lt;br /&gt;
# Алгоритм Карацубы.&lt;br /&gt;
# Алгоритм Штрассена. [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать Дасгупту и др., §2.5 Умножение матриц]&lt;br /&gt;
# Быстрая сортировка и доказательство того, что в среднем случае она работает за О(n * log n). [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 8 Быстрая сортировка, стр. 148]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 6 (до 18.02)===&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Пусть мы хотим найти двоичное представление десятичного числа 10&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;. Будем считать, что n --- степень двойки (n = 2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt;).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Pwr2Bin(n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть 1010&lt;br /&gt;
    z = ...&lt;br /&gt;
    вернуть Multiply(z, z)&amp;lt;/source&amp;gt;&lt;br /&gt;
Multiply --- функция, перемножающая два n-битовых двоичных числа x и y по алгоритму Карацубы за O(n&amp;lt;sup&amp;gt;log&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;3&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Пусть мы хотим перевести произвольное десятичное число x в записи которого n=2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; чисел в двоичную систему счисления.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Dec2Bin(x, n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть binary[x]&lt;br /&gt;
    разделить x на два десятичных числа xl и xr из n/2 цифр.&lt;br /&gt;
    вернуть ...&amp;lt;/source&amp;gt;&lt;br /&gt;
Здесь binary --- это массив, содержащий двоичное представление десятичных цифр.&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Докажите, что математическое ожидание времени работы алгоритма быстрой сортировки (усреднение по всем вариантам выбора опорного элемента) на любом входе размера n удовлетворяет соотношению: T(n) ≤ O(n) + 1/n * &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt; (T(i-1) + T(n-i)).&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Найдите решение соотношения из предыдущего пункта.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Динамическое программирование (ДП). Первые примеры (02.01)==&lt;br /&gt;
# Нахождение самой длинной возрастающей подпоследовательности.&lt;br /&gt;
# Нахождение редакционного расстояния (или редакционной стоимости, расстояния Левенштейна).&lt;br /&gt;
# Нахождение представителя большинства.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 7 (до 20.02)===&lt;br /&gt;
* В этом задании везде, где требуется реализовать алгоритм, необходимо привести код на любом языке программирования.&lt;br /&gt;
* Для получения максимальной оценки нужно решить все задачи без звёздочек. Одна решённая задача со звёздочкой заменяет одну задачу без звёздочки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения редакционного расстояния (алгоритм Вагнера — Фишера). Например, редакционное расстояние между словами &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равно 6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения длины наибольшей общей подстроки. Например, длина наибольшей общей подстроки &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равна 8 (&amp;quot;antholog&amp;quot;). Чем больше это значение, тем схожей строки.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Предположим теперь, что сравниваемые строки состоят из символов A, С, G и T; за удаление или вставку мы платим -5; за замену буквы x на y платим w[x, y], где x, y принадлежат множеству {A, С, G, T}, a w — это матрица весов:&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
!-!! A!! G!! C!! T&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! A&lt;br /&gt;
|10||-1||-3||-4&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
!G&lt;br /&gt;
||-1||7||-5||-3&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! C&lt;br /&gt;
||-3||-5||9||0&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! T&lt;br /&gt;
||-4||-3||0||8&lt;br /&gt;
|}&lt;br /&gt;
Тогда выравнивание:&lt;br /&gt;
 AGACTAGTTAC&lt;br /&gt;
 CGA‒‒‒GACGT&lt;br /&gt;
будет иметь следующую оценку:&lt;br /&gt;
 w[A,C] + w[G,G] + w[A,A] + 3*(-5) + w[G,G] + w[T,A] + w[T,C] + w[A,G] + w[C,T] = -3 + 7 + 10 - 3*5 + 7 + (-4) + 0 + (-1) + 0 = 1.&lt;br /&gt;
&lt;br /&gt;
Напишите алгоритм, который находит максимальную стоимость всех возможных выравниваний. Верно ли, что чем больше это значение, тем непохожей строки?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как давно один народ отделился от другого? Кто похожей — итальянец и китаец или якут и эфиоп? На эти вопросы можно отвечать с разных точек зрения — культурной, исторической, лингвистической, ... В последние же годы человечество научилось секвенировать геном, что позволило исследовать этот вопрос с точки зрения генетики. Секвенирование генома — это процесс записи ДНК в виде нуклеотидной последовательности, которая представляет собой последовательность из четырёх символов — A, С, G и T. Существуют базы, которые хранят генетическую информацию о людях из разных стран и континентов, например, [http://www.mtdb.igp.uu.se/ http://www.mtdb.igp.uu.se/ → Download mtDNA sequences]. Чем больше сходство между геномами, тем сильнее родственные связи между их обладателями. Используя решение предыдущего пункта, выполните задания:&lt;br /&gt;
# Определите, кто похожей — итальянец и китаец или якут и эфиоп?&lt;br /&gt;
# Найдите нескольких похожих и нескольких непохожих народностей.&lt;br /&gt;
# * Выберите одну народность. Найдите самых похожих и самых непохожих на неё.&lt;br /&gt;
# * Найдите самые похожие и самые непохожие народности.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Задача о разрезании стержня (05.01)==&lt;br /&gt;
# Постановка задачи.&lt;br /&gt;
# Решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Решение с нахождением максимума по p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Восходящий алгоритм с запоминанием. Вывод длин кусочков стержня. Оценка сложности.&lt;br /&gt;
# Нисходящий алгоритм с запоминанием. Оценка сложности.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.1 Разрезание стержня, стр. 393]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 8 (до 22.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Решая задачу о разрезании стержня мы вначале построили рекурсивное решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt; для всех 1 ≤ i &amp;lt; n. Его сложность описывалась рекуррентной формулой T(n) = n + &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n-1&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt;(T(i) + T(n-i)), T(1) = 1.&lt;br /&gt;
# Объясните эту формулу.&lt;br /&gt;
# Покажите с помощью метода подстановок, что T(n) ≤ 2&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Покажите с помощью контрпримера, что описанная далее жадная стратегия не всегда определяет оптимальный способ разрезания стержня. Определим плотность стержня длиной i как p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;/i, то есть как стоимость единицы его длины. Жадная стратегия для стержня длиной n отрезает от стержня первую часть длиной i, где 1 ≤ i ≤ n, имеющую максимальную плотность. Затем та же жадная стратегия применяется к оставшейся части длиной n-i.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Рассмотрим модификацию задачи разрезания стержня, в которой в дополнение к цене p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; каждого стержня добавляется фиксированная цена разреза c. Теперь прибыль, связанная с решением, представляет собой сумму цен частей стержня минус стоимость разрезов. Разработайте алгоритм динамического программирования для этой модифицированной задачи.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Непрерывным участком называется группа подряд идущих элементов. Например, для последовательности&lt;br /&gt;
 5, 15, −30, 10, −5, 40, 10&lt;br /&gt;
элементы 15, −30, 10 образуют непрерывный участок, а 5, 15, 40 -- нет. Постройте линейный алгоритм для следующей задачи:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Вход: список чисел a1, a2, ... ‌, an.&lt;br /&gt;
Выход: непрерывный участок с максимальной суммой (сумма участка нулевой длины равна нулю).&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Для приведённого примера ответом будет 10, −5, 40, 10 с суммой 55. Какова сложность алгоритма? Почему?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Надо заплатить v рублей, имея купюры в x1, x2, ‌..., xn рублей (купюр каждого типа сколько угодно). Это не всегда возможно (скажем, купюрами в&lt;br /&gt;
10 и 25 рублей можно заплатить 45 рублей, но не 47 и не 15). Постройте основанный на методе динамического программирования алгоритм со временем работы O(nv), выясняющий, возможна ли уплата.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как решить предыдущую задачу, если каждая купюра имеется в единственном экземпляре? (Например, купюрами в 1, 5, 10, 20 рублей можно заплатить 16 = 1 + 5 + 10 и 31 = 1 + 10 + 20 рублей, но не 40 (не хватит денег). Время работы алгоритма по-прежнему O(nv).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Ещё один вариант той же задачи: купюр каждого типа сколько угодно, но всего разрешается использовать не более k купюр. (Например, если есть купюры в 5 и 10 рублей, а k = 6, то 55 разменять можно, а 65 –– нет).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Перемножение цепочки матриц. Оптимальное бинарное дерево поиска (начало) (09.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о перемножении цепочки матриц. Постановка задачи.Пример. Нисходящий алгоритм.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.2 Перемножение цепочки матриц, стр. 403]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 9 (до 24.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Найдите оптимальную расстановку скобок в произведении последовательности матриц, размерности которых равны 5×10, 10×3, 3×12, 12×5, 5×50, 50×6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Напишите восходящий алгоритм для поиска оптимальной расстановки скобок.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Расстановка пробелов. Оптимальное бинарное дерево поиска (середина) (12.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о расстановке пробелов. Постановка задачи. Решения для трёх случаев: 1. нужно вернуть можно ли разбить текст на слова; 2. вернуть разбивку на слова; 3. слова встречаются не равновероятно, вернуть наиболее вероятную разбивку на слова.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи. Вывод математического ожидания времени поиска.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Праздничное домашнее задание 10 (до 02.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[&amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;,&amp;quot;, &amp;quot;.&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;,&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;.&amp;quot;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Подсказка:&#039;&#039;&#039; разбейте текст на слова из списка и посмотрите на азбуку Морзе.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Способы представления графов в памяти (16.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Разбор ошибок в домашнем задании.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Графы. Способы представления графов в памяти (матрица смежности, список рёбер, список соседей (список смежностей), матрица инцидентности). Зависимость сложности алгоритмов от способа представления.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §22.1 Представление графов, стр. 626]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 11 (до 02.03)===&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача A.]&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача B.]&lt;br /&gt;
# Нарисуйте неориентированный граф с 5 вершинами и 8 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Нарисуйте ориентированный граф с 4 вершинами и 3 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Дан ориентированный граф. &#039;&#039;Исходящая степень вершины v&#039;&#039; --- это количество исходящих из неё рёбер, &#039;&#039;входящая степень v&#039;&#039; --- это количество рёбер входящих в  v. Имеется представление ориентированного графа с использование списка соседей. Как долго будут вычисляться исходящие степени всех вершин графа? А входящие степени?&lt;br /&gt;
# Дан граф G = (V, E). Какие из рассмотренных способов хранения графов используют меньше всего памяти для хранения G и почему? Указание: рассмотрите случаи |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;lt; |E| и |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;gt; |E|.&lt;br /&gt;
# Пусть C --- это матрица смежности графа G.&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
# Пусть B --- это матрица инцидентности ориентированного графа G. Как связаны элементы матрицы BB&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
&lt;br /&gt;
==Реализация поиска в глубину (19.02)==&lt;br /&gt;
# Реализация поиска в глубину и смежных задач.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 12 (до 5.03)===&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Выберите любой способ хранения графа. Реализуйте поиск в глубину.&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Напишите алгоритм, который возвращает данные о том, какие вершины лежат в одной компоненте связности.&lt;br /&gt;
# &#039;&#039;(любой ЯП или псевдокод)&#039;&#039; Напишите алгоритм проверки сильной связности ориентированного графа. Какова его сложность?&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №2==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
Необходимо реализовать 3 задачи из [https://official.contest.yandex.ru/contest/1085 контеста], см. [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing распределение задач]. Каждую задачу можно написать на С++ или Python. На выполнение работы отводится две недели (см. время окончания контеста). [https://official.contest.yandex.ru/contest/1123 Дорешивание.]&lt;br /&gt;
&lt;br /&gt;
==ДП и графы (26.02)==&lt;br /&gt;
==ДП и графы (02.03)==&lt;br /&gt;
==Жадные алгоритмы (12.03)==&lt;br /&gt;
===Домашнее задание 13 (до 23.03)===&lt;br /&gt;
# Вася хочет купить по одной акции каждой компании. Все акции стоят одинаково, но дорожают по-разному. Каждый месяц акция i-ой компании дорожает в r_i раз. В один месяц можно купить только одну акцию.&lt;br /&gt;
## Напишите алгоритм, который выводит оптимальную последовательность покупок (такую, что на покупку всех акций потратится меньше денег).&lt;br /&gt;
## Докажите корректность алгоритма, то есть докажите, что последовательность покупок, которую выводит ваш алгоритм, оптимальна.&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список, очередь (16.03)==&lt;br /&gt;
# Реализация линейного двусвязного списка (С++).&lt;br /&gt;
# Реализация очереди ограниченной длины на базе вектора (С++).&lt;br /&gt;
# Реализация очереди на базе списка (С++).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14 (до 23.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте (на С++) структуру данных Стек. У стека должно быть три операции:&lt;br /&gt;
* push --- положить элемент на вершину стека;&lt;br /&gt;
* pop --- удалить верхний элемент;&lt;br /&gt;
* front --- вернуть значение верхнего элемента.&lt;br /&gt;
Оцените время работы каждой функции.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список (19.03)==&lt;br /&gt;
===Домашнее задание 13* (до 30.03)===&lt;br /&gt;
#Для приведённой реализации класса List (https://yadi.sk/i/c5r_79WdfMyNS).&lt;br /&gt;
## Допишите print, push_back и push_front.&lt;br /&gt;
## В функции insert_after и delete_node вставьте необходимые проверки так, чтобы они работали для крайних случаев.&lt;br /&gt;
## Напишите main в котором&lt;br /&gt;
### создаётся объект класса List, &lt;br /&gt;
### заполняется элементами с помощью функций push_back, push_front и insert_after и&lt;br /&gt;
### удаляется i-ый элемент.&lt;br /&gt;
&lt;br /&gt;
==Повторение (30.03)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Для данных пар функций выясните их связь в терминах O-, o-, Ω-, ω-, Θ-обозначений. Поставьте галочку в клетке с Ω, если f(x) = Ω(g(x)) и прочерк, если равенства нет. [https://ru.wikipedia.org/wiki/«O»_большое_и_«o»_малое#.D0.94.D1.80.D1.83.D0.B3.D0.B8.D0.B5_.D0.BF.D0.BE.D0.B4.D0.BE.D0.B1.D0.BD.D1.8B.D0.B5_.D0.BE.D0.B1.D0.BE.D0.B7.D0.BD.D0.B0.D1.87.D0.B5.D0.BD.D0.B8.D1.8F Википедия]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! f(x)!! g(x)!! O!! o!! Ω!! ω!! Θ&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! 2^100&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n * log(n)&lt;br /&gt;
! 2^100 * n * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n&lt;br /&gt;
! 2^100 * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n!&lt;br /&gt;
! 2^(2015n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n*2^n&lt;br /&gt;
! 3^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 5^n&lt;br /&gt;
! 5^(n+1)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n + n^2 + n^3 + ... + n^1000&lt;br /&gt;
! 7^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм Quickselect нахождения k-ого элемента по возрастанию: http://en.wikipedia.org/wiki/Quickselect&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;На улице стоит ряд домов. В каждом из домов лежит сколько-то денег. Вор хочет обокрасть дома на переулке. Он не может обокрасть два соседних дома, потому что хозяин дома, который он обокрал, сразу предупредит соседей. Нужно найти, какую максимальную сумму вор может украсть с переулка. На вход программы подается массив неотрицательных целых чисел - количество долларов в доме с номером i. Соседние дома в массиве представлены соседними элементами. Например, пусть задан массив { 1, 4, 5 } - тогда вор максимум может украсть $6, обокрав дома 1 и 3. Пусть задан массив { 1, 7, 2 } - тогда вор максимум может украсть $7, обокрав дом 2.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Алфавит из всех маленьких латинских букв и пробела закодирован числами следующим способом:&lt;br /&gt;
  &#039;a&#039; -&amp;gt; 1&lt;br /&gt;
  &#039;b&#039; -&amp;gt; 2&lt;br /&gt;
  &#039;c&#039; -&amp;gt; 3&lt;br /&gt;
  ...&lt;br /&gt;
  &#039;z&#039; -&amp;gt; 26&lt;br /&gt;
  &#039; &#039; -&amp;gt; 27&lt;br /&gt;
На вход программы подается строка из цифр. Нужно посчитать, сколькими способами можно раскодировать эту строку.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Дан граф, заданный матрицей смежности. Вывести пары вершин между которыми нет пути.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Повторение (02.04) ==&lt;br /&gt;
Решали и разбирали первые 4 задачи из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14* (до 11.03)===&lt;br /&gt;
Решите любые две задачи (подпункты НЕ считаются отдельными задачами) с предыдущей пары (Повторение (30.03)).&lt;br /&gt;
&lt;br /&gt;
== Повторение (06.04) ==&lt;br /&gt;
Будем решать вторую половину задач из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 15 (до 16.04)===&lt;br /&gt;
# Приведите пример графа, который содержит отрицательные рёбра, не содержит циклов отрицательного веса и для которого алгоритм Дейкстры возвращает неверный результат.&lt;br /&gt;
# Используется ли в алгоритме Дейкстры то, что веса рёбер неотрицательны? Если &amp;quot;да&amp;quot;, то где именно?&lt;br /&gt;
# Пусть граф содержит рёбра с весами &amp;gt;= -100. Если прибавить к каждому ребру 101 и при помощи алгоритма Дейкстры найти кратчайшие пути. Будут ли эти пути кратчайшими в исходном графе? Почему?&lt;br /&gt;
&lt;br /&gt;
== Повторение (07.04) ==&lt;br /&gt;
&#039;&#039;&#039;Решение рекуррентных соотношений&#039;&#039;&#039;&lt;br /&gt;
# Решите уравнение: T(n) = 4*T(n/2) + O(n^2) с базой T(1) = O(1)&lt;br /&gt;
## Используя основную теорему.&lt;br /&gt;
## Используя дерево рекурсий.&lt;br /&gt;
## Методом подстановки.&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2)) + n является \Theta(n lg n).&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2) + 17) + n является \Theta(n lg n).&lt;br /&gt;
# Решите уравнения, считая, что T(1) = O(1):&lt;br /&gt;
## T(n) = T(n-1) + n&lt;br /&gt;
## T(n) = 2*T(floor(sqrt(n))) + lg n. Указание: попробуйте использовать замену переменных.&lt;br /&gt;
## T(n) = 3*T(sqrt(n)) + lg n&lt;br /&gt;
# Дайте верхнюю и нижнюю оценки функции T(n). Постарайтесь, чтобы оценки были как можно более точные&lt;br /&gt;
## T(n) = 4T(n/3) + n*lg(n)&lt;br /&gt;
## T(n) = 3T(n/3) + n/lg(n)&lt;br /&gt;
## T(n) = 4T(n/2) + n^2*sqrt(n)&lt;br /&gt;
## T(n) = T(n/2) + T(n/4) + T(n/8) + n&lt;br /&gt;
## T(n) = T(n-1) + 1/n&lt;br /&gt;
## T(n) = T(n-2) + 1/lg(n)&lt;br /&gt;
## T(n) = sqrt(n) * T(sqrt(n)) + n&lt;br /&gt;
&#039;&#039;&#039;Анализ и построение алгоритмов&#039;&#039;&#039;&lt;br /&gt;
# Числа Фибоначчи F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; можно выразить через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, используя матрицу: https://yadi.sk/i/Pm_aNzHCforFU. &lt;br /&gt;
## Покажите как вычислить F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;.&lt;br /&gt;
## Как вычислить F&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;n+1&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;?&lt;br /&gt;
## Напишите алгоритм.&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
## Ускорьте его так, чтобы он работал за O(log n).&lt;br /&gt;
# Дана последовательность символов. Какое минимальное количество символов нужно удалить из неё, чтобы получить палиндром?&lt;br /&gt;
## Напишите алгоритм (на псевдокоде или на любом языке программирования).&lt;br /&gt;
## Оцените время работы алгоритма.&lt;br /&gt;
# Какую структуру данных вы бы использовали для реализации упорядоченного множества (http://neerc.ifmo.ru/wiki/index.php?title=Упорядоченное_множество)? Какая будет сложность каждой из операций над множеством?&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 16 (до 20.04)===&lt;br /&gt;
# Решите 6 задач из первой части и 6 из второй. (Укажите какие именно.) Каждый из подпунктов является отдельной задачей.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм и теорема Форда-Фалкерсона (16.04)==&lt;br /&gt;
# Базовые определения (пропускные способности, сток, исток и пр.). Пример. &lt;br /&gt;
# Ограничения на поток (сохранение и что меньше пропускных способностей).&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, пример работы&lt;br /&gt;
# Разрез, определение, пример.&lt;br /&gt;
# Утверждение: максимальный поток &amp;lt;= любого разреза.&lt;br /&gt;
# Теорема Форда-Фалкерсона (с доказательством).&lt;br /&gt;
# Пример на котором алгоритм Форда-Фалкерсонаработает работает очень долго при неудачном выборе путей.&lt;br /&gt;
# Сложность алгоритма Форда-Фалкерсона.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №3==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
В [https://official.contest.yandex.ru/contest/1196 домашнем задании] пять задач. Они разделены на два варианта, помеченные римскими цифрами I и II. Свой вариант нужно узнать [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing здесь на вкладке HW3]. Третья задача — общая для двух вариантов; ее решение необходимо снабдить доказательством корректности алгоритма. На выполнение задания дается примерно 2 недели (см. точное время окончания в контесте). Каждую задачу можно написать на С++ или Python.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Форда-Фалкерсона и Эдмондса-Карпа (20.04)==&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, напоминание: базовые определения, пример работы, пример на котором алгоритм работает долго, сложность.&lt;br /&gt;
# Алгоритм Эдмодса-Карпа. Доказательство асимптотики времени работы.&lt;br /&gt;
&lt;br /&gt;
==(23.04)==&lt;br /&gt;
&lt;br /&gt;
==(11.05) Красно-чёрные деревья==&lt;br /&gt;
[https://ru.wikipedia.org/wiki/Красно-чёрное_дерево Красно-чёрное дерево]&lt;br /&gt;
===Домашнее задание 17 (до 18.05)===&lt;br /&gt;
# Зачем нужны красно-чёрные деревья?&lt;br /&gt;
# Благодаря какому свойству и почему красно-чёрное дерево является сбалансированным?&lt;br /&gt;
# Нарисуйте полное бинарное дерево поиска высотой 3 с ключами {1, 2, ..., 15}. Сделайте из него красно-чёрные деревья высотой 2, 3 и 4.&lt;br /&gt;
# Нарисуйте красно-чёрные деревья, получающиеся последовательной вставкой элементов 12, 10, 29, 30, 31, 32 в [https://ru.wikipedia.org/wiki/Красно-чёрное_дерево#/media/File:Red-black_tree_example.svg данное дерево]. Для вставки используйте алгоритм вставки из Википедии. Укажите какой именно функцией вы воспользовались.&lt;br /&gt;
# Определим &#039;&#039;&#039;ослабленное красно-чёрное дерево&#039;&#039;&#039; как бинарное дерево поиска, которое удовлетворяет красно-чёрным свойствам 1, 3, 4 и 5. Другими словами, корень может быть как чёрным, так и красным. Рассмотрите ослабленное красно-чёрное дерево T, корень которого красный. Если перекрасить корень дерева T в чёрный, будет ли оно красно-чёрным деревом?&lt;br /&gt;
# Покажите, что самый длинный простой нисходящий путь от вершины x к листу красно-черного дерева имеет длину, не более чем в два раза превышающую кратчайший путь от x к листу-потомку.&lt;br /&gt;
# Чему равно наибольшее возможное количество внутренних узлов в красно-чёрном дереве с чёрной высоты k? А наименьшее возможное количество?&lt;br /&gt;
# Нарисуйте красно-чёрные деревья, получающиеся последовательной вставкой ключей 41, 38, 31, 12, 19, 8 в изначально пустое дерево.&lt;br /&gt;
# Покажите какие деревья будут получаться в результате последовательного удаления ключей в порядке 8, 12, 19, 31, 38, 41.&lt;br /&gt;
&lt;br /&gt;
==(14.05) Конкурентный анализ самоорганизующихся циклов==&lt;br /&gt;
[https://vk.com/doc12518218_390369758 Конспект лекций]&lt;br /&gt;
&lt;br /&gt;
===Задание 18 (до 21.05)===&lt;br /&gt;
Все вычисления сопроводите подробными объяснениями о том, почему верно то или иное (не)равенство.&lt;br /&gt;
# Пусть имеется n-элементный список и m поисковых запросов к нему. После каждой операции поиска можно переупорядочить список. Обозначим стоимость последовательности поисков через C. Докажите, что в худшем случае C = Ω(mn).&lt;br /&gt;
#  Обозначим через c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; стоимость i-ого поискового запроса с применением эвристики перемещения в начало, которая включает стоимость поиска элемента в списке и стоимость его перемещения в начало списка путём ряда обменов соседних элементов списка. Покажите, что i-ая операция поиска находит элемент x в списке L с применением эвристики перемещения в начало, то c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = 2 * rank&amp;lt;sub&amp;gt;L&amp;lt;/sub&amp;gt;(x) - 1.&lt;br /&gt;
# Покажите, что c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = 2 * rank&amp;lt;sub&amp;gt;L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x).&lt;br /&gt;
# Покажите, что c*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = rank&amp;lt;sub&amp;gt;L*&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) + t&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;.&lt;br /&gt;
# Докажите, что после одного обмена двух соседних элементов потенциал либо увеличивается на 2, либо уменьшается на 2.&lt;br /&gt;
# Докажите, что rank&amp;lt;sub&amp;gt;L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) = |A| + |B| + 1.&lt;br /&gt;
# Докажите, что rank&amp;lt;sub&amp;gt;L*&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) = |A| + |С| + 1.&lt;br /&gt;
# Покажите, что поиск i-ого элемента приводит к изменению потенциала Ф(L&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;) - Ф(L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;) &amp;lt;= 2 (|A| - |B| + t*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;), где t*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; --- это количество обменов при i-ом поиске.&lt;br /&gt;
# Во сколько раз стоимость С&amp;lt;sub&amp;gt;MFT&amp;lt;/sub&amp;gt;(S) превышает C&amp;lt;sub&amp;gt;OPT&amp;lt;/sub&amp;gt;(S)?&lt;/div&gt;</summary>
		<author><name>Kassalanche</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=12224</id>
		<title>Алгоритмы и структуры данных. Подгруппа 105-1</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=12224"/>
		<updated>2015-05-14T07:32:24Z</updated>

		<summary type="html">&lt;p&gt;Kassalanche: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==О курсе==&lt;br /&gt;
[[Алгоритмы_и_структуры_данных|План лекций и список рекомендуемой литературы.]]&lt;br /&gt;
&lt;br /&gt;
[[Алгоритмы_и_структуры_данных._Подгруппа_105-1._FAQ|FAQ.]]&lt;br /&gt;
&lt;br /&gt;
[[Reviewboard|Инструкция по использованию Reviewboard.]]&lt;br /&gt;
&lt;br /&gt;
[[Практические_занятия_по_курсу_ОиМП/C++_check|Style guide.]]&lt;br /&gt;
&lt;br /&gt;
==Итоговая оценка за курс==&lt;br /&gt;
Итоговая оценка (ИО) зависит от&lt;br /&gt;
* оценок за пять больших домашних заданий (БДЗ1, БДЗ2, ..., БДЗ5),&lt;br /&gt;
* оценок за домашние задания (ДЗ1, ДЗ2, ...),&lt;br /&gt;
* оценки за контрольную работу (КР),&lt;br /&gt;
* оценки за экзамен (ЭКЗ),&lt;br /&gt;
и может быть вычислена по формуле:&lt;br /&gt;
 ИО = 0.7 * (0.3 * КР + 0.7 *(ИДЗ1 + ИДЗ2 + ИДЗ3 + ИДЗ4 + ИДЗ5)/5) + 0.3 * ЭКЗ =&lt;br /&gt;
    = 0.21*КР + 0.98*ИДЗ1 + 0.98*ИДЗ2 + 0.98*ИДЗ3 + 0.98*ИДЗ4 + 0.98*ИДЗ5 + 0.3*ЭКЗ,&lt;br /&gt;
где&lt;br /&gt;
 ИДЗi = min (10, 0.7 * БДЗi + 0.4 * &amp;lt;cредняя оценка за ДЗj, прошедшие с предыдущего БДЗ по i-ое&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
==Порядок сдачи домашних работ==&lt;br /&gt;
===Большие домашние работы===&lt;br /&gt;
# Получить OK за задачу в контесте.&lt;br /&gt;
# Залить исходный код на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* На каждую задачу создавайте отдельный запрос на ревью. &lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении суток приходят замечания к коду. &#039;&#039;&#039;Если в течении суток замечаний или Ship It не появилось, проверьте, что вы правильно отправили запрос и, если всё сделано правильно, спросите у семинариста получил ли он запрос.&#039;&#039;&#039;&lt;br /&gt;
# Вы их исправляете, проверяете в контесте, что программа по-прежнему проходит все тесты, заливаете новую версию в Review Board. Штрафов за посылки НЕ будет.&lt;br /&gt;
# Процесс повторяется пока остаются замечания к коду или пока не истёк дедлайн. После закрытия контеста будут ещё одни сутки на доработку замечаний в Review Board.&lt;br /&gt;
# Оценивается только последняя версия работы в Review Board.&lt;br /&gt;
&lt;br /&gt;
===Маленькие домашние работы===&lt;br /&gt;
# Залить решение на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* Желаемые форматы: txt, py, cpp, h. Допускаются любые другие.&lt;br /&gt;
#* На каждую домашнюю работу создавайте отдельный запрос на ревью. Обязательно указывайте номер домашней работы.&lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении неопределенного промежутка времени придут оценки по каждому из заданий.&lt;br /&gt;
&lt;br /&gt;
==Оценивание домашних работ==&lt;br /&gt;
* Все задания предполагаются индивидуальными. Запрещены любые заимствования без ссылки на автора.&lt;br /&gt;
* Решения после установленного дедлайна не принимаются. Дедлайн указан в заголовке каждого задания.&lt;br /&gt;
* Везде, где требуется написать алгоритм, можно использовать любой язык программирования или псевдокод.&lt;br /&gt;
* Там, где требуется построить алгоритм с заданной асимптотикой, приведите обоснование, что полученный алгоритм удовлетворяет этому условию.&lt;br /&gt;
* Эти правила не действуют, если в задании явно оговорено иное.&lt;br /&gt;
&lt;br /&gt;
==Мотивация к изучению алгоритмов. Подсчёт числа операций (12.01)==&lt;br /&gt;
# Числа Фибоначчи. Определение. Примитивный рекурсивный алгоритм вычисления i-ого числа. Оценка числа операций. Анализ причин неэффективности. Алгоритм с запоминанием вычисленных ранее значений. Оценка числа операций. Сравнение с предыдущим. (подробнее: глава 0, страницы 8-10 из книги &amp;lt;&amp;lt;Алгоритмы&amp;gt;&amp;gt;, [[Алгоритмы_и_структуры_данных|см. список рекомендованной литературы]])&lt;br /&gt;
# Задача о ханойской башне. Постановка задачи. Рекурсивный алгоритм. Рекуррентная формула для числа перемещений. Замкнутая формула для числа перемещений (+ доказательство). Доказательство того, что эту задачу нельзя решить используя меньшее число перемещений дисков. ([https://www.dropbox.com/s/t8cbs7ttu4iasvj/algo-0-recursion.pdf?dl=0 Разбор задачи о ханойской башне], автор Сергей Объедков)&lt;br /&gt;
# Сортировка пузырьком. Алгоритм. Подсчёт количество операций сравнения и обмена (swap). Анализ наилучшего и наихудшего случаев ([https://ru.wikipedia.org/wiki/Сортировка_пузырьком Википедия])&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 1 (12.01 - 26.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
Во всех задачах, если не оговорено иного, предполагаем, что работаем с целыми неотрицательными числами. Для первых 7 задач необходимо&lt;br /&gt;
* описать что можно считать наилучшим и наихудшим случаями,&lt;br /&gt;
* для каждого из двух случаев подсчитать отдельно количество операций сравнения и swap (если есть).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Даны три числа, требуется вернуть наименьшее.&lt;br /&gt;
# Даны три числа, требуется отсортировать их.&lt;br /&gt;
# Дана последовательность A из n элементов и число x, требуется найти элемент равный x. Примечание: если таких значений i несколько, вернуть любое; если такого элемента нет, функция должна сообщить об этом.&lt;br /&gt;
# * Дана упорядоченная последовательность A из n элементов и число x, требуется найти такое i, что A[i] равно x. Алгоритм должен быть эффективней, чем в предыдущем пункте и использовать то, что последовательность упорядочена.&lt;br /&gt;
# Дана последовательность из 100 000 чисел от 0 до 100. Напишите эффективный алгоритм сортировки, который бы учитывал специфику входных данных.&lt;br /&gt;
# * Дано 32 битное неотрицательное число. Требуется номер первого ненулевого бит. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения, считая, что числа распределены равномерно.&lt;br /&gt;
# * Даны 32 битные неотрицательные числа m и n. Требуется вывести True, если m &amp;lt; n, иначе False. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения битов, считая, что числа распределены равномерно.&lt;br /&gt;
# Напишите рекурсивную функцию, вычисляющую n-ое число Фибоначчи (как на занятии). Подсчитайте количество рекурсивных вызовов.&lt;br /&gt;
# * Напишите функцию, вычисляющую n-ое число Фибоначчи, у которой число операций — полином от n, и которая использует количество памяти, независящее от n.&lt;br /&gt;
&lt;br /&gt;
==O-символика и стратегия &amp;quot;разделяй и властвуй&amp;quot; (15.01)==&lt;br /&gt;
# Сортировка слиянием. Алгоритм, рекуррентное соотношение для времени сортировки, сложность. Подробнее: [https://dl.dropboxusercontent.com/u/829163/draft.pdf §2.3 Сортировка слиянием (стр. 54)].&lt;br /&gt;
# О-символика. [https://dl.dropboxusercontent.com/u/829163/draft.pdf §0.3 О-символика (стр. 10)].&lt;br /&gt;
# Задача о слиянии m упорядоченных массивов по n элементов. Три алгоритма решения: последовательное слияние, слияние &amp;quot;деревом&amp;quot; (обе функции используют Merge из MergeSort), аналог Merge для m массивов. Анализ сложности каждого из них.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 2 (15.01-29.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
* Во всех задачах, если не оговорено иного, для простоты &#039;&#039;можно&#039;&#039; считать, что n является степенью какого-либо числа, например, степенью двойки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Дана функция F, определённая ниже. Сколько строк она напечатает? Указание: для обоих подпунктов рассмотрите два случая: 1. n является степенью двойки, 2. n не является степенью двойки.&lt;br /&gt;
## Запишите рекуррентное соотношение для числа строк.&lt;br /&gt;
## Решите уравнение, полученное в предыдущем пункте, то есть, выведите замкнутую (нерекуррентную формулу). Для простоты можно считать, что n является степенью двойки.&lt;br /&gt;
# В массиве A размера n записана возрастающая последовательность целых чисел. Постройте алгоритм типа &amp;quot;разделяй и властвуй&amp;quot;, который проверяет, существует ли такой индекс i, что A[i] = i&lt;br /&gt;
## за время O(n),&lt;br /&gt;
## * за время O(log n).&lt;br /&gt;
## Какие случаи для вашего алгоритма являются наихудшими и наилучшими? Какого время работы в лучшем и худшем случаях?&lt;br /&gt;
# Дан бесконечный массив A, первые n элементов которого содержат возрастающую последовательность положительных чисел, а дальше стоят -1. Значение n не дано. Постройте алгоритм, который получает на вход целое число x и находит это x в массиве --- или говорит, что там его нет, &lt;br /&gt;
## за время O(n),&lt;br /&gt;
## за время O(log n).&lt;br /&gt;
# Рассмотрим алгоритм вычисления наибольшего общего делителя (НОД) двух положительных чисел, основанный на методе &amp;quot;разделяй и властвуй&amp;quot;.&lt;br /&gt;
## (задание не оценивается) Прочитайте [https://dl.dropboxusercontent.com/u/829163/draft.pdf §1.2.3 Алгоритм Евклида (стр. 23)].&lt;br /&gt;
## * Докажите, что определение НОД-а, приведённое ниже, корректно.&lt;br /&gt;
## Постройте алгоритм, основанный на этом определении.&lt;br /&gt;
## Какой алгоритм будет быстрее для n-битовых чисел a и b при больших значениях n --- ваш или алгоритм Евклида?&lt;br /&gt;
# * Покажите как за время O(n log n) удалить из массива размера n все дубликаты, то есть оставить каждый элемент в одном экземпляре.&lt;br /&gt;
# * Даны два упорядоченных массива размера m и n. Постройте алгоритм, находящий k-й по величине элемент в объединении этих массивов за время O(log(n+m)). &lt;br /&gt;
&lt;br /&gt;
Функция F(n).&lt;br /&gt;
  если n &amp;gt; 1:&lt;br /&gt;
    напечатать &amp;quot;всё ещё работаю&amp;quot;&lt;br /&gt;
    F(n/2)&lt;br /&gt;
    F(n/2)&lt;br /&gt;
&lt;br /&gt;
Определение НОД-а.&lt;br /&gt;
             2НОД(a/2, b/2), если а и b чётны,&lt;br /&gt;
  НОД(a,b) = НОД(a, b/2), если а нечётно, b чётно,&lt;br /&gt;
             НОД((a-b)/2, b), если а и b нечётны.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;lt;nowiki&amp;gt;Задачи взяты из книги &amp;quot;Алгоритмы&amp;quot;, глава 2 (см. список рекомендованной литературы).&amp;lt;/nowiki&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Сложение и умножение (19.01)==&lt;br /&gt;
# Алгоритм сложения, его сложность (§1.1.1 Сложение*)&lt;br /&gt;
# &amp;quot;Школьный&amp;quot; алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Рекурсивный алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Алгоритм умножения, реализующий стратегию &amp;quot;разделяй и властвуй&amp;quot;, анализ сложности (§2.1 Умножение чисел*)&lt;br /&gt;
 * [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать.]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 3 (19.01 - 2.02)===&lt;br /&gt;
* Во всех задачах для простоты можно считать, что n является степенью какого-либо числа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Найдите произведение чисел 10011011 и 10111010 (в двоичной системе счисления), используя алгоритм умножения чисел, основанный на методе «разделяй и властвуй». Необходимо не только дать ответ, но и привести ход решения.&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 3 рекурсивных вызова для подзадач размера n-1 и комбинирует из них решение исходной задачи за О(n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте три верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 10 рекурсивных вызовов для подзадач размера n/2 и комбинирует из них решение исходной задачи за О(5n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте два верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Докажите, что 3m² + m = O(m²).&lt;br /&gt;
# Докажите, что lg m = O(m/1000), где lg m — это логарифм с двоичным основанием.&lt;br /&gt;
# Докажите, что из равенства f(n) = O(g(n)) не следует, что g(n) = O(f(n)).&lt;br /&gt;
# Докажите, что O(m) содержится в O(m²).&lt;br /&gt;
&lt;br /&gt;
==Решение рекуррентных уравнений (22.01)==&lt;br /&gt;
# Примеры решений рекуррентных уравнений (см. [https://www.dropbox.com/s/6a0r410zjm9qwe7/algo-3-recurrences.pdf?dl=0 конспект]).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 4 (до 14.02)===&lt;br /&gt;
* Нельзя использовать утверждение основной теоремы о решении рекуррентных соотношений.&lt;br /&gt;
* &#039;&#039;Можно&#039;&#039; использовать метод построения дерева рекурсии или подстановку (метод с угадыванием ответа).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Какой из трёх приведённых ниже алгоритмов вы бы предпочли? Обоснуйте свой ответ.&lt;br /&gt;
#* Алгоритм A, решая задачу, производит пять рекурсивных вызовов для подзадач вдвое меньшего размера, после чего строит ответ для исходной задачи за линейное время.&lt;br /&gt;
#* Алгоритм B, решая задачу размера n, делает два рекурсивных вызова для задач размера n − 1, после чего находит ответ за время O(1).&lt;br /&gt;
#* Алгоритм C, решая задачу размера n, рекурсивно решает девять задач размера n/3 и строит ответ за время O(n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Найдите T(n) в замкнутой форме для любых 7 из 10 приведённых ниже рекуррентных соотношений:&lt;br /&gt;
## T(n) ≤ 2T(n/3) + 1;&lt;br /&gt;
## T(n) ≤ 7T(n/7) + n;&lt;br /&gt;
## T(n) ≤ 9T(n/3) + n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 8T(n/2) + n&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 49T(n/25) + n&amp;lt;sup&amp;gt;3/2&amp;lt;/sup&amp;gt;log n;&lt;br /&gt;
## T(n) ≤ T(n − 1) + 2;&lt;br /&gt;
## T(n) ≤ T(n − 1) + n&amp;lt;sup&amp;gt;c&amp;lt;/sup&amp;gt;, где c ≥ 1 –– константа;&lt;br /&gt;
## T(n) ≤ T(n − 1) + c&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;, где c &amp;gt; 1 –– константа;&lt;br /&gt;
## T(n) ≤ 2T(n − 1) + 1;&lt;br /&gt;
## T(n) ≤ T(sqrt(n)) + 1.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №1==&lt;br /&gt;
Необходимо реализовать все 6 задач из [https://official.contest.yandex.ru/contest/1002 контеста]. Каждую задачу можно писать на С++ или Python. На выполнение работы отводится две недели. Каждая задача оценивается в 10/6 балла. Оценка &#039;&#039;может&#039;&#039; быть снижена за плохой код, но не более чем на 25%.&lt;br /&gt;
&lt;br /&gt;
==Бинарное дерево поиска (26.01)==&lt;br /&gt;
# Определение. Пример.&lt;br /&gt;
# Не модифицирующие алгоритмы: поиск (рекурсивный и итеративный алгоритмы), поиск минимума, inordered обход (вывод значений узлов в отсортированном порядке), поиск следующего по возрастанию.&lt;br /&gt;
# Модифицирующие алгоритмы: вставка (рекурсивная реализация), удаление (только идея).&lt;br /&gt;
 [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 13, стр. 248]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 5 (до 16.02)===&lt;br /&gt;
* Для получения максимальной оценки можно выполнить или все задачи без звёздочки, или задачу со звёздочкой. Преподаватель понимает, что реализацию БДП сложно не найти в интернете, но от копипасты не будет никакой пользы. Напротив, самостоятельная реализация очень полезна и приветствуется, даже если не получится выполнить всех пунктов задания.&lt;br /&gt;
* Задачи с двумя звёздочками необязательны.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Нарисуйте бинарные деревья поиска высотой 2, 3, 4, 5 и 6 для множества ключей {1, 4, 5, 10, 16, 17, 21}. Корень дерева имеет высоту 0.&lt;br /&gt;
# &#039;&#039;&#039;Сортировка с использованием БДП.&#039;&#039;&#039;&lt;br /&gt;
## Какова асимптотическая сложность алгоритма вставки элемента в дерево высоты d? Почему? Назовите наилучший и наиухдший случаи.&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который строит БДП в узлах которого стоят элементы данной последовательности. Можно использовать функцию Insert. Назовите наилучший и наихудший случаи. Есть теорема о том, что полученный алгоритм будет работать в среднем случае за время O(n * log n).&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который выводит их в порядке возрастания. Используйте бинарное дерево поиска. Какова в среднем случае сложность этого алгоритма? Назовите наилучший и наихудший случаи. Какова сложность в наихудшем случае?&lt;br /&gt;
# Напишите функцию GetRoot, которой на вход подаётся указатель на произвольный узел дерева, а она возвращает указатель на корень.&lt;br /&gt;
# Напишите процедуру PrintLeafs, которой на вход подаётся указатель на корень дерева, и она печатает листья дерева&lt;br /&gt;
## по возрастанию,&lt;br /&gt;
## по убыванию.&lt;br /&gt;
# ** Альтернативный обход в порядке возрастания бинарного дерева поиска с n узлами (или центрированный (inordered) обход) можно осуществить путём поиска минимального элемента дерева с помощью функции Minimum с последующий n-1 вызовом функции Next. Каково время работы такого алгоритма?&lt;br /&gt;
# * Реализуйте на С++ структуру данных бинарное дерево поиска, [https://yadi.sk/i/gi2SEStreFfSb используя заготовку].&lt;br /&gt;
## Нарисуйте бинарное дерево поиска, которое строится в функции getTreeExample.&lt;br /&gt;
## Реализуйте следующие алгоритмы: &lt;br /&gt;
### поиск минимума, &lt;br /&gt;
### inordered обход (вывод значений узлов в отсортированном порядке),&lt;br /&gt;
### поиск следующего по возрастанию,&lt;br /&gt;
### вставка элемента в дерево,&lt;br /&gt;
### сортировка последовательности с использованием БДП (дан вектор чисел, необходимо вывести их по возрастанию),&lt;br /&gt;
### ** удаление.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Карацубы, Штрассена. Быстрая сортировка (29.01)==&lt;br /&gt;
# Алгоритм Карацубы.&lt;br /&gt;
# Алгоритм Штрассена. [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать Дасгупту и др., §2.5 Умножение матриц]&lt;br /&gt;
# Быстрая сортировка и доказательство того, что в среднем случае она работает за О(n * log n). [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 8 Быстрая сортировка, стр. 148]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 6 (до 18.02)===&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Пусть мы хотим найти двоичное представление десятичного числа 10&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;. Будем считать, что n --- степень двойки (n = 2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt;).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Pwr2Bin(n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть 1010&lt;br /&gt;
    z = ...&lt;br /&gt;
    вернуть Multiply(z, z)&amp;lt;/source&amp;gt;&lt;br /&gt;
Multiply --- функция, перемножающая два n-битовых двоичных числа x и y по алгоритму Карацубы за O(n&amp;lt;sup&amp;gt;log&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;3&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Пусть мы хотим перевести произвольное десятичное число x в записи которого n=2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; чисел в двоичную систему счисления.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Dec2Bin(x, n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть binary[x]&lt;br /&gt;
    разделить x на два десятичных числа xl и xr из n/2 цифр.&lt;br /&gt;
    вернуть ...&amp;lt;/source&amp;gt;&lt;br /&gt;
Здесь binary --- это массив, содержащий двоичное представление десятичных цифр.&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Докажите, что математическое ожидание времени работы алгоритма быстрой сортировки (усреднение по всем вариантам выбора опорного элемента) на любом входе размера n удовлетворяет соотношению: T(n) ≤ O(n) + 1/n * &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt; (T(i-1) + T(n-i)).&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Найдите решение соотношения из предыдущего пункта.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Динамическое программирование (ДП). Первые примеры (02.01)==&lt;br /&gt;
# Нахождение самой длинной возрастающей подпоследовательности.&lt;br /&gt;
# Нахождение редакционного расстояния (или редакционной стоимости, расстояния Левенштейна).&lt;br /&gt;
# Нахождение представителя большинства.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 7 (до 20.02)===&lt;br /&gt;
* В этом задании везде, где требуется реализовать алгоритм, необходимо привести код на любом языке программирования.&lt;br /&gt;
* Для получения максимальной оценки нужно решить все задачи без звёздочек. Одна решённая задача со звёздочкой заменяет одну задачу без звёздочки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения редакционного расстояния (алгоритм Вагнера — Фишера). Например, редакционное расстояние между словами &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равно 6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения длины наибольшей общей подстроки. Например, длина наибольшей общей подстроки &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равна 8 (&amp;quot;antholog&amp;quot;). Чем больше это значение, тем схожей строки.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Предположим теперь, что сравниваемые строки состоят из символов A, С, G и T; за удаление или вставку мы платим -5; за замену буквы x на y платим w[x, y], где x, y принадлежат множеству {A, С, G, T}, a w — это матрица весов:&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
!-!! A!! G!! C!! T&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! A&lt;br /&gt;
|10||-1||-3||-4&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
!G&lt;br /&gt;
||-1||7||-5||-3&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! C&lt;br /&gt;
||-3||-5||9||0&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! T&lt;br /&gt;
||-4||-3||0||8&lt;br /&gt;
|}&lt;br /&gt;
Тогда выравнивание:&lt;br /&gt;
 AGACTAGTTAC&lt;br /&gt;
 CGA‒‒‒GACGT&lt;br /&gt;
будет иметь следующую оценку:&lt;br /&gt;
 w[A,C] + w[G,G] + w[A,A] + 3*(-5) + w[G,G] + w[T,A] + w[T,C] + w[A,G] + w[C,T] = -3 + 7 + 10 - 3*5 + 7 + (-4) + 0 + (-1) + 0 = 1.&lt;br /&gt;
&lt;br /&gt;
Напишите алгоритм, который находит максимальную стоимость всех возможных выравниваний. Верно ли, что чем больше это значение, тем непохожей строки?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как давно один народ отделился от другого? Кто похожей — итальянец и китаец или якут и эфиоп? На эти вопросы можно отвечать с разных точек зрения — культурной, исторической, лингвистической, ... В последние же годы человечество научилось секвенировать геном, что позволило исследовать этот вопрос с точки зрения генетики. Секвенирование генома — это процесс записи ДНК в виде нуклеотидной последовательности, которая представляет собой последовательность из четырёх символов — A, С, G и T. Существуют базы, которые хранят генетическую информацию о людях из разных стран и континентов, например, [http://www.mtdb.igp.uu.se/ http://www.mtdb.igp.uu.se/ → Download mtDNA sequences]. Чем больше сходство между геномами, тем сильнее родственные связи между их обладателями. Используя решение предыдущего пункта, выполните задания:&lt;br /&gt;
# Определите, кто похожей — итальянец и китаец или якут и эфиоп?&lt;br /&gt;
# Найдите нескольких похожих и нескольких непохожих народностей.&lt;br /&gt;
# * Выберите одну народность. Найдите самых похожих и самых непохожих на неё.&lt;br /&gt;
# * Найдите самые похожие и самые непохожие народности.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Задача о разрезании стержня (05.01)==&lt;br /&gt;
# Постановка задачи.&lt;br /&gt;
# Решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Решение с нахождением максимума по p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Восходящий алгоритм с запоминанием. Вывод длин кусочков стержня. Оценка сложности.&lt;br /&gt;
# Нисходящий алгоритм с запоминанием. Оценка сложности.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.1 Разрезание стержня, стр. 393]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 8 (до 22.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Решая задачу о разрезании стержня мы вначале построили рекурсивное решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt; для всех 1 ≤ i &amp;lt; n. Его сложность описывалась рекуррентной формулой T(n) = n + &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n-1&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt;(T(i) + T(n-i)), T(1) = 1.&lt;br /&gt;
# Объясните эту формулу.&lt;br /&gt;
# Покажите с помощью метода подстановок, что T(n) ≤ 2&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Покажите с помощью контрпримера, что описанная далее жадная стратегия не всегда определяет оптимальный способ разрезания стержня. Определим плотность стержня длиной i как p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;/i, то есть как стоимость единицы его длины. Жадная стратегия для стержня длиной n отрезает от стержня первую часть длиной i, где 1 ≤ i ≤ n, имеющую максимальную плотность. Затем та же жадная стратегия применяется к оставшейся части длиной n-i.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Рассмотрим модификацию задачи разрезания стержня, в которой в дополнение к цене p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; каждого стержня добавляется фиксированная цена разреза c. Теперь прибыль, связанная с решением, представляет собой сумму цен частей стержня минус стоимость разрезов. Разработайте алгоритм динамического программирования для этой модифицированной задачи.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Непрерывным участком называется группа подряд идущих элементов. Например, для последовательности&lt;br /&gt;
 5, 15, −30, 10, −5, 40, 10&lt;br /&gt;
элементы 15, −30, 10 образуют непрерывный участок, а 5, 15, 40 -- нет. Постройте линейный алгоритм для следующей задачи:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Вход: список чисел a1, a2, ... ‌, an.&lt;br /&gt;
Выход: непрерывный участок с максимальной суммой (сумма участка нулевой длины равна нулю).&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Для приведённого примера ответом будет 10, −5, 40, 10 с суммой 55. Какова сложность алгоритма? Почему?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Надо заплатить v рублей, имея купюры в x1, x2, ‌..., xn рублей (купюр каждого типа сколько угодно). Это не всегда возможно (скажем, купюрами в&lt;br /&gt;
10 и 25 рублей можно заплатить 45 рублей, но не 47 и не 15). Постройте основанный на методе динамического программирования алгоритм со временем работы O(nv), выясняющий, возможна ли уплата.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как решить предыдущую задачу, если каждая купюра имеется в единственном экземпляре? (Например, купюрами в 1, 5, 10, 20 рублей можно заплатить 16 = 1 + 5 + 10 и 31 = 1 + 10 + 20 рублей, но не 40 (не хватит денег). Время работы алгоритма по-прежнему O(nv).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Ещё один вариант той же задачи: купюр каждого типа сколько угодно, но всего разрешается использовать не более k купюр. (Например, если есть купюры в 5 и 10 рублей, а k = 6, то 55 разменять можно, а 65 –– нет).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Перемножение цепочки матриц. Оптимальное бинарное дерево поиска (начало) (09.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о перемножении цепочки матриц. Постановка задачи.Пример. Нисходящий алгоритм.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.2 Перемножение цепочки матриц, стр. 403]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 9 (до 24.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Найдите оптимальную расстановку скобок в произведении последовательности матриц, размерности которых равны 5×10, 10×3, 3×12, 12×5, 5×50, 50×6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Напишите восходящий алгоритм для поиска оптимальной расстановки скобок.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Расстановка пробелов. Оптимальное бинарное дерево поиска (середина) (12.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о расстановке пробелов. Постановка задачи. Решения для трёх случаев: 1. нужно вернуть можно ли разбить текст на слова; 2. вернуть разбивку на слова; 3. слова встречаются не равновероятно, вернуть наиболее вероятную разбивку на слова.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи. Вывод математического ожидания времени поиска.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Праздничное домашнее задание 10 (до 02.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[&amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;,&amp;quot;, &amp;quot;.&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;,&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;.&amp;quot;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Подсказка:&#039;&#039;&#039; разбейте текст на слова из списка и посмотрите на азбуку Морзе.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Способы представления графов в памяти (16.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Разбор ошибок в домашнем задании.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Графы. Способы представления графов в памяти (матрица смежности, список рёбер, список соседей (список смежностей), матрица инцидентности). Зависимость сложности алгоритмов от способа представления.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §22.1 Представление графов, стр. 626]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 11 (до 02.03)===&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача A.]&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача B.]&lt;br /&gt;
# Нарисуйте неориентированный граф с 5 вершинами и 8 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Нарисуйте ориентированный граф с 4 вершинами и 3 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Дан ориентированный граф. &#039;&#039;Исходящая степень вершины v&#039;&#039; --- это количество исходящих из неё рёбер, &#039;&#039;входящая степень v&#039;&#039; --- это количество рёбер входящих в  v. Имеется представление ориентированного графа с использование списка соседей. Как долго будут вычисляться исходящие степени всех вершин графа? А входящие степени?&lt;br /&gt;
# Дан граф G = (V, E). Какие из рассмотренных способов хранения графов используют меньше всего памяти для хранения G и почему? Указание: рассмотрите случаи |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;lt; |E| и |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;gt; |E|.&lt;br /&gt;
# Пусть C --- это матрица смежности графа G.&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
# Пусть B --- это матрица инцидентности ориентированного графа G. Как связаны элементы матрицы BB&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
&lt;br /&gt;
==Реализация поиска в глубину (19.02)==&lt;br /&gt;
# Реализация поиска в глубину и смежных задач.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 12 (до 5.03)===&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Выберите любой способ хранения графа. Реализуйте поиск в глубину.&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Напишите алгоритм, который возвращает данные о том, какие вершины лежат в одной компоненте связности.&lt;br /&gt;
# &#039;&#039;(любой ЯП или псевдокод)&#039;&#039; Напишите алгоритм проверки сильной связности ориентированного графа. Какова его сложность?&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №2==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
Необходимо реализовать 3 задачи из [https://official.contest.yandex.ru/contest/1085 контеста], см. [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing распределение задач]. Каждую задачу можно написать на С++ или Python. На выполнение работы отводится две недели (см. время окончания контеста). [https://official.contest.yandex.ru/contest/1123 Дорешивание.]&lt;br /&gt;
&lt;br /&gt;
==ДП и графы (26.02)==&lt;br /&gt;
==ДП и графы (02.03)==&lt;br /&gt;
==Жадные алгоритмы (12.03)==&lt;br /&gt;
===Домашнее задание 13 (до 23.03)===&lt;br /&gt;
# Вася хочет купить по одной акции каждой компании. Все акции стоят одинаково, но дорожают по-разному. Каждый месяц акция i-ой компании дорожает в r_i раз. В один месяц можно купить только одну акцию.&lt;br /&gt;
## Напишите алгоритм, который выводит оптимальную последовательность покупок (такую, что на покупку всех акций потратится меньше денег).&lt;br /&gt;
## Докажите корректность алгоритма, то есть докажите, что последовательность покупок, которую выводит ваш алгоритм, оптимальна.&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список, очередь (16.03)==&lt;br /&gt;
# Реализация линейного двусвязного списка (С++).&lt;br /&gt;
# Реализация очереди ограниченной длины на базе вектора (С++).&lt;br /&gt;
# Реализация очереди на базе списка (С++).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14 (до 23.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте (на С++) структуру данных Стек. У стека должно быть три операции:&lt;br /&gt;
* push --- положить элемент на вершину стека;&lt;br /&gt;
* pop --- удалить верхний элемент;&lt;br /&gt;
* front --- вернуть значение верхнего элемента.&lt;br /&gt;
Оцените время работы каждой функции.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список (19.03)==&lt;br /&gt;
===Домашнее задание 13* (до 30.03)===&lt;br /&gt;
#Для приведённой реализации класса List (https://yadi.sk/i/c5r_79WdfMyNS).&lt;br /&gt;
## Допишите print, push_back и push_front.&lt;br /&gt;
## В функции insert_after и delete_node вставьте необходимые проверки так, чтобы они работали для крайних случаев.&lt;br /&gt;
## Напишите main в котором&lt;br /&gt;
### создаётся объект класса List, &lt;br /&gt;
### заполняется элементами с помощью функций push_back, push_front и insert_after и&lt;br /&gt;
### удаляется i-ый элемент.&lt;br /&gt;
&lt;br /&gt;
==Повторение (30.03)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Для данных пар функций выясните их связь в терминах O-, o-, Ω-, ω-, Θ-обозначений. Поставьте галочку в клетке с Ω, если f(x) = Ω(g(x)) и прочерк, если равенства нет. [https://ru.wikipedia.org/wiki/«O»_большое_и_«o»_малое#.D0.94.D1.80.D1.83.D0.B3.D0.B8.D0.B5_.D0.BF.D0.BE.D0.B4.D0.BE.D0.B1.D0.BD.D1.8B.D0.B5_.D0.BE.D0.B1.D0.BE.D0.B7.D0.BD.D0.B0.D1.87.D0.B5.D0.BD.D0.B8.D1.8F Википедия]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! f(x)!! g(x)!! O!! o!! Ω!! ω!! Θ&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! 2^100&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n * log(n)&lt;br /&gt;
! 2^100 * n * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n&lt;br /&gt;
! 2^100 * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n!&lt;br /&gt;
! 2^(2015n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n*2^n&lt;br /&gt;
! 3^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 5^n&lt;br /&gt;
! 5^(n+1)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n + n^2 + n^3 + ... + n^1000&lt;br /&gt;
! 7^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм Quickselect нахождения k-ого элемента по возрастанию: http://en.wikipedia.org/wiki/Quickselect&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;На улице стоит ряд домов. В каждом из домов лежит сколько-то денег. Вор хочет обокрасть дома на переулке. Он не может обокрасть два соседних дома, потому что хозяин дома, который он обокрал, сразу предупредит соседей. Нужно найти, какую максимальную сумму вор может украсть с переулка. На вход программы подается массив неотрицательных целых чисел - количество долларов в доме с номером i. Соседние дома в массиве представлены соседними элементами. Например, пусть задан массив { 1, 4, 5 } - тогда вор максимум может украсть $6, обокрав дома 1 и 3. Пусть задан массив { 1, 7, 2 } - тогда вор максимум может украсть $7, обокрав дом 2.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Алфавит из всех маленьких латинских букв и пробела закодирован числами следующим способом:&lt;br /&gt;
  &#039;a&#039; -&amp;gt; 1&lt;br /&gt;
  &#039;b&#039; -&amp;gt; 2&lt;br /&gt;
  &#039;c&#039; -&amp;gt; 3&lt;br /&gt;
  ...&lt;br /&gt;
  &#039;z&#039; -&amp;gt; 26&lt;br /&gt;
  &#039; &#039; -&amp;gt; 27&lt;br /&gt;
На вход программы подается строка из цифр. Нужно посчитать, сколькими способами можно раскодировать эту строку.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Дан граф, заданный матрицей смежности. Вывести пары вершин между которыми нет пути.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Повторение (02.04) ==&lt;br /&gt;
Решали и разбирали первые 4 задачи из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14* (до 11.03)===&lt;br /&gt;
Решите любые две задачи (подпункты НЕ считаются отдельными задачами) с предыдущей пары (Повторение (30.03)).&lt;br /&gt;
&lt;br /&gt;
== Повторение (06.04) ==&lt;br /&gt;
Будем решать вторую половину задач из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 15 (до 16.04)===&lt;br /&gt;
# Приведите пример графа, который содержит отрицательные рёбра, не содержит циклов отрицательного веса и для которого алгоритм Дейкстры возвращает неверный результат.&lt;br /&gt;
# Используется ли в алгоритме Дейкстры то, что веса рёбер неотрицательны? Если &amp;quot;да&amp;quot;, то где именно?&lt;br /&gt;
# Пусть граф содержит рёбра с весами &amp;gt;= -100. Если прибавить к каждому ребру 101 и при помощи алгоритма Дейкстры найти кратчайшие пути. Будут ли эти пути кратчайшими в исходном графе? Почему?&lt;br /&gt;
&lt;br /&gt;
== Повторение (07.04) ==&lt;br /&gt;
&#039;&#039;&#039;Решение рекуррентных соотношений&#039;&#039;&#039;&lt;br /&gt;
# Решите уравнение: T(n) = 4*T(n/2) + O(n^2) с базой T(1) = O(1)&lt;br /&gt;
## Используя основную теорему.&lt;br /&gt;
## Используя дерево рекурсий.&lt;br /&gt;
## Методом подстановки.&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2)) + n является \Theta(n lg n).&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2) + 17) + n является \Theta(n lg n).&lt;br /&gt;
# Решите уравнения, считая, что T(1) = O(1):&lt;br /&gt;
## T(n) = T(n-1) + n&lt;br /&gt;
## T(n) = 2*T(floor(sqrt(n))) + lg n. Указание: попробуйте использовать замену переменных.&lt;br /&gt;
## T(n) = 3*T(sqrt(n)) + lg n&lt;br /&gt;
# Дайте верхнюю и нижнюю оценки функции T(n). Постарайтесь, чтобы оценки были как можно более точные&lt;br /&gt;
## T(n) = 4T(n/3) + n*lg(n)&lt;br /&gt;
## T(n) = 3T(n/3) + n/lg(n)&lt;br /&gt;
## T(n) = 4T(n/2) + n^2*sqrt(n)&lt;br /&gt;
## T(n) = T(n/2) + T(n/4) + T(n/8) + n&lt;br /&gt;
## T(n) = T(n-1) + 1/n&lt;br /&gt;
## T(n) = T(n-2) + 1/lg(n)&lt;br /&gt;
## T(n) = sqrt(n) * T(sqrt(n)) + n&lt;br /&gt;
&#039;&#039;&#039;Анализ и построение алгоритмов&#039;&#039;&#039;&lt;br /&gt;
# Числа Фибоначчи F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; можно выразить через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, используя матрицу: https://yadi.sk/i/Pm_aNzHCforFU. &lt;br /&gt;
## Покажите как вычислить F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;.&lt;br /&gt;
## Как вычислить F&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;n+1&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;?&lt;br /&gt;
## Напишите алгоритм.&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
## Ускорьте его так, чтобы он работал за O(log n).&lt;br /&gt;
# Дана последовательность символов. Какое минимальное количество символов нужно удалить из неё, чтобы получить палиндром?&lt;br /&gt;
## Напишите алгоритм (на псевдокоде или на любом языке программирования).&lt;br /&gt;
## Оцените время работы алгоритма.&lt;br /&gt;
# Какую структуру данных вы бы использовали для реализации упорядоченного множества (http://neerc.ifmo.ru/wiki/index.php?title=Упорядоченное_множество)? Какая будет сложность каждой из операций над множеством?&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 16 (до 20.04)===&lt;br /&gt;
# Решите 6 задач из первой части и 6 из второй. (Укажите какие именно.) Каждый из подпунктов является отдельной задачей.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм и теорема Форда-Фалкерсона (16.04)==&lt;br /&gt;
# Базовые определения (пропускные способности, сток, исток и пр.). Пример. &lt;br /&gt;
# Ограничения на поток (сохранение и что меньше пропускных способностей).&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, пример работы&lt;br /&gt;
# Разрез, определение, пример.&lt;br /&gt;
# Утверждение: максимальный поток &amp;lt;= любого разреза.&lt;br /&gt;
# Теорема Форда-Фалкерсона (с доказательством).&lt;br /&gt;
# Пример на котором алгоритм Форда-Фалкерсонаработает работает очень долго при неудачном выборе путей.&lt;br /&gt;
# Сложность алгоритма Форда-Фалкерсона.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №3==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
В [https://official.contest.yandex.ru/contest/1196 домашнем задании] пять задач. Они разделены на два варианта, помеченные римскими цифрами I и II. Свой вариант нужно узнать [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing здесь на вкладке HW3]. Третья задача — общая для двух вариантов; ее решение необходимо снабдить доказательством корректности алгоритма. На выполнение задания дается примерно 2 недели (см. точное время окончания в контесте). Каждую задачу можно написать на С++ или Python.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Форда-Фалкерсона и Эдмондса-Карпа (20.04)==&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, напоминание: базовые определения, пример работы, пример на котором алгоритм работает долго, сложность.&lt;br /&gt;
# Алгоритм Эдмодса-Карпа. Доказательство асимптотики времени работы.&lt;br /&gt;
&lt;br /&gt;
==(23.04)==&lt;br /&gt;
&lt;br /&gt;
==(11.05) Красно-чёрные деревья==&lt;br /&gt;
[https://ru.wikipedia.org/wiki/Красно-чёрное_дерево Красно-чёрное дерево]&lt;br /&gt;
===Домашнее задание 17 (до 18.05)===&lt;br /&gt;
# Зачем нужны красно-чёрные деревья?&lt;br /&gt;
# Благодаря какому свойству и почему красно-чёрное дерево является сбалансированным?&lt;br /&gt;
# Нарисуйте полное бинарное дерево поиска высотой 3 с ключами {1, 2, ..., 15}. Сделайте из него красно-чёрные деревья высотой 2, 3 и 4.&lt;br /&gt;
# Нарисуйте красно-чёрные деревья, получающиеся последовательной вставкой элементов 12, 10, 29, 30, 31, 32 в [https://ru.wikipedia.org/wiki/Красно-чёрное_дерево#/media/File:Red-black_tree_example.svg данное дерево]. Для вставки используйте алгоритм вставки из Википедии. Укажите какой именно функцией вы воспользовались.&lt;br /&gt;
# Определим &#039;&#039;&#039;ослабленное красно-чёрное дерево&#039;&#039;&#039; как бинарное дерево поиска, которое удовлетворяет красно-чёрным свойствам 1, 3, 4 и 5. Другими словами, корень может быть как чёрным, так и красным. Рассмотрите ослабленное красно-чёрное дерево T, корень которого красный. Если перекрасить корень дерева T в чёрный, будет ли оно красно-чёрным деревом?&lt;br /&gt;
# Покажите, что самый длинный простой нисходящий путь от вершины x к листу красно-черного дерева имеет длину, не более чем в два раза превышающую кратчайший путь от x к листу-потомку.&lt;br /&gt;
# Чему равно наибольшее возможное количество внутренних узлов в красно-чёрном дереве с чёрной высоты k? А наименьшее возможное количество?&lt;br /&gt;
# Нарисуйте красно-чёрные деревья, получающиеся последовательной вставкой ключей 41, 38, 31, 12, 19, 8 в изначально пустое дерево.&lt;br /&gt;
# Покажите какие деревья будут получаться в результате последовательного удаления ключей в порядке 8, 12, 19, 31, 38, 41.&lt;br /&gt;
&lt;br /&gt;
==(14.05) Конкурентный анализ самоорганизующихся циклов==&lt;br /&gt;
[https://vk.com/doc12518218_390369758 Конспект лекций]&lt;br /&gt;
&lt;br /&gt;
===Задание 18 (до 21.05)===&lt;br /&gt;
Все вычисления сопроводите подробными объяснениями о том, почему верно то или иное (не)равенство.&lt;br /&gt;
# Пусть имеется n-элементный список и m поисковых запросов к нему. После каждой операции поиска можно переупорядочить список. Обозначим стоимость последовательности поисков через C. Докажите, что в худшем случае C = Ω(mn).&lt;br /&gt;
#  Обозначим через c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; стоимость i-ого поискового запроса с применением эвристики перемещения в начало, которая включает стоимость поиска элемента в списке и стоимость его перемещения в начало списка путём ряда обменов соседних элементов списка. Покажите, что i-ая операция поиска находит элемент x в списке L с применением эвристики перемещения в начало, то c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = 2 * rank&amp;lt;sub&amp;gt;L&amp;lt;/sub&amp;gt;(x) - 1.&lt;br /&gt;
# Покажите, что c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = 2 * rank&amp;lt;sub&amp;gt;L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;.&lt;br /&gt;
# Покажите, что c*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = rank&amp;lt;sub&amp;gt;L*&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt; + t&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;.&lt;br /&gt;
# Докажите, что после одного обмена двух соседних элементов потенциал либо увеличивается на 2, либо уменьшается на 2.&lt;br /&gt;
# Докажите, что rank&amp;lt;sub&amp;gt;L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) = |A| + |B| + 1.&lt;br /&gt;
# Докажите, что rank&amp;lt;sub&amp;gt;L*&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) = |A| + |С| + 1.&lt;br /&gt;
# Покажите, что поиск i-ого элемента приводит к изменению потенциала Ф(L&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;) - Ф(L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;) &amp;lt;= 2 (|A| - |B| + t*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;), где t*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; --- это количество обменов при i-ом поиске.&lt;br /&gt;
# Во сколько раз стоимость С&amp;lt;sub&amp;gt;MFT&amp;lt;/sub&amp;gt;(S) превышает C&amp;lt;sub&amp;gt;OPT&amp;lt;/sub&amp;gt;(S)?&lt;/div&gt;</summary>
		<author><name>Kassalanche</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2016&amp;diff=12189</id>
		<title>Алгоритмы и структуры данных 2016</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2016&amp;diff=12189"/>
		<updated>2015-05-14T06:06:49Z</updated>

		<summary type="html">&lt;p&gt;Kassalanche: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== О курсе ===&lt;br /&gt;
Лектор: Объедков Сергей Александрович&lt;br /&gt;
&lt;br /&gt;
== Лекции ==&lt;br /&gt;
[http://t-arxiv.appspot.com/ &#039;&#039;&#039;Конспект Ярослава Сергиенко.&#039;&#039;&#039;]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;13 января:&#039;&#039;&#039; Сортировка вставкой и слиянием. Использование инварианта цикла при доказательстве корректности сортировки вставкой.  Θ- и &#039;&#039;O&#039;&#039;-обозначения. Оценка сложности алгоритмов. Рекуррентные соотношения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;16 января:&#039;&#039;&#039; &#039;&#039;О&#039;&#039;-, &#039;&#039;o&#039;&#039;-, Ω-, ω-, Θ-обозначения. Быстрая сортировка, время работы в худшем, лучшем и среднем случаях. Оптимальность сортировки слиянием. Сортировка при помощи двоичного дерева поиска и ее связь с быстрой сортировкой.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;20 января:&#039;&#039;&#039; Примеры решения рекуррентных соотношений: решение с использованием дерева рекурсии и методом подстановки. Формулировка и интуитивное объяснение основной теоремы. [https://www.dropbox.com/s/6a0r410zjm9qwe7/algo-3-recurrences.pdf?dl=0 (Конспект.)]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;23 января:&#039;&#039;&#039; Выбор порядковой статистики за время &#039;&#039;O&#039;&#039;(&#039;&#039;n&#039;&#039;): [http://en.wikipedia.org/wiki/Quickselect рандомизированный] и [http://en.wikipedia.org/wiki/Median_of_medians детерминированный] алгоритмы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;27 января:&#039;&#039;&#039; Быстрое возведение в степень по модулю. Алгоритм Карацубы для умножения целых чисел. Алгоритм Штрассена для умножения матриц.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;30 января:&#039;&#039;&#039; [http://en.wikipedia.org/wiki/Closest_pair_of_points_problem#Planar_case Поиск ближайшей пары точек] за время &#039;&#039;O&#039;&#039;(&#039;&#039;n&#039;&#039;log &#039;&#039;n&#039;&#039;). Задача о планировании взвешенных интервалов: рекурсивное решение.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3 февраля:&#039;&#039;&#039; Динамическое программирование. Задача о планировании взвешенных интервалов: рекурсивное решение с мемоизацией и итеративное решение. Свойства задач, эффективно решаемых при помощи динамического программирования: наличие полиномиального числа подзадач, выразимость исходной задачи в терминах подзадач, сводимость больших подзадач к полиномиальному числу меньших подзадач. Выравнивание абзаца по ширине: рекурсивное решение с мемоизацией.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6 февраля:&#039;&#039;&#039; Лекция отменяется из-за болезни преподавателя, но будет компенсирована 11 апреля.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;10 февраля:&#039;&#039;&#039; [https://www.dropbox.com/s/1fa95j4om3kykh6/algo-alignment.pdf?dl=0 Вычисление редакционного расстояния и выравнивание последовательностей].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;12 февраля:&#039;&#039;&#039; Графы: обход в глубину и в ширину, поиск компонент связности в неориентированных графах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;17 февраля:&#039;&#039;&#039; Способы представления графов: матрица смежности и списки смежности. Оценка сложности алгоритмов поиска в ширину и глубину, поиска компонент связности в неориентированных графах. Связность в ориентированных графах, алгоритм проверки сильной связности ориентированного графа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;20 февраля:&#039;&#039;&#039; Топологическая сортировка. Вычисление компонент сильной связности в ориентированном графе.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;24 февраля:&#039;&#039;&#039; Поиск кратчайших путей во взвешенном графе: алгоритмы [http://en.wikipedia.org/wiki/Bellman–Ford_algorithm Беллмана – Форда] и [http://en.wikipedia.org/wiki/Floyd–Warshall_algorithm Флойда – Уоршелла].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;27 февраля:&#039;&#039;&#039; Выполнимость 2-КНФ и [http://en.wikipedia.org/wiki/2-satisfiability#Strongly_connected_components компоненты сильной связности]. Перемножение матриц, поиск пути через промежуточную точку и алгоритм Флойда – Уоршелла.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3 марта:&#039;&#039;&#039; Лекция переносится на 11 апреля.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6 марта:&#039;&#039;&#039; Жадные алгоритмы. Примеры: (1) выбор максимального подмножества непересекающихся интервалов; (2) разбиение множества интервалов на минимальное число подмножеств непересекающихся интервалов; (3) составление плана работ с заданными продолжительностями и крайними сроками выполнения, минимизирующего максимальную задержку. Различные методы доказательства корректности жадных алгоритмов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;10 марта:&#039;&#039;&#039; Алгоритм Дейкстры.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;13 марта:&#039;&#039;&#039; Структуры данных. Массив с операциями инициализации, чтения и  записи, выполняемыми за время O(1). Три подхода к амортизационному анализу: групповой анализ, банковский метод и метод потенциалов (на примере двоичного счетчика).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;17 марта:&#039;&#039;&#039; Реализация приоритетной очереди при помощи двоичной кучи.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;20 марта:&#039;&#039;&#039; Минимальные основные деревья. Алгоритмы Крускала, Прима и Reverse-Delete.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;31 марта:&#039;&#039;&#039; Система непересекающихся множеств.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3 апреля:&#039;&#039;&#039; Сжатие путей в системе непересекающихся множеств. Кластеризация и алгоритм Крускала.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;7 апреля:&#039;&#039;&#039; Жадный алгоритм на матроиде.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;10 апреля:&#039;&#039;&#039; Максимальный поток. Алгоритм Форда – Фалкерсона.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;11 апреля:&#039;&#039;&#039; Алгоритм Эдмондса – Карпа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;14 апреля:&#039;&#039;&#039; Двойственность задач о максимальном потоке и минимальном разрезе. Сведение задачи о максимальном паросочетании в двудольном графе к задаче о максимальном потоке.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;17 апреля:&#039;&#039;&#039; Задача о назначениях (поиск совершенного паросочетания с минимальным весом во взвешенном двудольном графе). Алгоритм, последовательно находящий самые дешевые увеличивающие пути.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;21 апреля:&#039;&#039;&#039; Рандомизированный алгоритм поиска минимального разреза (алгоритм Каргера). Простой рандомизированный алгоритм для вычисления означивания переменных, максимизирующего число истинных дизъюнктов в 3-КНФ: случайное означивание гарантирует истинность 7/8 всех дизъюнктов в среднем.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;24 апреля:&#039;&#039;&#039; Хеш-таблицы. Разрешение коллизий при помощи цепочек. Открытая адресация.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;28 апреля:&#039;&#039;&#039; Сбалансированные деревья поиска. Красно-черные деревья.&lt;br /&gt;
&lt;br /&gt;
== Домашние задания ==&lt;br /&gt;
&lt;br /&gt;
=== Задание 1 ===&lt;br /&gt;
&lt;br /&gt;
Необходимо сдать все 6 задач в данном [https://official.contest.yandex.ru/contest/1002 контесте]. На выполнение задания дается 2 недели (см. точное время окончания в контесте). Условия ревью определяют семинаристы.&lt;br /&gt;
&lt;br /&gt;
=== Задание 2 ===&lt;br /&gt;
&lt;br /&gt;
[https://official.contest.yandex.ru/contest/1085 Контест]. В домашнем задании пять задач, из которых нужно решить три, назначенные преподавателем, ведущим семинарские занятия в вашей группе. На выполнение задания дается примерно 2 недели (см. точное время окончания в контесте). Условия ревью определяют семинаристы. [https://official.contest.yandex.ru/contest/1123 Дорешивание.]&lt;br /&gt;
&lt;br /&gt;
=== Задание 3 ===&lt;br /&gt;
&lt;br /&gt;
[https://official.contest.yandex.ru/contest/1196 Контест]. В домашнем задании пять задач. Они разделены на два варианта, помеченные римскими цифрами I и II. Свой вариант нужно узнать у семинариста. Третья задача — общая для двух вариантов; ее решение необходимо снабдить доказательством корректности алгоритма. На выполнение задания дается примерно 2 недели (см. точное время окончания в контесте). Условия ревью определяют семинаристы. &lt;br /&gt;
&lt;br /&gt;
== Контрольная работа ==&lt;br /&gt;
&lt;br /&gt;
Контрольная работа состоится 11 апреля в 13:40 – 15:00 в ауд. 622. [https://www.dropbox.com/s/uj2m9xdueq57y9o/sample.pdf?dl=0 Примеры задач] (и [https://www.dropbox.com/s/szdymvchx74b731/sample-solved.pdf?dl=0 решений])].&lt;br /&gt;
&lt;br /&gt;
== Семинары ==&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппа 101-1|Подгруппа 101-1.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппа 101-2|Подгруппа 101-2.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппы 102-1, 102-2, 107-2|Подгруппа 102-1.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппы 102-1, 102-2, 107-2|Подгруппа 102-2.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппа 103-1|Подгруппа 103-1.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппа 105-1|Подгруппа 105-1.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппа 106-1|Подгруппа 106-1.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппа 106-2|Подгруппа 106-2.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппа 107-1|Подгруппа 107-1.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппы 102-1, 102-2, 107-2|Подгруппа 107-2.]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Рекомендуемая литература ==&lt;br /&gt;
# Кормен, Лейзерсон, Ривест, Штайн. Алгоритмы: построение и анализ ([https://vk.com/doc4262442_326131655?hash=9d6945b570241aa338&amp;amp;dl=681b57216bf37463e9 3-е изд.], [http://librarun.org/book/4121/1 2-е изд.], [http://e-maxx.ru/bookz/files/cormen.pdf  1-е изд.])&lt;br /&gt;
# [https://dl.dropboxusercontent.com/u/829163/draft.pdf Дасгупта, Пападимитриу, Вазирани. Алгоритмы] ([http://beust.com/algorithms.pdf оригинал] | [http://biblio.mccme.ru/node/5066/shop купить])&lt;br /&gt;
&lt;br /&gt;
== Полезные ссылки ==&lt;br /&gt;
# [[Reviewboard|Инструкция по использованию Review Board.]]&lt;/div&gt;</summary>
		<author><name>Kassalanche</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=12182</id>
		<title>Алгоритмы и структуры данных. Подгруппа 105-1</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=12182"/>
		<updated>2015-05-14T05:50:01Z</updated>

		<summary type="html">&lt;p&gt;Kassalanche: /* Задание 18 (до 21.05) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==О курсе==&lt;br /&gt;
[[Алгоритмы_и_структуры_данных|План лекций и список рекомендуемой литературы.]]&lt;br /&gt;
&lt;br /&gt;
[[Алгоритмы_и_структуры_данных._Подгруппа_105-1._FAQ|FAQ.]]&lt;br /&gt;
&lt;br /&gt;
[[Reviewboard|Инструкция по использованию Reviewboard.]]&lt;br /&gt;
&lt;br /&gt;
[[Практические_занятия_по_курсу_ОиМП/C++_check|Style guide.]]&lt;br /&gt;
&lt;br /&gt;
==Итоговая оценка за курс==&lt;br /&gt;
Итоговая оценка (ИО) зависит от&lt;br /&gt;
* оценок за пять больших домашних заданий (БДЗ1, БДЗ2, ..., БДЗ5),&lt;br /&gt;
* оценок за домашние задания (ДЗ1, ДЗ2, ...),&lt;br /&gt;
* оценки за контрольную работу (КР),&lt;br /&gt;
* оценки за экзамен (ЭКЗ),&lt;br /&gt;
и может быть вычислена по формуле:&lt;br /&gt;
 ИО = 0.7 * (0.3 * КР + 0.7 *(ИДЗ1 + ИДЗ2 + ИДЗ3 + ИДЗ4 + ИДЗ5)/5) + 0.3 * ЭКЗ =&lt;br /&gt;
    = 0.21*КР + 0.98*ИДЗ1 + 0.98*ИДЗ2 + 0.98*ИДЗ3 + 0.98*ИДЗ4 + 0.98*ИДЗ5 + 0.3*ЭКЗ,&lt;br /&gt;
где&lt;br /&gt;
 ИДЗi = min (10, 0.7 * БДЗi + 0.4 * &amp;lt;cредняя оценка за ДЗj, прошедшие с предыдущего БДЗ по i-ое&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
==Порядок сдачи домашних работ==&lt;br /&gt;
===Большие домашние работы===&lt;br /&gt;
# Получить OK за задачу в контесте.&lt;br /&gt;
# Залить исходный код на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* На каждую задачу создавайте отдельный запрос на ревью. &lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении суток приходят замечания к коду. &#039;&#039;&#039;Если в течении суток замечаний или Ship It не появилось, проверьте, что вы правильно отправили запрос и, если всё сделано правильно, спросите у семинариста получил ли он запрос.&#039;&#039;&#039;&lt;br /&gt;
# Вы их исправляете, проверяете в контесте, что программа по-прежнему проходит все тесты, заливаете новую версию в Review Board. Штрафов за посылки НЕ будет.&lt;br /&gt;
# Процесс повторяется пока остаются замечания к коду или пока не истёк дедлайн. После закрытия контеста будут ещё одни сутки на доработку замечаний в Review Board.&lt;br /&gt;
# Оценивается только последняя версия работы в Review Board.&lt;br /&gt;
&lt;br /&gt;
===Маленькие домашние работы===&lt;br /&gt;
# Залить решение на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* Желаемые форматы: txt, py, cpp, h. Допускаются любые другие.&lt;br /&gt;
#* На каждую домашнюю работу создавайте отдельный запрос на ревью. Обязательно указывайте номер домашней работы.&lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении неопределенного промежутка времени придут оценки по каждому из заданий.&lt;br /&gt;
&lt;br /&gt;
==Оценивание домашних работ==&lt;br /&gt;
* Все задания предполагаются индивидуальными. Запрещены любые заимствования без ссылки на автора.&lt;br /&gt;
* Решения после установленного дедлайна не принимаются. Дедлайн указан в заголовке каждого задания.&lt;br /&gt;
* Везде, где требуется написать алгоритм, можно использовать любой язык программирования или псевдокод.&lt;br /&gt;
* Там, где требуется построить алгоритм с заданной асимптотикой, приведите обоснование, что полученный алгоритм удовлетворяет этому условию.&lt;br /&gt;
* Эти правила не действуют, если в задании явно оговорено иное.&lt;br /&gt;
&lt;br /&gt;
==Мотивация к изучению алгоритмов. Подсчёт числа операций (12.01)==&lt;br /&gt;
# Числа Фибоначчи. Определение. Примитивный рекурсивный алгоритм вычисления i-ого числа. Оценка числа операций. Анализ причин неэффективности. Алгоритм с запоминанием вычисленных ранее значений. Оценка числа операций. Сравнение с предыдущим. (подробнее: глава 0, страницы 8-10 из книги &amp;lt;&amp;lt;Алгоритмы&amp;gt;&amp;gt;, [[Алгоритмы_и_структуры_данных|см. список рекомендованной литературы]])&lt;br /&gt;
# Задача о ханойской башне. Постановка задачи. Рекурсивный алгоритм. Рекуррентная формула для числа перемещений. Замкнутая формула для числа перемещений (+ доказательство). Доказательство того, что эту задачу нельзя решить используя меньшее число перемещений дисков. ([https://www.dropbox.com/s/t8cbs7ttu4iasvj/algo-0-recursion.pdf?dl=0 Разбор задачи о ханойской башне], автор Сергей Объедков)&lt;br /&gt;
# Сортировка пузырьком. Алгоритм. Подсчёт количество операций сравнения и обмена (swap). Анализ наилучшего и наихудшего случаев ([https://ru.wikipedia.org/wiki/Сортировка_пузырьком Википедия])&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 1 (12.01 - 26.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
Во всех задачах, если не оговорено иного, предполагаем, что работаем с целыми неотрицательными числами. Для первых 7 задач необходимо&lt;br /&gt;
* описать что можно считать наилучшим и наихудшим случаями,&lt;br /&gt;
* для каждого из двух случаев подсчитать отдельно количество операций сравнения и swap (если есть).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Даны три числа, требуется вернуть наименьшее.&lt;br /&gt;
# Даны три числа, требуется отсортировать их.&lt;br /&gt;
# Дана последовательность A из n элементов и число x, требуется найти элемент равный x. Примечание: если таких значений i несколько, вернуть любое; если такого элемента нет, функция должна сообщить об этом.&lt;br /&gt;
# * Дана упорядоченная последовательность A из n элементов и число x, требуется найти такое i, что A[i] равно x. Алгоритм должен быть эффективней, чем в предыдущем пункте и использовать то, что последовательность упорядочена.&lt;br /&gt;
# Дана последовательность из 100 000 чисел от 0 до 100. Напишите эффективный алгоритм сортировки, который бы учитывал специфику входных данных.&lt;br /&gt;
# * Дано 32 битное неотрицательное число. Требуется номер первого ненулевого бит. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения, считая, что числа распределены равномерно.&lt;br /&gt;
# * Даны 32 битные неотрицательные числа m и n. Требуется вывести True, если m &amp;lt; n, иначе False. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения битов, считая, что числа распределены равномерно.&lt;br /&gt;
# Напишите рекурсивную функцию, вычисляющую n-ое число Фибоначчи (как на занятии). Подсчитайте количество рекурсивных вызовов.&lt;br /&gt;
# * Напишите функцию, вычисляющую n-ое число Фибоначчи, у которой число операций — полином от n, и которая использует количество памяти, независящее от n.&lt;br /&gt;
&lt;br /&gt;
==O-символика и стратегия &amp;quot;разделяй и властвуй&amp;quot; (15.01)==&lt;br /&gt;
# Сортировка слиянием. Алгоритм, рекуррентное соотношение для времени сортировки, сложность. Подробнее: [https://dl.dropboxusercontent.com/u/829163/draft.pdf §2.3 Сортировка слиянием (стр. 54)].&lt;br /&gt;
# О-символика. [https://dl.dropboxusercontent.com/u/829163/draft.pdf §0.3 О-символика (стр. 10)].&lt;br /&gt;
# Задача о слиянии m упорядоченных массивов по n элементов. Три алгоритма решения: последовательное слияние, слияние &amp;quot;деревом&amp;quot; (обе функции используют Merge из MergeSort), аналог Merge для m массивов. Анализ сложности каждого из них.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 2 (15.01-29.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
* Во всех задачах, если не оговорено иного, для простоты &#039;&#039;можно&#039;&#039; считать, что n является степенью какого-либо числа, например, степенью двойки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Дана функция F, определённая ниже. Сколько строк она напечатает? Указание: для обоих подпунктов рассмотрите два случая: 1. n является степенью двойки, 2. n не является степенью двойки.&lt;br /&gt;
## Запишите рекуррентное соотношение для числа строк.&lt;br /&gt;
## Решите уравнение, полученное в предыдущем пункте, то есть, выведите замкнутую (нерекуррентную формулу). Для простоты можно считать, что n является степенью двойки.&lt;br /&gt;
# В массиве A размера n записана возрастающая последовательность целых чисел. Постройте алгоритм типа &amp;quot;разделяй и властвуй&amp;quot;, который проверяет, существует ли такой индекс i, что A[i] = i&lt;br /&gt;
## за время O(n),&lt;br /&gt;
## * за время O(log n).&lt;br /&gt;
## Какие случаи для вашего алгоритма являются наихудшими и наилучшими? Какого время работы в лучшем и худшем случаях?&lt;br /&gt;
# Дан бесконечный массив A, первые n элементов которого содержат возрастающую последовательность положительных чисел, а дальше стоят -1. Значение n не дано. Постройте алгоритм, который получает на вход целое число x и находит это x в массиве --- или говорит, что там его нет, &lt;br /&gt;
## за время O(n),&lt;br /&gt;
## за время O(log n).&lt;br /&gt;
# Рассмотрим алгоритм вычисления наибольшего общего делителя (НОД) двух положительных чисел, основанный на методе &amp;quot;разделяй и властвуй&amp;quot;.&lt;br /&gt;
## (задание не оценивается) Прочитайте [https://dl.dropboxusercontent.com/u/829163/draft.pdf §1.2.3 Алгоритм Евклида (стр. 23)].&lt;br /&gt;
## * Докажите, что определение НОД-а, приведённое ниже, корректно.&lt;br /&gt;
## Постройте алгоритм, основанный на этом определении.&lt;br /&gt;
## Какой алгоритм будет быстрее для n-битовых чисел a и b при больших значениях n --- ваш или алгоритм Евклида?&lt;br /&gt;
# * Покажите как за время O(n log n) удалить из массива размера n все дубликаты, то есть оставить каждый элемент в одном экземпляре.&lt;br /&gt;
# * Даны два упорядоченных массива размера m и n. Постройте алгоритм, находящий k-й по величине элемент в объединении этих массивов за время O(log(n+m)). &lt;br /&gt;
&lt;br /&gt;
Функция F(n).&lt;br /&gt;
  если n &amp;gt; 1:&lt;br /&gt;
    напечатать &amp;quot;всё ещё работаю&amp;quot;&lt;br /&gt;
    F(n/2)&lt;br /&gt;
    F(n/2)&lt;br /&gt;
&lt;br /&gt;
Определение НОД-а.&lt;br /&gt;
             2НОД(a/2, b/2), если а и b чётны,&lt;br /&gt;
  НОД(a,b) = НОД(a, b/2), если а нечётно, b чётно,&lt;br /&gt;
             НОД((a-b)/2, b), если а и b нечётны.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;lt;nowiki&amp;gt;Задачи взяты из книги &amp;quot;Алгоритмы&amp;quot;, глава 2 (см. список рекомендованной литературы).&amp;lt;/nowiki&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Сложение и умножение (19.01)==&lt;br /&gt;
# Алгоритм сложения, его сложность (§1.1.1 Сложение*)&lt;br /&gt;
# &amp;quot;Школьный&amp;quot; алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Рекурсивный алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Алгоритм умножения, реализующий стратегию &amp;quot;разделяй и властвуй&amp;quot;, анализ сложности (§2.1 Умножение чисел*)&lt;br /&gt;
 * [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать.]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 3 (19.01 - 2.02)===&lt;br /&gt;
* Во всех задачах для простоты можно считать, что n является степенью какого-либо числа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Найдите произведение чисел 10011011 и 10111010 (в двоичной системе счисления), используя алгоритм умножения чисел, основанный на методе «разделяй и властвуй». Необходимо не только дать ответ, но и привести ход решения.&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 3 рекурсивных вызова для подзадач размера n-1 и комбинирует из них решение исходной задачи за О(n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте три верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 10 рекурсивных вызовов для подзадач размера n/2 и комбинирует из них решение исходной задачи за О(5n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте два верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Докажите, что 3m² + m = O(m²).&lt;br /&gt;
# Докажите, что lg m = O(m/1000), где lg m — это логарифм с двоичным основанием.&lt;br /&gt;
# Докажите, что из равенства f(n) = O(g(n)) не следует, что g(n) = O(f(n)).&lt;br /&gt;
# Докажите, что O(m) содержится в O(m²).&lt;br /&gt;
&lt;br /&gt;
==Решение рекуррентных уравнений (22.01)==&lt;br /&gt;
# Примеры решений рекуррентных уравнений (см. [https://www.dropbox.com/s/6a0r410zjm9qwe7/algo-3-recurrences.pdf?dl=0 конспект]).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 4 (до 14.02)===&lt;br /&gt;
* Нельзя использовать утверждение основной теоремы о решении рекуррентных соотношений.&lt;br /&gt;
* &#039;&#039;Можно&#039;&#039; использовать метод построения дерева рекурсии или подстановку (метод с угадыванием ответа).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Какой из трёх приведённых ниже алгоритмов вы бы предпочли? Обоснуйте свой ответ.&lt;br /&gt;
#* Алгоритм A, решая задачу, производит пять рекурсивных вызовов для подзадач вдвое меньшего размера, после чего строит ответ для исходной задачи за линейное время.&lt;br /&gt;
#* Алгоритм B, решая задачу размера n, делает два рекурсивных вызова для задач размера n − 1, после чего находит ответ за время O(1).&lt;br /&gt;
#* Алгоритм C, решая задачу размера n, рекурсивно решает девять задач размера n/3 и строит ответ за время O(n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Найдите T(n) в замкнутой форме для любых 7 из 10 приведённых ниже рекуррентных соотношений:&lt;br /&gt;
## T(n) ≤ 2T(n/3) + 1;&lt;br /&gt;
## T(n) ≤ 7T(n/7) + n;&lt;br /&gt;
## T(n) ≤ 9T(n/3) + n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 8T(n/2) + n&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 49T(n/25) + n&amp;lt;sup&amp;gt;3/2&amp;lt;/sup&amp;gt;log n;&lt;br /&gt;
## T(n) ≤ T(n − 1) + 2;&lt;br /&gt;
## T(n) ≤ T(n − 1) + n&amp;lt;sup&amp;gt;c&amp;lt;/sup&amp;gt;, где c ≥ 1 –– константа;&lt;br /&gt;
## T(n) ≤ T(n − 1) + c&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;, где c &amp;gt; 1 –– константа;&lt;br /&gt;
## T(n) ≤ 2T(n − 1) + 1;&lt;br /&gt;
## T(n) ≤ T(sqrt(n)) + 1.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №1==&lt;br /&gt;
Необходимо реализовать все 6 задач из [https://official.contest.yandex.ru/contest/1002 контеста]. Каждую задачу можно писать на С++ или Python. На выполнение работы отводится две недели. Каждая задача оценивается в 10/6 балла. Оценка &#039;&#039;может&#039;&#039; быть снижена за плохой код, но не более чем на 25%.&lt;br /&gt;
&lt;br /&gt;
==Бинарное дерево поиска (26.01)==&lt;br /&gt;
# Определение. Пример.&lt;br /&gt;
# Не модифицирующие алгоритмы: поиск (рекурсивный и итеративный алгоритмы), поиск минимума, inordered обход (вывод значений узлов в отсортированном порядке), поиск следующего по возрастанию.&lt;br /&gt;
# Модифицирующие алгоритмы: вставка (рекурсивная реализация), удаление (только идея).&lt;br /&gt;
 [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 13, стр. 248]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 5 (до 16.02)===&lt;br /&gt;
* Для получения максимальной оценки можно выполнить или все задачи без звёздочки, или задачу со звёздочкой. Преподаватель понимает, что реализацию БДП сложно не найти в интернете, но от копипасты не будет никакой пользы. Напротив, самостоятельная реализация очень полезна и приветствуется, даже если не получится выполнить всех пунктов задания.&lt;br /&gt;
* Задачи с двумя звёздочками необязательны.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Нарисуйте бинарные деревья поиска высотой 2, 3, 4, 5 и 6 для множества ключей {1, 4, 5, 10, 16, 17, 21}. Корень дерева имеет высоту 0.&lt;br /&gt;
# &#039;&#039;&#039;Сортировка с использованием БДП.&#039;&#039;&#039;&lt;br /&gt;
## Какова асимптотическая сложность алгоритма вставки элемента в дерево высоты d? Почему? Назовите наилучший и наиухдший случаи.&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который строит БДП в узлах которого стоят элементы данной последовательности. Можно использовать функцию Insert. Назовите наилучший и наихудший случаи. Есть теорема о том, что полученный алгоритм будет работать в среднем случае за время O(n * log n).&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который выводит их в порядке возрастания. Используйте бинарное дерево поиска. Какова в среднем случае сложность этого алгоритма? Назовите наилучший и наихудший случаи. Какова сложность в наихудшем случае?&lt;br /&gt;
# Напишите функцию GetRoot, которой на вход подаётся указатель на произвольный узел дерева, а она возвращает указатель на корень.&lt;br /&gt;
# Напишите процедуру PrintLeafs, которой на вход подаётся указатель на корень дерева, и она печатает листья дерева&lt;br /&gt;
## по возрастанию,&lt;br /&gt;
## по убыванию.&lt;br /&gt;
# ** Альтернативный обход в порядке возрастания бинарного дерева поиска с n узлами (или центрированный (inordered) обход) можно осуществить путём поиска минимального элемента дерева с помощью функции Minimum с последующий n-1 вызовом функции Next. Каково время работы такого алгоритма?&lt;br /&gt;
# * Реализуйте на С++ структуру данных бинарное дерево поиска, [https://yadi.sk/i/gi2SEStreFfSb используя заготовку].&lt;br /&gt;
## Нарисуйте бинарное дерево поиска, которое строится в функции getTreeExample.&lt;br /&gt;
## Реализуйте следующие алгоритмы: &lt;br /&gt;
### поиск минимума, &lt;br /&gt;
### inordered обход (вывод значений узлов в отсортированном порядке),&lt;br /&gt;
### поиск следующего по возрастанию,&lt;br /&gt;
### вставка элемента в дерево,&lt;br /&gt;
### сортировка последовательности с использованием БДП (дан вектор чисел, необходимо вывести их по возрастанию),&lt;br /&gt;
### ** удаление.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Карацубы, Штрассена. Быстрая сортировка (29.01)==&lt;br /&gt;
# Алгоритм Карацубы.&lt;br /&gt;
# Алгоритм Штрассена. [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать Дасгупту и др., §2.5 Умножение матриц]&lt;br /&gt;
# Быстрая сортировка и доказательство того, что в среднем случае она работает за О(n * log n). [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 8 Быстрая сортировка, стр. 148]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 6 (до 18.02)===&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Пусть мы хотим найти двоичное представление десятичного числа 10&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;. Будем считать, что n --- степень двойки (n = 2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt;).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Pwr2Bin(n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть 1010&lt;br /&gt;
    z = ...&lt;br /&gt;
    вернуть Multiply(z, z)&amp;lt;/source&amp;gt;&lt;br /&gt;
Multiply --- функция, перемножающая два n-битовых двоичных числа x и y по алгоритму Карацубы за O(n&amp;lt;sup&amp;gt;log&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;3&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Пусть мы хотим перевести произвольное десятичное число x в записи которого n=2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; чисел в двоичную систему счисления.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Dec2Bin(x, n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть binary[x]&lt;br /&gt;
    разделить x на два десятичных числа xl и xr из n/2 цифр.&lt;br /&gt;
    вернуть ...&amp;lt;/source&amp;gt;&lt;br /&gt;
Здесь binary --- это массив, содержащий двоичное представление десятичных цифр.&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Докажите, что математическое ожидание времени работы алгоритма быстрой сортировки (усреднение по всем вариантам выбора опорного элемента) на любом входе размера n удовлетворяет соотношению: T(n) ≤ O(n) + 1/n * &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt; (T(i-1) + T(n-i)).&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Найдите решение соотношения из предыдущего пункта.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Динамическое программирование (ДП). Первые примеры (02.01)==&lt;br /&gt;
# Нахождение самой длинной возрастающей подпоследовательности.&lt;br /&gt;
# Нахождение редакционного расстояния (или редакционной стоимости, расстояния Левенштейна).&lt;br /&gt;
# Нахождение представителя большинства.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 7 (до 20.02)===&lt;br /&gt;
* В этом задании везде, где требуется реализовать алгоритм, необходимо привести код на любом языке программирования.&lt;br /&gt;
* Для получения максимальной оценки нужно решить все задачи без звёздочек. Одна решённая задача со звёздочкой заменяет одну задачу без звёздочки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения редакционного расстояния (алгоритм Вагнера — Фишера). Например, редакционное расстояние между словами &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равно 6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения длины наибольшей общей подстроки. Например, длина наибольшей общей подстроки &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равна 8 (&amp;quot;antholog&amp;quot;). Чем больше это значение, тем схожей строки.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Предположим теперь, что сравниваемые строки состоят из символов A, С, G и T; за удаление или вставку мы платим -5; за замену буквы x на y платим w[x, y], где x, y принадлежат множеству {A, С, G, T}, a w — это матрица весов:&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
!-!! A!! G!! C!! T&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! A&lt;br /&gt;
|10||-1||-3||-4&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
!G&lt;br /&gt;
||-1||7||-5||-3&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! C&lt;br /&gt;
||-3||-5||9||0&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! T&lt;br /&gt;
||-4||-3||0||8&lt;br /&gt;
|}&lt;br /&gt;
Тогда выравнивание:&lt;br /&gt;
 AGACTAGTTAC&lt;br /&gt;
 CGA‒‒‒GACGT&lt;br /&gt;
будет иметь следующую оценку:&lt;br /&gt;
 w[A,C] + w[G,G] + w[A,A] + 3*(-5) + w[G,G] + w[T,A] + w[T,C] + w[A,G] + w[C,T] = -3 + 7 + 10 - 3*5 + 7 + (-4) + 0 + (-1) + 0 = 1.&lt;br /&gt;
&lt;br /&gt;
Напишите алгоритм, который находит максимальную стоимость всех возможных выравниваний. Верно ли, что чем больше это значение, тем непохожей строки?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как давно один народ отделился от другого? Кто похожей — итальянец и китаец или якут и эфиоп? На эти вопросы можно отвечать с разных точек зрения — культурной, исторической, лингвистической, ... В последние же годы человечество научилось секвенировать геном, что позволило исследовать этот вопрос с точки зрения генетики. Секвенирование генома — это процесс записи ДНК в виде нуклеотидной последовательности, которая представляет собой последовательность из четырёх символов — A, С, G и T. Существуют базы, которые хранят генетическую информацию о людях из разных стран и континентов, например, [http://www.mtdb.igp.uu.se/ http://www.mtdb.igp.uu.se/ → Download mtDNA sequences]. Чем больше сходство между геномами, тем сильнее родственные связи между их обладателями. Используя решение предыдущего пункта, выполните задания:&lt;br /&gt;
# Определите, кто похожей — итальянец и китаец или якут и эфиоп?&lt;br /&gt;
# Найдите нескольких похожих и нескольких непохожих народностей.&lt;br /&gt;
# * Выберите одну народность. Найдите самых похожих и самых непохожих на неё.&lt;br /&gt;
# * Найдите самые похожие и самые непохожие народности.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Задача о разрезании стержня (05.01)==&lt;br /&gt;
# Постановка задачи.&lt;br /&gt;
# Решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Решение с нахождением максимума по p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Восходящий алгоритм с запоминанием. Вывод длин кусочков стержня. Оценка сложности.&lt;br /&gt;
# Нисходящий алгоритм с запоминанием. Оценка сложности.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.1 Разрезание стержня, стр. 393]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 8 (до 22.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Решая задачу о разрезании стержня мы вначале построили рекурсивное решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt; для всех 1 ≤ i &amp;lt; n. Его сложность описывалась рекуррентной формулой T(n) = n + &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n-1&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt;(T(i) + T(n-i)), T(1) = 1.&lt;br /&gt;
# Объясните эту формулу.&lt;br /&gt;
# Покажите с помощью метода подстановок, что T(n) ≤ 2&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Покажите с помощью контрпримера, что описанная далее жадная стратегия не всегда определяет оптимальный способ разрезания стержня. Определим плотность стержня длиной i как p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;/i, то есть как стоимость единицы его длины. Жадная стратегия для стержня длиной n отрезает от стержня первую часть длиной i, где 1 ≤ i ≤ n, имеющую максимальную плотность. Затем та же жадная стратегия применяется к оставшейся части длиной n-i.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Рассмотрим модификацию задачи разрезания стержня, в которой в дополнение к цене p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; каждого стержня добавляется фиксированная цена разреза c. Теперь прибыль, связанная с решением, представляет собой сумму цен частей стержня минус стоимость разрезов. Разработайте алгоритм динамического программирования для этой модифицированной задачи.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Непрерывным участком называется группа подряд идущих элементов. Например, для последовательности&lt;br /&gt;
 5, 15, −30, 10, −5, 40, 10&lt;br /&gt;
элементы 15, −30, 10 образуют непрерывный участок, а 5, 15, 40 -- нет. Постройте линейный алгоритм для следующей задачи:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Вход: список чисел a1, a2, ... ‌, an.&lt;br /&gt;
Выход: непрерывный участок с максимальной суммой (сумма участка нулевой длины равна нулю).&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Для приведённого примера ответом будет 10, −5, 40, 10 с суммой 55. Какова сложность алгоритма? Почему?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Надо заплатить v рублей, имея купюры в x1, x2, ‌..., xn рублей (купюр каждого типа сколько угодно). Это не всегда возможно (скажем, купюрами в&lt;br /&gt;
10 и 25 рублей можно заплатить 45 рублей, но не 47 и не 15). Постройте основанный на методе динамического программирования алгоритм со временем работы O(nv), выясняющий, возможна ли уплата.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как решить предыдущую задачу, если каждая купюра имеется в единственном экземпляре? (Например, купюрами в 1, 5, 10, 20 рублей можно заплатить 16 = 1 + 5 + 10 и 31 = 1 + 10 + 20 рублей, но не 40 (не хватит денег). Время работы алгоритма по-прежнему O(nv).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Ещё один вариант той же задачи: купюр каждого типа сколько угодно, но всего разрешается использовать не более k купюр. (Например, если есть купюры в 5 и 10 рублей, а k = 6, то 55 разменять можно, а 65 –– нет).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Перемножение цепочки матриц. Оптимальное бинарное дерево поиска (начало) (09.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о перемножении цепочки матриц. Постановка задачи.Пример. Нисходящий алгоритм.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.2 Перемножение цепочки матриц, стр. 403]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 9 (до 24.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Найдите оптимальную расстановку скобок в произведении последовательности матриц, размерности которых равны 5×10, 10×3, 3×12, 12×5, 5×50, 50×6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Напишите восходящий алгоритм для поиска оптимальной расстановки скобок.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Расстановка пробелов. Оптимальное бинарное дерево поиска (середина) (12.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о расстановке пробелов. Постановка задачи. Решения для трёх случаев: 1. нужно вернуть можно ли разбить текст на слова; 2. вернуть разбивку на слова; 3. слова встречаются не равновероятно, вернуть наиболее вероятную разбивку на слова.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи. Вывод математического ожидания времени поиска.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Праздничное домашнее задание 10 (до 02.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[&amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;,&amp;quot;, &amp;quot;.&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;,&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;.&amp;quot;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Подсказка:&#039;&#039;&#039; разбейте текст на слова из списка и посмотрите на азбуку Морзе.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Способы представления графов в памяти (16.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Разбор ошибок в домашнем задании.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Графы. Способы представления графов в памяти (матрица смежности, список рёбер, список соседей (список смежностей), матрица инцидентности). Зависимость сложности алгоритмов от способа представления.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §22.1 Представление графов, стр. 626]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 11 (до 02.03)===&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача A.]&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача B.]&lt;br /&gt;
# Нарисуйте неориентированный граф с 5 вершинами и 8 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Нарисуйте ориентированный граф с 4 вершинами и 3 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Дан ориентированный граф. &#039;&#039;Исходящая степень вершины v&#039;&#039; --- это количество исходящих из неё рёбер, &#039;&#039;входящая степень v&#039;&#039; --- это количество рёбер входящих в  v. Имеется представление ориентированного графа с использование списка соседей. Как долго будут вычисляться исходящие степени всех вершин графа? А входящие степени?&lt;br /&gt;
# Дан граф G = (V, E). Какие из рассмотренных способов хранения графов используют меньше всего памяти для хранения G и почему? Указание: рассмотрите случаи |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;lt; |E| и |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;gt; |E|.&lt;br /&gt;
# Пусть C --- это матрица смежности графа G.&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
# Пусть B --- это матрица инцидентности ориентированного графа G. Как связаны элементы матрицы BB&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
&lt;br /&gt;
==Реализация поиска в глубину (19.02)==&lt;br /&gt;
# Реализация поиска в глубину и смежных задач.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 12 (до 5.03)===&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Выберите любой способ хранения графа. Реализуйте поиск в глубину.&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Напишите алгоритм, который возвращает данные о том, какие вершины лежат в одной компоненте связности.&lt;br /&gt;
# &#039;&#039;(любой ЯП или псевдокод)&#039;&#039; Напишите алгоритм проверки сильной связности ориентированного графа. Какова его сложность?&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №2==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
Необходимо реализовать 3 задачи из [https://official.contest.yandex.ru/contest/1085 контеста], см. [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing распределение задач]. Каждую задачу можно написать на С++ или Python. На выполнение работы отводится две недели (см. время окончания контеста). [https://official.contest.yandex.ru/contest/1123 Дорешивание.]&lt;br /&gt;
&lt;br /&gt;
==ДП и графы (26.02)==&lt;br /&gt;
==ДП и графы (02.03)==&lt;br /&gt;
==Жадные алгоритмы (12.03)==&lt;br /&gt;
===Домашнее задание 13 (до 23.03)===&lt;br /&gt;
# Вася хочет купить по одной акции каждой компании. Все акции стоят одинаково, но дорожают по-разному. Каждый месяц акция i-ой компании дорожает в r_i раз. В один месяц можно купить только одну акцию.&lt;br /&gt;
## Напишите алгоритм, который выводит оптимальную последовательность покупок (такую, что на покупку всех акций потратится меньше денег).&lt;br /&gt;
## Докажите корректность алгоритма, то есть докажите, что последовательность покупок, которую выводит ваш алгоритм, оптимальна.&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список, очередь (16.03)==&lt;br /&gt;
# Реализация линейного двусвязного списка (С++).&lt;br /&gt;
# Реализация очереди ограниченной длины на базе вектора (С++).&lt;br /&gt;
# Реализация очереди на базе списка (С++).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14 (до 23.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте (на С++) структуру данных Стек. У стека должно быть три операции:&lt;br /&gt;
* push --- положить элемент на вершину стека;&lt;br /&gt;
* pop --- удалить верхний элемент;&lt;br /&gt;
* front --- вернуть значение верхнего элемента.&lt;br /&gt;
Оцените время работы каждой функции.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список (19.03)==&lt;br /&gt;
===Домашнее задание 13* (до 30.03)===&lt;br /&gt;
#Для приведённой реализации класса List (https://yadi.sk/i/c5r_79WdfMyNS).&lt;br /&gt;
## Допишите print, push_back и push_front.&lt;br /&gt;
## В функции insert_after и delete_node вставьте необходимые проверки так, чтобы они работали для крайних случаев.&lt;br /&gt;
## Напишите main в котором&lt;br /&gt;
### создаётся объект класса List, &lt;br /&gt;
### заполняется элементами с помощью функций push_back, push_front и insert_after и&lt;br /&gt;
### удаляется i-ый элемент.&lt;br /&gt;
&lt;br /&gt;
==Повторение (30.03)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Для данных пар функций выясните их связь в терминах O-, o-, Ω-, ω-, Θ-обозначений. Поставьте галочку в клетке с Ω, если f(x) = Ω(g(x)) и прочерк, если равенства нет. [https://ru.wikipedia.org/wiki/«O»_большое_и_«o»_малое#.D0.94.D1.80.D1.83.D0.B3.D0.B8.D0.B5_.D0.BF.D0.BE.D0.B4.D0.BE.D0.B1.D0.BD.D1.8B.D0.B5_.D0.BE.D0.B1.D0.BE.D0.B7.D0.BD.D0.B0.D1.87.D0.B5.D0.BD.D0.B8.D1.8F Википедия]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! f(x)!! g(x)!! O!! o!! Ω!! ω!! Θ&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! 2^100&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n * log(n)&lt;br /&gt;
! 2^100 * n * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n&lt;br /&gt;
! 2^100 * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n!&lt;br /&gt;
! 2^(2015n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n*2^n&lt;br /&gt;
! 3^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 5^n&lt;br /&gt;
! 5^(n+1)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n + n^2 + n^3 + ... + n^1000&lt;br /&gt;
! 7^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм Quickselect нахождения k-ого элемента по возрастанию: http://en.wikipedia.org/wiki/Quickselect&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;На улице стоит ряд домов. В каждом из домов лежит сколько-то денег. Вор хочет обокрасть дома на переулке. Он не может обокрасть два соседних дома, потому что хозяин дома, который он обокрал, сразу предупредит соседей. Нужно найти, какую максимальную сумму вор может украсть с переулка. На вход программы подается массив неотрицательных целых чисел - количество долларов в доме с номером i. Соседние дома в массиве представлены соседними элементами. Например, пусть задан массив { 1, 4, 5 } - тогда вор максимум может украсть $6, обокрав дома 1 и 3. Пусть задан массив { 1, 7, 2 } - тогда вор максимум может украсть $7, обокрав дом 2.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Алфавит из всех маленьких латинских букв и пробела закодирован числами следующим способом:&lt;br /&gt;
  &#039;a&#039; -&amp;gt; 1&lt;br /&gt;
  &#039;b&#039; -&amp;gt; 2&lt;br /&gt;
  &#039;c&#039; -&amp;gt; 3&lt;br /&gt;
  ...&lt;br /&gt;
  &#039;z&#039; -&amp;gt; 26&lt;br /&gt;
  &#039; &#039; -&amp;gt; 27&lt;br /&gt;
На вход программы подается строка из цифр. Нужно посчитать, сколькими способами можно раскодировать эту строку.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Дан граф, заданный матрицей смежности. Вывести пары вершин между которыми нет пути.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Повторение (02.04) ==&lt;br /&gt;
Решали и разбирали первые 4 задачи из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14* (до 11.03)===&lt;br /&gt;
Решите любые две задачи (подпункты НЕ считаются отдельными задачами) с предыдущей пары (Повторение (30.03)).&lt;br /&gt;
&lt;br /&gt;
== Повторение (06.04) ==&lt;br /&gt;
Будем решать вторую половину задач из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 15 (до 16.04)===&lt;br /&gt;
# Приведите пример графа, который содержит отрицательные рёбра, не содержит циклов отрицательного веса и для которого алгоритм Дейкстры возвращает неверный результат.&lt;br /&gt;
# Используется ли в алгоритме Дейкстры то, что веса рёбер неотрицательны? Если &amp;quot;да&amp;quot;, то где именно?&lt;br /&gt;
# Пусть граф содержит рёбра с весами &amp;gt;= -100. Если прибавить к каждому ребру 101 и при помощи алгоритма Дейкстры найти кратчайшие пути. Будут ли эти пути кратчайшими в исходном графе? Почему?&lt;br /&gt;
&lt;br /&gt;
== Повторение (07.04) ==&lt;br /&gt;
&#039;&#039;&#039;Решение рекуррентных соотношений&#039;&#039;&#039;&lt;br /&gt;
# Решите уравнение: T(n) = 4*T(n/2) + O(n^2) с базой T(1) = O(1)&lt;br /&gt;
## Используя основную теорему.&lt;br /&gt;
## Используя дерево рекурсий.&lt;br /&gt;
## Методом подстановки.&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2)) + n является \Theta(n lg n).&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2) + 17) + n является \Theta(n lg n).&lt;br /&gt;
# Решите уравнения, считая, что T(1) = O(1):&lt;br /&gt;
## T(n) = T(n-1) + n&lt;br /&gt;
## T(n) = 2*T(floor(sqrt(n))) + lg n. Указание: попробуйте использовать замену переменных.&lt;br /&gt;
## T(n) = 3*T(sqrt(n)) + lg n&lt;br /&gt;
# Дайте верхнюю и нижнюю оценки функции T(n). Постарайтесь, чтобы оценки были как можно более точные&lt;br /&gt;
## T(n) = 4T(n/3) + n*lg(n)&lt;br /&gt;
## T(n) = 3T(n/3) + n/lg(n)&lt;br /&gt;
## T(n) = 4T(n/2) + n^2*sqrt(n)&lt;br /&gt;
## T(n) = T(n/2) + T(n/4) + T(n/8) + n&lt;br /&gt;
## T(n) = T(n-1) + 1/n&lt;br /&gt;
## T(n) = T(n-2) + 1/lg(n)&lt;br /&gt;
## T(n) = sqrt(n) * T(sqrt(n)) + n&lt;br /&gt;
&#039;&#039;&#039;Анализ и построение алгоритмов&#039;&#039;&#039;&lt;br /&gt;
# Числа Фибоначчи F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; можно выразить через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, используя матрицу: https://yadi.sk/i/Pm_aNzHCforFU. &lt;br /&gt;
## Покажите как вычислить F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;.&lt;br /&gt;
## Как вычислить F&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;n+1&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;?&lt;br /&gt;
## Напишите алгоритм.&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
## Ускорьте его так, чтобы он работал за O(log n).&lt;br /&gt;
# Дана последовательность символов. Какое минимальное количество символов нужно удалить из неё, чтобы получить палиндром?&lt;br /&gt;
## Напишите алгоритм (на псевдокоде или на любом языке программирования).&lt;br /&gt;
## Оцените время работы алгоритма.&lt;br /&gt;
# Какую структуру данных вы бы использовали для реализации упорядоченного множества (http://neerc.ifmo.ru/wiki/index.php?title=Упорядоченное_множество)? Какая будет сложность каждой из операций над множеством?&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 16 (до 20.04)===&lt;br /&gt;
# Решите 6 задач из первой части и 6 из второй. (Укажите какие именно.) Каждый из подпунктов является отдельной задачей.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм и теорема Форда-Фалкерсона (16.04)==&lt;br /&gt;
# Базовые определения (пропускные способности, сток, исток и пр.). Пример. &lt;br /&gt;
# Ограничения на поток (сохранение и что меньше пропускных способностей).&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, пример работы&lt;br /&gt;
# Разрез, определение, пример.&lt;br /&gt;
# Утверждение: максимальный поток &amp;lt;= любого разреза.&lt;br /&gt;
# Теорема Форда-Фалкерсона (с доказательством).&lt;br /&gt;
# Пример на котором алгоритм Форда-Фалкерсонаработает работает очень долго при неудачном выборе путей.&lt;br /&gt;
# Сложность алгоритма Форда-Фалкерсона.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №3==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
В [https://official.contest.yandex.ru/contest/1196 домашнем задании] пять задач. Они разделены на два варианта, помеченные римскими цифрами I и II. Свой вариант нужно узнать [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing здесь на вкладке HW3]. Третья задача — общая для двух вариантов; ее решение необходимо снабдить доказательством корректности алгоритма. На выполнение задания дается примерно 2 недели (см. точное время окончания в контесте). Каждую задачу можно написать на С++ или Python.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Форда-Фалкерсона и Эдмондса-Карпа (20.04)==&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, напоминание: базовые определения, пример работы, пример на котором алгоритм работает долго, сложность.&lt;br /&gt;
# Алгоритм Эдмодса-Карпа. Доказательство асимптотики времени работы.&lt;br /&gt;
&lt;br /&gt;
==(23.04)==&lt;br /&gt;
&lt;br /&gt;
==(11.05) Красно-чёрные деревья==&lt;br /&gt;
[https://ru.wikipedia.org/wiki/Красно-чёрное_дерево Красно-чёрное дерево]&lt;br /&gt;
===Домашнее задание 17 (до 18.05)===&lt;br /&gt;
# Зачем нужны красно-чёрные деревья?&lt;br /&gt;
# Благодаря какому свойству и почему красно-чёрное дерево является сбалансированным?&lt;br /&gt;
# Нарисуйте полное бинарное дерево поиска высотой 3 с ключами {1, 2, ..., 15}. Сделайте из него красно-чёрные деревья высотой 2, 3 и 4.&lt;br /&gt;
# Нарисуйте красно-чёрные деревья, получающиеся последовательной вставкой элементов 12, 10, 29, 30, 31, 32 в [https://ru.wikipedia.org/wiki/Красно-чёрное_дерево#/media/File:Red-black_tree_example.svg данное дерево]. Для вставки используйте алгоритм вставки из Википедии. Укажите какой именно функцией вы воспользовались.&lt;br /&gt;
# Определим &#039;&#039;&#039;ослабленное красно-чёрное дерево&#039;&#039;&#039; как бинарное дерево поиска, которое удовлетворяет красно-чёрным свойствам 1, 3, 4 и 5. Другими словами, корень может быть как чёрным, так и красным. Рассмотрите ослабленное красно-чёрное дерево T, корень которого красный. Если перекрасить корень дерева T в чёрный, будет ли оно красно-чёрным деревом?&lt;br /&gt;
# Покажите, что самый длинный простой нисходящий путь от вершины x к листу красно-черного дерева имеет длину, не более чем в два раза превышающую кратчайший путь от x к листу-потомку.&lt;br /&gt;
# Чему равно наибольшее возможное количество внутренних узлов в красно-чёрном дереве с чёрной высоты k? А наименьшее возможное количество?&lt;br /&gt;
# Нарисуйте красно-чёрные деревья, получающиеся последовательной вставкой ключей 41, 38, 31, 12, 19, 8 в изначально пустое дерево.&lt;br /&gt;
# Покажите какие деревья будут получаться в результате последовательного удаления ключей в порядке 8, 12, 19, 31, 38, 41.&lt;br /&gt;
&lt;br /&gt;
==(14.05) Конкурентный анализ самоорганизующихся циклов==&lt;br /&gt;
[https://vk.com/doc12518218_390369758 Конспект лекций]&lt;br /&gt;
&lt;br /&gt;
===Задание 18 (до 21.05)===&lt;br /&gt;
Все вычисления сопроводите подробными объяснениями о том, почему верно то или иное (не)равенство.&lt;br /&gt;
# Пусть имеется n-элементный список и m поисковых запросов к нему. После каждой операции поиска можно переупорядочить список. Обозначим стоимость последовательности поисков через C. Докажите, что в худшем случае C = Ω(mn).&lt;br /&gt;
#  Обозначим через c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; стоимость i-ого поискового запроса с применением эвристики перемещения в начало, которая включает стоимость поиска элемента в списке и стоимость его перемещения в начало списка путём ряда обменов соседних элементов списка. Покажите, что i-ая операция поиска находит элемент x в списке L с применением эвристики перемещения в начало, то c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = 2 * rank&amp;lt;sub&amp;gt;L&amp;lt;/sub&amp;gt;(x) - 1.&lt;br /&gt;
# Покажите, что c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = 2 * rank&amp;lt;sub&amp;gt;L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;.&lt;br /&gt;
# Покажите, что c*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = rank&amp;lt;sub&amp;gt;L*&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt; + t&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;.&lt;br /&gt;
# Докажите, что после одного обмена двух соседних элементов потенциал либо увеличивается на 2, либо уменьшается на 2.&lt;br /&gt;
# Докажите, что rank&amp;lt;sub&amp;gt;L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) = |A| + |B| + 1.&lt;br /&gt;
# Докажите, что rank&amp;lt;sub&amp;gt;L*&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;(x) = |A| + |С| + 1.&lt;br /&gt;
# Покажите, что поиск i-ого элемента приводит к изменению потенциала&lt;br /&gt;
Ф(L&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;) - Ф(L&amp;lt;sub&amp;gt;i-1&amp;lt;/sub&amp;gt;) &amp;lt;= 2 (|A| - |B| + t*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;), где t*&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; --- это количество обменов при i-ом поиске.&lt;br /&gt;
# Во сколько раз стоимость С&amp;lt;sub&amp;gt;MFT&amp;lt;/sub&amp;gt;(S) превышает C&amp;lt;sub&amp;gt;OPT&amp;lt;/sub&amp;gt;(S)?&lt;/div&gt;</summary>
		<author><name>Kassalanche</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=12140</id>
		<title>Алгоритмы и структуры данных. Подгруппа 105-1</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=12140"/>
		<updated>2015-05-13T23:31:21Z</updated>

		<summary type="html">&lt;p&gt;Kassalanche: /* (11.05) Красно-чёрные деревья */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==О курсе==&lt;br /&gt;
[[Алгоритмы_и_структуры_данных|План лекций и список рекомендуемой литературы.]]&lt;br /&gt;
&lt;br /&gt;
[[Алгоритмы_и_структуры_данных._Подгруппа_105-1._FAQ|FAQ.]]&lt;br /&gt;
&lt;br /&gt;
[[Reviewboard|Инструкция по использованию Reviewboard.]]&lt;br /&gt;
&lt;br /&gt;
[[Практические_занятия_по_курсу_ОиМП/C++_check|Style guide.]]&lt;br /&gt;
&lt;br /&gt;
==Итоговая оценка за курс==&lt;br /&gt;
Итоговая оценка (ИО) зависит от&lt;br /&gt;
* оценок за пять больших домашних заданий (БДЗ1, БДЗ2, ..., БДЗ5),&lt;br /&gt;
* оценок за домашние задания (ДЗ1, ДЗ2, ...),&lt;br /&gt;
* оценки за контрольную работу (КР),&lt;br /&gt;
* оценки за экзамен (ЭКЗ),&lt;br /&gt;
и может быть вычислена по формуле:&lt;br /&gt;
 ИО = 0.7 * (0.3 * КР + 0.7 *(ИДЗ1 + ИДЗ2 + ИДЗ3 + ИДЗ4 + ИДЗ5)/5) + 0.3 * ЭКЗ =&lt;br /&gt;
    = 0.21*КР + 0.98*ИДЗ1 + 0.98*ИДЗ2 + 0.98*ИДЗ3 + 0.98*ИДЗ4 + 0.98*ИДЗ5 + 0.3*ЭКЗ,&lt;br /&gt;
где&lt;br /&gt;
 ИДЗi = min (10, 0.7 * БДЗi + 0.4 * &amp;lt;cредняя оценка за ДЗj, прошедшие с предыдущего БДЗ по i-ое&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
==Порядок сдачи домашних работ==&lt;br /&gt;
===Большие домашние работы===&lt;br /&gt;
# Получить OK за задачу в контесте.&lt;br /&gt;
# Залить исходный код на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* На каждую задачу создавайте отдельный запрос на ревью. &lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении суток приходят замечания к коду. &#039;&#039;&#039;Если в течении суток замечаний или Ship It не появилось, проверьте, что вы правильно отправили запрос и, если всё сделано правильно, спросите у семинариста получил ли он запрос.&#039;&#039;&#039;&lt;br /&gt;
# Вы их исправляете, проверяете в контесте, что программа по-прежнему проходит все тесты, заливаете новую версию в Review Board. Штрафов за посылки НЕ будет.&lt;br /&gt;
# Процесс повторяется пока остаются замечания к коду или пока не истёк дедлайн. После закрытия контеста будут ещё одни сутки на доработку замечаний в Review Board.&lt;br /&gt;
# Оценивается только последняя версия работы в Review Board.&lt;br /&gt;
&lt;br /&gt;
===Маленькие домашние работы===&lt;br /&gt;
# Залить решение на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* Желаемые форматы: txt, py, cpp, h. Допускаются любые другие.&lt;br /&gt;
#* На каждую домашнюю работу создавайте отдельный запрос на ревью. Обязательно указывайте номер домашней работы.&lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении неопределенного промежутка времени придут оценки по каждому из заданий.&lt;br /&gt;
&lt;br /&gt;
==Оценивание домашних работ==&lt;br /&gt;
* Все задания предполагаются индивидуальными. Запрещены любые заимствования без ссылки на автора.&lt;br /&gt;
* Решения после установленного дедлайна не принимаются. Дедлайн указан в заголовке каждого задания.&lt;br /&gt;
* Везде, где требуется написать алгоритм, можно использовать любой язык программирования или псевдокод.&lt;br /&gt;
* Там, где требуется построить алгоритм с заданной асимптотикой, приведите обоснование, что полученный алгоритм удовлетворяет этому условию.&lt;br /&gt;
* Эти правила не действуют, если в задании явно оговорено иное.&lt;br /&gt;
&lt;br /&gt;
==Мотивация к изучению алгоритмов. Подсчёт числа операций (12.01)==&lt;br /&gt;
# Числа Фибоначчи. Определение. Примитивный рекурсивный алгоритм вычисления i-ого числа. Оценка числа операций. Анализ причин неэффективности. Алгоритм с запоминанием вычисленных ранее значений. Оценка числа операций. Сравнение с предыдущим. (подробнее: глава 0, страницы 8-10 из книги &amp;lt;&amp;lt;Алгоритмы&amp;gt;&amp;gt;, [[Алгоритмы_и_структуры_данных|см. список рекомендованной литературы]])&lt;br /&gt;
# Задача о ханойской башне. Постановка задачи. Рекурсивный алгоритм. Рекуррентная формула для числа перемещений. Замкнутая формула для числа перемещений (+ доказательство). Доказательство того, что эту задачу нельзя решить используя меньшее число перемещений дисков. ([https://www.dropbox.com/s/t8cbs7ttu4iasvj/algo-0-recursion.pdf?dl=0 Разбор задачи о ханойской башне], автор Сергей Объедков)&lt;br /&gt;
# Сортировка пузырьком. Алгоритм. Подсчёт количество операций сравнения и обмена (swap). Анализ наилучшего и наихудшего случаев ([https://ru.wikipedia.org/wiki/Сортировка_пузырьком Википедия])&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 1 (12.01 - 26.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
Во всех задачах, если не оговорено иного, предполагаем, что работаем с целыми неотрицательными числами. Для первых 7 задач необходимо&lt;br /&gt;
* описать что можно считать наилучшим и наихудшим случаями,&lt;br /&gt;
* для каждого из двух случаев подсчитать отдельно количество операций сравнения и swap (если есть).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Даны три числа, требуется вернуть наименьшее.&lt;br /&gt;
# Даны три числа, требуется отсортировать их.&lt;br /&gt;
# Дана последовательность A из n элементов и число x, требуется найти элемент равный x. Примечание: если таких значений i несколько, вернуть любое; если такого элемента нет, функция должна сообщить об этом.&lt;br /&gt;
# * Дана упорядоченная последовательность A из n элементов и число x, требуется найти такое i, что A[i] равно x. Алгоритм должен быть эффективней, чем в предыдущем пункте и использовать то, что последовательность упорядочена.&lt;br /&gt;
# Дана последовательность из 100 000 чисел от 0 до 100. Напишите эффективный алгоритм сортировки, который бы учитывал специфику входных данных.&lt;br /&gt;
# * Дано 32 битное неотрицательное число. Требуется номер первого ненулевого бит. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения, считая, что числа распределены равномерно.&lt;br /&gt;
# * Даны 32 битные неотрицательные числа m и n. Требуется вывести True, если m &amp;lt; n, иначе False. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения битов, считая, что числа распределены равномерно.&lt;br /&gt;
# Напишите рекурсивную функцию, вычисляющую n-ое число Фибоначчи (как на занятии). Подсчитайте количество рекурсивных вызовов.&lt;br /&gt;
# * Напишите функцию, вычисляющую n-ое число Фибоначчи, у которой число операций — полином от n, и которая использует количество памяти, независящее от n.&lt;br /&gt;
&lt;br /&gt;
==O-символика и стратегия &amp;quot;разделяй и властвуй&amp;quot; (15.01)==&lt;br /&gt;
# Сортировка слиянием. Алгоритм, рекуррентное соотношение для времени сортировки, сложность. Подробнее: [https://dl.dropboxusercontent.com/u/829163/draft.pdf §2.3 Сортировка слиянием (стр. 54)].&lt;br /&gt;
# О-символика. [https://dl.dropboxusercontent.com/u/829163/draft.pdf §0.3 О-символика (стр. 10)].&lt;br /&gt;
# Задача о слиянии m упорядоченных массивов по n элементов. Три алгоритма решения: последовательное слияние, слияние &amp;quot;деревом&amp;quot; (обе функции используют Merge из MergeSort), аналог Merge для m массивов. Анализ сложности каждого из них.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 2 (15.01-29.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
* Во всех задачах, если не оговорено иного, для простоты &#039;&#039;можно&#039;&#039; считать, что n является степенью какого-либо числа, например, степенью двойки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Дана функция F, определённая ниже. Сколько строк она напечатает? Указание: для обоих подпунктов рассмотрите два случая: 1. n является степенью двойки, 2. n не является степенью двойки.&lt;br /&gt;
## Запишите рекуррентное соотношение для числа строк.&lt;br /&gt;
## Решите уравнение, полученное в предыдущем пункте, то есть, выведите замкнутую (нерекуррентную формулу). Для простоты можно считать, что n является степенью двойки.&lt;br /&gt;
# В массиве A размера n записана возрастающая последовательность целых чисел. Постройте алгоритм типа &amp;quot;разделяй и властвуй&amp;quot;, который проверяет, существует ли такой индекс i, что A[i] = i&lt;br /&gt;
## за время O(n),&lt;br /&gt;
## * за время O(log n).&lt;br /&gt;
## Какие случаи для вашего алгоритма являются наихудшими и наилучшими? Какого время работы в лучшем и худшем случаях?&lt;br /&gt;
# Дан бесконечный массив A, первые n элементов которого содержат возрастающую последовательность положительных чисел, а дальше стоят -1. Значение n не дано. Постройте алгоритм, который получает на вход целое число x и находит это x в массиве --- или говорит, что там его нет, &lt;br /&gt;
## за время O(n),&lt;br /&gt;
## за время O(log n).&lt;br /&gt;
# Рассмотрим алгоритм вычисления наибольшего общего делителя (НОД) двух положительных чисел, основанный на методе &amp;quot;разделяй и властвуй&amp;quot;.&lt;br /&gt;
## (задание не оценивается) Прочитайте [https://dl.dropboxusercontent.com/u/829163/draft.pdf §1.2.3 Алгоритм Евклида (стр. 23)].&lt;br /&gt;
## * Докажите, что определение НОД-а, приведённое ниже, корректно.&lt;br /&gt;
## Постройте алгоритм, основанный на этом определении.&lt;br /&gt;
## Какой алгоритм будет быстрее для n-битовых чисел a и b при больших значениях n --- ваш или алгоритм Евклида?&lt;br /&gt;
# * Покажите как за время O(n log n) удалить из массива размера n все дубликаты, то есть оставить каждый элемент в одном экземпляре.&lt;br /&gt;
# * Даны два упорядоченных массива размера m и n. Постройте алгоритм, находящий k-й по величине элемент в объединении этих массивов за время O(log(n+m)). &lt;br /&gt;
&lt;br /&gt;
Функция F(n).&lt;br /&gt;
  если n &amp;gt; 1:&lt;br /&gt;
    напечатать &amp;quot;всё ещё работаю&amp;quot;&lt;br /&gt;
    F(n/2)&lt;br /&gt;
    F(n/2)&lt;br /&gt;
&lt;br /&gt;
Определение НОД-а.&lt;br /&gt;
             2НОД(a/2, b/2), если а и b чётны,&lt;br /&gt;
  НОД(a,b) = НОД(a, b/2), если а нечётно, b чётно,&lt;br /&gt;
             НОД((a-b)/2, b), если а и b нечётны.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;lt;nowiki&amp;gt;Задачи взяты из книги &amp;quot;Алгоритмы&amp;quot;, глава 2 (см. список рекомендованной литературы).&amp;lt;/nowiki&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Сложение и умножение (19.01)==&lt;br /&gt;
# Алгоритм сложения, его сложность (§1.1.1 Сложение*)&lt;br /&gt;
# &amp;quot;Школьный&amp;quot; алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Рекурсивный алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Алгоритм умножения, реализующий стратегию &amp;quot;разделяй и властвуй&amp;quot;, анализ сложности (§2.1 Умножение чисел*)&lt;br /&gt;
 * [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать.]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 3 (19.01 - 2.02)===&lt;br /&gt;
* Во всех задачах для простоты можно считать, что n является степенью какого-либо числа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Найдите произведение чисел 10011011 и 10111010 (в двоичной системе счисления), используя алгоритм умножения чисел, основанный на методе «разделяй и властвуй». Необходимо не только дать ответ, но и привести ход решения.&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 3 рекурсивных вызова для подзадач размера n-1 и комбинирует из них решение исходной задачи за О(n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте три верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 10 рекурсивных вызовов для подзадач размера n/2 и комбинирует из них решение исходной задачи за О(5n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте два верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Докажите, что 3m² + m = O(m²).&lt;br /&gt;
# Докажите, что lg m = O(m/1000), где lg m — это логарифм с двоичным основанием.&lt;br /&gt;
# Докажите, что из равенства f(n) = O(g(n)) не следует, что g(n) = O(f(n)).&lt;br /&gt;
# Докажите, что O(m) содержится в O(m²).&lt;br /&gt;
&lt;br /&gt;
==Решение рекуррентных уравнений (22.01)==&lt;br /&gt;
# Примеры решений рекуррентных уравнений (см. [https://www.dropbox.com/s/6a0r410zjm9qwe7/algo-3-recurrences.pdf?dl=0 конспект]).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 4 (до 14.02)===&lt;br /&gt;
* Нельзя использовать утверждение основной теоремы о решении рекуррентных соотношений.&lt;br /&gt;
* &#039;&#039;Можно&#039;&#039; использовать метод построения дерева рекурсии или подстановку (метод с угадыванием ответа).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Какой из трёх приведённых ниже алгоритмов вы бы предпочли? Обоснуйте свой ответ.&lt;br /&gt;
#* Алгоритм A, решая задачу, производит пять рекурсивных вызовов для подзадач вдвое меньшего размера, после чего строит ответ для исходной задачи за линейное время.&lt;br /&gt;
#* Алгоритм B, решая задачу размера n, делает два рекурсивных вызова для задач размера n − 1, после чего находит ответ за время O(1).&lt;br /&gt;
#* Алгоритм C, решая задачу размера n, рекурсивно решает девять задач размера n/3 и строит ответ за время O(n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Найдите T(n) в замкнутой форме для любых 7 из 10 приведённых ниже рекуррентных соотношений:&lt;br /&gt;
## T(n) ≤ 2T(n/3) + 1;&lt;br /&gt;
## T(n) ≤ 7T(n/7) + n;&lt;br /&gt;
## T(n) ≤ 9T(n/3) + n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 8T(n/2) + n&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 49T(n/25) + n&amp;lt;sup&amp;gt;3/2&amp;lt;/sup&amp;gt;log n;&lt;br /&gt;
## T(n) ≤ T(n − 1) + 2;&lt;br /&gt;
## T(n) ≤ T(n − 1) + n&amp;lt;sup&amp;gt;c&amp;lt;/sup&amp;gt;, где c ≥ 1 –– константа;&lt;br /&gt;
## T(n) ≤ T(n − 1) + c&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;, где c &amp;gt; 1 –– константа;&lt;br /&gt;
## T(n) ≤ 2T(n − 1) + 1;&lt;br /&gt;
## T(n) ≤ T(sqrt(n)) + 1.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №1==&lt;br /&gt;
Необходимо реализовать все 6 задач из [https://official.contest.yandex.ru/contest/1002 контеста]. Каждую задачу можно писать на С++ или Python. На выполнение работы отводится две недели. Каждая задача оценивается в 10/6 балла. Оценка &#039;&#039;может&#039;&#039; быть снижена за плохой код, но не более чем на 25%.&lt;br /&gt;
&lt;br /&gt;
==Бинарное дерево поиска (26.01)==&lt;br /&gt;
# Определение. Пример.&lt;br /&gt;
# Не модифицирующие алгоритмы: поиск (рекурсивный и итеративный алгоритмы), поиск минимума, inordered обход (вывод значений узлов в отсортированном порядке), поиск следующего по возрастанию.&lt;br /&gt;
# Модифицирующие алгоритмы: вставка (рекурсивная реализация), удаление (только идея).&lt;br /&gt;
 [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 13, стр. 248]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 5 (до 16.02)===&lt;br /&gt;
* Для получения максимальной оценки можно выполнить или все задачи без звёздочки, или задачу со звёздочкой. Преподаватель понимает, что реализацию БДП сложно не найти в интернете, но от копипасты не будет никакой пользы. Напротив, самостоятельная реализация очень полезна и приветствуется, даже если не получится выполнить всех пунктов задания.&lt;br /&gt;
* Задачи с двумя звёздочками необязательны.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Нарисуйте бинарные деревья поиска высотой 2, 3, 4, 5 и 6 для множества ключей {1, 4, 5, 10, 16, 17, 21}. Корень дерева имеет высоту 0.&lt;br /&gt;
# &#039;&#039;&#039;Сортировка с использованием БДП.&#039;&#039;&#039;&lt;br /&gt;
## Какова асимптотическая сложность алгоритма вставки элемента в дерево высоты d? Почему? Назовите наилучший и наиухдший случаи.&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который строит БДП в узлах которого стоят элементы данной последовательности. Можно использовать функцию Insert. Назовите наилучший и наихудший случаи. Есть теорема о том, что полученный алгоритм будет работать в среднем случае за время O(n * log n).&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который выводит их в порядке возрастания. Используйте бинарное дерево поиска. Какова в среднем случае сложность этого алгоритма? Назовите наилучший и наихудший случаи. Какова сложность в наихудшем случае?&lt;br /&gt;
# Напишите функцию GetRoot, которой на вход подаётся указатель на произвольный узел дерева, а она возвращает указатель на корень.&lt;br /&gt;
# Напишите процедуру PrintLeafs, которой на вход подаётся указатель на корень дерева, и она печатает листья дерева&lt;br /&gt;
## по возрастанию,&lt;br /&gt;
## по убыванию.&lt;br /&gt;
# ** Альтернативный обход в порядке возрастания бинарного дерева поиска с n узлами (или центрированный (inordered) обход) можно осуществить путём поиска минимального элемента дерева с помощью функции Minimum с последующий n-1 вызовом функции Next. Каково время работы такого алгоритма?&lt;br /&gt;
# * Реализуйте на С++ структуру данных бинарное дерево поиска, [https://yadi.sk/i/gi2SEStreFfSb используя заготовку].&lt;br /&gt;
## Нарисуйте бинарное дерево поиска, которое строится в функции getTreeExample.&lt;br /&gt;
## Реализуйте следующие алгоритмы: &lt;br /&gt;
### поиск минимума, &lt;br /&gt;
### inordered обход (вывод значений узлов в отсортированном порядке),&lt;br /&gt;
### поиск следующего по возрастанию,&lt;br /&gt;
### вставка элемента в дерево,&lt;br /&gt;
### сортировка последовательности с использованием БДП (дан вектор чисел, необходимо вывести их по возрастанию),&lt;br /&gt;
### ** удаление.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Карацубы, Штрассена. Быстрая сортировка (29.01)==&lt;br /&gt;
# Алгоритм Карацубы.&lt;br /&gt;
# Алгоритм Штрассена. [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать Дасгупту и др., §2.5 Умножение матриц]&lt;br /&gt;
# Быстрая сортировка и доказательство того, что в среднем случае она работает за О(n * log n). [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 8 Быстрая сортировка, стр. 148]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 6 (до 18.02)===&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Пусть мы хотим найти двоичное представление десятичного числа 10&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;. Будем считать, что n --- степень двойки (n = 2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt;).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Pwr2Bin(n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть 1010&lt;br /&gt;
    z = ...&lt;br /&gt;
    вернуть Multiply(z, z)&amp;lt;/source&amp;gt;&lt;br /&gt;
Multiply --- функция, перемножающая два n-битовых двоичных числа x и y по алгоритму Карацубы за O(n&amp;lt;sup&amp;gt;log&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;3&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Пусть мы хотим перевести произвольное десятичное число x в записи которого n=2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; чисел в двоичную систему счисления.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Dec2Bin(x, n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть binary[x]&lt;br /&gt;
    разделить x на два десятичных числа xl и xr из n/2 цифр.&lt;br /&gt;
    вернуть ...&amp;lt;/source&amp;gt;&lt;br /&gt;
Здесь binary --- это массив, содержащий двоичное представление десятичных цифр.&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Докажите, что математическое ожидание времени работы алгоритма быстрой сортировки (усреднение по всем вариантам выбора опорного элемента) на любом входе размера n удовлетворяет соотношению: T(n) ≤ O(n) + 1/n * &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt; (T(i-1) + T(n-i)).&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Найдите решение соотношения из предыдущего пункта.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Динамическое программирование (ДП). Первые примеры (02.01)==&lt;br /&gt;
# Нахождение самой длинной возрастающей подпоследовательности.&lt;br /&gt;
# Нахождение редакционного расстояния (или редакционной стоимости, расстояния Левенштейна).&lt;br /&gt;
# Нахождение представителя большинства.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 7 (до 20.02)===&lt;br /&gt;
* В этом задании везде, где требуется реализовать алгоритм, необходимо привести код на любом языке программирования.&lt;br /&gt;
* Для получения максимальной оценки нужно решить все задачи без звёздочек. Одна решённая задача со звёздочкой заменяет одну задачу без звёздочки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения редакционного расстояния (алгоритм Вагнера — Фишера). Например, редакционное расстояние между словами &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равно 6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения длины наибольшей общей подстроки. Например, длина наибольшей общей подстроки &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равна 8 (&amp;quot;antholog&amp;quot;). Чем больше это значение, тем схожей строки.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Предположим теперь, что сравниваемые строки состоят из символов A, С, G и T; за удаление или вставку мы платим -5; за замену буквы x на y платим w[x, y], где x, y принадлежат множеству {A, С, G, T}, a w — это матрица весов:&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
!-!! A!! G!! C!! T&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! A&lt;br /&gt;
|10||-1||-3||-4&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
!G&lt;br /&gt;
||-1||7||-5||-3&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! C&lt;br /&gt;
||-3||-5||9||0&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! T&lt;br /&gt;
||-4||-3||0||8&lt;br /&gt;
|}&lt;br /&gt;
Тогда выравнивание:&lt;br /&gt;
 AGACTAGTTAC&lt;br /&gt;
 CGA‒‒‒GACGT&lt;br /&gt;
будет иметь следующую оценку:&lt;br /&gt;
 w[A,C] + w[G,G] + w[A,A] + 3*(-5) + w[G,G] + w[T,A] + w[T,C] + w[A,G] + w[C,T] = -3 + 7 + 10 - 3*5 + 7 + (-4) + 0 + (-1) + 0 = 1.&lt;br /&gt;
&lt;br /&gt;
Напишите алгоритм, который находит максимальную стоимость всех возможных выравниваний. Верно ли, что чем больше это значение, тем непохожей строки?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как давно один народ отделился от другого? Кто похожей — итальянец и китаец или якут и эфиоп? На эти вопросы можно отвечать с разных точек зрения — культурной, исторической, лингвистической, ... В последние же годы человечество научилось секвенировать геном, что позволило исследовать этот вопрос с точки зрения генетики. Секвенирование генома — это процесс записи ДНК в виде нуклеотидной последовательности, которая представляет собой последовательность из четырёх символов — A, С, G и T. Существуют базы, которые хранят генетическую информацию о людях из разных стран и континентов, например, [http://www.mtdb.igp.uu.se/ http://www.mtdb.igp.uu.se/ → Download mtDNA sequences]. Чем больше сходство между геномами, тем сильнее родственные связи между их обладателями. Используя решение предыдущего пункта, выполните задания:&lt;br /&gt;
# Определите, кто похожей — итальянец и китаец или якут и эфиоп?&lt;br /&gt;
# Найдите нескольких похожих и нескольких непохожих народностей.&lt;br /&gt;
# * Выберите одну народность. Найдите самых похожих и самых непохожих на неё.&lt;br /&gt;
# * Найдите самые похожие и самые непохожие народности.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Задача о разрезании стержня (05.01)==&lt;br /&gt;
# Постановка задачи.&lt;br /&gt;
# Решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Решение с нахождением максимума по p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Восходящий алгоритм с запоминанием. Вывод длин кусочков стержня. Оценка сложности.&lt;br /&gt;
# Нисходящий алгоритм с запоминанием. Оценка сложности.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.1 Разрезание стержня, стр. 393]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 8 (до 22.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Решая задачу о разрезании стержня мы вначале построили рекурсивное решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt; для всех 1 ≤ i &amp;lt; n. Его сложность описывалась рекуррентной формулой T(n) = n + &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n-1&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt;(T(i) + T(n-i)), T(1) = 1.&lt;br /&gt;
# Объясните эту формулу.&lt;br /&gt;
# Покажите с помощью метода подстановок, что T(n) ≤ 2&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Покажите с помощью контрпримера, что описанная далее жадная стратегия не всегда определяет оптимальный способ разрезания стержня. Определим плотность стержня длиной i как p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;/i, то есть как стоимость единицы его длины. Жадная стратегия для стержня длиной n отрезает от стержня первую часть длиной i, где 1 ≤ i ≤ n, имеющую максимальную плотность. Затем та же жадная стратегия применяется к оставшейся части длиной n-i.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Рассмотрим модификацию задачи разрезания стержня, в которой в дополнение к цене p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; каждого стержня добавляется фиксированная цена разреза c. Теперь прибыль, связанная с решением, представляет собой сумму цен частей стержня минус стоимость разрезов. Разработайте алгоритм динамического программирования для этой модифицированной задачи.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Непрерывным участком называется группа подряд идущих элементов. Например, для последовательности&lt;br /&gt;
 5, 15, −30, 10, −5, 40, 10&lt;br /&gt;
элементы 15, −30, 10 образуют непрерывный участок, а 5, 15, 40 -- нет. Постройте линейный алгоритм для следующей задачи:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Вход: список чисел a1, a2, ... ‌, an.&lt;br /&gt;
Выход: непрерывный участок с максимальной суммой (сумма участка нулевой длины равна нулю).&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Для приведённого примера ответом будет 10, −5, 40, 10 с суммой 55. Какова сложность алгоритма? Почему?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Надо заплатить v рублей, имея купюры в x1, x2, ‌..., xn рублей (купюр каждого типа сколько угодно). Это не всегда возможно (скажем, купюрами в&lt;br /&gt;
10 и 25 рублей можно заплатить 45 рублей, но не 47 и не 15). Постройте основанный на методе динамического программирования алгоритм со временем работы O(nv), выясняющий, возможна ли уплата.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как решить предыдущую задачу, если каждая купюра имеется в единственном экземпляре? (Например, купюрами в 1, 5, 10, 20 рублей можно заплатить 16 = 1 + 5 + 10 и 31 = 1 + 10 + 20 рублей, но не 40 (не хватит денег). Время работы алгоритма по-прежнему O(nv).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Ещё один вариант той же задачи: купюр каждого типа сколько угодно, но всего разрешается использовать не более k купюр. (Например, если есть купюры в 5 и 10 рублей, а k = 6, то 55 разменять можно, а 65 –– нет).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Перемножение цепочки матриц. Оптимальное бинарное дерево поиска (начало) (09.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о перемножении цепочки матриц. Постановка задачи.Пример. Нисходящий алгоритм.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.2 Перемножение цепочки матриц, стр. 403]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 9 (до 24.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Найдите оптимальную расстановку скобок в произведении последовательности матриц, размерности которых равны 5×10, 10×3, 3×12, 12×5, 5×50, 50×6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Напишите восходящий алгоритм для поиска оптимальной расстановки скобок.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Расстановка пробелов. Оптимальное бинарное дерево поиска (середина) (12.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о расстановке пробелов. Постановка задачи. Решения для трёх случаев: 1. нужно вернуть можно ли разбить текст на слова; 2. вернуть разбивку на слова; 3. слова встречаются не равновероятно, вернуть наиболее вероятную разбивку на слова.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи. Вывод математического ожидания времени поиска.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Праздничное домашнее задание 10 (до 02.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[&amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;,&amp;quot;, &amp;quot;.&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;,&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;.&amp;quot;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Подсказка:&#039;&#039;&#039; разбейте текст на слова из списка и посмотрите на азбуку Морзе.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Способы представления графов в памяти (16.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Разбор ошибок в домашнем задании.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Графы. Способы представления графов в памяти (матрица смежности, список рёбер, список соседей (список смежностей), матрица инцидентности). Зависимость сложности алгоритмов от способа представления.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §22.1 Представление графов, стр. 626]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 11 (до 02.03)===&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача A.]&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача B.]&lt;br /&gt;
# Нарисуйте неориентированный граф с 5 вершинами и 8 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Нарисуйте ориентированный граф с 4 вершинами и 3 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Дан ориентированный граф. &#039;&#039;Исходящая степень вершины v&#039;&#039; --- это количество исходящих из неё рёбер, &#039;&#039;входящая степень v&#039;&#039; --- это количество рёбер входящих в  v. Имеется представление ориентированного графа с использование списка соседей. Как долго будут вычисляться исходящие степени всех вершин графа? А входящие степени?&lt;br /&gt;
# Дан граф G = (V, E). Какие из рассмотренных способов хранения графов используют меньше всего памяти для хранения G и почему? Указание: рассмотрите случаи |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;lt; |E| и |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;gt; |E|.&lt;br /&gt;
# Пусть C --- это матрица смежности графа G.&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
# Пусть B --- это матрица инцидентности ориентированного графа G. Как связаны элементы матрицы BB&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
&lt;br /&gt;
==Реализация поиска в глубину (19.02)==&lt;br /&gt;
# Реализация поиска в глубину и смежных задач.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 12 (до 5.03)===&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Выберите любой способ хранения графа. Реализуйте поиск в глубину.&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Напишите алгоритм, который возвращает данные о том, какие вершины лежат в одной компоненте связности.&lt;br /&gt;
# &#039;&#039;(любой ЯП или псевдокод)&#039;&#039; Напишите алгоритм проверки сильной связности ориентированного графа. Какова его сложность?&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №2==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
Необходимо реализовать 3 задачи из [https://official.contest.yandex.ru/contest/1085 контеста], см. [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing распределение задач]. Каждую задачу можно написать на С++ или Python. На выполнение работы отводится две недели (см. время окончания контеста). [https://official.contest.yandex.ru/contest/1123 Дорешивание.]&lt;br /&gt;
&lt;br /&gt;
==ДП и графы (26.02)==&lt;br /&gt;
==ДП и графы (02.03)==&lt;br /&gt;
==Жадные алгоритмы (12.03)==&lt;br /&gt;
===Домашнее задание 13 (до 23.03)===&lt;br /&gt;
# Вася хочет купить по одной акции каждой компании. Все акции стоят одинаково, но дорожают по-разному. Каждый месяц акция i-ой компании дорожает в r_i раз. В один месяц можно купить только одну акцию.&lt;br /&gt;
## Напишите алгоритм, который выводит оптимальную последовательность покупок (такую, что на покупку всех акций потратится меньше денег).&lt;br /&gt;
## Докажите корректность алгоритма, то есть докажите, что последовательность покупок, которую выводит ваш алгоритм, оптимальна.&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список, очередь (16.03)==&lt;br /&gt;
# Реализация линейного двусвязного списка (С++).&lt;br /&gt;
# Реализация очереди ограниченной длины на базе вектора (С++).&lt;br /&gt;
# Реализация очереди на базе списка (С++).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14 (до 23.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте (на С++) структуру данных Стек. У стека должно быть три операции:&lt;br /&gt;
* push --- положить элемент на вершину стека;&lt;br /&gt;
* pop --- удалить верхний элемент;&lt;br /&gt;
* front --- вернуть значение верхнего элемента.&lt;br /&gt;
Оцените время работы каждой функции.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список (19.03)==&lt;br /&gt;
===Домашнее задание 13* (до 30.03)===&lt;br /&gt;
#Для приведённой реализации класса List (https://yadi.sk/i/c5r_79WdfMyNS).&lt;br /&gt;
## Допишите print, push_back и push_front.&lt;br /&gt;
## В функции insert_after и delete_node вставьте необходимые проверки так, чтобы они работали для крайних случаев.&lt;br /&gt;
## Напишите main в котором&lt;br /&gt;
### создаётся объект класса List, &lt;br /&gt;
### заполняется элементами с помощью функций push_back, push_front и insert_after и&lt;br /&gt;
### удаляется i-ый элемент.&lt;br /&gt;
&lt;br /&gt;
==Повторение (30.03)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Для данных пар функций выясните их связь в терминах O-, o-, Ω-, ω-, Θ-обозначений. Поставьте галочку в клетке с Ω, если f(x) = Ω(g(x)) и прочерк, если равенства нет. [https://ru.wikipedia.org/wiki/«O»_большое_и_«o»_малое#.D0.94.D1.80.D1.83.D0.B3.D0.B8.D0.B5_.D0.BF.D0.BE.D0.B4.D0.BE.D0.B1.D0.BD.D1.8B.D0.B5_.D0.BE.D0.B1.D0.BE.D0.B7.D0.BD.D0.B0.D1.87.D0.B5.D0.BD.D0.B8.D1.8F Википедия]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! f(x)!! g(x)!! O!! o!! Ω!! ω!! Θ&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! 2^100&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n * log(n)&lt;br /&gt;
! 2^100 * n * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n&lt;br /&gt;
! 2^100 * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n!&lt;br /&gt;
! 2^(2015n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n*2^n&lt;br /&gt;
! 3^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 5^n&lt;br /&gt;
! 5^(n+1)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n + n^2 + n^3 + ... + n^1000&lt;br /&gt;
! 7^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм Quickselect нахождения k-ого элемента по возрастанию: http://en.wikipedia.org/wiki/Quickselect&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;На улице стоит ряд домов. В каждом из домов лежит сколько-то денег. Вор хочет обокрасть дома на переулке. Он не может обокрасть два соседних дома, потому что хозяин дома, который он обокрал, сразу предупредит соседей. Нужно найти, какую максимальную сумму вор может украсть с переулка. На вход программы подается массив неотрицательных целых чисел - количество долларов в доме с номером i. Соседние дома в массиве представлены соседними элементами. Например, пусть задан массив { 1, 4, 5 } - тогда вор максимум может украсть $6, обокрав дома 1 и 3. Пусть задан массив { 1, 7, 2 } - тогда вор максимум может украсть $7, обокрав дом 2.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Алфавит из всех маленьких латинских букв и пробела закодирован числами следующим способом:&lt;br /&gt;
  &#039;a&#039; -&amp;gt; 1&lt;br /&gt;
  &#039;b&#039; -&amp;gt; 2&lt;br /&gt;
  &#039;c&#039; -&amp;gt; 3&lt;br /&gt;
  ...&lt;br /&gt;
  &#039;z&#039; -&amp;gt; 26&lt;br /&gt;
  &#039; &#039; -&amp;gt; 27&lt;br /&gt;
На вход программы подается строка из цифр. Нужно посчитать, сколькими способами можно раскодировать эту строку.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Дан граф, заданный матрицей смежности. Вывести пары вершин между которыми нет пути.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Повторение (02.04) ==&lt;br /&gt;
Решали и разбирали первые 4 задачи из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14* (до 11.03)===&lt;br /&gt;
Решите любые две задачи (подпункты НЕ считаются отдельными задачами) с предыдущей пары (Повторение (30.03)).&lt;br /&gt;
&lt;br /&gt;
== Повторение (06.04) ==&lt;br /&gt;
Будем решать вторую половину задач из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 15 (до 16.04)===&lt;br /&gt;
# Приведите пример графа, который содержит отрицательные рёбра, не содержит циклов отрицательного веса и для которого алгоритм Дейкстры возвращает неверный результат.&lt;br /&gt;
# Используется ли в алгоритме Дейкстры то, что веса рёбер неотрицательны? Если &amp;quot;да&amp;quot;, то где именно?&lt;br /&gt;
# Пусть граф содержит рёбра с весами &amp;gt;= -100. Если прибавить к каждому ребру 101 и при помощи алгоритма Дейкстры найти кратчайшие пути. Будут ли эти пути кратчайшими в исходном графе? Почему?&lt;br /&gt;
&lt;br /&gt;
== Повторение (07.04) ==&lt;br /&gt;
&#039;&#039;&#039;Решение рекуррентных соотношений&#039;&#039;&#039;&lt;br /&gt;
# Решите уравнение: T(n) = 4*T(n/2) + O(n^2) с базой T(1) = O(1)&lt;br /&gt;
## Используя основную теорему.&lt;br /&gt;
## Используя дерево рекурсий.&lt;br /&gt;
## Методом подстановки.&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2)) + n является \Theta(n lg n).&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2) + 17) + n является \Theta(n lg n).&lt;br /&gt;
# Решите уравнения, считая, что T(1) = O(1):&lt;br /&gt;
## T(n) = T(n-1) + n&lt;br /&gt;
## T(n) = 2*T(floor(sqrt(n))) + lg n. Указание: попробуйте использовать замену переменных.&lt;br /&gt;
## T(n) = 3*T(sqrt(n)) + lg n&lt;br /&gt;
# Дайте верхнюю и нижнюю оценки функции T(n). Постарайтесь, чтобы оценки были как можно более точные&lt;br /&gt;
## T(n) = 4T(n/3) + n*lg(n)&lt;br /&gt;
## T(n) = 3T(n/3) + n/lg(n)&lt;br /&gt;
## T(n) = 4T(n/2) + n^2*sqrt(n)&lt;br /&gt;
## T(n) = T(n/2) + T(n/4) + T(n/8) + n&lt;br /&gt;
## T(n) = T(n-1) + 1/n&lt;br /&gt;
## T(n) = T(n-2) + 1/lg(n)&lt;br /&gt;
## T(n) = sqrt(n) * T(sqrt(n)) + n&lt;br /&gt;
&#039;&#039;&#039;Анализ и построение алгоритмов&#039;&#039;&#039;&lt;br /&gt;
# Числа Фибоначчи F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; можно выразить через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, используя матрицу: https://yadi.sk/i/Pm_aNzHCforFU. &lt;br /&gt;
## Покажите как вычислить F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;.&lt;br /&gt;
## Как вычислить F&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;n+1&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;?&lt;br /&gt;
## Напишите алгоритм.&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
## Ускорьте его так, чтобы он работал за O(log n).&lt;br /&gt;
# Дана последовательность символов. Какое минимальное количество символов нужно удалить из неё, чтобы получить палиндром?&lt;br /&gt;
## Напишите алгоритм (на псевдокоде или на любом языке программирования).&lt;br /&gt;
## Оцените время работы алгоритма.&lt;br /&gt;
# Какую структуру данных вы бы использовали для реализации упорядоченного множества (http://neerc.ifmo.ru/wiki/index.php?title=Упорядоченное_множество)? Какая будет сложность каждой из операций над множеством?&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 16 (до 20.04)===&lt;br /&gt;
# Решите 6 задач из первой части и 6 из второй. (Укажите какие именно.) Каждый из подпунктов является отдельной задачей.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм и теорема Форда-Фалкерсона (16.04)==&lt;br /&gt;
# Базовые определения (пропускные способности, сток, исток и пр.). Пример. &lt;br /&gt;
# Ограничения на поток (сохранение и что меньше пропускных способностей).&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, пример работы&lt;br /&gt;
# Разрез, определение, пример.&lt;br /&gt;
# Утверждение: максимальный поток &amp;lt;= любого разреза.&lt;br /&gt;
# Теорема Форда-Фалкерсона (с доказательством).&lt;br /&gt;
# Пример на котором алгоритм Форда-Фалкерсонаработает работает очень долго при неудачном выборе путей.&lt;br /&gt;
# Сложность алгоритма Форда-Фалкерсона.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №3==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
В [https://official.contest.yandex.ru/contest/1196 домашнем задании] пять задач. Они разделены на два варианта, помеченные римскими цифрами I и II. Свой вариант нужно узнать [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing здесь на вкладке HW3]. Третья задача — общая для двух вариантов; ее решение необходимо снабдить доказательством корректности алгоритма. На выполнение задания дается примерно 2 недели (см. точное время окончания в контесте). Каждую задачу можно написать на С++ или Python.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Форда-Фалкерсона и Эдмондса-Карпа (20.04)==&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, напоминание: базовые определения, пример работы, пример на котором алгоритм работает долго, сложность.&lt;br /&gt;
# Алгоритм Эдмодса-Карпа. Доказательство асимптотики времени работы.&lt;br /&gt;
&lt;br /&gt;
==(23.04)==&lt;br /&gt;
&lt;br /&gt;
==(11.05) Красно-чёрные деревья==&lt;br /&gt;
[https://ru.wikipedia.org/wiki/Красно-чёрное_дерево Красно-чёрное дерево]&lt;br /&gt;
===Домашнее задание 17 (до 18.05)===&lt;br /&gt;
# Зачем нужны красно-чёрные деревья?&lt;br /&gt;
# Благодаря какому свойству и почему красно-чёрное дерево является сбалансированным?&lt;br /&gt;
# Нарисуйте полное бинарное дерево поиска высотой 3 с ключами {1, 2, ..., 15}. Сделайте из него красно-чёрные деревья высотой 2, 3 и 4.&lt;br /&gt;
# Нарисуйте красно-чёрные деревья, получающиеся последовательной вставкой элементов 12, 10, 29, 30, 31, 32 в [https://ru.wikipedia.org/wiki/Красно-чёрное_дерево#/media/File:Red-black_tree_example.svg данное дерево]. Для вставки используйте алгоритм вставки из Википедии. Укажите какой именно функцией вы воспользовались.&lt;br /&gt;
# Определим &#039;&#039;&#039;ослабленное красно-чёрное дерево&#039;&#039;&#039; как бинарное дерево поиска, которое удовлетворяет красно-чёрным свойствам 1, 3, 4 и 5. Другими словами, корень может быть как чёрным, так и красным. Рассмотрите ослабленное красно-чёрное дерево T, корень которого красный. Если перекрасить корень дерева T в чёрный, будет ли оно красно-чёрным деревом?&lt;br /&gt;
# Покажите, что самый длинный простой нисходящий путь от вершины x к листу красно-черного дерева имеет длину, не более чем в два раза превышающую кратчайший путь от x к листу-потомку.&lt;br /&gt;
# Чему равно наибольшее возможное количество внутренних узлов в красно-чёрном дереве с чёрной высоты k? А наименьшее возможное количество?&lt;br /&gt;
# Нарисуйте красно-чёрные деревья, получающиеся последовательной вставкой ключей 41, 38, 31, 12, 19, 8 в изначально пустое дерево.&lt;br /&gt;
# Покажите какие деревья будут получаться в результате последовательного удаления ключей в порядке 8, 12, 19, 31, 38, 41.&lt;br /&gt;
&lt;br /&gt;
==(14.05) Конкурентный анализ самоорганизующихся циклов==&lt;br /&gt;
[https://vk.com/doc12518218_390369758 Конспект лекций]&lt;br /&gt;
&lt;br /&gt;
===Задание 18 (до 21.05)===&lt;br /&gt;
# Пусть имеется n-элементный список и m поисковых запросов к нему. После каждой операции поиска можно переупорядочить список. Обозначим стоимость последовательности поисков через C. Докажите, что в худшем случае C = Ω(mn).&lt;br /&gt;
#  Покажите, что&lt;/div&gt;</summary>
		<author><name>Kassalanche</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=11550</id>
		<title>Алгоритмы и структуры данных. Подгруппа 105-1</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=11550"/>
		<updated>2015-05-11T16:05:51Z</updated>

		<summary type="html">&lt;p&gt;Kassalanche: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==О курсе==&lt;br /&gt;
[[Алгоритмы_и_структуры_данных|План лекций и список рекомендуемой литературы.]]&lt;br /&gt;
&lt;br /&gt;
[[Алгоритмы_и_структуры_данных._Подгруппа_105-1._FAQ|FAQ.]]&lt;br /&gt;
&lt;br /&gt;
[[Reviewboard|Инструкция по использованию Reviewboard.]]&lt;br /&gt;
&lt;br /&gt;
[[Практические_занятия_по_курсу_ОиМП/C++_check|Style guide.]]&lt;br /&gt;
&lt;br /&gt;
==Итоговая оценка за курс==&lt;br /&gt;
Итоговая оценка (ИО) зависит от&lt;br /&gt;
* оценок за пять больших домашних заданий (БДЗ1, БДЗ2, ..., БДЗ5),&lt;br /&gt;
* оценок за домашние задания (ДЗ1, ДЗ2, ...),&lt;br /&gt;
* оценки за контрольную работу (КР),&lt;br /&gt;
* оценки за экзамен (ЭКЗ),&lt;br /&gt;
и может быть вычислена по формуле:&lt;br /&gt;
 ИО = 0.7 * (0.3 * КР + 0.7 *(ИДЗ1 + ИДЗ2 + ИДЗ3 + ИДЗ4 + ИДЗ5)/5) + 0.3 * ЭКЗ =&lt;br /&gt;
    = 0.21*КР + 0.98*ИДЗ1 + 0.98*ИДЗ2 + 0.98*ИДЗ3 + 0.98*ИДЗ4 + 0.98*ИДЗ5 + 0.3*ЭКЗ,&lt;br /&gt;
где&lt;br /&gt;
 ИДЗi = min (10, 0.7 * БДЗi + 0.4 * &amp;lt;cредняя оценка за ДЗj, прошедшие с предыдущего БДЗ по i-ое&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
==Порядок сдачи домашних работ==&lt;br /&gt;
===Большие домашние работы===&lt;br /&gt;
# Получить OK за задачу в контесте.&lt;br /&gt;
# Залить исходный код на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* На каждую задачу создавайте отдельный запрос на ревью. &lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении суток приходят замечания к коду. &#039;&#039;&#039;Если в течении суток замечаний или Ship It не появилось, проверьте, что вы правильно отправили запрос и, если всё сделано правильно, спросите у семинариста получил ли он запрос.&#039;&#039;&#039;&lt;br /&gt;
# Вы их исправляете, проверяете в контесте, что программа по-прежнему проходит все тесты, заливаете новую версию в Review Board. Штрафов за посылки НЕ будет.&lt;br /&gt;
# Процесс повторяется пока остаются замечания к коду или пока не истёк дедлайн. После закрытия контеста будут ещё одни сутки на доработку замечаний в Review Board.&lt;br /&gt;
# Оценивается только последняя версия работы в Review Board.&lt;br /&gt;
&lt;br /&gt;
===Маленькие домашние работы===&lt;br /&gt;
# Залить решение на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* Желаемые форматы: txt, py, cpp, h. Допускаются любые другие.&lt;br /&gt;
#* На каждую домашнюю работу создавайте отдельный запрос на ревью. Обязательно указывайте номер домашней работы.&lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении неопределенного промежутка времени придут оценки по каждому из заданий.&lt;br /&gt;
&lt;br /&gt;
==Оценивание домашних работ==&lt;br /&gt;
* Все задания предполагаются индивидуальными. Запрещены любые заимствования без ссылки на автора.&lt;br /&gt;
* Решения после установленного дедлайна не принимаются. Дедлайн указан в заголовке каждого задания.&lt;br /&gt;
* Везде, где требуется написать алгоритм, можно использовать любой язык программирования или псевдокод.&lt;br /&gt;
* Там, где требуется построить алгоритм с заданной асимптотикой, приведите обоснование, что полученный алгоритм удовлетворяет этому условию.&lt;br /&gt;
* Эти правила не действуют, если в задании явно оговорено иное.&lt;br /&gt;
&lt;br /&gt;
==Мотивация к изучению алгоритмов. Подсчёт числа операций (12.01)==&lt;br /&gt;
# Числа Фибоначчи. Определение. Примитивный рекурсивный алгоритм вычисления i-ого числа. Оценка числа операций. Анализ причин неэффективности. Алгоритм с запоминанием вычисленных ранее значений. Оценка числа операций. Сравнение с предыдущим. (подробнее: глава 0, страницы 8-10 из книги &amp;lt;&amp;lt;Алгоритмы&amp;gt;&amp;gt;, [[Алгоритмы_и_структуры_данных|см. список рекомендованной литературы]])&lt;br /&gt;
# Задача о ханойской башне. Постановка задачи. Рекурсивный алгоритм. Рекуррентная формула для числа перемещений. Замкнутая формула для числа перемещений (+ доказательство). Доказательство того, что эту задачу нельзя решить используя меньшее число перемещений дисков. ([https://www.dropbox.com/s/t8cbs7ttu4iasvj/algo-0-recursion.pdf?dl=0 Разбор задачи о ханойской башне], автор Сергей Объедков)&lt;br /&gt;
# Сортировка пузырьком. Алгоритм. Подсчёт количество операций сравнения и обмена (swap). Анализ наилучшего и наихудшего случаев ([https://ru.wikipedia.org/wiki/Сортировка_пузырьком Википедия])&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 1 (12.01 - 26.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
Во всех задачах, если не оговорено иного, предполагаем, что работаем с целыми неотрицательными числами. Для первых 7 задач необходимо&lt;br /&gt;
* описать что можно считать наилучшим и наихудшим случаями,&lt;br /&gt;
* для каждого из двух случаев подсчитать отдельно количество операций сравнения и swap (если есть).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Даны три числа, требуется вернуть наименьшее.&lt;br /&gt;
# Даны три числа, требуется отсортировать их.&lt;br /&gt;
# Дана последовательность A из n элементов и число x, требуется найти элемент равный x. Примечание: если таких значений i несколько, вернуть любое; если такого элемента нет, функция должна сообщить об этом.&lt;br /&gt;
# * Дана упорядоченная последовательность A из n элементов и число x, требуется найти такое i, что A[i] равно x. Алгоритм должен быть эффективней, чем в предыдущем пункте и использовать то, что последовательность упорядочена.&lt;br /&gt;
# Дана последовательность из 100 000 чисел от 0 до 100. Напишите эффективный алгоритм сортировки, который бы учитывал специфику входных данных.&lt;br /&gt;
# * Дано 32 битное неотрицательное число. Требуется номер первого ненулевого бит. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения, считая, что числа распределены равномерно.&lt;br /&gt;
# * Даны 32 битные неотрицательные числа m и n. Требуется вывести True, если m &amp;lt; n, иначе False. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения битов, считая, что числа распределены равномерно.&lt;br /&gt;
# Напишите рекурсивную функцию, вычисляющую n-ое число Фибоначчи (как на занятии). Подсчитайте количество рекурсивных вызовов.&lt;br /&gt;
# * Напишите функцию, вычисляющую n-ое число Фибоначчи, у которой число операций — полином от n, и которая использует количество памяти, независящее от n.&lt;br /&gt;
&lt;br /&gt;
==O-символика и стратегия &amp;quot;разделяй и властвуй&amp;quot; (15.01)==&lt;br /&gt;
# Сортировка слиянием. Алгоритм, рекуррентное соотношение для времени сортировки, сложность. Подробнее: [https://dl.dropboxusercontent.com/u/829163/draft.pdf §2.3 Сортировка слиянием (стр. 54)].&lt;br /&gt;
# О-символика. [https://dl.dropboxusercontent.com/u/829163/draft.pdf §0.3 О-символика (стр. 10)].&lt;br /&gt;
# Задача о слиянии m упорядоченных массивов по n элементов. Три алгоритма решения: последовательное слияние, слияние &amp;quot;деревом&amp;quot; (обе функции используют Merge из MergeSort), аналог Merge для m массивов. Анализ сложности каждого из них.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 2 (15.01-29.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
* Во всех задачах, если не оговорено иного, для простоты &#039;&#039;можно&#039;&#039; считать, что n является степенью какого-либо числа, например, степенью двойки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Дана функция F, определённая ниже. Сколько строк она напечатает? Указание: для обоих подпунктов рассмотрите два случая: 1. n является степенью двойки, 2. n не является степенью двойки.&lt;br /&gt;
## Запишите рекуррентное соотношение для числа строк.&lt;br /&gt;
## Решите уравнение, полученное в предыдущем пункте, то есть, выведите замкнутую (нерекуррентную формулу). Для простоты можно считать, что n является степенью двойки.&lt;br /&gt;
# В массиве A размера n записана возрастающая последовательность целых чисел. Постройте алгоритм типа &amp;quot;разделяй и властвуй&amp;quot;, который проверяет, существует ли такой индекс i, что A[i] = i&lt;br /&gt;
## за время O(n),&lt;br /&gt;
## * за время O(log n).&lt;br /&gt;
## Какие случаи для вашего алгоритма являются наихудшими и наилучшими? Какого время работы в лучшем и худшем случаях?&lt;br /&gt;
# Дан бесконечный массив A, первые n элементов которого содержат возрастающую последовательность положительных чисел, а дальше стоят -1. Значение n не дано. Постройте алгоритм, который получает на вход целое число x и находит это x в массиве --- или говорит, что там его нет, &lt;br /&gt;
## за время O(n),&lt;br /&gt;
## за время O(log n).&lt;br /&gt;
# Рассмотрим алгоритм вычисления наибольшего общего делителя (НОД) двух положительных чисел, основанный на методе &amp;quot;разделяй и властвуй&amp;quot;.&lt;br /&gt;
## (задание не оценивается) Прочитайте [https://dl.dropboxusercontent.com/u/829163/draft.pdf §1.2.3 Алгоритм Евклида (стр. 23)].&lt;br /&gt;
## * Докажите, что определение НОД-а, приведённое ниже, корректно.&lt;br /&gt;
## Постройте алгоритм, основанный на этом определении.&lt;br /&gt;
## Какой алгоритм будет быстрее для n-битовых чисел a и b при больших значениях n --- ваш или алгоритм Евклида?&lt;br /&gt;
# * Покажите как за время O(n log n) удалить из массива размера n все дубликаты, то есть оставить каждый элемент в одном экземпляре.&lt;br /&gt;
# * Даны два упорядоченных массива размера m и n. Постройте алгоритм, находящий k-й по величине элемент в объединении этих массивов за время O(log(n+m)). &lt;br /&gt;
&lt;br /&gt;
Функция F(n).&lt;br /&gt;
  если n &amp;gt; 1:&lt;br /&gt;
    напечатать &amp;quot;всё ещё работаю&amp;quot;&lt;br /&gt;
    F(n/2)&lt;br /&gt;
    F(n/2)&lt;br /&gt;
&lt;br /&gt;
Определение НОД-а.&lt;br /&gt;
             2НОД(a/2, b/2), если а и b чётны,&lt;br /&gt;
  НОД(a,b) = НОД(a, b/2), если а нечётно, b чётно,&lt;br /&gt;
             НОД((a-b)/2, b), если а и b нечётны.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;lt;nowiki&amp;gt;Задачи взяты из книги &amp;quot;Алгоритмы&amp;quot;, глава 2 (см. список рекомендованной литературы).&amp;lt;/nowiki&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Сложение и умножение (19.01)==&lt;br /&gt;
# Алгоритм сложения, его сложность (§1.1.1 Сложение*)&lt;br /&gt;
# &amp;quot;Школьный&amp;quot; алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Рекурсивный алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Алгоритм умножения, реализующий стратегию &amp;quot;разделяй и властвуй&amp;quot;, анализ сложности (§2.1 Умножение чисел*)&lt;br /&gt;
 * [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать.]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 3 (19.01 - 2.02)===&lt;br /&gt;
* Во всех задачах для простоты можно считать, что n является степенью какого-либо числа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Найдите произведение чисел 10011011 и 10111010 (в двоичной системе счисления), используя алгоритм умножения чисел, основанный на методе «разделяй и властвуй». Необходимо не только дать ответ, но и привести ход решения.&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 3 рекурсивных вызова для подзадач размера n-1 и комбинирует из них решение исходной задачи за О(n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте три верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 10 рекурсивных вызовов для подзадач размера n/2 и комбинирует из них решение исходной задачи за О(5n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте два верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Докажите, что 3m² + m = O(m²).&lt;br /&gt;
# Докажите, что lg m = O(m/1000), где lg m — это логарифм с двоичным основанием.&lt;br /&gt;
# Докажите, что из равенства f(n) = O(g(n)) не следует, что g(n) = O(f(n)).&lt;br /&gt;
# Докажите, что O(m) содержится в O(m²).&lt;br /&gt;
&lt;br /&gt;
==Решение рекуррентных уравнений (22.01)==&lt;br /&gt;
# Примеры решений рекуррентных уравнений (см. [https://www.dropbox.com/s/6a0r410zjm9qwe7/algo-3-recurrences.pdf?dl=0 конспект]).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 4 (до 14.02)===&lt;br /&gt;
* Нельзя использовать утверждение основной теоремы о решении рекуррентных соотношений.&lt;br /&gt;
* &#039;&#039;Можно&#039;&#039; использовать метод построения дерева рекурсии или подстановку (метод с угадыванием ответа).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Какой из трёх приведённых ниже алгоритмов вы бы предпочли? Обоснуйте свой ответ.&lt;br /&gt;
#* Алгоритм A, решая задачу, производит пять рекурсивных вызовов для подзадач вдвое меньшего размера, после чего строит ответ для исходной задачи за линейное время.&lt;br /&gt;
#* Алгоритм B, решая задачу размера n, делает два рекурсивных вызова для задач размера n − 1, после чего находит ответ за время O(1).&lt;br /&gt;
#* Алгоритм C, решая задачу размера n, рекурсивно решает девять задач размера n/3 и строит ответ за время O(n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Найдите T(n) в замкнутой форме для любых 7 из 10 приведённых ниже рекуррентных соотношений:&lt;br /&gt;
## T(n) ≤ 2T(n/3) + 1;&lt;br /&gt;
## T(n) ≤ 7T(n/7) + n;&lt;br /&gt;
## T(n) ≤ 9T(n/3) + n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 8T(n/2) + n&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 49T(n/25) + n&amp;lt;sup&amp;gt;3/2&amp;lt;/sup&amp;gt;log n;&lt;br /&gt;
## T(n) ≤ T(n − 1) + 2;&lt;br /&gt;
## T(n) ≤ T(n − 1) + n&amp;lt;sup&amp;gt;c&amp;lt;/sup&amp;gt;, где c ≥ 1 –– константа;&lt;br /&gt;
## T(n) ≤ T(n − 1) + c&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;, где c &amp;gt; 1 –– константа;&lt;br /&gt;
## T(n) ≤ 2T(n − 1) + 1;&lt;br /&gt;
## T(n) ≤ T(sqrt(n)) + 1.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №1==&lt;br /&gt;
Необходимо реализовать все 6 задач из [https://official.contest.yandex.ru/contest/1002 контеста]. Каждую задачу можно писать на С++ или Python. На выполнение работы отводится две недели. Каждая задача оценивается в 10/6 балла. Оценка &#039;&#039;может&#039;&#039; быть снижена за плохой код, но не более чем на 25%.&lt;br /&gt;
&lt;br /&gt;
==Бинарное дерево поиска (26.01)==&lt;br /&gt;
# Определение. Пример.&lt;br /&gt;
# Не модифицирующие алгоритмы: поиск (рекурсивный и итеративный алгоритмы), поиск минимума, inordered обход (вывод значений узлов в отсортированном порядке), поиск следующего по возрастанию.&lt;br /&gt;
# Модифицирующие алгоритмы: вставка (рекурсивная реализация), удаление (только идея).&lt;br /&gt;
 [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 13, стр. 248]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 5 (до 16.02)===&lt;br /&gt;
* Для получения максимальной оценки можно выполнить или все задачи без звёздочки, или задачу со звёздочкой. Преподаватель понимает, что реализацию БДП сложно не найти в интернете, но от копипасты не будет никакой пользы. Напротив, самостоятельная реализация очень полезна и приветствуется, даже если не получится выполнить всех пунктов задания.&lt;br /&gt;
* Задачи с двумя звёздочками необязательны.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Нарисуйте бинарные деревья поиска высотой 2, 3, 4, 5 и 6 для множества ключей {1, 4, 5, 10, 16, 17, 21}. Корень дерева имеет высоту 0.&lt;br /&gt;
# &#039;&#039;&#039;Сортировка с использованием БДП.&#039;&#039;&#039;&lt;br /&gt;
## Какова асимптотическая сложность алгоритма вставки элемента в дерево высоты d? Почему? Назовите наилучший и наиухдший случаи.&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который строит БДП в узлах которого стоят элементы данной последовательности. Можно использовать функцию Insert. Назовите наилучший и наихудший случаи. Есть теорема о том, что полученный алгоритм будет работать в среднем случае за время O(n * log n).&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который выводит их в порядке возрастания. Используйте бинарное дерево поиска. Какова в среднем случае сложность этого алгоритма? Назовите наилучший и наихудший случаи. Какова сложность в наихудшем случае?&lt;br /&gt;
# Напишите функцию GetRoot, которой на вход подаётся указатель на произвольный узел дерева, а она возвращает указатель на корень.&lt;br /&gt;
# Напишите процедуру PrintLeafs, которой на вход подаётся указатель на корень дерева, и она печатает листья дерева&lt;br /&gt;
## по возрастанию,&lt;br /&gt;
## по убыванию.&lt;br /&gt;
# ** Альтернативный обход в порядке возрастания бинарного дерева поиска с n узлами (или центрированный (inordered) обход) можно осуществить путём поиска минимального элемента дерева с помощью функции Minimum с последующий n-1 вызовом функции Next. Каково время работы такого алгоритма?&lt;br /&gt;
# * Реализуйте на С++ структуру данных бинарное дерево поиска, [https://yadi.sk/i/gi2SEStreFfSb используя заготовку].&lt;br /&gt;
## Нарисуйте бинарное дерево поиска, которое строится в функции getTreeExample.&lt;br /&gt;
## Реализуйте следующие алгоритмы: &lt;br /&gt;
### поиск минимума, &lt;br /&gt;
### inordered обход (вывод значений узлов в отсортированном порядке),&lt;br /&gt;
### поиск следующего по возрастанию,&lt;br /&gt;
### вставка элемента в дерево,&lt;br /&gt;
### сортировка последовательности с использованием БДП (дан вектор чисел, необходимо вывести их по возрастанию),&lt;br /&gt;
### ** удаление.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Карацубы, Штрассена. Быстрая сортировка (29.01)==&lt;br /&gt;
# Алгоритм Карацубы.&lt;br /&gt;
# Алгоритм Штрассена. [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать Дасгупту и др., §2.5 Умножение матриц]&lt;br /&gt;
# Быстрая сортировка и доказательство того, что в среднем случае она работает за О(n * log n). [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 8 Быстрая сортировка, стр. 148]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 6 (до 18.02)===&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Пусть мы хотим найти двоичное представление десятичного числа 10&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;. Будем считать, что n --- степень двойки (n = 2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt;).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Pwr2Bin(n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть 1010&lt;br /&gt;
    z = ...&lt;br /&gt;
    вернуть Multiply(z, z)&amp;lt;/source&amp;gt;&lt;br /&gt;
Multiply --- функция, перемножающая два n-битовых двоичных числа x и y по алгоритму Карацубы за O(n&amp;lt;sup&amp;gt;log&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;3&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Пусть мы хотим перевести произвольное десятичное число x в записи которого n=2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; чисел в двоичную систему счисления.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Dec2Bin(x, n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть binary[x]&lt;br /&gt;
    разделить x на два десятичных числа xl и xr из n/2 цифр.&lt;br /&gt;
    вернуть ...&amp;lt;/source&amp;gt;&lt;br /&gt;
Здесь binary --- это массив, содержащий двоичное представление десятичных цифр.&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Докажите, что математическое ожидание времени работы алгоритма быстрой сортировки (усреднение по всем вариантам выбора опорного элемента) на любом входе размера n удовлетворяет соотношению: T(n) ≤ O(n) + 1/n * &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt; (T(i-1) + T(n-i)).&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Найдите решение соотношения из предыдущего пункта.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Динамическое программирование (ДП). Первые примеры (02.01)==&lt;br /&gt;
# Нахождение самой длинной возрастающей подпоследовательности.&lt;br /&gt;
# Нахождение редакционного расстояния (или редакционной стоимости, расстояния Левенштейна).&lt;br /&gt;
# Нахождение представителя большинства.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 7 (до 20.02)===&lt;br /&gt;
* В этом задании везде, где требуется реализовать алгоритм, необходимо привести код на любом языке программирования.&lt;br /&gt;
* Для получения максимальной оценки нужно решить все задачи без звёздочек. Одна решённая задача со звёздочкой заменяет одну задачу без звёздочки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения редакционного расстояния (алгоритм Вагнера — Фишера). Например, редакционное расстояние между словами &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равно 6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения длины наибольшей общей подстроки. Например, длина наибольшей общей подстроки &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равна 8 (&amp;quot;antholog&amp;quot;). Чем больше это значение, тем схожей строки.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Предположим теперь, что сравниваемые строки состоят из символов A, С, G и T; за удаление или вставку мы платим -5; за замену буквы x на y платим w[x, y], где x, y принадлежат множеству {A, С, G, T}, a w — это матрица весов:&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
!-!! A!! G!! C!! T&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! A&lt;br /&gt;
|10||-1||-3||-4&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
!G&lt;br /&gt;
||-1||7||-5||-3&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! C&lt;br /&gt;
||-3||-5||9||0&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! T&lt;br /&gt;
||-4||-3||0||8&lt;br /&gt;
|}&lt;br /&gt;
Тогда выравнивание:&lt;br /&gt;
 AGACTAGTTAC&lt;br /&gt;
 CGA‒‒‒GACGT&lt;br /&gt;
будет иметь следующую оценку:&lt;br /&gt;
 w[A,C] + w[G,G] + w[A,A] + 3*(-5) + w[G,G] + w[T,A] + w[T,C] + w[A,G] + w[C,T] = -3 + 7 + 10 - 3*5 + 7 + (-4) + 0 + (-1) + 0 = 1.&lt;br /&gt;
&lt;br /&gt;
Напишите алгоритм, который находит максимальную стоимость всех возможных выравниваний. Верно ли, что чем больше это значение, тем непохожей строки?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как давно один народ отделился от другого? Кто похожей — итальянец и китаец или якут и эфиоп? На эти вопросы можно отвечать с разных точек зрения — культурной, исторической, лингвистической, ... В последние же годы человечество научилось секвенировать геном, что позволило исследовать этот вопрос с точки зрения генетики. Секвенирование генома — это процесс записи ДНК в виде нуклеотидной последовательности, которая представляет собой последовательность из четырёх символов — A, С, G и T. Существуют базы, которые хранят генетическую информацию о людях из разных стран и континентов, например, [http://www.mtdb.igp.uu.se/ http://www.mtdb.igp.uu.se/ → Download mtDNA sequences]. Чем больше сходство между геномами, тем сильнее родственные связи между их обладателями. Используя решение предыдущего пункта, выполните задания:&lt;br /&gt;
# Определите, кто похожей — итальянец и китаец или якут и эфиоп?&lt;br /&gt;
# Найдите нескольких похожих и нескольких непохожих народностей.&lt;br /&gt;
# * Выберите одну народность. Найдите самых похожих и самых непохожих на неё.&lt;br /&gt;
# * Найдите самые похожие и самые непохожие народности.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Задача о разрезании стержня (05.01)==&lt;br /&gt;
# Постановка задачи.&lt;br /&gt;
# Решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Решение с нахождением максимума по p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Восходящий алгоритм с запоминанием. Вывод длин кусочков стержня. Оценка сложности.&lt;br /&gt;
# Нисходящий алгоритм с запоминанием. Оценка сложности.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.1 Разрезание стержня, стр. 393]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 8 (до 22.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Решая задачу о разрезании стержня мы вначале построили рекурсивное решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt; для всех 1 ≤ i &amp;lt; n. Его сложность описывалась рекуррентной формулой T(n) = n + &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n-1&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt;(T(i) + T(n-i)), T(1) = 1.&lt;br /&gt;
# Объясните эту формулу.&lt;br /&gt;
# Покажите с помощью метода подстановок, что T(n) ≤ 2&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Покажите с помощью контрпримера, что описанная далее жадная стратегия не всегда определяет оптимальный способ разрезания стержня. Определим плотность стержня длиной i как p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;/i, то есть как стоимость единицы его длины. Жадная стратегия для стержня длиной n отрезает от стержня первую часть длиной i, где 1 ≤ i ≤ n, имеющую максимальную плотность. Затем та же жадная стратегия применяется к оставшейся части длиной n-i.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Рассмотрим модификацию задачи разрезания стержня, в которой в дополнение к цене p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; каждого стержня добавляется фиксированная цена разреза c. Теперь прибыль, связанная с решением, представляет собой сумму цен частей стержня минус стоимость разрезов. Разработайте алгоритм динамического программирования для этой модифицированной задачи.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Непрерывным участком называется группа подряд идущих элементов. Например, для последовательности&lt;br /&gt;
 5, 15, −30, 10, −5, 40, 10&lt;br /&gt;
элементы 15, −30, 10 образуют непрерывный участок, а 5, 15, 40 -- нет. Постройте линейный алгоритм для следующей задачи:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Вход: список чисел a1, a2, ... ‌, an.&lt;br /&gt;
Выход: непрерывный участок с максимальной суммой (сумма участка нулевой длины равна нулю).&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Для приведённого примера ответом будет 10, −5, 40, 10 с суммой 55. Какова сложность алгоритма? Почему?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Надо заплатить v рублей, имея купюры в x1, x2, ‌..., xn рублей (купюр каждого типа сколько угодно). Это не всегда возможно (скажем, купюрами в&lt;br /&gt;
10 и 25 рублей можно заплатить 45 рублей, но не 47 и не 15). Постройте основанный на методе динамического программирования алгоритм со временем работы O(nv), выясняющий, возможна ли уплата.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как решить предыдущую задачу, если каждая купюра имеется в единственном экземпляре? (Например, купюрами в 1, 5, 10, 20 рублей можно заплатить 16 = 1 + 5 + 10 и 31 = 1 + 10 + 20 рублей, но не 40 (не хватит денег). Время работы алгоритма по-прежнему O(nv).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Ещё один вариант той же задачи: купюр каждого типа сколько угодно, но всего разрешается использовать не более k купюр. (Например, если есть купюры в 5 и 10 рублей, а k = 6, то 55 разменять можно, а 65 –– нет).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Перемножение цепочки матриц. Оптимальное бинарное дерево поиска (начало) (09.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о перемножении цепочки матриц. Постановка задачи.Пример. Нисходящий алгоритм.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.2 Перемножение цепочки матриц, стр. 403]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 9 (до 24.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Найдите оптимальную расстановку скобок в произведении последовательности матриц, размерности которых равны 5×10, 10×3, 3×12, 12×5, 5×50, 50×6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Напишите восходящий алгоритм для поиска оптимальной расстановки скобок.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Расстановка пробелов. Оптимальное бинарное дерево поиска (середина) (12.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о расстановке пробелов. Постановка задачи. Решения для трёх случаев: 1. нужно вернуть можно ли разбить текст на слова; 2. вернуть разбивку на слова; 3. слова встречаются не равновероятно, вернуть наиболее вероятную разбивку на слова.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи. Вывод математического ожидания времени поиска.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Праздничное домашнее задание 10 (до 02.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[&amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;,&amp;quot;, &amp;quot;.&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;,&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;.&amp;quot;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Подсказка:&#039;&#039;&#039; разбейте текст на слова из списка и посмотрите на азбуку Морзе.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Способы представления графов в памяти (16.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Разбор ошибок в домашнем задании.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Графы. Способы представления графов в памяти (матрица смежности, список рёбер, список соседей (список смежностей), матрица инцидентности). Зависимость сложности алгоритмов от способа представления.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §22.1 Представление графов, стр. 626]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 11 (до 02.03)===&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача A.]&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача B.]&lt;br /&gt;
# Нарисуйте неориентированный граф с 5 вершинами и 8 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Нарисуйте ориентированный граф с 4 вершинами и 3 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Дан ориентированный граф. &#039;&#039;Исходящая степень вершины v&#039;&#039; --- это количество исходящих из неё рёбер, &#039;&#039;входящая степень v&#039;&#039; --- это количество рёбер входящих в  v. Имеется представление ориентированного графа с использование списка соседей. Как долго будут вычисляться исходящие степени всех вершин графа? А входящие степени?&lt;br /&gt;
# Дан граф G = (V, E). Какие из рассмотренных способов хранения графов используют меньше всего памяти для хранения G и почему? Указание: рассмотрите случаи |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;lt; |E| и |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;gt; |E|.&lt;br /&gt;
# Пусть C --- это матрица смежности графа G.&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
# Пусть B --- это матрица инцидентности ориентированного графа G. Как связаны элементы матрицы BB&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
&lt;br /&gt;
==Реализация поиска в глубину (19.02)==&lt;br /&gt;
# Реализация поиска в глубину и смежных задач.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 12 (до 5.03)===&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Выберите любой способ хранения графа. Реализуйте поиск в глубину.&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Напишите алгоритм, который возвращает данные о том, какие вершины лежат в одной компоненте связности.&lt;br /&gt;
# &#039;&#039;(любой ЯП или псевдокод)&#039;&#039; Напишите алгоритм проверки сильной связности ориентированного графа. Какова его сложность?&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №2==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
Необходимо реализовать 3 задачи из [https://official.contest.yandex.ru/contest/1085 контеста], см. [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing распределение задач]. Каждую задачу можно написать на С++ или Python. На выполнение работы отводится две недели (см. время окончания контеста). [https://official.contest.yandex.ru/contest/1123 Дорешивание.]&lt;br /&gt;
&lt;br /&gt;
==ДП и графы (26.02)==&lt;br /&gt;
==ДП и графы (02.03)==&lt;br /&gt;
==Жадные алгоритмы (12.03)==&lt;br /&gt;
===Домашнее задание 13 (до 23.03)===&lt;br /&gt;
# Вася хочет купить по одной акции каждой компании. Все акции стоят одинаково, но дорожают по-разному. Каждый месяц акция i-ой компании дорожает в r_i раз. В один месяц можно купить только одну акцию.&lt;br /&gt;
## Напишите алгоритм, который выводит оптимальную последовательность покупок (такую, что на покупку всех акций потратится меньше денег).&lt;br /&gt;
## Докажите корректность алгоритма, то есть докажите, что последовательность покупок, которую выводит ваш алгоритм, оптимальна.&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список, очередь (16.03)==&lt;br /&gt;
# Реализация линейного двусвязного списка (С++).&lt;br /&gt;
# Реализация очереди ограниченной длины на базе вектора (С++).&lt;br /&gt;
# Реализация очереди на базе списка (С++).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14 (до 23.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте (на С++) структуру данных Стек. У стека должно быть три операции:&lt;br /&gt;
* push --- положить элемент на вершину стека;&lt;br /&gt;
* pop --- удалить верхний элемент;&lt;br /&gt;
* front --- вернуть значение верхнего элемента.&lt;br /&gt;
Оцените время работы каждой функции.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список (19.03)==&lt;br /&gt;
===Домашнее задание 13* (до 30.03)===&lt;br /&gt;
#Для приведённой реализации класса List (https://yadi.sk/i/c5r_79WdfMyNS).&lt;br /&gt;
## Допишите print, push_back и push_front.&lt;br /&gt;
## В функции insert_after и delete_node вставьте необходимые проверки так, чтобы они работали для крайних случаев.&lt;br /&gt;
## Напишите main в котором&lt;br /&gt;
### создаётся объект класса List, &lt;br /&gt;
### заполняется элементами с помощью функций push_back, push_front и insert_after и&lt;br /&gt;
### удаляется i-ый элемент.&lt;br /&gt;
&lt;br /&gt;
==Повторение (30.03)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Для данных пар функций выясните их связь в терминах O-, o-, Ω-, ω-, Θ-обозначений. Поставьте галочку в клетке с Ω, если f(x) = Ω(g(x)) и прочерк, если равенства нет. [https://ru.wikipedia.org/wiki/«O»_большое_и_«o»_малое#.D0.94.D1.80.D1.83.D0.B3.D0.B8.D0.B5_.D0.BF.D0.BE.D0.B4.D0.BE.D0.B1.D0.BD.D1.8B.D0.B5_.D0.BE.D0.B1.D0.BE.D0.B7.D0.BD.D0.B0.D1.87.D0.B5.D0.BD.D0.B8.D1.8F Википедия]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! f(x)!! g(x)!! O!! o!! Ω!! ω!! Θ&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! 2^100&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n * log(n)&lt;br /&gt;
! 2^100 * n * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n&lt;br /&gt;
! 2^100 * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n!&lt;br /&gt;
! 2^(2015n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n*2^n&lt;br /&gt;
! 3^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 5^n&lt;br /&gt;
! 5^(n+1)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n + n^2 + n^3 + ... + n^1000&lt;br /&gt;
! 7^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм Quickselect нахождения k-ого элемента по возрастанию: http://en.wikipedia.org/wiki/Quickselect&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;На улице стоит ряд домов. В каждом из домов лежит сколько-то денег. Вор хочет обокрасть дома на переулке. Он не может обокрасть два соседних дома, потому что хозяин дома, который он обокрал, сразу предупредит соседей. Нужно найти, какую максимальную сумму вор может украсть с переулка. На вход программы подается массив неотрицательных целых чисел - количество долларов в доме с номером i. Соседние дома в массиве представлены соседними элементами. Например, пусть задан массив { 1, 4, 5 } - тогда вор максимум может украсть $6, обокрав дома 1 и 3. Пусть задан массив { 1, 7, 2 } - тогда вор максимум может украсть $7, обокрав дом 2.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Алфавит из всех маленьких латинских букв и пробела закодирован числами следующим способом:&lt;br /&gt;
  &#039;a&#039; -&amp;gt; 1&lt;br /&gt;
  &#039;b&#039; -&amp;gt; 2&lt;br /&gt;
  &#039;c&#039; -&amp;gt; 3&lt;br /&gt;
  ...&lt;br /&gt;
  &#039;z&#039; -&amp;gt; 26&lt;br /&gt;
  &#039; &#039; -&amp;gt; 27&lt;br /&gt;
На вход программы подается строка из цифр. Нужно посчитать, сколькими способами можно раскодировать эту строку.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Дан граф, заданный матрицей смежности. Вывести пары вершин между которыми нет пути.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Повторение (02.04) ==&lt;br /&gt;
Решали и разбирали первые 4 задачи из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14* (до 11.03)===&lt;br /&gt;
Решите любые две задачи (подпункты НЕ считаются отдельными задачами) с предыдущей пары (Повторение (30.03)).&lt;br /&gt;
&lt;br /&gt;
== Повторение (06.04) ==&lt;br /&gt;
Будем решать вторую половину задач из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 15 (до 16.04)===&lt;br /&gt;
# Приведите пример графа, который содержит отрицательные рёбра, не содержит циклов отрицательного веса и для которого алгоритм Дейкстры возвращает неверный результат.&lt;br /&gt;
# Используется ли в алгоритме Дейкстры то, что веса рёбер неотрицательны? Если &amp;quot;да&amp;quot;, то где именно?&lt;br /&gt;
# Пусть граф содержит рёбра с весами &amp;gt;= -100. Если прибавить к каждому ребру 101 и при помощи алгоритма Дейкстры найти кратчайшие пути. Будут ли эти пути кратчайшими в исходном графе? Почему?&lt;br /&gt;
&lt;br /&gt;
== Повторение (07.04) ==&lt;br /&gt;
&#039;&#039;&#039;Решение рекуррентных соотношений&#039;&#039;&#039;&lt;br /&gt;
# Решите уравнение: T(n) = 4*T(n/2) + O(n^2) с базой T(1) = O(1)&lt;br /&gt;
## Используя основную теорему.&lt;br /&gt;
## Используя дерево рекурсий.&lt;br /&gt;
## Методом подстановки.&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2)) + n является \Theta(n lg n).&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2) + 17) + n является \Theta(n lg n).&lt;br /&gt;
# Решите уравнения, считая, что T(1) = O(1):&lt;br /&gt;
## T(n) = T(n-1) + n&lt;br /&gt;
## T(n) = 2*T(floor(sqrt(n))) + lg n. Указание: попробуйте использовать замену переменных.&lt;br /&gt;
## T(n) = 3*T(sqrt(n)) + lg n&lt;br /&gt;
# Дайте верхнюю и нижнюю оценки функции T(n). Постарайтесь, чтобы оценки были как можно более точные&lt;br /&gt;
## T(n) = 4T(n/3) + n*lg(n)&lt;br /&gt;
## T(n) = 3T(n/3) + n/lg(n)&lt;br /&gt;
## T(n) = 4T(n/2) + n^2*sqrt(n)&lt;br /&gt;
## T(n) = T(n/2) + T(n/4) + T(n/8) + n&lt;br /&gt;
## T(n) = T(n-1) + 1/n&lt;br /&gt;
## T(n) = T(n-2) + 1/lg(n)&lt;br /&gt;
## T(n) = sqrt(n) * T(sqrt(n)) + n&lt;br /&gt;
&#039;&#039;&#039;Анализ и построение алгоритмов&#039;&#039;&#039;&lt;br /&gt;
# Числа Фибоначчи F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; можно выразить через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, используя матрицу: https://yadi.sk/i/Pm_aNzHCforFU. &lt;br /&gt;
## Покажите как вычислить F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;.&lt;br /&gt;
## Как вычислить F&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;n+1&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;?&lt;br /&gt;
## Напишите алгоритм.&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
## Ускорьте его так, чтобы он работал за O(log n).&lt;br /&gt;
# Дана последовательность символов. Какое минимальное количество символов нужно удалить из неё, чтобы получить палиндром?&lt;br /&gt;
## Напишите алгоритм (на псевдокоде или на любом языке программирования).&lt;br /&gt;
## Оцените время работы алгоритма.&lt;br /&gt;
# Какую структуру данных вы бы использовали для реализации упорядоченного множества (http://neerc.ifmo.ru/wiki/index.php?title=Упорядоченное_множество)? Какая будет сложность каждой из операций над множеством?&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 16 (до 20.04)===&lt;br /&gt;
# Решите 6 задач из первой части и 6 из второй. (Укажите какие именно.) Каждый из подпунктов является отдельной задачей.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм и теорема Форда-Фалкерсона (16.04)==&lt;br /&gt;
# Базовые определения (пропускные способности, сток, исток и пр.). Пример. &lt;br /&gt;
# Ограничения на поток (сохранение и что меньше пропускных способностей).&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, пример работы&lt;br /&gt;
# Разрез, определение, пример.&lt;br /&gt;
# Утверждение: максимальный поток &amp;lt;= любого разреза.&lt;br /&gt;
# Теорема Форда-Фалкерсона (с доказательством).&lt;br /&gt;
# Пример на котором алгоритм Форда-Фалкерсонаработает работает очень долго при неудачном выборе путей.&lt;br /&gt;
# Сложность алгоритма Форда-Фалкерсона.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №3==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
В [https://official.contest.yandex.ru/contest/1196 домашнем задании] пять задач. Они разделены на два варианта, помеченные римскими цифрами I и II. Свой вариант нужно узнать [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing здесь на вкладке HW3]. Третья задача — общая для двух вариантов; ее решение необходимо снабдить доказательством корректности алгоритма. На выполнение задания дается примерно 2 недели (см. точное время окончания в контесте). Каждую задачу можно написать на С++ или Python.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Форда-Фалкерсона и Эдмондса-Карпа (20.04)==&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, напоминание: базовые определения, пример работы, пример на котором алгоритм работает долго, сложность.&lt;br /&gt;
# Алгоритм Эдмодса-Карпа. Доказательство асимптотики времени работы.&lt;br /&gt;
&lt;br /&gt;
==(23.04)==&lt;br /&gt;
&lt;br /&gt;
==(11.05) Красно-чёрные деревья==&lt;br /&gt;
[https://ru.wikipedia.org/wiki/Красно-чёрное_дерево Красно-чёрное дерево]&lt;br /&gt;
===Домашнее задание 17 (до 18.05)===&lt;br /&gt;
# Зачем нужны красно-чёрные деревья?&lt;br /&gt;
# Благодаря какому свойству и почему красно-чёрное дерево является сбалансированным?&lt;br /&gt;
# Нарисуйте полное бинарное дерево поиска высотой 3 с ключами {1, 2, ..., 15}. Сделайте из него красно-чёрные деревья высотой 2, 3 и 4.&lt;br /&gt;
# Нарисуйте красно-чёрные деревья, получающиеся последовательной вставкой элементов 12, 10, 29, 30, 31, 32 в [https://ru.wikipedia.org/wiki/Красно-чёрное_дерево#/media/File:Red-black_tree_example.svg данное дерево]. Для вставки используйте алгоритм вставки из Википедии. Укажите какой именно функцией вы воспользовались.&lt;br /&gt;
# Определим &#039;&#039;&#039;ослабленное красно-чёрное дерево&#039;&#039;&#039; как бинарное дерево поиска, которое удовлетворяет красно-чёрным свойствам 1, 3, 4 и 5. Другими словами, корень может быть как чёрным, так и красным. Рассмотрите ослабленное красно-чёрное дерево T, корень которого красный. Если перекрасить корень дерева T в чёрный, будет ли оно красно-чёрным деревом?&lt;br /&gt;
# Покажите, что самый длинный простой нисходящий путь от вершины x к листу красно-черного дерева имеет длину, не более чем в два раза превышающую кратчайший путь от x к листу-потомку.&lt;br /&gt;
# Чему равно наибольшее возможное количество внутренних узлов в красно-чёрном дереве с чёрной высоты k? А наименьшее возможное количество?&lt;br /&gt;
# Нарисуйте красно-чёрные деревья, получающиеся последовательной вставкой ключей 41, 38, 31, 12, 19, 8 в изначально пустое дерево.&lt;br /&gt;
# Покажите какие деревья будут получаться в результате последовательного удаления ключей в порядке 8, 12, 19, 31, 38, 41.&lt;/div&gt;</summary>
		<author><name>Kassalanche</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=11549</id>
		<title>Алгоритмы и структуры данных. Подгруппа 105-1</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=11549"/>
		<updated>2015-05-11T16:05:10Z</updated>

		<summary type="html">&lt;p&gt;Kassalanche: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==О курсе==&lt;br /&gt;
[[Алгоритмы_и_структуры_данных|План лекций и список рекомендуемой литературы.]]&lt;br /&gt;
&lt;br /&gt;
[[Алгоритмы_и_структуры_данных._Подгруппа_105-1._FAQ|FAQ.]]&lt;br /&gt;
&lt;br /&gt;
[[Reviewboard|Инструкция по использованию Reviewboard.]]&lt;br /&gt;
&lt;br /&gt;
[[Практические_занятия_по_курсу_ОиМП/C++_check|Style guide.]]&lt;br /&gt;
&lt;br /&gt;
==Итоговая оценка за курс==&lt;br /&gt;
Итоговая оценка (ИО) зависит от&lt;br /&gt;
* оценок за пять больших домашних заданий (БДЗ1, БДЗ2, ..., БДЗ5),&lt;br /&gt;
* оценок за домашние задания (ДЗ1, ДЗ2, ...),&lt;br /&gt;
* оценки за контрольную работу (КР),&lt;br /&gt;
* оценки за экзамен (ЭКЗ),&lt;br /&gt;
и может быть вычислена по формуле:&lt;br /&gt;
 ИО = 0.7 * (0.3 * КР + 0.7 *(ИДЗ1 + ИДЗ2 + ИДЗ3 + ИДЗ4 + ИДЗ5)/5) + 0.3 * ЭКЗ =&lt;br /&gt;
    = 0.21*КР + 0.98*ИДЗ1 + 0.98*ИДЗ2 + 0.98*ИДЗ3 + 0.98*ИДЗ4 + 0.98*ИДЗ5 + 0.3*ЭКЗ,&lt;br /&gt;
где&lt;br /&gt;
 ИДЗi = min (10, 0.7 * БДЗi + 0.4 * &amp;lt;cредняя оценка за ДЗj, прошедшие с предыдущего БДЗ по i-ое&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
==Порядок сдачи домашних работ==&lt;br /&gt;
===Большие домашние работы===&lt;br /&gt;
# Получить OK за задачу в контесте.&lt;br /&gt;
# Залить исходный код на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* На каждую задачу создавайте отдельный запрос на ревью. &lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении суток приходят замечания к коду. &#039;&#039;&#039;Если в течении суток замечаний или Ship It не появилось, проверьте, что вы правильно отправили запрос и, если всё сделано правильно, спросите у семинариста получил ли он запрос.&#039;&#039;&#039;&lt;br /&gt;
# Вы их исправляете, проверяете в контесте, что программа по-прежнему проходит все тесты, заливаете новую версию в Review Board. Штрафов за посылки НЕ будет.&lt;br /&gt;
# Процесс повторяется пока остаются замечания к коду или пока не истёк дедлайн. После закрытия контеста будут ещё одни сутки на доработку замечаний в Review Board.&lt;br /&gt;
# Оценивается только последняя версия работы в Review Board.&lt;br /&gt;
&lt;br /&gt;
===Маленькие домашние работы===&lt;br /&gt;
# Залить решение на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* Желаемые форматы: txt, py, cpp, h. Допускаются любые другие.&lt;br /&gt;
#* На каждую домашнюю работу создавайте отдельный запрос на ревью. Обязательно указывайте номер домашней работы.&lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении неопределенного промежутка времени придут оценки по каждому из заданий.&lt;br /&gt;
&lt;br /&gt;
==Оценивание домашних работ==&lt;br /&gt;
* Все задания предполагаются индивидуальными. Запрещены любые заимствования без ссылки на автора.&lt;br /&gt;
* Решения после установленного дедлайна не принимаются. Дедлайн указан в заголовке каждого задания.&lt;br /&gt;
* Везде, где требуется написать алгоритм, можно использовать любой язык программирования или псевдокод.&lt;br /&gt;
* Там, где требуется построить алгоритм с заданной асимптотикой, приведите обоснование, что полученный алгоритм удовлетворяет этому условию.&lt;br /&gt;
* Эти правила не действуют, если в задании явно оговорено иное.&lt;br /&gt;
&lt;br /&gt;
==Мотивация к изучению алгоритмов. Подсчёт числа операций (12.01)==&lt;br /&gt;
# Числа Фибоначчи. Определение. Примитивный рекурсивный алгоритм вычисления i-ого числа. Оценка числа операций. Анализ причин неэффективности. Алгоритм с запоминанием вычисленных ранее значений. Оценка числа операций. Сравнение с предыдущим. (подробнее: глава 0, страницы 8-10 из книги &amp;lt;&amp;lt;Алгоритмы&amp;gt;&amp;gt;, [[Алгоритмы_и_структуры_данных|см. список рекомендованной литературы]])&lt;br /&gt;
# Задача о ханойской башне. Постановка задачи. Рекурсивный алгоритм. Рекуррентная формула для числа перемещений. Замкнутая формула для числа перемещений (+ доказательство). Доказательство того, что эту задачу нельзя решить используя меньшее число перемещений дисков. ([https://www.dropbox.com/s/t8cbs7ttu4iasvj/algo-0-recursion.pdf?dl=0 Разбор задачи о ханойской башне], автор Сергей Объедков)&lt;br /&gt;
# Сортировка пузырьком. Алгоритм. Подсчёт количество операций сравнения и обмена (swap). Анализ наилучшего и наихудшего случаев ([https://ru.wikipedia.org/wiki/Сортировка_пузырьком Википедия])&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 1 (12.01 - 26.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
Во всех задачах, если не оговорено иного, предполагаем, что работаем с целыми неотрицательными числами. Для первых 7 задач необходимо&lt;br /&gt;
* описать что можно считать наилучшим и наихудшим случаями,&lt;br /&gt;
* для каждого из двух случаев подсчитать отдельно количество операций сравнения и swap (если есть).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Даны три числа, требуется вернуть наименьшее.&lt;br /&gt;
# Даны три числа, требуется отсортировать их.&lt;br /&gt;
# Дана последовательность A из n элементов и число x, требуется найти элемент равный x. Примечание: если таких значений i несколько, вернуть любое; если такого элемента нет, функция должна сообщить об этом.&lt;br /&gt;
# * Дана упорядоченная последовательность A из n элементов и число x, требуется найти такое i, что A[i] равно x. Алгоритм должен быть эффективней, чем в предыдущем пункте и использовать то, что последовательность упорядочена.&lt;br /&gt;
# Дана последовательность из 100 000 чисел от 0 до 100. Напишите эффективный алгоритм сортировки, который бы учитывал специфику входных данных.&lt;br /&gt;
# * Дано 32 битное неотрицательное число. Требуется номер первого ненулевого бит. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения, считая, что числа распределены равномерно.&lt;br /&gt;
# * Даны 32 битные неотрицательные числа m и n. Требуется вывести True, если m &amp;lt; n, иначе False. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения битов, считая, что числа распределены равномерно.&lt;br /&gt;
# Напишите рекурсивную функцию, вычисляющую n-ое число Фибоначчи (как на занятии). Подсчитайте количество рекурсивных вызовов.&lt;br /&gt;
# * Напишите функцию, вычисляющую n-ое число Фибоначчи, у которой число операций — полином от n, и которая использует количество памяти, независящее от n.&lt;br /&gt;
&lt;br /&gt;
==O-символика и стратегия &amp;quot;разделяй и властвуй&amp;quot; (15.01)==&lt;br /&gt;
# Сортировка слиянием. Алгоритм, рекуррентное соотношение для времени сортировки, сложность. Подробнее: [https://dl.dropboxusercontent.com/u/829163/draft.pdf §2.3 Сортировка слиянием (стр. 54)].&lt;br /&gt;
# О-символика. [https://dl.dropboxusercontent.com/u/829163/draft.pdf §0.3 О-символика (стр. 10)].&lt;br /&gt;
# Задача о слиянии m упорядоченных массивов по n элементов. Три алгоритма решения: последовательное слияние, слияние &amp;quot;деревом&amp;quot; (обе функции используют Merge из MergeSort), аналог Merge для m массивов. Анализ сложности каждого из них.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 2 (15.01-29.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
* Во всех задачах, если не оговорено иного, для простоты &#039;&#039;можно&#039;&#039; считать, что n является степенью какого-либо числа, например, степенью двойки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Дана функция F, определённая ниже. Сколько строк она напечатает? Указание: для обоих подпунктов рассмотрите два случая: 1. n является степенью двойки, 2. n не является степенью двойки.&lt;br /&gt;
## Запишите рекуррентное соотношение для числа строк.&lt;br /&gt;
## Решите уравнение, полученное в предыдущем пункте, то есть, выведите замкнутую (нерекуррентную формулу). Для простоты можно считать, что n является степенью двойки.&lt;br /&gt;
# В массиве A размера n записана возрастающая последовательность целых чисел. Постройте алгоритм типа &amp;quot;разделяй и властвуй&amp;quot;, который проверяет, существует ли такой индекс i, что A[i] = i&lt;br /&gt;
## за время O(n),&lt;br /&gt;
## * за время O(log n).&lt;br /&gt;
## Какие случаи для вашего алгоритма являются наихудшими и наилучшими? Какого время работы в лучшем и худшем случаях?&lt;br /&gt;
# Дан бесконечный массив A, первые n элементов которого содержат возрастающую последовательность положительных чисел, а дальше стоят -1. Значение n не дано. Постройте алгоритм, который получает на вход целое число x и находит это x в массиве --- или говорит, что там его нет, &lt;br /&gt;
## за время O(n),&lt;br /&gt;
## за время O(log n).&lt;br /&gt;
# Рассмотрим алгоритм вычисления наибольшего общего делителя (НОД) двух положительных чисел, основанный на методе &amp;quot;разделяй и властвуй&amp;quot;.&lt;br /&gt;
## (задание не оценивается) Прочитайте [https://dl.dropboxusercontent.com/u/829163/draft.pdf §1.2.3 Алгоритм Евклида (стр. 23)].&lt;br /&gt;
## * Докажите, что определение НОД-а, приведённое ниже, корректно.&lt;br /&gt;
## Постройте алгоритм, основанный на этом определении.&lt;br /&gt;
## Какой алгоритм будет быстрее для n-битовых чисел a и b при больших значениях n --- ваш или алгоритм Евклида?&lt;br /&gt;
# * Покажите как за время O(n log n) удалить из массива размера n все дубликаты, то есть оставить каждый элемент в одном экземпляре.&lt;br /&gt;
# * Даны два упорядоченных массива размера m и n. Постройте алгоритм, находящий k-й по величине элемент в объединении этих массивов за время O(log(n+m)). &lt;br /&gt;
&lt;br /&gt;
Функция F(n).&lt;br /&gt;
  если n &amp;gt; 1:&lt;br /&gt;
    напечатать &amp;quot;всё ещё работаю&amp;quot;&lt;br /&gt;
    F(n/2)&lt;br /&gt;
    F(n/2)&lt;br /&gt;
&lt;br /&gt;
Определение НОД-а.&lt;br /&gt;
             2НОД(a/2, b/2), если а и b чётны,&lt;br /&gt;
  НОД(a,b) = НОД(a, b/2), если а нечётно, b чётно,&lt;br /&gt;
             НОД((a-b)/2, b), если а и b нечётны.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;lt;nowiki&amp;gt;Задачи взяты из книги &amp;quot;Алгоритмы&amp;quot;, глава 2 (см. список рекомендованной литературы).&amp;lt;/nowiki&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Сложение и умножение (19.01)==&lt;br /&gt;
# Алгоритм сложения, его сложность (§1.1.1 Сложение*)&lt;br /&gt;
# &amp;quot;Школьный&amp;quot; алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Рекурсивный алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Алгоритм умножения, реализующий стратегию &amp;quot;разделяй и властвуй&amp;quot;, анализ сложности (§2.1 Умножение чисел*)&lt;br /&gt;
 * [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать.]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 3 (19.01 - 2.02)===&lt;br /&gt;
* Во всех задачах для простоты можно считать, что n является степенью какого-либо числа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Найдите произведение чисел 10011011 и 10111010 (в двоичной системе счисления), используя алгоритм умножения чисел, основанный на методе «разделяй и властвуй». Необходимо не только дать ответ, но и привести ход решения.&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 3 рекурсивных вызова для подзадач размера n-1 и комбинирует из них решение исходной задачи за О(n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте три верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 10 рекурсивных вызовов для подзадач размера n/2 и комбинирует из них решение исходной задачи за О(5n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте два верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Докажите, что 3m² + m = O(m²).&lt;br /&gt;
# Докажите, что lg m = O(m/1000), где lg m — это логарифм с двоичным основанием.&lt;br /&gt;
# Докажите, что из равенства f(n) = O(g(n)) не следует, что g(n) = O(f(n)).&lt;br /&gt;
# Докажите, что O(m) содержится в O(m²).&lt;br /&gt;
&lt;br /&gt;
==Решение рекуррентных уравнений (22.01)==&lt;br /&gt;
# Примеры решений рекуррентных уравнений (см. [https://www.dropbox.com/s/6a0r410zjm9qwe7/algo-3-recurrences.pdf?dl=0 конспект]).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 4 (до 14.02)===&lt;br /&gt;
* Нельзя использовать утверждение основной теоремы о решении рекуррентных соотношений.&lt;br /&gt;
* &#039;&#039;Можно&#039;&#039; использовать метод построения дерева рекурсии или подстановку (метод с угадыванием ответа).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Какой из трёх приведённых ниже алгоритмов вы бы предпочли? Обоснуйте свой ответ.&lt;br /&gt;
#* Алгоритм A, решая задачу, производит пять рекурсивных вызовов для подзадач вдвое меньшего размера, после чего строит ответ для исходной задачи за линейное время.&lt;br /&gt;
#* Алгоритм B, решая задачу размера n, делает два рекурсивных вызова для задач размера n − 1, после чего находит ответ за время O(1).&lt;br /&gt;
#* Алгоритм C, решая задачу размера n, рекурсивно решает девять задач размера n/3 и строит ответ за время O(n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Найдите T(n) в замкнутой форме для любых 7 из 10 приведённых ниже рекуррентных соотношений:&lt;br /&gt;
## T(n) ≤ 2T(n/3) + 1;&lt;br /&gt;
## T(n) ≤ 7T(n/7) + n;&lt;br /&gt;
## T(n) ≤ 9T(n/3) + n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 8T(n/2) + n&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 49T(n/25) + n&amp;lt;sup&amp;gt;3/2&amp;lt;/sup&amp;gt;log n;&lt;br /&gt;
## T(n) ≤ T(n − 1) + 2;&lt;br /&gt;
## T(n) ≤ T(n − 1) + n&amp;lt;sup&amp;gt;c&amp;lt;/sup&amp;gt;, где c ≥ 1 –– константа;&lt;br /&gt;
## T(n) ≤ T(n − 1) + c&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;, где c &amp;gt; 1 –– константа;&lt;br /&gt;
## T(n) ≤ 2T(n − 1) + 1;&lt;br /&gt;
## T(n) ≤ T(sqrt(n)) + 1.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №1==&lt;br /&gt;
Необходимо реализовать все 6 задач из [https://official.contest.yandex.ru/contest/1002 контеста]. Каждую задачу можно писать на С++ или Python. На выполнение работы отводится две недели. Каждая задача оценивается в 10/6 балла. Оценка &#039;&#039;может&#039;&#039; быть снижена за плохой код, но не более чем на 25%.&lt;br /&gt;
&lt;br /&gt;
==Бинарное дерево поиска (26.01)==&lt;br /&gt;
# Определение. Пример.&lt;br /&gt;
# Не модифицирующие алгоритмы: поиск (рекурсивный и итеративный алгоритмы), поиск минимума, inordered обход (вывод значений узлов в отсортированном порядке), поиск следующего по возрастанию.&lt;br /&gt;
# Модифицирующие алгоритмы: вставка (рекурсивная реализация), удаление (только идея).&lt;br /&gt;
 [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 13, стр. 248]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 5 (до 16.02)===&lt;br /&gt;
* Для получения максимальной оценки можно выполнить или все задачи без звёздочки, или задачу со звёздочкой. Преподаватель понимает, что реализацию БДП сложно не найти в интернете, но от копипасты не будет никакой пользы. Напротив, самостоятельная реализация очень полезна и приветствуется, даже если не получится выполнить всех пунктов задания.&lt;br /&gt;
* Задачи с двумя звёздочками необязательны.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Нарисуйте бинарные деревья поиска высотой 2, 3, 4, 5 и 6 для множества ключей {1, 4, 5, 10, 16, 17, 21}. Корень дерева имеет высоту 0.&lt;br /&gt;
# &#039;&#039;&#039;Сортировка с использованием БДП.&#039;&#039;&#039;&lt;br /&gt;
## Какова асимптотическая сложность алгоритма вставки элемента в дерево высоты d? Почему? Назовите наилучший и наиухдший случаи.&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который строит БДП в узлах которого стоят элементы данной последовательности. Можно использовать функцию Insert. Назовите наилучший и наихудший случаи. Есть теорема о том, что полученный алгоритм будет работать в среднем случае за время O(n * log n).&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который выводит их в порядке возрастания. Используйте бинарное дерево поиска. Какова в среднем случае сложность этого алгоритма? Назовите наилучший и наихудший случаи. Какова сложность в наихудшем случае?&lt;br /&gt;
# Напишите функцию GetRoot, которой на вход подаётся указатель на произвольный узел дерева, а она возвращает указатель на корень.&lt;br /&gt;
# Напишите процедуру PrintLeafs, которой на вход подаётся указатель на корень дерева, и она печатает листья дерева&lt;br /&gt;
## по возрастанию,&lt;br /&gt;
## по убыванию.&lt;br /&gt;
# ** Альтернативный обход в порядке возрастания бинарного дерева поиска с n узлами (или центрированный (inordered) обход) можно осуществить путём поиска минимального элемента дерева с помощью функции Minimum с последующий n-1 вызовом функции Next. Каково время работы такого алгоритма?&lt;br /&gt;
# * Реализуйте на С++ структуру данных бинарное дерево поиска, [https://yadi.sk/i/gi2SEStreFfSb используя заготовку].&lt;br /&gt;
## Нарисуйте бинарное дерево поиска, которое строится в функции getTreeExample.&lt;br /&gt;
## Реализуйте следующие алгоритмы: &lt;br /&gt;
### поиск минимума, &lt;br /&gt;
### inordered обход (вывод значений узлов в отсортированном порядке),&lt;br /&gt;
### поиск следующего по возрастанию,&lt;br /&gt;
### вставка элемента в дерево,&lt;br /&gt;
### сортировка последовательности с использованием БДП (дан вектор чисел, необходимо вывести их по возрастанию),&lt;br /&gt;
### ** удаление.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Карацубы, Штрассена. Быстрая сортировка (29.01)==&lt;br /&gt;
# Алгоритм Карацубы.&lt;br /&gt;
# Алгоритм Штрассена. [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать Дасгупту и др., §2.5 Умножение матриц]&lt;br /&gt;
# Быстрая сортировка и доказательство того, что в среднем случае она работает за О(n * log n). [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 8 Быстрая сортировка, стр. 148]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 6 (до 18.02)===&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Пусть мы хотим найти двоичное представление десятичного числа 10&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;. Будем считать, что n --- степень двойки (n = 2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt;).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Pwr2Bin(n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть 1010&lt;br /&gt;
    z = ...&lt;br /&gt;
    вернуть Multiply(z, z)&amp;lt;/source&amp;gt;&lt;br /&gt;
Multiply --- функция, перемножающая два n-битовых двоичных числа x и y по алгоритму Карацубы за O(n&amp;lt;sup&amp;gt;log&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;3&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Пусть мы хотим перевести произвольное десятичное число x в записи которого n=2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; чисел в двоичную систему счисления.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Dec2Bin(x, n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть binary[x]&lt;br /&gt;
    разделить x на два десятичных числа xl и xr из n/2 цифр.&lt;br /&gt;
    вернуть ...&amp;lt;/source&amp;gt;&lt;br /&gt;
Здесь binary --- это массив, содержащий двоичное представление десятичных цифр.&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Докажите, что математическое ожидание времени работы алгоритма быстрой сортировки (усреднение по всем вариантам выбора опорного элемента) на любом входе размера n удовлетворяет соотношению: T(n) ≤ O(n) + 1/n * &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt; (T(i-1) + T(n-i)).&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Найдите решение соотношения из предыдущего пункта.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Динамическое программирование (ДП). Первые примеры (02.01)==&lt;br /&gt;
# Нахождение самой длинной возрастающей подпоследовательности.&lt;br /&gt;
# Нахождение редакционного расстояния (или редакционной стоимости, расстояния Левенштейна).&lt;br /&gt;
# Нахождение представителя большинства.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 7 (до 20.02)===&lt;br /&gt;
* В этом задании везде, где требуется реализовать алгоритм, необходимо привести код на любом языке программирования.&lt;br /&gt;
* Для получения максимальной оценки нужно решить все задачи без звёздочек. Одна решённая задача со звёздочкой заменяет одну задачу без звёздочки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения редакционного расстояния (алгоритм Вагнера — Фишера). Например, редакционное расстояние между словами &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равно 6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения длины наибольшей общей подстроки. Например, длина наибольшей общей подстроки &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равна 8 (&amp;quot;antholog&amp;quot;). Чем больше это значение, тем схожей строки.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Предположим теперь, что сравниваемые строки состоят из символов A, С, G и T; за удаление или вставку мы платим -5; за замену буквы x на y платим w[x, y], где x, y принадлежат множеству {A, С, G, T}, a w — это матрица весов:&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
!-!! A!! G!! C!! T&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! A&lt;br /&gt;
|10||-1||-3||-4&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
!G&lt;br /&gt;
||-1||7||-5||-3&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! C&lt;br /&gt;
||-3||-5||9||0&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! T&lt;br /&gt;
||-4||-3||0||8&lt;br /&gt;
|}&lt;br /&gt;
Тогда выравнивание:&lt;br /&gt;
 AGACTAGTTAC&lt;br /&gt;
 CGA‒‒‒GACGT&lt;br /&gt;
будет иметь следующую оценку:&lt;br /&gt;
 w[A,C] + w[G,G] + w[A,A] + 3*(-5) + w[G,G] + w[T,A] + w[T,C] + w[A,G] + w[C,T] = -3 + 7 + 10 - 3*5 + 7 + (-4) + 0 + (-1) + 0 = 1.&lt;br /&gt;
&lt;br /&gt;
Напишите алгоритм, который находит максимальную стоимость всех возможных выравниваний. Верно ли, что чем больше это значение, тем непохожей строки?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как давно один народ отделился от другого? Кто похожей — итальянец и китаец или якут и эфиоп? На эти вопросы можно отвечать с разных точек зрения — культурной, исторической, лингвистической, ... В последние же годы человечество научилось секвенировать геном, что позволило исследовать этот вопрос с точки зрения генетики. Секвенирование генома — это процесс записи ДНК в виде нуклеотидной последовательности, которая представляет собой последовательность из четырёх символов — A, С, G и T. Существуют базы, которые хранят генетическую информацию о людях из разных стран и континентов, например, [http://www.mtdb.igp.uu.se/ http://www.mtdb.igp.uu.se/ → Download mtDNA sequences]. Чем больше сходство между геномами, тем сильнее родственные связи между их обладателями. Используя решение предыдущего пункта, выполните задания:&lt;br /&gt;
# Определите, кто похожей — итальянец и китаец или якут и эфиоп?&lt;br /&gt;
# Найдите нескольких похожих и нескольких непохожих народностей.&lt;br /&gt;
# * Выберите одну народность. Найдите самых похожих и самых непохожих на неё.&lt;br /&gt;
# * Найдите самые похожие и самые непохожие народности.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Задача о разрезании стержня (05.01)==&lt;br /&gt;
# Постановка задачи.&lt;br /&gt;
# Решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Решение с нахождением максимума по p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Восходящий алгоритм с запоминанием. Вывод длин кусочков стержня. Оценка сложности.&lt;br /&gt;
# Нисходящий алгоритм с запоминанием. Оценка сложности.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.1 Разрезание стержня, стр. 393]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 8 (до 22.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Решая задачу о разрезании стержня мы вначале построили рекурсивное решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt; для всех 1 ≤ i &amp;lt; n. Его сложность описывалась рекуррентной формулой T(n) = n + &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n-1&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt;(T(i) + T(n-i)), T(1) = 1.&lt;br /&gt;
# Объясните эту формулу.&lt;br /&gt;
# Покажите с помощью метода подстановок, что T(n) ≤ 2&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Покажите с помощью контрпримера, что описанная далее жадная стратегия не всегда определяет оптимальный способ разрезания стержня. Определим плотность стержня длиной i как p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;/i, то есть как стоимость единицы его длины. Жадная стратегия для стержня длиной n отрезает от стержня первую часть длиной i, где 1 ≤ i ≤ n, имеющую максимальную плотность. Затем та же жадная стратегия применяется к оставшейся части длиной n-i.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Рассмотрим модификацию задачи разрезания стержня, в которой в дополнение к цене p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; каждого стержня добавляется фиксированная цена разреза c. Теперь прибыль, связанная с решением, представляет собой сумму цен частей стержня минус стоимость разрезов. Разработайте алгоритм динамического программирования для этой модифицированной задачи.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Непрерывным участком называется группа подряд идущих элементов. Например, для последовательности&lt;br /&gt;
 5, 15, −30, 10, −5, 40, 10&lt;br /&gt;
элементы 15, −30, 10 образуют непрерывный участок, а 5, 15, 40 -- нет. Постройте линейный алгоритм для следующей задачи:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Вход: список чисел a1, a2, ... ‌, an.&lt;br /&gt;
Выход: непрерывный участок с максимальной суммой (сумма участка нулевой длины равна нулю).&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Для приведённого примера ответом будет 10, −5, 40, 10 с суммой 55. Какова сложность алгоритма? Почему?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Надо заплатить v рублей, имея купюры в x1, x2, ‌..., xn рублей (купюр каждого типа сколько угодно). Это не всегда возможно (скажем, купюрами в&lt;br /&gt;
10 и 25 рублей можно заплатить 45 рублей, но не 47 и не 15). Постройте основанный на методе динамического программирования алгоритм со временем работы O(nv), выясняющий, возможна ли уплата.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как решить предыдущую задачу, если каждая купюра имеется в единственном экземпляре? (Например, купюрами в 1, 5, 10, 20 рублей можно заплатить 16 = 1 + 5 + 10 и 31 = 1 + 10 + 20 рублей, но не 40 (не хватит денег). Время работы алгоритма по-прежнему O(nv).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Ещё один вариант той же задачи: купюр каждого типа сколько угодно, но всего разрешается использовать не более k купюр. (Например, если есть купюры в 5 и 10 рублей, а k = 6, то 55 разменять можно, а 65 –– нет).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Перемножение цепочки матриц. Оптимальное бинарное дерево поиска (начало) (09.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о перемножении цепочки матриц. Постановка задачи.Пример. Нисходящий алгоритм.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.2 Перемножение цепочки матриц, стр. 403]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 9 (до 24.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Найдите оптимальную расстановку скобок в произведении последовательности матриц, размерности которых равны 5×10, 10×3, 3×12, 12×5, 5×50, 50×6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Напишите восходящий алгоритм для поиска оптимальной расстановки скобок.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Расстановка пробелов. Оптимальное бинарное дерево поиска (середина) (12.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о расстановке пробелов. Постановка задачи. Решения для трёх случаев: 1. нужно вернуть можно ли разбить текст на слова; 2. вернуть разбивку на слова; 3. слова встречаются не равновероятно, вернуть наиболее вероятную разбивку на слова.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи. Вывод математического ожидания времени поиска.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Праздничное домашнее задание 10 (до 02.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[&amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;,&amp;quot;, &amp;quot;.&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;,&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;.&amp;quot;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Подсказка:&#039;&#039;&#039; разбейте текст на слова из списка и посмотрите на азбуку Морзе.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Способы представления графов в памяти (16.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Разбор ошибок в домашнем задании.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Графы. Способы представления графов в памяти (матрица смежности, список рёбер, список соседей (список смежностей), матрица инцидентности). Зависимость сложности алгоритмов от способа представления.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §22.1 Представление графов, стр. 626]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 11 (до 02.03)===&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача A.]&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача B.]&lt;br /&gt;
# Нарисуйте неориентированный граф с 5 вершинами и 8 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Нарисуйте ориентированный граф с 4 вершинами и 3 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Дан ориентированный граф. &#039;&#039;Исходящая степень вершины v&#039;&#039; --- это количество исходящих из неё рёбер, &#039;&#039;входящая степень v&#039;&#039; --- это количество рёбер входящих в  v. Имеется представление ориентированного графа с использование списка соседей. Как долго будут вычисляться исходящие степени всех вершин графа? А входящие степени?&lt;br /&gt;
# Дан граф G = (V, E). Какие из рассмотренных способов хранения графов используют меньше всего памяти для хранения G и почему? Указание: рассмотрите случаи |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;lt; |E| и |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;gt; |E|.&lt;br /&gt;
# Пусть C --- это матрица смежности графа G.&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
# Пусть B --- это матрица инцидентности ориентированного графа G. Как связаны элементы матрицы BB&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
&lt;br /&gt;
==Реализация поиска в глубину (19.02)==&lt;br /&gt;
# Реализация поиска в глубину и смежных задач.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 12 (до 5.03)===&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Выберите любой способ хранения графа. Реализуйте поиск в глубину.&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Напишите алгоритм, который возвращает данные о том, какие вершины лежат в одной компоненте связности.&lt;br /&gt;
# &#039;&#039;(любой ЯП или псевдокод)&#039;&#039; Напишите алгоритм проверки сильной связности ориентированного графа. Какова его сложность?&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №2==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
Необходимо реализовать 3 задачи из [https://official.contest.yandex.ru/contest/1085 контеста], см. [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing распределение задач]. Каждую задачу можно написать на С++ или Python. На выполнение работы отводится две недели (см. время окончания контеста). [https://official.contest.yandex.ru/contest/1123 Дорешивание.]&lt;br /&gt;
&lt;br /&gt;
==ДП и графы (26.02)==&lt;br /&gt;
==ДП и графы (02.03)==&lt;br /&gt;
==Жадные алгоритмы (12.03)==&lt;br /&gt;
===Домашнее задание 13 (до 23.03)===&lt;br /&gt;
# Вася хочет купить по одной акции каждой компании. Все акции стоят одинаково, но дорожают по-разному. Каждый месяц акция i-ой компании дорожает в r_i раз. В один месяц можно купить только одну акцию.&lt;br /&gt;
## Напишите алгоритм, который выводит оптимальную последовательность покупок (такую, что на покупку всех акций потратится меньше денег).&lt;br /&gt;
## Докажите корректность алгоритма, то есть докажите, что последовательность покупок, которую выводит ваш алгоритм, оптимальна.&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список, очередь (16.03)==&lt;br /&gt;
# Реализация линейного двусвязного списка (С++).&lt;br /&gt;
# Реализация очереди ограниченной длины на базе вектора (С++).&lt;br /&gt;
# Реализация очереди на базе списка (С++).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14 (до 23.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте (на С++) структуру данных Стек. У стека должно быть три операции:&lt;br /&gt;
* push --- положить элемент на вершину стека;&lt;br /&gt;
* pop --- удалить верхний элемент;&lt;br /&gt;
* front --- вернуть значение верхнего элемента.&lt;br /&gt;
Оцените время работы каждой функции.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список (19.03)==&lt;br /&gt;
===Домашнее задание 13* (до 30.03)===&lt;br /&gt;
#Для приведённой реализации класса List (https://yadi.sk/i/c5r_79WdfMyNS).&lt;br /&gt;
## Допишите print, push_back и push_front.&lt;br /&gt;
## В функции insert_after и delete_node вставьте необходимые проверки так, чтобы они работали для крайних случаев.&lt;br /&gt;
## Напишите main в котором&lt;br /&gt;
### создаётся объект класса List, &lt;br /&gt;
### заполняется элементами с помощью функций push_back, push_front и insert_after и&lt;br /&gt;
### удаляется i-ый элемент.&lt;br /&gt;
&lt;br /&gt;
==Повторение (30.03)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Для данных пар функций выясните их связь в терминах O-, o-, Ω-, ω-, Θ-обозначений. Поставьте галочку в клетке с Ω, если f(x) = Ω(g(x)) и прочерк, если равенства нет. [https://ru.wikipedia.org/wiki/«O»_большое_и_«o»_малое#.D0.94.D1.80.D1.83.D0.B3.D0.B8.D0.B5_.D0.BF.D0.BE.D0.B4.D0.BE.D0.B1.D0.BD.D1.8B.D0.B5_.D0.BE.D0.B1.D0.BE.D0.B7.D0.BD.D0.B0.D1.87.D0.B5.D0.BD.D0.B8.D1.8F Википедия]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! f(x)!! g(x)!! O!! o!! Ω!! ω!! Θ&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! 2^100&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n * log(n)&lt;br /&gt;
! 2^100 * n * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n&lt;br /&gt;
! 2^100 * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n!&lt;br /&gt;
! 2^(2015n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n*2^n&lt;br /&gt;
! 3^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 5^n&lt;br /&gt;
! 5^(n+1)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n + n^2 + n^3 + ... + n^1000&lt;br /&gt;
! 7^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм Quickselect нахождения k-ого элемента по возрастанию: http://en.wikipedia.org/wiki/Quickselect&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;На улице стоит ряд домов. В каждом из домов лежит сколько-то денег. Вор хочет обокрасть дома на переулке. Он не может обокрасть два соседних дома, потому что хозяин дома, который он обокрал, сразу предупредит соседей. Нужно найти, какую максимальную сумму вор может украсть с переулка. На вход программы подается массив неотрицательных целых чисел - количество долларов в доме с номером i. Соседние дома в массиве представлены соседними элементами. Например, пусть задан массив { 1, 4, 5 } - тогда вор максимум может украсть $6, обокрав дома 1 и 3. Пусть задан массив { 1, 7, 2 } - тогда вор максимум может украсть $7, обокрав дом 2.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Алфавит из всех маленьких латинских букв и пробела закодирован числами следующим способом:&lt;br /&gt;
  &#039;a&#039; -&amp;gt; 1&lt;br /&gt;
  &#039;b&#039; -&amp;gt; 2&lt;br /&gt;
  &#039;c&#039; -&amp;gt; 3&lt;br /&gt;
  ...&lt;br /&gt;
  &#039;z&#039; -&amp;gt; 26&lt;br /&gt;
  &#039; &#039; -&amp;gt; 27&lt;br /&gt;
На вход программы подается строка из цифр. Нужно посчитать, сколькими способами можно раскодировать эту строку.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Дан граф, заданный матрицей смежности. Вывести пары вершин между которыми нет пути.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Повторение (02.04) ==&lt;br /&gt;
Решали и разбирали первые 4 задачи из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14* (до 11.03)===&lt;br /&gt;
Решите любые две задачи (подпункты НЕ считаются отдельными задачами) с предыдущей пары (Повторение (30.03)).&lt;br /&gt;
&lt;br /&gt;
== Повторение (06.04) ==&lt;br /&gt;
Будем решать вторую половину задач из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 15 (до 16.04)===&lt;br /&gt;
# Приведите пример графа, который содержит отрицательные рёбра, не содержит циклов отрицательного веса и для которого алгоритм Дейкстры возвращает неверный результат.&lt;br /&gt;
# Используется ли в алгоритме Дейкстры то, что веса рёбер неотрицательны? Если &amp;quot;да&amp;quot;, то где именно?&lt;br /&gt;
# Пусть граф содержит рёбра с весами &amp;gt;= -100. Если прибавить к каждому ребру 101 и при помощи алгоритма Дейкстры найти кратчайшие пути. Будут ли эти пути кратчайшими в исходном графе? Почему?&lt;br /&gt;
&lt;br /&gt;
== Повторение (07.04) ==&lt;br /&gt;
&#039;&#039;&#039;Решение рекуррентных соотношений&#039;&#039;&#039;&lt;br /&gt;
# Решите уравнение: T(n) = 4*T(n/2) + O(n^2) с базой T(1) = O(1)&lt;br /&gt;
## Используя основную теорему.&lt;br /&gt;
## Используя дерево рекурсий.&lt;br /&gt;
## Методом подстановки.&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2)) + n является \Theta(n lg n).&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2) + 17) + n является \Theta(n lg n).&lt;br /&gt;
# Решите уравнения, считая, что T(1) = O(1):&lt;br /&gt;
## T(n) = T(n-1) + n&lt;br /&gt;
## T(n) = 2*T(floor(sqrt(n))) + lg n. Указание: попробуйте использовать замену переменных.&lt;br /&gt;
## T(n) = 3*T(sqrt(n)) + lg n&lt;br /&gt;
# Дайте верхнюю и нижнюю оценки функции T(n). Постарайтесь, чтобы оценки были как можно более точные&lt;br /&gt;
## T(n) = 4T(n/3) + n*lg(n)&lt;br /&gt;
## T(n) = 3T(n/3) + n/lg(n)&lt;br /&gt;
## T(n) = 4T(n/2) + n^2*sqrt(n)&lt;br /&gt;
## T(n) = T(n/2) + T(n/4) + T(n/8) + n&lt;br /&gt;
## T(n) = T(n-1) + 1/n&lt;br /&gt;
## T(n) = T(n-2) + 1/lg(n)&lt;br /&gt;
## T(n) = sqrt(n) * T(sqrt(n)) + n&lt;br /&gt;
&#039;&#039;&#039;Анализ и построение алгоритмов&#039;&#039;&#039;&lt;br /&gt;
# Числа Фибоначчи F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; можно выразить через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, используя матрицу: https://yadi.sk/i/Pm_aNzHCforFU. &lt;br /&gt;
## Покажите как вычислить F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;.&lt;br /&gt;
## Как вычислить F&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;n+1&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;?&lt;br /&gt;
## Напишите алгоритм.&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
## Ускорьте его так, чтобы он работал за O(log n).&lt;br /&gt;
# Дана последовательность символов. Какое минимальное количество символов нужно удалить из неё, чтобы получить палиндром?&lt;br /&gt;
## Напишите алгоритм (на псевдокоде или на любом языке программирования).&lt;br /&gt;
## Оцените время работы алгоритма.&lt;br /&gt;
# Какую структуру данных вы бы использовали для реализации упорядоченного множества (http://neerc.ifmo.ru/wiki/index.php?title=Упорядоченное_множество)? Какая будет сложность каждой из операций над множеством?&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 16 (до 20.04)===&lt;br /&gt;
# Решите 6 задач из первой части и 6 из второй. (Укажите какие именно.) Каждый из подпунктов является отдельной задачей.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм и теорема Форда-Фалкерсона (16.04)==&lt;br /&gt;
# Базовые определения (пропускные способности, сток, исток и пр.). Пример. &lt;br /&gt;
# Ограничения на поток (сохранение и что меньше пропускных способностей).&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, пример работы&lt;br /&gt;
# Разрез, определение, пример.&lt;br /&gt;
# Утверждение: максимальный поток &amp;lt;= любого разреза.&lt;br /&gt;
# Теорема Форда-Фалкерсона (с доказательством).&lt;br /&gt;
# Пример на котором алгоритм Форда-Фалкерсонаработает работает очень долго при неудачном выборе путей.&lt;br /&gt;
# Сложность алгоритма Форда-Фалкерсона.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №3==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
В [https://official.contest.yandex.ru/contest/1196 домашнем задании] пять задач. Они разделены на два варианта, помеченные римскими цифрами I и II. Свой вариант нужно узнать [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing здесь на вкладке HW3]. Третья задача — общая для двух вариантов; ее решение необходимо снабдить доказательством корректности алгоритма. На выполнение задания дается примерно 2 недели (см. точное время окончания в контесте). Каждую задачу можно написать на С++ или Python.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Форда-Фалкерсона и Эдмондса-Карпа (20.04)==&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, напоминание: базовые определения, пример работы, пример на котором алгоритм работает долго, сложность.&lt;br /&gt;
# Алгоритм Эдмодса-Карпа. Доказательство асимптотики времени работы.&lt;br /&gt;
&lt;br /&gt;
==(23.04)==&lt;br /&gt;
&lt;br /&gt;
==(11.05) Красно-чёрные деревья==&lt;br /&gt;
[https://ru.wikipedia.org/wiki/Красно-чёрное_дерево Красно-чёрное дерево]&lt;br /&gt;
===Домашнее задание 17 (до 18.04)===&lt;br /&gt;
# Зачем нужны красно-чёрные деревья?&lt;br /&gt;
# Благодаря какому свойству и почему красно-чёрное дерево является сбалансированным?&lt;br /&gt;
# Нарисуйте полное бинарное дерево поиска высотой 3 с ключами {1, 2, ..., 15}. Сделайте из него красно-чёрные деревья высотой 2, 3 и 4.&lt;br /&gt;
# Нарисуйте красно-чёрные деревья, получающиеся последовательной вставкой элементов 12, 10, 29, 30, 31, 32 в [https://ru.wikipedia.org/wiki/Красно-чёрное_дерево#/media/File:Red-black_tree_example.svg данное дерево]. Для вставки используйте алгоритм вставки из Википедии. Укажите какой именно функцией вы воспользовались.&lt;br /&gt;
# Определим &#039;&#039;&#039;ослабленное красно-чёрное дерево&#039;&#039;&#039; как бинарное дерево поиска, которое удовлетворяет красно-чёрным свойствам 1, 3, 4 и 5. Другими словами, корень может быть как чёрным, так и красным. Рассмотрите ослабленное красно-чёрное дерево T, корень которого красный. Если перекрасить корень дерева T в чёрный, будет ли оно красно-чёрным деревом?&lt;br /&gt;
# Покажите, что самый длинный простой нисходящий путь от вершины x к листу красно-черного дерева имеет длину, не более чем в два раза превышающую кратчайший путь от x к листу-потомку.&lt;br /&gt;
# Чему равно наибольшее возможное количество внутренних узлов в красно-чёрном дереве с чёрной высоты k? А наименьшее возможное количество?&lt;br /&gt;
# Нарисуйте красно-чёрные деревья, получающиеся последовательной вставкой ключей 41, 38, 31, 12, 19, 8 в изначально пустое дерево.&lt;br /&gt;
# Покажите какие деревья будут получаться в результате последовательного удаления ключей в порядке 8, 12, 19, 31, 38, 41.&lt;/div&gt;</summary>
		<author><name>Kassalanche</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=11260</id>
		<title>Алгоритмы и структуры данных. Подгруппа 105-1</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=11260"/>
		<updated>2015-05-11T08:04:07Z</updated>

		<summary type="html">&lt;p&gt;Kassalanche: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==О курсе==&lt;br /&gt;
[[Алгоритмы_и_структуры_данных|План лекций и список рекомендуемой литературы.]]&lt;br /&gt;
&lt;br /&gt;
[[Алгоритмы_и_структуры_данных._Подгруппа_105-1._FAQ|FAQ.]]&lt;br /&gt;
&lt;br /&gt;
[[Reviewboard|Инструкция по использованию Reviewboard.]]&lt;br /&gt;
&lt;br /&gt;
[[Практические_занятия_по_курсу_ОиМП/C++_check|Style guide.]]&lt;br /&gt;
&lt;br /&gt;
==Итоговая оценка за курс==&lt;br /&gt;
Итоговая оценка (ИО) зависит от&lt;br /&gt;
* оценок за пять больших домашних заданий (БДЗ1, БДЗ2, ..., БДЗ5),&lt;br /&gt;
* оценок за домашние задания (ДЗ1, ДЗ2, ...),&lt;br /&gt;
* оценки за контрольную работу (КР),&lt;br /&gt;
* оценки за экзамен (ЭКЗ),&lt;br /&gt;
и может быть вычислена по формуле:&lt;br /&gt;
 ИО = 0.7 * (0.3 * КР + 0.7 *(ИДЗ1 + ИДЗ2 + ИДЗ3 + ИДЗ4 + ИДЗ5)/5) + 0.3 * ЭКЗ =&lt;br /&gt;
    = 0.21*КР + 0.98*ИДЗ1 + 0.98*ИДЗ2 + 0.98*ИДЗ3 + 0.98*ИДЗ4 + 0.98*ИДЗ5 + 0.3*ЭКЗ,&lt;br /&gt;
где&lt;br /&gt;
 ИДЗi = min (10, 0.7 * БДЗi + 0.4 * &amp;lt;cредняя оценка за ДЗj, прошедшие с предыдущего БДЗ по i-ое&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
==Порядок сдачи домашних работ==&lt;br /&gt;
===Большие домашние работы===&lt;br /&gt;
# Получить OK за задачу в контесте.&lt;br /&gt;
# Залить исходный код на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* На каждую задачу создавайте отдельный запрос на ревью. &lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении суток приходят замечания к коду. &#039;&#039;&#039;Если в течении суток замечаний или Ship It не появилось, проверьте, что вы правильно отправили запрос и, если всё сделано правильно, спросите у семинариста получил ли он запрос.&#039;&#039;&#039;&lt;br /&gt;
# Вы их исправляете, проверяете в контесте, что программа по-прежнему проходит все тесты, заливаете новую версию в Review Board. Штрафов за посылки НЕ будет.&lt;br /&gt;
# Процесс повторяется пока остаются замечания к коду или пока не истёк дедлайн. После закрытия контеста будут ещё одни сутки на доработку замечаний в Review Board.&lt;br /&gt;
# Оценивается только последняя версия работы в Review Board.&lt;br /&gt;
&lt;br /&gt;
===Маленькие домашние работы===&lt;br /&gt;
# Залить решение на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* Желаемые форматы: txt, py, cpp, h. Допускаются любые другие.&lt;br /&gt;
#* На каждую домашнюю работу создавайте отдельный запрос на ревью. Обязательно указывайте номер домашней работы.&lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении неопределенного промежутка времени придут оценки по каждому из заданий.&lt;br /&gt;
&lt;br /&gt;
==Оценивание домашних работ==&lt;br /&gt;
* Все задания предполагаются индивидуальными. Запрещены любые заимствования без ссылки на автора.&lt;br /&gt;
* Решения после установленного дедлайна не принимаются. Дедлайн указан в заголовке каждого задания.&lt;br /&gt;
* Везде, где требуется написать алгоритм, можно использовать любой язык программирования или псевдокод.&lt;br /&gt;
* Там, где требуется построить алгоритм с заданной асимптотикой, приведите обоснование, что полученный алгоритм удовлетворяет этому условию.&lt;br /&gt;
* Эти правила не действуют, если в задании явно оговорено иное.&lt;br /&gt;
&lt;br /&gt;
==Мотивация к изучению алгоритмов. Подсчёт числа операций (12.01)==&lt;br /&gt;
# Числа Фибоначчи. Определение. Примитивный рекурсивный алгоритм вычисления i-ого числа. Оценка числа операций. Анализ причин неэффективности. Алгоритм с запоминанием вычисленных ранее значений. Оценка числа операций. Сравнение с предыдущим. (подробнее: глава 0, страницы 8-10 из книги &amp;lt;&amp;lt;Алгоритмы&amp;gt;&amp;gt;, [[Алгоритмы_и_структуры_данных|см. список рекомендованной литературы]])&lt;br /&gt;
# Задача о ханойской башне. Постановка задачи. Рекурсивный алгоритм. Рекуррентная формула для числа перемещений. Замкнутая формула для числа перемещений (+ доказательство). Доказательство того, что эту задачу нельзя решить используя меньшее число перемещений дисков. ([https://www.dropbox.com/s/t8cbs7ttu4iasvj/algo-0-recursion.pdf?dl=0 Разбор задачи о ханойской башне], автор Сергей Объедков)&lt;br /&gt;
# Сортировка пузырьком. Алгоритм. Подсчёт количество операций сравнения и обмена (swap). Анализ наилучшего и наихудшего случаев ([https://ru.wikipedia.org/wiki/Сортировка_пузырьком Википедия])&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 1 (12.01 - 26.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
Во всех задачах, если не оговорено иного, предполагаем, что работаем с целыми неотрицательными числами. Для первых 7 задач необходимо&lt;br /&gt;
* описать что можно считать наилучшим и наихудшим случаями,&lt;br /&gt;
* для каждого из двух случаев подсчитать отдельно количество операций сравнения и swap (если есть).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Даны три числа, требуется вернуть наименьшее.&lt;br /&gt;
# Даны три числа, требуется отсортировать их.&lt;br /&gt;
# Дана последовательность A из n элементов и число x, требуется найти элемент равный x. Примечание: если таких значений i несколько, вернуть любое; если такого элемента нет, функция должна сообщить об этом.&lt;br /&gt;
# * Дана упорядоченная последовательность A из n элементов и число x, требуется найти такое i, что A[i] равно x. Алгоритм должен быть эффективней, чем в предыдущем пункте и использовать то, что последовательность упорядочена.&lt;br /&gt;
# Дана последовательность из 100 000 чисел от 0 до 100. Напишите эффективный алгоритм сортировки, который бы учитывал специфику входных данных.&lt;br /&gt;
# * Дано 32 битное неотрицательное число. Требуется номер первого ненулевого бит. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения, считая, что числа распределены равномерно.&lt;br /&gt;
# * Даны 32 битные неотрицательные числа m и n. Требуется вывести True, если m &amp;lt; n, иначе False. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения битов, считая, что числа распределены равномерно.&lt;br /&gt;
# Напишите рекурсивную функцию, вычисляющую n-ое число Фибоначчи (как на занятии). Подсчитайте количество рекурсивных вызовов.&lt;br /&gt;
# * Напишите функцию, вычисляющую n-ое число Фибоначчи, у которой число операций — полином от n, и которая использует количество памяти, независящее от n.&lt;br /&gt;
&lt;br /&gt;
==O-символика и стратегия &amp;quot;разделяй и властвуй&amp;quot; (15.01)==&lt;br /&gt;
# Сортировка слиянием. Алгоритм, рекуррентное соотношение для времени сортировки, сложность. Подробнее: [https://dl.dropboxusercontent.com/u/829163/draft.pdf §2.3 Сортировка слиянием (стр. 54)].&lt;br /&gt;
# О-символика. [https://dl.dropboxusercontent.com/u/829163/draft.pdf §0.3 О-символика (стр. 10)].&lt;br /&gt;
# Задача о слиянии m упорядоченных массивов по n элементов. Три алгоритма решения: последовательное слияние, слияние &amp;quot;деревом&amp;quot; (обе функции используют Merge из MergeSort), аналог Merge для m массивов. Анализ сложности каждого из них.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 2 (15.01-29.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
* Во всех задачах, если не оговорено иного, для простоты &#039;&#039;можно&#039;&#039; считать, что n является степенью какого-либо числа, например, степенью двойки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Дана функция F, определённая ниже. Сколько строк она напечатает? Указание: для обоих подпунктов рассмотрите два случая: 1. n является степенью двойки, 2. n не является степенью двойки.&lt;br /&gt;
## Запишите рекуррентное соотношение для числа строк.&lt;br /&gt;
## Решите уравнение, полученное в предыдущем пункте, то есть, выведите замкнутую (нерекуррентную формулу). Для простоты можно считать, что n является степенью двойки.&lt;br /&gt;
# В массиве A размера n записана возрастающая последовательность целых чисел. Постройте алгоритм типа &amp;quot;разделяй и властвуй&amp;quot;, который проверяет, существует ли такой индекс i, что A[i] = i&lt;br /&gt;
## за время O(n),&lt;br /&gt;
## * за время O(log n).&lt;br /&gt;
## Какие случаи для вашего алгоритма являются наихудшими и наилучшими? Какого время работы в лучшем и худшем случаях?&lt;br /&gt;
# Дан бесконечный массив A, первые n элементов которого содержат возрастающую последовательность положительных чисел, а дальше стоят -1. Значение n не дано. Постройте алгоритм, который получает на вход целое число x и находит это x в массиве --- или говорит, что там его нет, &lt;br /&gt;
## за время O(n),&lt;br /&gt;
## за время O(log n).&lt;br /&gt;
# Рассмотрим алгоритм вычисления наибольшего общего делителя (НОД) двух положительных чисел, основанный на методе &amp;quot;разделяй и властвуй&amp;quot;.&lt;br /&gt;
## (задание не оценивается) Прочитайте [https://dl.dropboxusercontent.com/u/829163/draft.pdf §1.2.3 Алгоритм Евклида (стр. 23)].&lt;br /&gt;
## * Докажите, что определение НОД-а, приведённое ниже, корректно.&lt;br /&gt;
## Постройте алгоритм, основанный на этом определении.&lt;br /&gt;
## Какой алгоритм будет быстрее для n-битовых чисел a и b при больших значениях n --- ваш или алгоритм Евклида?&lt;br /&gt;
# * Покажите как за время O(n log n) удалить из массива размера n все дубликаты, то есть оставить каждый элемент в одном экземпляре.&lt;br /&gt;
# * Даны два упорядоченных массива размера m и n. Постройте алгоритм, находящий k-й по величине элемент в объединении этих массивов за время O(log(n+m)). &lt;br /&gt;
&lt;br /&gt;
Функция F(n).&lt;br /&gt;
  если n &amp;gt; 1:&lt;br /&gt;
    напечатать &amp;quot;всё ещё работаю&amp;quot;&lt;br /&gt;
    F(n/2)&lt;br /&gt;
    F(n/2)&lt;br /&gt;
&lt;br /&gt;
Определение НОД-а.&lt;br /&gt;
             2НОД(a/2, b/2), если а и b чётны,&lt;br /&gt;
  НОД(a,b) = НОД(a, b/2), если а нечётно, b чётно,&lt;br /&gt;
             НОД((a-b)/2, b), если а и b нечётны.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;lt;nowiki&amp;gt;Задачи взяты из книги &amp;quot;Алгоритмы&amp;quot;, глава 2 (см. список рекомендованной литературы).&amp;lt;/nowiki&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Сложение и умножение (19.01)==&lt;br /&gt;
# Алгоритм сложения, его сложность (§1.1.1 Сложение*)&lt;br /&gt;
# &amp;quot;Школьный&amp;quot; алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Рекурсивный алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Алгоритм умножения, реализующий стратегию &amp;quot;разделяй и властвуй&amp;quot;, анализ сложности (§2.1 Умножение чисел*)&lt;br /&gt;
 * [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать.]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 3 (19.01 - 2.02)===&lt;br /&gt;
* Во всех задачах для простоты можно считать, что n является степенью какого-либо числа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Найдите произведение чисел 10011011 и 10111010 (в двоичной системе счисления), используя алгоритм умножения чисел, основанный на методе «разделяй и властвуй». Необходимо не только дать ответ, но и привести ход решения.&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 3 рекурсивных вызова для подзадач размера n-1 и комбинирует из них решение исходной задачи за О(n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте три верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 10 рекурсивных вызовов для подзадач размера n/2 и комбинирует из них решение исходной задачи за О(5n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте два верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Докажите, что 3m² + m = O(m²).&lt;br /&gt;
# Докажите, что lg m = O(m/1000), где lg m — это логарифм с двоичным основанием.&lt;br /&gt;
# Докажите, что из равенства f(n) = O(g(n)) не следует, что g(n) = O(f(n)).&lt;br /&gt;
# Докажите, что O(m) содержится в O(m²).&lt;br /&gt;
&lt;br /&gt;
==Решение рекуррентных уравнений (22.01)==&lt;br /&gt;
# Примеры решений рекуррентных уравнений (см. [https://www.dropbox.com/s/6a0r410zjm9qwe7/algo-3-recurrences.pdf?dl=0 конспект]).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 4 (до 14.02)===&lt;br /&gt;
* Нельзя использовать утверждение основной теоремы о решении рекуррентных соотношений.&lt;br /&gt;
* &#039;&#039;Можно&#039;&#039; использовать метод построения дерева рекурсии или подстановку (метод с угадыванием ответа).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Какой из трёх приведённых ниже алгоритмов вы бы предпочли? Обоснуйте свой ответ.&lt;br /&gt;
#* Алгоритм A, решая задачу, производит пять рекурсивных вызовов для подзадач вдвое меньшего размера, после чего строит ответ для исходной задачи за линейное время.&lt;br /&gt;
#* Алгоритм B, решая задачу размера n, делает два рекурсивных вызова для задач размера n − 1, после чего находит ответ за время O(1).&lt;br /&gt;
#* Алгоритм C, решая задачу размера n, рекурсивно решает девять задач размера n/3 и строит ответ за время O(n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Найдите T(n) в замкнутой форме для любых 7 из 10 приведённых ниже рекуррентных соотношений:&lt;br /&gt;
## T(n) ≤ 2T(n/3) + 1;&lt;br /&gt;
## T(n) ≤ 7T(n/7) + n;&lt;br /&gt;
## T(n) ≤ 9T(n/3) + n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 8T(n/2) + n&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 49T(n/25) + n&amp;lt;sup&amp;gt;3/2&amp;lt;/sup&amp;gt;log n;&lt;br /&gt;
## T(n) ≤ T(n − 1) + 2;&lt;br /&gt;
## T(n) ≤ T(n − 1) + n&amp;lt;sup&amp;gt;c&amp;lt;/sup&amp;gt;, где c ≥ 1 –– константа;&lt;br /&gt;
## T(n) ≤ T(n − 1) + c&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;, где c &amp;gt; 1 –– константа;&lt;br /&gt;
## T(n) ≤ 2T(n − 1) + 1;&lt;br /&gt;
## T(n) ≤ T(sqrt(n)) + 1.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №1==&lt;br /&gt;
Необходимо реализовать все 6 задач из [https://official.contest.yandex.ru/contest/1002 контеста]. Каждую задачу можно писать на С++ или Python. На выполнение работы отводится две недели. Каждая задача оценивается в 10/6 балла. Оценка &#039;&#039;может&#039;&#039; быть снижена за плохой код, но не более чем на 25%.&lt;br /&gt;
&lt;br /&gt;
==Бинарное дерево поиска (26.01)==&lt;br /&gt;
# Определение. Пример.&lt;br /&gt;
# Не модифицирующие алгоритмы: поиск (рекурсивный и итеративный алгоритмы), поиск минимума, inordered обход (вывод значений узлов в отсортированном порядке), поиск следующего по возрастанию.&lt;br /&gt;
# Модифицирующие алгоритмы: вставка (рекурсивная реализация), удаление (только идея).&lt;br /&gt;
 [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 13, стр. 248]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 5 (до 16.02)===&lt;br /&gt;
* Для получения максимальной оценки можно выполнить или все задачи без звёздочки, или задачу со звёздочкой. Преподаватель понимает, что реализацию БДП сложно не найти в интернете, но от копипасты не будет никакой пользы. Напротив, самостоятельная реализация очень полезна и приветствуется, даже если не получится выполнить всех пунктов задания.&lt;br /&gt;
* Задачи с двумя звёздочками необязательны.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Нарисуйте бинарные деревья поиска высотой 2, 3, 4, 5 и 6 для множества ключей {1, 4, 5, 10, 16, 17, 21}. Корень дерева имеет высоту 0.&lt;br /&gt;
# &#039;&#039;&#039;Сортировка с использованием БДП.&#039;&#039;&#039;&lt;br /&gt;
## Какова асимптотическая сложность алгоритма вставки элемента в дерево высоты d? Почему? Назовите наилучший и наиухдший случаи.&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который строит БДП в узлах которого стоят элементы данной последовательности. Можно использовать функцию Insert. Назовите наилучший и наихудший случаи. Есть теорема о том, что полученный алгоритм будет работать в среднем случае за время O(n * log n).&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который выводит их в порядке возрастания. Используйте бинарное дерево поиска. Какова в среднем случае сложность этого алгоритма? Назовите наилучший и наихудший случаи. Какова сложность в наихудшем случае?&lt;br /&gt;
# Напишите функцию GetRoot, которой на вход подаётся указатель на произвольный узел дерева, а она возвращает указатель на корень.&lt;br /&gt;
# Напишите процедуру PrintLeafs, которой на вход подаётся указатель на корень дерева, и она печатает листья дерева&lt;br /&gt;
## по возрастанию,&lt;br /&gt;
## по убыванию.&lt;br /&gt;
# ** Альтернативный обход в порядке возрастания бинарного дерева поиска с n узлами (или центрированный (inordered) обход) можно осуществить путём поиска минимального элемента дерева с помощью функции Minimum с последующий n-1 вызовом функции Next. Каково время работы такого алгоритма?&lt;br /&gt;
# * Реализуйте на С++ структуру данных бинарное дерево поиска, [https://yadi.sk/i/gi2SEStreFfSb используя заготовку].&lt;br /&gt;
## Нарисуйте бинарное дерево поиска, которое строится в функции getTreeExample.&lt;br /&gt;
## Реализуйте следующие алгоритмы: &lt;br /&gt;
### поиск минимума, &lt;br /&gt;
### inordered обход (вывод значений узлов в отсортированном порядке),&lt;br /&gt;
### поиск следующего по возрастанию,&lt;br /&gt;
### вставка элемента в дерево,&lt;br /&gt;
### сортировка последовательности с использованием БДП (дан вектор чисел, необходимо вывести их по возрастанию),&lt;br /&gt;
### ** удаление.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Карацубы, Штрассена. Быстрая сортировка (29.01)==&lt;br /&gt;
# Алгоритм Карацубы.&lt;br /&gt;
# Алгоритм Штрассена. [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать Дасгупту и др., §2.5 Умножение матриц]&lt;br /&gt;
# Быстрая сортировка и доказательство того, что в среднем случае она работает за О(n * log n). [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 8 Быстрая сортировка, стр. 148]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 6 (до 18.02)===&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Пусть мы хотим найти двоичное представление десятичного числа 10&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;. Будем считать, что n --- степень двойки (n = 2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt;).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Pwr2Bin(n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть 1010&lt;br /&gt;
    z = ...&lt;br /&gt;
    вернуть Multiply(z, z)&amp;lt;/source&amp;gt;&lt;br /&gt;
Multiply --- функция, перемножающая два n-битовых двоичных числа x и y по алгоритму Карацубы за O(n&amp;lt;sup&amp;gt;log&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;3&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Пусть мы хотим перевести произвольное десятичное число x в записи которого n=2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; чисел в двоичную систему счисления.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Dec2Bin(x, n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть binary[x]&lt;br /&gt;
    разделить x на два десятичных числа xl и xr из n/2 цифр.&lt;br /&gt;
    вернуть ...&amp;lt;/source&amp;gt;&lt;br /&gt;
Здесь binary --- это массив, содержащий двоичное представление десятичных цифр.&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Докажите, что математическое ожидание времени работы алгоритма быстрой сортировки (усреднение по всем вариантам выбора опорного элемента) на любом входе размера n удовлетворяет соотношению: T(n) ≤ O(n) + 1/n * &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt; (T(i-1) + T(n-i)).&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Найдите решение соотношения из предыдущего пункта.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Динамическое программирование (ДП). Первые примеры (02.01)==&lt;br /&gt;
# Нахождение самой длинной возрастающей подпоследовательности.&lt;br /&gt;
# Нахождение редакционного расстояния (или редакционной стоимости, расстояния Левенштейна).&lt;br /&gt;
# Нахождение представителя большинства.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 7 (до 20.02)===&lt;br /&gt;
* В этом задании везде, где требуется реализовать алгоритм, необходимо привести код на любом языке программирования.&lt;br /&gt;
* Для получения максимальной оценки нужно решить все задачи без звёздочек. Одна решённая задача со звёздочкой заменяет одну задачу без звёздочки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения редакционного расстояния (алгоритм Вагнера — Фишера). Например, редакционное расстояние между словами &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равно 6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения длины наибольшей общей подстроки. Например, длина наибольшей общей подстроки &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равна 8 (&amp;quot;antholog&amp;quot;). Чем больше это значение, тем схожей строки.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Предположим теперь, что сравниваемые строки состоят из символов A, С, G и T; за удаление или вставку мы платим -5; за замену буквы x на y платим w[x, y], где x, y принадлежат множеству {A, С, G, T}, a w — это матрица весов:&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
!-!! A!! G!! C!! T&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! A&lt;br /&gt;
|10||-1||-3||-4&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
!G&lt;br /&gt;
||-1||7||-5||-3&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! C&lt;br /&gt;
||-3||-5||9||0&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! T&lt;br /&gt;
||-4||-3||0||8&lt;br /&gt;
|}&lt;br /&gt;
Тогда выравнивание:&lt;br /&gt;
 AGACTAGTTAC&lt;br /&gt;
 CGA‒‒‒GACGT&lt;br /&gt;
будет иметь следующую оценку:&lt;br /&gt;
 w[A,C] + w[G,G] + w[A,A] + 3*(-5) + w[G,G] + w[T,A] + w[T,C] + w[A,G] + w[C,T] = -3 + 7 + 10 - 3*5 + 7 + (-4) + 0 + (-1) + 0 = 1.&lt;br /&gt;
&lt;br /&gt;
Напишите алгоритм, который находит максимальную стоимость всех возможных выравниваний. Верно ли, что чем больше это значение, тем непохожей строки?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как давно один народ отделился от другого? Кто похожей — итальянец и китаец или якут и эфиоп? На эти вопросы можно отвечать с разных точек зрения — культурной, исторической, лингвистической, ... В последние же годы человечество научилось секвенировать геном, что позволило исследовать этот вопрос с точки зрения генетики. Секвенирование генома — это процесс записи ДНК в виде нуклеотидной последовательности, которая представляет собой последовательность из четырёх символов — A, С, G и T. Существуют базы, которые хранят генетическую информацию о людях из разных стран и континентов, например, [http://www.mtdb.igp.uu.se/ http://www.mtdb.igp.uu.se/ → Download mtDNA sequences]. Чем больше сходство между геномами, тем сильнее родственные связи между их обладателями. Используя решение предыдущего пункта, выполните задания:&lt;br /&gt;
# Определите, кто похожей — итальянец и китаец или якут и эфиоп?&lt;br /&gt;
# Найдите нескольких похожих и нескольких непохожих народностей.&lt;br /&gt;
# * Выберите одну народность. Найдите самых похожих и самых непохожих на неё.&lt;br /&gt;
# * Найдите самые похожие и самые непохожие народности.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Задача о разрезании стержня (05.01)==&lt;br /&gt;
# Постановка задачи.&lt;br /&gt;
# Решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Решение с нахождением максимума по p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Восходящий алгоритм с запоминанием. Вывод длин кусочков стержня. Оценка сложности.&lt;br /&gt;
# Нисходящий алгоритм с запоминанием. Оценка сложности.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.1 Разрезание стержня, стр. 393]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 8 (до 22.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Решая задачу о разрезании стержня мы вначале построили рекурсивное решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt; для всех 1 ≤ i &amp;lt; n. Его сложность описывалась рекуррентной формулой T(n) = n + &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n-1&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt;(T(i) + T(n-i)), T(1) = 1.&lt;br /&gt;
# Объясните эту формулу.&lt;br /&gt;
# Покажите с помощью метода подстановок, что T(n) ≤ 2&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Покажите с помощью контрпримера, что описанная далее жадная стратегия не всегда определяет оптимальный способ разрезания стержня. Определим плотность стержня длиной i как p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;/i, то есть как стоимость единицы его длины. Жадная стратегия для стержня длиной n отрезает от стержня первую часть длиной i, где 1 ≤ i ≤ n, имеющую максимальную плотность. Затем та же жадная стратегия применяется к оставшейся части длиной n-i.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Рассмотрим модификацию задачи разрезания стержня, в которой в дополнение к цене p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; каждого стержня добавляется фиксированная цена разреза c. Теперь прибыль, связанная с решением, представляет собой сумму цен частей стержня минус стоимость разрезов. Разработайте алгоритм динамического программирования для этой модифицированной задачи.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Непрерывным участком называется группа подряд идущих элементов. Например, для последовательности&lt;br /&gt;
 5, 15, −30, 10, −5, 40, 10&lt;br /&gt;
элементы 15, −30, 10 образуют непрерывный участок, а 5, 15, 40 -- нет. Постройте линейный алгоритм для следующей задачи:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Вход: список чисел a1, a2, ... ‌, an.&lt;br /&gt;
Выход: непрерывный участок с максимальной суммой (сумма участка нулевой длины равна нулю).&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Для приведённого примера ответом будет 10, −5, 40, 10 с суммой 55. Какова сложность алгоритма? Почему?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Надо заплатить v рублей, имея купюры в x1, x2, ‌..., xn рублей (купюр каждого типа сколько угодно). Это не всегда возможно (скажем, купюрами в&lt;br /&gt;
10 и 25 рублей можно заплатить 45 рублей, но не 47 и не 15). Постройте основанный на методе динамического программирования алгоритм со временем работы O(nv), выясняющий, возможна ли уплата.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как решить предыдущую задачу, если каждая купюра имеется в единственном экземпляре? (Например, купюрами в 1, 5, 10, 20 рублей можно заплатить 16 = 1 + 5 + 10 и 31 = 1 + 10 + 20 рублей, но не 40 (не хватит денег). Время работы алгоритма по-прежнему O(nv).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Ещё один вариант той же задачи: купюр каждого типа сколько угодно, но всего разрешается использовать не более k купюр. (Например, если есть купюры в 5 и 10 рублей, а k = 6, то 55 разменять можно, а 65 –– нет).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Перемножение цепочки матриц. Оптимальное бинарное дерево поиска (начало) (09.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о перемножении цепочки матриц. Постановка задачи.Пример. Нисходящий алгоритм.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.2 Перемножение цепочки матриц, стр. 403]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 9 (до 24.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Найдите оптимальную расстановку скобок в произведении последовательности матриц, размерности которых равны 5×10, 10×3, 3×12, 12×5, 5×50, 50×6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Напишите восходящий алгоритм для поиска оптимальной расстановки скобок.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Расстановка пробелов. Оптимальное бинарное дерево поиска (середина) (12.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о расстановке пробелов. Постановка задачи. Решения для трёх случаев: 1. нужно вернуть можно ли разбить текст на слова; 2. вернуть разбивку на слова; 3. слова встречаются не равновероятно, вернуть наиболее вероятную разбивку на слова.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи. Вывод математического ожидания времени поиска.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Праздничное домашнее задание 10 (до 02.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[&amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;,&amp;quot;, &amp;quot;.&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;,&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;.&amp;quot;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Подсказка:&#039;&#039;&#039; разбейте текст на слова из списка и посмотрите на азбуку Морзе.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Способы представления графов в памяти (16.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Разбор ошибок в домашнем задании.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Графы. Способы представления графов в памяти (матрица смежности, список рёбер, список соседей (список смежностей), матрица инцидентности). Зависимость сложности алгоритмов от способа представления.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §22.1 Представление графов, стр. 626]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 11 (до 02.03)===&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача A.]&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача B.]&lt;br /&gt;
# Нарисуйте неориентированный граф с 5 вершинами и 8 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Нарисуйте ориентированный граф с 4 вершинами и 3 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Дан ориентированный граф. &#039;&#039;Исходящая степень вершины v&#039;&#039; --- это количество исходящих из неё рёбер, &#039;&#039;входящая степень v&#039;&#039; --- это количество рёбер входящих в  v. Имеется представление ориентированного графа с использование списка соседей. Как долго будут вычисляться исходящие степени всех вершин графа? А входящие степени?&lt;br /&gt;
# Дан граф G = (V, E). Какие из рассмотренных способов хранения графов используют меньше всего памяти для хранения G и почему? Указание: рассмотрите случаи |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;lt; |E| и |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;gt; |E|.&lt;br /&gt;
# Пусть C --- это матрица смежности графа G.&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
# Пусть B --- это матрица инцидентности ориентированного графа G. Как связаны элементы матрицы BB&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
&lt;br /&gt;
==Реализация поиска в глубину (19.02)==&lt;br /&gt;
# Реализация поиска в глубину и смежных задач.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 12 (до 5.03)===&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Выберите любой способ хранения графа. Реализуйте поиск в глубину.&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Напишите алгоритм, который возвращает данные о том, какие вершины лежат в одной компоненте связности.&lt;br /&gt;
# &#039;&#039;(любой ЯП или псевдокод)&#039;&#039; Напишите алгоритм проверки сильной связности ориентированного графа. Какова его сложность?&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №2==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
Необходимо реализовать 3 задачи из [https://official.contest.yandex.ru/contest/1085 контеста], см. [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing распределение задач]. Каждую задачу можно написать на С++ или Python. На выполнение работы отводится две недели (см. время окончания контеста). [https://official.contest.yandex.ru/contest/1123 Дорешивание.]&lt;br /&gt;
&lt;br /&gt;
==ДП и графы (26.02)==&lt;br /&gt;
==ДП и графы (02.03)==&lt;br /&gt;
==Жадные алгоритмы (12.03)==&lt;br /&gt;
===Домашнее задание 13 (до 23.03)===&lt;br /&gt;
# Вася хочет купить по одной акции каждой компании. Все акции стоят одинаково, но дорожают по-разному. Каждый месяц акция i-ой компании дорожает в r_i раз. В один месяц можно купить только одну акцию.&lt;br /&gt;
## Напишите алгоритм, который выводит оптимальную последовательность покупок (такую, что на покупку всех акций потратится меньше денег).&lt;br /&gt;
## Докажите корректность алгоритма, то есть докажите, что последовательность покупок, которую выводит ваш алгоритм, оптимальна.&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список, очередь (16.03)==&lt;br /&gt;
# Реализация линейного двусвязного списка (С++).&lt;br /&gt;
# Реализация очереди ограниченной длины на базе вектора (С++).&lt;br /&gt;
# Реализация очереди на базе списка (С++).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14 (до 23.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте (на С++) структуру данных Стек. У стека должно быть три операции:&lt;br /&gt;
* push --- положить элемент на вершину стека;&lt;br /&gt;
* pop --- удалить верхний элемент;&lt;br /&gt;
* front --- вернуть значение верхнего элемента.&lt;br /&gt;
Оцените время работы каждой функции.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список (19.03)==&lt;br /&gt;
===Домашнее задание 13* (до 30.03)===&lt;br /&gt;
#Для приведённой реализации класса List (https://yadi.sk/i/c5r_79WdfMyNS).&lt;br /&gt;
## Допишите print, push_back и push_front.&lt;br /&gt;
## В функции insert_after и delete_node вставьте необходимые проверки так, чтобы они работали для крайних случаев.&lt;br /&gt;
## Напишите main в котором&lt;br /&gt;
### создаётся объект класса List, &lt;br /&gt;
### заполняется элементами с помощью функций push_back, push_front и insert_after и&lt;br /&gt;
### удаляется i-ый элемент.&lt;br /&gt;
&lt;br /&gt;
==Повторение (30.03)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Для данных пар функций выясните их связь в терминах O-, o-, Ω-, ω-, Θ-обозначений. Поставьте галочку в клетке с Ω, если f(x) = Ω(g(x)) и прочерк, если равенства нет. [https://ru.wikipedia.org/wiki/«O»_большое_и_«o»_малое#.D0.94.D1.80.D1.83.D0.B3.D0.B8.D0.B5_.D0.BF.D0.BE.D0.B4.D0.BE.D0.B1.D0.BD.D1.8B.D0.B5_.D0.BE.D0.B1.D0.BE.D0.B7.D0.BD.D0.B0.D1.87.D0.B5.D0.BD.D0.B8.D1.8F Википедия]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! f(x)!! g(x)!! O!! o!! Ω!! ω!! Θ&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! 2^100&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n * log(n)&lt;br /&gt;
! 2^100 * n * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n&lt;br /&gt;
! 2^100 * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n!&lt;br /&gt;
! 2^(2015n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n*2^n&lt;br /&gt;
! 3^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 5^n&lt;br /&gt;
! 5^(n+1)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n + n^2 + n^3 + ... + n^1000&lt;br /&gt;
! 7^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм Quickselect нахождения k-ого элемента по возрастанию: http://en.wikipedia.org/wiki/Quickselect&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;На улице стоит ряд домов. В каждом из домов лежит сколько-то денег. Вор хочет обокрасть дома на переулке. Он не может обокрасть два соседних дома, потому что хозяин дома, который он обокрал, сразу предупредит соседей. Нужно найти, какую максимальную сумму вор может украсть с переулка. На вход программы подается массив неотрицательных целых чисел - количество долларов в доме с номером i. Соседние дома в массиве представлены соседними элементами. Например, пусть задан массив { 1, 4, 5 } - тогда вор максимум может украсть $6, обокрав дома 1 и 3. Пусть задан массив { 1, 7, 2 } - тогда вор максимум может украсть $7, обокрав дом 2.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Алфавит из всех маленьких латинских букв и пробела закодирован числами следующим способом:&lt;br /&gt;
  &#039;a&#039; -&amp;gt; 1&lt;br /&gt;
  &#039;b&#039; -&amp;gt; 2&lt;br /&gt;
  &#039;c&#039; -&amp;gt; 3&lt;br /&gt;
  ...&lt;br /&gt;
  &#039;z&#039; -&amp;gt; 26&lt;br /&gt;
  &#039; &#039; -&amp;gt; 27&lt;br /&gt;
На вход программы подается строка из цифр. Нужно посчитать, сколькими способами можно раскодировать эту строку.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Дан граф, заданный матрицей смежности. Вывести пары вершин между которыми нет пути.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Повторение (02.04) ==&lt;br /&gt;
Решали и разбирали первые 4 задачи из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14* (до 11.03)===&lt;br /&gt;
Решите любые две задачи (подпункты НЕ считаются отдельными задачами) с предыдущей пары (Повторение (30.03)).&lt;br /&gt;
&lt;br /&gt;
== Повторение (06.04) ==&lt;br /&gt;
Будем решать вторую половину задач из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 15 (до 16.04)===&lt;br /&gt;
# Приведите пример графа, который содержит отрицательные рёбра, не содержит циклов отрицательного веса и для которого алгоритм Дейкстры возвращает неверный результат.&lt;br /&gt;
# Используется ли в алгоритме Дейкстры то, что веса рёбер неотрицательны? Если &amp;quot;да&amp;quot;, то где именно?&lt;br /&gt;
# Пусть граф содержит рёбра с весами &amp;gt;= -100. Если прибавить к каждому ребру 101 и при помощи алгоритма Дейкстры найти кратчайшие пути. Будут ли эти пути кратчайшими в исходном графе? Почему?&lt;br /&gt;
&lt;br /&gt;
== Повторение (07.04) ==&lt;br /&gt;
&#039;&#039;&#039;Решение рекуррентных соотношений&#039;&#039;&#039;&lt;br /&gt;
# Решите уравнение: T(n) = 4*T(n/2) + O(n^2) с базой T(1) = O(1)&lt;br /&gt;
## Используя основную теорему.&lt;br /&gt;
## Используя дерево рекурсий.&lt;br /&gt;
## Методом подстановки.&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2)) + n является \Theta(n lg n).&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2) + 17) + n является \Theta(n lg n).&lt;br /&gt;
# Решите уравнения, считая, что T(1) = O(1):&lt;br /&gt;
## T(n) = T(n-1) + n&lt;br /&gt;
## T(n) = 2*T(floor(sqrt(n))) + lg n. Указание: попробуйте использовать замену переменных.&lt;br /&gt;
## T(n) = 3*T(sqrt(n)) + lg n&lt;br /&gt;
# Дайте верхнюю и нижнюю оценки функции T(n). Постарайтесь, чтобы оценки были как можно более точные&lt;br /&gt;
## T(n) = 4T(n/3) + n*lg(n)&lt;br /&gt;
## T(n) = 3T(n/3) + n/lg(n)&lt;br /&gt;
## T(n) = 4T(n/2) + n^2*sqrt(n)&lt;br /&gt;
## T(n) = T(n/2) + T(n/4) + T(n/8) + n&lt;br /&gt;
## T(n) = T(n-1) + 1/n&lt;br /&gt;
## T(n) = T(n-2) + 1/lg(n)&lt;br /&gt;
## T(n) = sqrt(n) * T(sqrt(n)) + n&lt;br /&gt;
&#039;&#039;&#039;Анализ и построение алгоритмов&#039;&#039;&#039;&lt;br /&gt;
# Числа Фибоначчи F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; можно выразить через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, используя матрицу: https://yadi.sk/i/Pm_aNzHCforFU. &lt;br /&gt;
## Покажите как вычислить F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;.&lt;br /&gt;
## Как вычислить F&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;n+1&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;?&lt;br /&gt;
## Напишите алгоритм.&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
## Ускорьте его так, чтобы он работал за O(log n).&lt;br /&gt;
# Дана последовательность символов. Какое минимальное количество символов нужно удалить из неё, чтобы получить палиндром?&lt;br /&gt;
## Напишите алгоритм (на псевдокоде или на любом языке программирования).&lt;br /&gt;
## Оцените время работы алгоритма.&lt;br /&gt;
# Какую структуру данных вы бы использовали для реализации упорядоченного множества (http://neerc.ifmo.ru/wiki/index.php?title=Упорядоченное_множество)? Какая будет сложность каждой из операций над множеством?&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 16 (до 20.04)===&lt;br /&gt;
# Решите 6 задач из первой части и 6 из второй. (Укажите какие именно.) Каждый из подпунктов является отдельной задачей.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм и теорема Форда-Фалкерсона (16.04)==&lt;br /&gt;
# Базовые определения (пропускные способности, сток, исток и пр.). Пример. &lt;br /&gt;
# Ограничения на поток (сохранение и что меньше пропускных способностей).&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, пример работы&lt;br /&gt;
# Разрез, определение, пример.&lt;br /&gt;
# Утверждение: максимальный поток &amp;lt;= любого разреза.&lt;br /&gt;
# Теорема Форда-Фалкерсона (с доказательством).&lt;br /&gt;
# Пример на котором алгоритм Форда-Фалкерсонаработает работает очень долго при неудачном выборе путей.&lt;br /&gt;
# Сложность алгоритма Форда-Фалкерсона.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №3==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
В [https://official.contest.yandex.ru/contest/1196 домашнем задании] пять задач. Они разделены на два варианта, помеченные римскими цифрами I и II. Свой вариант нужно узнать [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing здесь на вкладке HW3]. Третья задача — общая для двух вариантов; ее решение необходимо снабдить доказательством корректности алгоритма. На выполнение задания дается примерно 2 недели (см. точное время окончания в контесте). Каждую задачу можно написать на С++ или Python.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Форда-Фалкерсона и Эдмондса-Карпа(20.04)==&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, напоминание: базовые определения, пример работы, пример на котором алгоритм работает долго, сложность.&lt;br /&gt;
# Алгоритм Эдмодса-Карпа. Доказательство асимптотики времени работы.&lt;br /&gt;
&lt;br /&gt;
==(23.04)==&lt;br /&gt;
&lt;br /&gt;
==(11.05) Красно-чёрные деревья==&lt;br /&gt;
[https://ru.wikipedia.org/wiki/Красно-чёрное_дерево Красно-чёрное дерево]&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Зачем нужны красно-чёрные деревья?&lt;br /&gt;
# Благодаря какому свойству и почему красно-чёрное дерево является сбалансированным?&lt;br /&gt;
# Нарисуйте полное бинарное дерево поиска высотой 3 с ключами {1, 2, ..., 15}. Сделайте из него красно-чёрные деревья высотой 2, 3 и 4.&lt;br /&gt;
# Нарисуйте красно-чёрные деревья, получающиеся последовательной вставкой элементов 12, 10, 29, 30, 31, 32 в [https://ru.wikipedia.org/wiki/Красно-чёрное_дерево#/media/File:Red-black_tree_example.svg данное дерево]. Для вставки используйте алгоритм вставки из Википедии. Укажите какой именно функцией вы воспользовались.&lt;br /&gt;
# Определим &#039;&#039;&#039;ослабленное красно-чёрное дерево&#039;&#039;&#039; как бинарное дерево поиска, которое удовлетворяет красно-чёрным свойствам 1, 3, 4 и 5. Другими словами, корень может быть как чёрным, так и красным. Рассмотрите ослабленное красно-чёрное дерево T, корень которого красный. Если перекрасить корень дерева T в чёрный, будет ли оно красно-чёрным деревом?&lt;br /&gt;
# Покажите, что самый длинный простой нисходящий путь от вершины x к листу красно-черного дерева имеет длину, не более чем в два раза превышающую кратчайший путь от x к листу-потомку.&lt;br /&gt;
# Чему равно наибольшее возможное количество внутренних узлов в красно-чёрном дереве с чёрной высоты k? А наименьшее возможное количество?&lt;br /&gt;
# Нарисуйте красно-чёрные деревья, получающиеся последовательной вставкой ключей 41, 38, 31, 12, 19, 8 в изначально пустое дерево.&lt;br /&gt;
# Покажите какие деревья будут получаться в результате последовательного удаления ключей в порядке 8, 12, 19, 31, 38, 41.&lt;/div&gt;</summary>
		<author><name>Kassalanche</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%9F%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%B7%D0%B0%D0%BD%D1%8F%D1%82%D0%B8%D1%8F_%D0%BF%D0%BE_%D0%BA%D1%83%D1%80%D1%81%D1%83_%D0%9E%D0%B8%D0%9C%D0%9F/C%2B%2B_check&amp;diff=9120</id>
		<title>Практические занятия по курсу ОиМП/C++ check</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%9F%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%B7%D0%B0%D0%BD%D1%8F%D1%82%D0%B8%D1%8F_%D0%BF%D0%BE_%D0%BA%D1%83%D1%80%D1%81%D1%83_%D0%9E%D0%B8%D0%9C%D0%9F/C%2B%2B_check&amp;diff=9120"/>
		<updated>2015-04-28T16:08:34Z</updated>

		<summary type="html">&lt;p&gt;Kassalanche: /* Именование */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Оформление ==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Отступ - 4 пробела. Символы табуляции использовать для отступов запрещено.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Отступами выделяются: тела функций, структур/классов, вложенных блоков.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Бинарные операторы отбиваются пробелами с двух сторон, после унарных пробелы не ставятся: a += b + -c&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Пробелы после открывающей скобки и перед закрывающей скобкой не ставятся: f(1, (2 + 3)). Закрывающая скобка должна идти на той же строке, что и последнее выражение.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Максимальная длина строки - 100 символов.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Перед ; пробел не ставится. После ; в for ставится пробел.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Пустые блоки записываются как {} (а не ;).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Открывающая { пишется на той же строке, что и начало блока (if, while, for, объявление функции).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;else пишется на той же строке, что и закрывающая } от if: if (...) {...\n} else {&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Однострочные комментарии отделяются от кода двумя пробелами и начинаются с пробела.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Пробелы в конце строки запрещены.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Файл должен заканчиваться переводом строки.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;В range-base for двоеточие обрамляется пробелами.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;В начале/конце блока, после public/private/protected пустые строки не ставятся.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Перед объявлением функции/структуры/класса - пустая строка обязательна.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Секции include-ов и using-ов были упорядочены по алфавиту.&lt;br /&gt;
Плохо:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;vector&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Хорошо:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;vector&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Плохо:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
using std::vector;&lt;br /&gt;
using std::cin;&lt;br /&gt;
using std::cout;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Хорошо:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
using std::cin;&lt;br /&gt;
using std::cout;&lt;br /&gt;
using std::vector;&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Имя шаблона и параметр шаблона НЕ должны разделяться пробелом.&lt;br /&gt;
&lt;br /&gt;
Плохо:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
vector &amp;lt;int&amp;gt; v;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Хорошо:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
vector&amp;lt;int&amp;gt; v&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Именование ==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Имена переменных должны начинаться со строчной буквы.&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
! !! плохо !! хорошо&lt;br /&gt;
|-&lt;br /&gt;
!&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;int Distance;&amp;lt;/source&amp;gt;&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;int distance;&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Не используйте однобуквенных переменных (за исключением счётчиков циклов). Из названия переменной должно быть понятно что в ней хранится.&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
! !! плохо !! хорошо&lt;br /&gt;
|-&lt;br /&gt;
!&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;// количество строк и столбцов&lt;br /&gt;
size_t a, b;&amp;lt;/source&amp;gt;&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;//количество строк и столбцов&lt;br /&gt;
size_t rowCount, columnCount;&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Не используйте транслит в именах.&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
! !! плохо !! хорошо&lt;br /&gt;
|-&lt;br /&gt;
!&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;size_t dlina_massiva;&amp;lt;/source&amp;gt;&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;size_t length;&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Давайте переменным осмысленные имена. В частности, не используйте однобуквенных имён за исключением имён итераторов (i, j, k, ...), координат (x, y, z).&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
! !! плохо !! хорошо&lt;br /&gt;
|-&lt;br /&gt;
!&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
char alf(int j) { &lt;br /&gt;
    ...&lt;br /&gt;
}&lt;br /&gt;
// или&lt;br /&gt;
char alphabet(int j) { &lt;br /&gt;
    ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
char get_char(int j) {&lt;br /&gt;
    ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
!&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int ln;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int length;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Для переменных-счётчиков не следует использовать имена DocNum, NumDoc, DocsCount, DocsNum, CountDoc из-за неграмотности и неоднозначности. Для числа элементов (скажем документов) можно использовать NumDocs или DocCount. Для функции, долго и явно подсчитывающей это число, подойдет CountDocs().&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Функциям, которые возвращают bool, лучше давать имена, начинающиеся на is или has.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// плохо&lt;br /&gt;
bool graph_connected() { ... }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// хорошо&lt;br /&gt;
bool is_connected_graph() { ... }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// плохо&lt;br /&gt;
bool element(int n) { ... }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// хорошо&lt;br /&gt;
bool has_element(int n) { ... }&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== std::vector ==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Если требуется создать вектор размера n, воспользуйтесь специальным конструктором.&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
! !! плохо !! хорошо&lt;br /&gt;
|-&lt;br /&gt;
!&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;vector&amp;lt;int&amp;gt; v;&lt;br /&gt;
v.resize(n);&amp;lt;/source&amp;gt;&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;vector&amp;lt;int&amp;gt; v(n);&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Циклы ==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Если требуется перебрать элементы коллекции, предпочитайте [http://ru.cppreference.com/w/cpp/language/range-for range-base for]. Он лаконичней и легче читается.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// плохо&lt;br /&gt;
for (size_t i = 0; i &amp;lt; neighbors_list[vertex].size(); ++i) {&lt;br /&gt;
    if (!(visited[neighbors_list[vertex][i]])) {&lt;br /&gt;
        dfs(neighbors_list[vertex][i], visited);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// хорошо&lt;br /&gt;
for (const int&amp;amp; neighbor_vertex : neighbors_list[vertex]) {&lt;br /&gt;
    if (!(visited[neighbor_vertex])) {&lt;br /&gt;
        dfs(neighbor_vertex, visited);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Функции ==&lt;br /&gt;
Функции нужны&lt;br /&gt;
* для избежания дублирования кода;&lt;br /&gt;
* для того, чтобы можно было их переиспользовать много раз в различных проектах.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Порядок аргументов функции: сначала входные параметры (по значению либо константой ссылке), затем выходные (по указателю).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Передавайте аргументы в функции по константной ссылке везде, где это уместно.&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
! !! плохо !! хорошо&lt;br /&gt;
|-&lt;br /&gt;
!&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;void print_vector(vector&amp;lt;int&amp;gt; v) {&lt;br /&gt;
    ...&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;void print_vector(const vector&amp;lt;int&amp;gt;&amp;amp; v) {&lt;br /&gt;
    ...&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Не создавайте функции с избыточным числом аргументов. Например, в функцию, печатающую вектор, не нужно передавать размер вектора.&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
! !! плохо !! хорошо&lt;br /&gt;
|-&lt;br /&gt;
!&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;void print_vector(const vector&amp;lt;int&amp;gt;&amp;amp; v, int n) {&lt;br /&gt;
    for (size_t i = 0; i &amp;lt; n; ++i) {&lt;br /&gt;
        cout &amp;lt;&amp;lt; v[i] &amp;lt;&amp;lt; &amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;void print_vector(const vector&amp;lt;int&amp;gt;&amp;amp; v) {&lt;br /&gt;
    // Используйте v.size(), чтобы получить длину вектора&lt;br /&gt;
    for (size_t i = 0; i &amp;lt; v.size(); ++i) {&lt;br /&gt;
        cout &amp;lt;&amp;lt; v[i] &amp;lt;&amp;lt; &amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;В проекте есть вектор, хранящий путь &amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;vector&amp;lt;int&amp;gt; way&amp;lt;/source&amp;gt; и требуется написать функцию, которая печатает этот путь.&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
! !! плохо !! хорошо&lt;br /&gt;
|-&lt;br /&gt;
!&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;void print_way(const vector&amp;lt;int&amp;gt;&amp;amp; way) {&lt;br /&gt;
    for (size_t i = 0; i &amp;lt; way.size(); ++i) {&lt;br /&gt;
        cout &amp;lt;&amp;lt; way[i] &amp;lt;&amp;lt; &amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;void print_vector(const vector&amp;lt;int&amp;gt;&amp;amp; v) {&lt;br /&gt;
    for (size_t i = 0; i &amp;lt; v.size(); ++i) {&lt;br /&gt;
        cout &amp;lt;&amp;lt; v[i] &amp;lt;&amp;lt; &amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// или&lt;br /&gt;
&lt;br /&gt;
void print_vector(const vector&amp;lt;int&amp;gt;&amp;amp; v) {&lt;br /&gt;
    for (size_t i = 0; i &amp;lt; v.size(); ++i) {&lt;br /&gt;
        cout &amp;lt;&amp;lt; v[i] &amp;lt;&amp;lt; &amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void print_way(const vector&amp;lt;int&amp;gt;&amp;amp; way) {&lt;br /&gt;
    print_vector(way);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
Плохой вариант плох тем, что теряется свойство реюзабельности у функции: вы не сможете использовать её в другом проекте, где, скажем, нужно будет распечатать вектор оценок.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Прочее ==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Необходимо явно подключать заголовочные файлы, в которых объявляются используемые функции/классы/... Запрещено явно подключать один и тот же заголовочный файл дважды.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;В качестве логических операторов следует использовать &amp;amp;&amp;amp;, ||, ... Их аналоги and, or, ... запрещены.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Запрещено использовать приведение типов в стиле C - следует использовать *_cast.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Конструктор от одного аргумента должен быть объявлен explicit.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;При объявлении виртуальной функции следует использовать один и только один из спецификаторов virtual, final, override.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;При объявлении переменной спецификаторы static/extern/... идут перед именем типа.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Запрещено использовать директиву using namespace. Нужно либо каждый раз указывать namespace явно, либо импортировать конкретные типы/переменные: using std::vector.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Везде, где это возможно, используйте префиксный инкремент и декремент.&lt;br /&gt;
&lt;br /&gt;
Плохо:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
i++;&lt;br /&gt;
it--;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Хорошо:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
++i;&lt;br /&gt;
--it;&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Пишите код так, чтобы не было предупреждений (warnings) компилятора. Это нужно по двум причинам:&lt;br /&gt;
# Обычно компилятор выдаёт предупреждения по делу, на те места, где скрыта потенциальная ошибка.&lt;br /&gt;
# Если игнорировать &amp;quot;неважные&amp;quot; предупреждения, их может много накопиться и вы не заметите действительно важных.&lt;br /&gt;
В частности, избегайте сравнений знаковых (int) и беззнаковых (size_t) переменных.&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
! !! плохо !! хорошо&lt;br /&gt;
|-&lt;br /&gt;
!&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;for (int i = 0; i &amp;lt; v.size(); ++i) {&lt;br /&gt;
    ...&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;for (size_t i = 0; i &amp;lt; v.size(); ++i) {&lt;br /&gt;
    ...&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Примеры и проверка ==&lt;br /&gt;
[https://yadi.sk/d/0ZeUy2xKbyeuw как делать не надо]&lt;br /&gt;
&lt;br /&gt;
Флаги для [http://google-styleguide.googlecode.com/svn/trunk/cpplint/cpplint.py cpplint]: --filter=-,+build/include,-build/include_order,-build/include_what_you_use,+build/storage_class,+readability/alt_tokens,+readability/braces,+readability/casting,+readability/inheritance,+runtime/casting,+runtime/explicit,+whitespace/blank_line,+whitespace/braces,+whitespace/comma,+whitespace/comments,+whitespace/empty_conditional_body,+whitespace/empty_loop_body,+whitespace/end_of_line,+whitespace/ending_newline,+whitespace/forcolon,+whitespace/indent,+whitespace/line_length,+whitespace/newline,+whitespace/operators,+whitespace/parens,+whitespace/semicolon,+whitespace/tab --linelength=100&lt;/div&gt;</summary>
		<author><name>Kassalanche</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=8519</id>
		<title>Алгоритмы и структуры данных. Подгруппа 105-1</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=8519"/>
		<updated>2015-04-23T20:01:18Z</updated>

		<summary type="html">&lt;p&gt;Kassalanche: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==О курсе==&lt;br /&gt;
[[Алгоритмы_и_структуры_данных|План лекций и список рекомендуемой литературы.]]&lt;br /&gt;
&lt;br /&gt;
[[Алгоритмы_и_структуры_данных._Подгруппа_105-1._FAQ|FAQ.]]&lt;br /&gt;
&lt;br /&gt;
[[Reviewboard|Инструкция по использованию Reviewboard.]]&lt;br /&gt;
&lt;br /&gt;
[[Практические_занятия_по_курсу_ОиМП/C++_check|Style guide.]]&lt;br /&gt;
&lt;br /&gt;
==Итоговая оценка за курс==&lt;br /&gt;
Итоговая оценка (ИО) зависит от&lt;br /&gt;
* оценок за пять больших домашних заданий (БДЗ1, БДЗ2, ..., БДЗ5),&lt;br /&gt;
* оценок за домашние задания (ДЗ1, ДЗ2, ...),&lt;br /&gt;
* оценки за контрольную работу (КР),&lt;br /&gt;
* оценки за экзамен (ЭКЗ),&lt;br /&gt;
и может быть вычислена по формуле:&lt;br /&gt;
 ИО = 0.7 * (0.3 * КР + 0.7 *(ИДЗ1 + ИДЗ2 + ИДЗ3 + ИДЗ4 + ИДЗ5)/5) + 0.3 * ЭКЗ =&lt;br /&gt;
    = 0.21*КР + 0.98*ИДЗ1 + 0.98*ИДЗ2 + 0.98*ИДЗ3 + 0.98*ИДЗ4 + 0.98*ИДЗ5 + 0.3*ЭКЗ,&lt;br /&gt;
где&lt;br /&gt;
 ИДЗi = min (10, 0.7 * БДЗi + 0.4 * &amp;lt;cредняя оценка за ДЗj, прошедшие с предыдущего БДЗ по i-ое&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
==Порядок сдачи домашних работ==&lt;br /&gt;
===Большие домашние работы===&lt;br /&gt;
# Получить OK за задачу в контесте.&lt;br /&gt;
# Залить исходный код на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* На каждую задачу создавайте отдельный запрос на ревью. &lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении суток приходят замечания к коду. &#039;&#039;&#039;Если в течении суток замечаний или Ship It не появилось, проверьте, что вы правильно отправили запрос и, если всё сделано правильно, спросите у семинариста получил ли он запрос.&#039;&#039;&#039;&lt;br /&gt;
# Вы их исправляете, проверяете в контесте, что программа по-прежнему проходит все тесты, заливаете новую версию в Review Board. Штрафов за посылки НЕ будет.&lt;br /&gt;
# Процесс повторяется пока остаются замечания к коду или пока не истёк дедлайн. После закрытия контеста будут ещё одни сутки на доработку замечаний в Review Board.&lt;br /&gt;
# Оценивается только последняя версия работы в Review Board.&lt;br /&gt;
&lt;br /&gt;
===Маленькие домашние работы===&lt;br /&gt;
# Залить решение на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* Желаемые форматы: txt, py, cpp, h. Допускаются любые другие.&lt;br /&gt;
#* На каждую домашнюю работу создавайте отдельный запрос на ревью. Обязательно указывайте номер домашней работы.&lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении неопределенного промежутка времени придут оценки по каждому из заданий.&lt;br /&gt;
&lt;br /&gt;
==Оценивание домашних работ==&lt;br /&gt;
* Все задания предполагаются индивидуальными. Запрещены любые заимствования без ссылки на автора.&lt;br /&gt;
* Решения после установленного дедлайна не принимаются. Дедлайн указан в заголовке каждого задания.&lt;br /&gt;
* Везде, где требуется написать алгоритм, можно использовать любой язык программирования или псевдокод.&lt;br /&gt;
* Там, где требуется построить алгоритм с заданной асимптотикой, приведите обоснование, что полученный алгоритм удовлетворяет этому условию.&lt;br /&gt;
* Эти правила не действуют, если в задании явно оговорено иное.&lt;br /&gt;
&lt;br /&gt;
==Мотивация к изучению алгоритмов. Подсчёт числа операций (12.01)==&lt;br /&gt;
# Числа Фибоначчи. Определение. Примитивный рекурсивный алгоритм вычисления i-ого числа. Оценка числа операций. Анализ причин неэффективности. Алгоритм с запоминанием вычисленных ранее значений. Оценка числа операций. Сравнение с предыдущим. (подробнее: глава 0, страницы 8-10 из книги &amp;lt;&amp;lt;Алгоритмы&amp;gt;&amp;gt;, [[Алгоритмы_и_структуры_данных|см. список рекомендованной литературы]])&lt;br /&gt;
# Задача о ханойской башне. Постановка задачи. Рекурсивный алгоритм. Рекуррентная формула для числа перемещений. Замкнутая формула для числа перемещений (+ доказательство). Доказательство того, что эту задачу нельзя решить используя меньшее число перемещений дисков. ([https://www.dropbox.com/s/t8cbs7ttu4iasvj/algo-0-recursion.pdf?dl=0 Разбор задачи о ханойской башне], автор Сергей Объедков)&lt;br /&gt;
# Сортировка пузырьком. Алгоритм. Подсчёт количество операций сравнения и обмена (swap). Анализ наилучшего и наихудшего случаев ([https://ru.wikipedia.org/wiki/Сортировка_пузырьком Википедия])&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 1 (12.01 - 26.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
Во всех задачах, если не оговорено иного, предполагаем, что работаем с целыми неотрицательными числами. Для первых 7 задач необходимо&lt;br /&gt;
* описать что можно считать наилучшим и наихудшим случаями,&lt;br /&gt;
* для каждого из двух случаев подсчитать отдельно количество операций сравнения и swap (если есть).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Даны три числа, требуется вернуть наименьшее.&lt;br /&gt;
# Даны три числа, требуется отсортировать их.&lt;br /&gt;
# Дана последовательность A из n элементов и число x, требуется найти элемент равный x. Примечание: если таких значений i несколько, вернуть любое; если такого элемента нет, функция должна сообщить об этом.&lt;br /&gt;
# * Дана упорядоченная последовательность A из n элементов и число x, требуется найти такое i, что A[i] равно x. Алгоритм должен быть эффективней, чем в предыдущем пункте и использовать то, что последовательность упорядочена.&lt;br /&gt;
# Дана последовательность из 100 000 чисел от 0 до 100. Напишите эффективный алгоритм сортировки, который бы учитывал специфику входных данных.&lt;br /&gt;
# * Дано 32 битное неотрицательное число. Требуется номер первого ненулевого бит. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения, считая, что числа распределены равномерно.&lt;br /&gt;
# * Даны 32 битные неотрицательные числа m и n. Требуется вывести True, если m &amp;lt; n, иначе False. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения битов, считая, что числа распределены равномерно.&lt;br /&gt;
# Напишите рекурсивную функцию, вычисляющую n-ое число Фибоначчи (как на занятии). Подсчитайте количество рекурсивных вызовов.&lt;br /&gt;
# * Напишите функцию, вычисляющую n-ое число Фибоначчи, у которой число операций — полином от n, и которая использует количество памяти, независящее от n.&lt;br /&gt;
&lt;br /&gt;
==O-символика и стратегия &amp;quot;разделяй и властвуй&amp;quot; (15.01)==&lt;br /&gt;
# Сортировка слиянием. Алгоритм, рекуррентное соотношение для времени сортировки, сложность. Подробнее: [https://dl.dropboxusercontent.com/u/829163/draft.pdf §2.3 Сортировка слиянием (стр. 54)].&lt;br /&gt;
# О-символика. [https://dl.dropboxusercontent.com/u/829163/draft.pdf §0.3 О-символика (стр. 10)].&lt;br /&gt;
# Задача о слиянии m упорядоченных массивов по n элементов. Три алгоритма решения: последовательное слияние, слияние &amp;quot;деревом&amp;quot; (обе функции используют Merge из MergeSort), аналог Merge для m массивов. Анализ сложности каждого из них.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 2 (15.01-29.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
* Во всех задачах, если не оговорено иного, для простоты &#039;&#039;можно&#039;&#039; считать, что n является степенью какого-либо числа, например, степенью двойки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Дана функция F, определённая ниже. Сколько строк она напечатает? Указание: для обоих подпунктов рассмотрите два случая: 1. n является степенью двойки, 2. n не является степенью двойки.&lt;br /&gt;
## Запишите рекуррентное соотношение для числа строк.&lt;br /&gt;
## Решите уравнение, полученное в предыдущем пункте, то есть, выведите замкнутую (нерекуррентную формулу). Для простоты можно считать, что n является степенью двойки.&lt;br /&gt;
# В массиве A размера n записана возрастающая последовательность целых чисел. Постройте алгоритм типа &amp;quot;разделяй и властвуй&amp;quot;, который проверяет, существует ли такой индекс i, что A[i] = i&lt;br /&gt;
## за время O(n),&lt;br /&gt;
## * за время O(log n).&lt;br /&gt;
## Какие случаи для вашего алгоритма являются наихудшими и наилучшими? Какого время работы в лучшем и худшем случаях?&lt;br /&gt;
# Дан бесконечный массив A, первые n элементов которого содержат возрастающую последовательность положительных чисел, а дальше стоят -1. Значение n не дано. Постройте алгоритм, который получает на вход целое число x и находит это x в массиве --- или говорит, что там его нет, &lt;br /&gt;
## за время O(n),&lt;br /&gt;
## за время O(log n).&lt;br /&gt;
# Рассмотрим алгоритм вычисления наибольшего общего делителя (НОД) двух положительных чисел, основанный на методе &amp;quot;разделяй и властвуй&amp;quot;.&lt;br /&gt;
## (задание не оценивается) Прочитайте [https://dl.dropboxusercontent.com/u/829163/draft.pdf §1.2.3 Алгоритм Евклида (стр. 23)].&lt;br /&gt;
## * Докажите, что определение НОД-а, приведённое ниже, корректно.&lt;br /&gt;
## Постройте алгоритм, основанный на этом определении.&lt;br /&gt;
## Какой алгоритм будет быстрее для n-битовых чисел a и b при больших значениях n --- ваш или алгоритм Евклида?&lt;br /&gt;
# * Покажите как за время O(n log n) удалить из массива размера n все дубликаты, то есть оставить каждый элемент в одном экземпляре.&lt;br /&gt;
# * Даны два упорядоченных массива размера m и n. Постройте алгоритм, находящий k-й по величине элемент в объединении этих массивов за время O(log(n+m)). &lt;br /&gt;
&lt;br /&gt;
Функция F(n).&lt;br /&gt;
  если n &amp;gt; 1:&lt;br /&gt;
    напечатать &amp;quot;всё ещё работаю&amp;quot;&lt;br /&gt;
    F(n/2)&lt;br /&gt;
    F(n/2)&lt;br /&gt;
&lt;br /&gt;
Определение НОД-а.&lt;br /&gt;
             2НОД(a/2, b/2), если а и b чётны,&lt;br /&gt;
  НОД(a,b) = НОД(a, b/2), если а нечётно, b чётно,&lt;br /&gt;
             НОД((a-b)/2, b), если а и b нечётны.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;lt;nowiki&amp;gt;Задачи взяты из книги &amp;quot;Алгоритмы&amp;quot;, глава 2 (см. список рекомендованной литературы).&amp;lt;/nowiki&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Сложение и умножение (19.01)==&lt;br /&gt;
# Алгоритм сложения, его сложность (§1.1.1 Сложение*)&lt;br /&gt;
# &amp;quot;Школьный&amp;quot; алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Рекурсивный алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Алгоритм умножения, реализующий стратегию &amp;quot;разделяй и властвуй&amp;quot;, анализ сложности (§2.1 Умножение чисел*)&lt;br /&gt;
 * [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать.]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 3 (19.01 - 2.02)===&lt;br /&gt;
* Во всех задачах для простоты можно считать, что n является степенью какого-либо числа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Найдите произведение чисел 10011011 и 10111010 (в двоичной системе счисления), используя алгоритм умножения чисел, основанный на методе «разделяй и властвуй». Необходимо не только дать ответ, но и привести ход решения.&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 3 рекурсивных вызова для подзадач размера n-1 и комбинирует из них решение исходной задачи за О(n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте три верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 10 рекурсивных вызовов для подзадач размера n/2 и комбинирует из них решение исходной задачи за О(5n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте два верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Докажите, что 3m² + m = O(m²).&lt;br /&gt;
# Докажите, что lg m = O(m/1000), где lg m — это логарифм с двоичным основанием.&lt;br /&gt;
# Докажите, что из равенства f(n) = O(g(n)) не следует, что g(n) = O(f(n)).&lt;br /&gt;
# Докажите, что O(m) содержится в O(m²).&lt;br /&gt;
&lt;br /&gt;
==Решение рекуррентных уравнений (22.01)==&lt;br /&gt;
# Примеры решений рекуррентных уравнений (см. [https://www.dropbox.com/s/6a0r410zjm9qwe7/algo-3-recurrences.pdf?dl=0 конспект]).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 4 (до 14.02)===&lt;br /&gt;
* Нельзя использовать утверждение основной теоремы о решении рекуррентных соотношений.&lt;br /&gt;
* &#039;&#039;Можно&#039;&#039; использовать метод построения дерева рекурсии или подстановку (метод с угадыванием ответа).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Какой из трёх приведённых ниже алгоритмов вы бы предпочли? Обоснуйте свой ответ.&lt;br /&gt;
#* Алгоритм A, решая задачу, производит пять рекурсивных вызовов для подзадач вдвое меньшего размера, после чего строит ответ для исходной задачи за линейное время.&lt;br /&gt;
#* Алгоритм B, решая задачу размера n, делает два рекурсивных вызова для задач размера n − 1, после чего находит ответ за время O(1).&lt;br /&gt;
#* Алгоритм C, решая задачу размера n, рекурсивно решает девять задач размера n/3 и строит ответ за время O(n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Найдите T(n) в замкнутой форме для любых 7 из 10 приведённых ниже рекуррентных соотношений:&lt;br /&gt;
## T(n) ≤ 2T(n/3) + 1;&lt;br /&gt;
## T(n) ≤ 7T(n/7) + n;&lt;br /&gt;
## T(n) ≤ 9T(n/3) + n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 8T(n/2) + n&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 49T(n/25) + n&amp;lt;sup&amp;gt;3/2&amp;lt;/sup&amp;gt;log n;&lt;br /&gt;
## T(n) ≤ T(n − 1) + 2;&lt;br /&gt;
## T(n) ≤ T(n − 1) + n&amp;lt;sup&amp;gt;c&amp;lt;/sup&amp;gt;, где c ≥ 1 –– константа;&lt;br /&gt;
## T(n) ≤ T(n − 1) + c&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;, где c &amp;gt; 1 –– константа;&lt;br /&gt;
## T(n) ≤ 2T(n − 1) + 1;&lt;br /&gt;
## T(n) ≤ T(sqrt(n)) + 1.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №1==&lt;br /&gt;
Необходимо реализовать все 6 задач из [https://official.contest.yandex.ru/contest/1002 контеста]. Каждую задачу можно писать на С++ или Python. На выполнение работы отводится две недели. Каждая задача оценивается в 10/6 балла. Оценка &#039;&#039;может&#039;&#039; быть снижена за плохой код, но не более чем на 25%.&lt;br /&gt;
&lt;br /&gt;
==Бинарное дерево поиска (26.01)==&lt;br /&gt;
# Определение. Пример.&lt;br /&gt;
# Не модифицирующие алгоритмы: поиск (рекурсивный и итеративный алгоритмы), поиск минимума, inordered обход (вывод значений узлов в отсортированном порядке), поиск следующего по возрастанию.&lt;br /&gt;
# Модифицирующие алгоритмы: вставка (рекурсивная реализация), удаление (только идея).&lt;br /&gt;
 [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 13, стр. 248]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 5 (до 16.02)===&lt;br /&gt;
* Для получения максимальной оценки можно выполнить или все задачи без звёздочки, или задачу со звёздочкой. Преподаватель понимает, что реализацию БДП сложно не найти в интернете, но от копипасты не будет никакой пользы. Напротив, самостоятельная реализация очень полезна и приветствуется, даже если не получится выполнить всех пунктов задания.&lt;br /&gt;
* Задачи с двумя звёздочками необязательны.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Нарисуйте бинарные деревья поиска высотой 2, 3, 4, 5 и 6 для множества ключей {1, 4, 5, 10, 16, 17, 21}. Корень дерева имеет высоту 0.&lt;br /&gt;
# &#039;&#039;&#039;Сортировка с использованием БДП.&#039;&#039;&#039;&lt;br /&gt;
## Какова асимптотическая сложность алгоритма вставки элемента в дерево высоты d? Почему? Назовите наилучший и наиухдший случаи.&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который строит БДП в узлах которого стоят элементы данной последовательности. Можно использовать функцию Insert. Назовите наилучший и наихудший случаи. Есть теорема о том, что полученный алгоритм будет работать в среднем случае за время O(n * log n).&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который выводит их в порядке возрастания. Используйте бинарное дерево поиска. Какова в среднем случае сложность этого алгоритма? Назовите наилучший и наихудший случаи. Какова сложность в наихудшем случае?&lt;br /&gt;
# Напишите функцию GetRoot, которой на вход подаётся указатель на произвольный узел дерева, а она возвращает указатель на корень.&lt;br /&gt;
# Напишите процедуру PrintLeafs, которой на вход подаётся указатель на корень дерева, и она печатает листья дерева&lt;br /&gt;
## по возрастанию,&lt;br /&gt;
## по убыванию.&lt;br /&gt;
# ** Альтернативный обход в порядке возрастания бинарного дерева поиска с n узлами (или центрированный (inordered) обход) можно осуществить путём поиска минимального элемента дерева с помощью функции Minimum с последующий n-1 вызовом функции Next. Каково время работы такого алгоритма?&lt;br /&gt;
# * Реализуйте на С++ структуру данных бинарное дерево поиска, [https://yadi.sk/i/gi2SEStreFfSb используя заготовку].&lt;br /&gt;
## Нарисуйте бинарное дерево поиска, которое строится в функции getTreeExample.&lt;br /&gt;
## Реализуйте следующие алгоритмы: &lt;br /&gt;
### поиск минимума, &lt;br /&gt;
### inordered обход (вывод значений узлов в отсортированном порядке),&lt;br /&gt;
### поиск следующего по возрастанию,&lt;br /&gt;
### вставка элемента в дерево,&lt;br /&gt;
### сортировка последовательности с использованием БДП (дан вектор чисел, необходимо вывести их по возрастанию),&lt;br /&gt;
### ** удаление.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Карацубы, Штрассена. Быстрая сортировка (29.01)==&lt;br /&gt;
# Алгоритм Карацубы.&lt;br /&gt;
# Алгоритм Штрассена. [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать Дасгупту и др., §2.5 Умножение матриц]&lt;br /&gt;
# Быстрая сортировка и доказательство того, что в среднем случае она работает за О(n * log n). [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 8 Быстрая сортировка, стр. 148]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 6 (до 18.02)===&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Пусть мы хотим найти двоичное представление десятичного числа 10&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;. Будем считать, что n --- степень двойки (n = 2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt;).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Pwr2Bin(n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть 1010&lt;br /&gt;
    z = ...&lt;br /&gt;
    вернуть Multiply(z, z)&amp;lt;/source&amp;gt;&lt;br /&gt;
Multiply --- функция, перемножающая два n-битовых двоичных числа x и y по алгоритму Карацубы за O(n&amp;lt;sup&amp;gt;log&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;3&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Пусть мы хотим перевести произвольное десятичное число x в записи которого n=2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; чисел в двоичную систему счисления.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Dec2Bin(x, n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть binary[x]&lt;br /&gt;
    разделить x на два десятичных числа xl и xr из n/2 цифр.&lt;br /&gt;
    вернуть ...&amp;lt;/source&amp;gt;&lt;br /&gt;
Здесь binary --- это массив, содержащий двоичное представление десятичных цифр.&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Докажите, что математическое ожидание времени работы алгоритма быстрой сортировки (усреднение по всем вариантам выбора опорного элемента) на любом входе размера n удовлетворяет соотношению: T(n) ≤ O(n) + 1/n * &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt; (T(i-1) + T(n-i)).&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Найдите решение соотношения из предыдущего пункта.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Динамическое программирование (ДП). Первые примеры (02.01)==&lt;br /&gt;
# Нахождение самой длинной возрастающей подпоследовательности.&lt;br /&gt;
# Нахождение редакционного расстояния (или редакционной стоимости, расстояния Левенштейна).&lt;br /&gt;
# Нахождение представителя большинства.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 7 (до 20.02)===&lt;br /&gt;
* В этом задании везде, где требуется реализовать алгоритм, необходимо привести код на любом языке программирования.&lt;br /&gt;
* Для получения максимальной оценки нужно решить все задачи без звёздочек. Одна решённая задача со звёздочкой заменяет одну задачу без звёздочки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения редакционного расстояния (алгоритм Вагнера — Фишера). Например, редакционное расстояние между словами &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равно 6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения длины наибольшей общей подстроки. Например, длина наибольшей общей подстроки &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равна 8 (&amp;quot;antholog&amp;quot;). Чем больше это значение, тем схожей строки.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Предположим теперь, что сравниваемые строки состоят из символов A, С, G и T; за удаление или вставку мы платим -5; за замену буквы x на y платим w[x, y], где x, y принадлежат множеству {A, С, G, T}, a w — это матрица весов:&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
!-!! A!! G!! C!! T&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! A&lt;br /&gt;
|10||-1||-3||-4&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
!G&lt;br /&gt;
||-1||7||-5||-3&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! C&lt;br /&gt;
||-3||-5||9||0&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! T&lt;br /&gt;
||-4||-3||0||8&lt;br /&gt;
|}&lt;br /&gt;
Тогда выравнивание:&lt;br /&gt;
 AGACTAGTTAC&lt;br /&gt;
 CGA‒‒‒GACGT&lt;br /&gt;
будет иметь следующую оценку:&lt;br /&gt;
 w[A,C] + w[G,G] + w[A,A] + 3*(-5) + w[G,G] + w[T,A] + w[T,C] + w[A,G] + w[C,T] = -3 + 7 + 10 - 3*5 + 7 + (-4) + 0 + (-1) + 0 = 1.&lt;br /&gt;
&lt;br /&gt;
Напишите алгоритм, который находит максимальную стоимость всех возможных выравниваний. Верно ли, что чем больше это значение, тем непохожей строки?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как давно один народ отделился от другого? Кто похожей — итальянец и китаец или якут и эфиоп? На эти вопросы можно отвечать с разных точек зрения — культурной, исторической, лингвистической, ... В последние же годы человечество научилось секвенировать геном, что позволило исследовать этот вопрос с точки зрения генетики. Секвенирование генома — это процесс записи ДНК в виде нуклеотидной последовательности, которая представляет собой последовательность из четырёх символов — A, С, G и T. Существуют базы, которые хранят генетическую информацию о людях из разных стран и континентов, например, [http://www.mtdb.igp.uu.se/ http://www.mtdb.igp.uu.se/ → Download mtDNA sequences]. Чем больше сходство между геномами, тем сильнее родственные связи между их обладателями. Используя решение предыдущего пункта, выполните задания:&lt;br /&gt;
# Определите, кто похожей — итальянец и китаец или якут и эфиоп?&lt;br /&gt;
# Найдите нескольких похожих и нескольких непохожих народностей.&lt;br /&gt;
# * Выберите одну народность. Найдите самых похожих и самых непохожих на неё.&lt;br /&gt;
# * Найдите самые похожие и самые непохожие народности.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Задача о разрезании стержня (05.01)==&lt;br /&gt;
# Постановка задачи.&lt;br /&gt;
# Решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Решение с нахождением максимума по p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Восходящий алгоритм с запоминанием. Вывод длин кусочков стержня. Оценка сложности.&lt;br /&gt;
# Нисходящий алгоритм с запоминанием. Оценка сложности.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.1 Разрезание стержня, стр. 393]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 8 (до 22.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Решая задачу о разрезании стержня мы вначале построили рекурсивное решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt; для всех 1 ≤ i &amp;lt; n. Его сложность описывалась рекуррентной формулой T(n) = n + &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n-1&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt;(T(i) + T(n-i)), T(1) = 1.&lt;br /&gt;
# Объясните эту формулу.&lt;br /&gt;
# Покажите с помощью метода подстановок, что T(n) ≤ 2&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Покажите с помощью контрпримера, что описанная далее жадная стратегия не всегда определяет оптимальный способ разрезания стержня. Определим плотность стержня длиной i как p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;/i, то есть как стоимость единицы его длины. Жадная стратегия для стержня длиной n отрезает от стержня первую часть длиной i, где 1 ≤ i ≤ n, имеющую максимальную плотность. Затем та же жадная стратегия применяется к оставшейся части длиной n-i.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Рассмотрим модификацию задачи разрезания стержня, в которой в дополнение к цене p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; каждого стержня добавляется фиксированная цена разреза c. Теперь прибыль, связанная с решением, представляет собой сумму цен частей стержня минус стоимость разрезов. Разработайте алгоритм динамического программирования для этой модифицированной задачи.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Непрерывным участком называется группа подряд идущих элементов. Например, для последовательности&lt;br /&gt;
 5, 15, −30, 10, −5, 40, 10&lt;br /&gt;
элементы 15, −30, 10 образуют непрерывный участок, а 5, 15, 40 -- нет. Постройте линейный алгоритм для следующей задачи:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Вход: список чисел a1, a2, ... ‌, an.&lt;br /&gt;
Выход: непрерывный участок с максимальной суммой (сумма участка нулевой длины равна нулю).&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Для приведённого примера ответом будет 10, −5, 40, 10 с суммой 55. Какова сложность алгоритма? Почему?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Надо заплатить v рублей, имея купюры в x1, x2, ‌..., xn рублей (купюр каждого типа сколько угодно). Это не всегда возможно (скажем, купюрами в&lt;br /&gt;
10 и 25 рублей можно заплатить 45 рублей, но не 47 и не 15). Постройте основанный на методе динамического программирования алгоритм со временем работы O(nv), выясняющий, возможна ли уплата.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как решить предыдущую задачу, если каждая купюра имеется в единственном экземпляре? (Например, купюрами в 1, 5, 10, 20 рублей можно заплатить 16 = 1 + 5 + 10 и 31 = 1 + 10 + 20 рублей, но не 40 (не хватит денег). Время работы алгоритма по-прежнему O(nv).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Ещё один вариант той же задачи: купюр каждого типа сколько угодно, но всего разрешается использовать не более k купюр. (Например, если есть купюры в 5 и 10 рублей, а k = 6, то 55 разменять можно, а 65 –– нет).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Перемножение цепочки матриц. Оптимальное бинарное дерево поиска (начало) (09.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о перемножении цепочки матриц. Постановка задачи.Пример. Нисходящий алгоритм.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.2 Перемножение цепочки матриц, стр. 403]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 9 (до 24.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Найдите оптимальную расстановку скобок в произведении последовательности матриц, размерности которых равны 5×10, 10×3, 3×12, 12×5, 5×50, 50×6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Напишите восходящий алгоритм для поиска оптимальной расстановки скобок.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Расстановка пробелов. Оптимальное бинарное дерево поиска (середина) (12.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о расстановке пробелов. Постановка задачи. Решения для трёх случаев: 1. нужно вернуть можно ли разбить текст на слова; 2. вернуть разбивку на слова; 3. слова встречаются не равновероятно, вернуть наиболее вероятную разбивку на слова.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи. Вывод математического ожидания времени поиска.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Праздничное домашнее задание 10 (до 02.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[&amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;,&amp;quot;, &amp;quot;.&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;,&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;.&amp;quot;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Подсказка:&#039;&#039;&#039; разбейте текст на слова из списка и посмотрите на азбуку Морзе.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Способы представления графов в памяти (16.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Разбор ошибок в домашнем задании.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Графы. Способы представления графов в памяти (матрица смежности, список рёбер, список соседей (список смежностей), матрица инцидентности). Зависимость сложности алгоритмов от способа представления.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §22.1 Представление графов, стр. 626]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 11 (до 02.03)===&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача A.]&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача B.]&lt;br /&gt;
# Нарисуйте неориентированный граф с 5 вершинами и 8 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Нарисуйте ориентированный граф с 4 вершинами и 3 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Дан ориентированный граф. &#039;&#039;Исходящая степень вершины v&#039;&#039; --- это количество исходящих из неё рёбер, &#039;&#039;входящая степень v&#039;&#039; --- это количество рёбер входящих в  v. Имеется представление ориентированного графа с использование списка соседей. Как долго будут вычисляться исходящие степени всех вершин графа? А входящие степени?&lt;br /&gt;
# Дан граф G = (V, E). Какие из рассмотренных способов хранения графов используют меньше всего памяти для хранения G и почему? Указание: рассмотрите случаи |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;lt; |E| и |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;gt; |E|.&lt;br /&gt;
# Пусть C --- это матрица смежности графа G.&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
# Пусть B --- это матрица инцидентности ориентированного графа G. Как связаны элементы матрицы BB&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
&lt;br /&gt;
==Реализация поиска в глубину (19.02)==&lt;br /&gt;
# Реализация поиска в глубину и смежных задач.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 12 (до 5.03)===&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Выберите любой способ хранения графа. Реализуйте поиск в глубину.&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Напишите алгоритм, который возвращает данные о том, какие вершины лежат в одной компоненте связности.&lt;br /&gt;
# &#039;&#039;(любой ЯП или псевдокод)&#039;&#039; Напишите алгоритм проверки сильной связности ориентированного графа. Какова его сложность?&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №2==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
Необходимо реализовать 3 задачи из [https://official.contest.yandex.ru/contest/1085 контеста], см. [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing распределение задач]. Каждую задачу можно написать на С++ или Python. На выполнение работы отводится две недели (см. время окончания контеста). [https://official.contest.yandex.ru/contest/1123 Дорешивание.]&lt;br /&gt;
&lt;br /&gt;
==ДП и графы (26.02)==&lt;br /&gt;
==ДП и графы (02.03)==&lt;br /&gt;
==Жадные алгоритмы (12.03)==&lt;br /&gt;
===Домашнее задание 13 (до 23.03)===&lt;br /&gt;
# Вася хочет купить по одной акции каждой компании. Все акции стоят одинаково, но дорожают по-разному. Каждый месяц акция i-ой компании дорожает в r_i раз. В один месяц можно купить только одну акцию.&lt;br /&gt;
## Напишите алгоритм, который выводит оптимальную последовательность покупок (такую, что на покупку всех акций потратится меньше денег).&lt;br /&gt;
## Докажите корректность алгоритма, то есть докажите, что последовательность покупок, которую выводит ваш алгоритм, оптимальна.&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список, очередь (16.03)==&lt;br /&gt;
# Реализация линейного двусвязного списка (С++).&lt;br /&gt;
# Реализация очереди ограниченной длины на базе вектора (С++).&lt;br /&gt;
# Реализация очереди на базе списка (С++).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14 (до 23.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте (на С++) структуру данных Стек. У стека должно быть три операции:&lt;br /&gt;
* push --- положить элемент на вершину стека;&lt;br /&gt;
* pop --- удалить верхний элемент;&lt;br /&gt;
* front --- вернуть значение верхнего элемента.&lt;br /&gt;
Оцените время работы каждой функции.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список (19.03)==&lt;br /&gt;
===Домашнее задание 13* (до 30.03)===&lt;br /&gt;
#Для приведённой реализации класса List (https://yadi.sk/i/c5r_79WdfMyNS).&lt;br /&gt;
## Допишите print, push_back и push_front.&lt;br /&gt;
## В функции insert_after и delete_node вставьте необходимые проверки так, чтобы они работали для крайних случаев.&lt;br /&gt;
## Напишите main в котором&lt;br /&gt;
### создаётся объект класса List, &lt;br /&gt;
### заполняется элементами с помощью функций push_back, push_front и insert_after и&lt;br /&gt;
### удаляется i-ый элемент.&lt;br /&gt;
&lt;br /&gt;
==Повторение (30.03)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Для данных пар функций выясните их связь в терминах O-, o-, Ω-, ω-, Θ-обозначений. Поставьте галочку в клетке с Ω, если f(x) = Ω(g(x)) и прочерк, если равенства нет. [https://ru.wikipedia.org/wiki/«O»_большое_и_«o»_малое#.D0.94.D1.80.D1.83.D0.B3.D0.B8.D0.B5_.D0.BF.D0.BE.D0.B4.D0.BE.D0.B1.D0.BD.D1.8B.D0.B5_.D0.BE.D0.B1.D0.BE.D0.B7.D0.BD.D0.B0.D1.87.D0.B5.D0.BD.D0.B8.D1.8F Википедия]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! f(x)!! g(x)!! O!! o!! Ω!! ω!! Θ&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! 2^100&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n * log(n)&lt;br /&gt;
! 2^100 * n * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n&lt;br /&gt;
! 2^100 * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n!&lt;br /&gt;
! 2^(2015n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n*2^n&lt;br /&gt;
! 3^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 5^n&lt;br /&gt;
! 5^(n+1)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n + n^2 + n^3 + ... + n^1000&lt;br /&gt;
! 7^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм Quickselect нахождения k-ого элемента по возрастанию: http://en.wikipedia.org/wiki/Quickselect&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;На улице стоит ряд домов. В каждом из домов лежит сколько-то денег. Вор хочет обокрасть дома на переулке. Он не может обокрасть два соседних дома, потому что хозяин дома, который он обокрал, сразу предупредит соседей. Нужно найти, какую максимальную сумму вор может украсть с переулка. На вход программы подается массив неотрицательных целых чисел - количество долларов в доме с номером i. Соседние дома в массиве представлены соседними элементами. Например, пусть задан массив { 1, 4, 5 } - тогда вор максимум может украсть $6, обокрав дома 1 и 3. Пусть задан массив { 1, 7, 2 } - тогда вор максимум может украсть $7, обокрав дом 2.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Алфавит из всех маленьких латинских букв и пробела закодирован числами следующим способом:&lt;br /&gt;
  &#039;a&#039; -&amp;gt; 1&lt;br /&gt;
  &#039;b&#039; -&amp;gt; 2&lt;br /&gt;
  &#039;c&#039; -&amp;gt; 3&lt;br /&gt;
  ...&lt;br /&gt;
  &#039;z&#039; -&amp;gt; 26&lt;br /&gt;
  &#039; &#039; -&amp;gt; 27&lt;br /&gt;
На вход программы подается строка из цифр. Нужно посчитать, сколькими способами можно раскодировать эту строку.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Дан граф, заданный матрицей смежности. Вывести пары вершин между которыми нет пути.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Повторение (02.04) ==&lt;br /&gt;
Решали и разбирали первые 4 задачи из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14* (до 11.03)===&lt;br /&gt;
Решите любые две задачи (подпункты НЕ считаются отдельными задачами) с предыдущей пары (Повторение (30.03)).&lt;br /&gt;
&lt;br /&gt;
== Повторение (06.04) ==&lt;br /&gt;
Будем решать вторую половину задач из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 15 (до 16.04)===&lt;br /&gt;
# Приведите пример графа, который содержит отрицательные рёбра, не содержит циклов отрицательного веса и для которого алгоритм Дейкстры возвращает неверный результат.&lt;br /&gt;
# Используется ли в алгоритме Дейкстры то, что веса рёбер неотрицательны? Если &amp;quot;да&amp;quot;, то где именно?&lt;br /&gt;
# Пусть граф содержит рёбра с весами &amp;gt;= -100. Если прибавить к каждому ребру 101 и при помощи алгоритма Дейкстры найти кратчайшие пути. Будут ли эти пути кратчайшими в исходном графе? Почему?&lt;br /&gt;
&lt;br /&gt;
== Повторение (07.04) ==&lt;br /&gt;
&#039;&#039;&#039;Решение рекуррентных соотношений&#039;&#039;&#039;&lt;br /&gt;
# Решите уравнение: T(n) = 4*T(n/2) + O(n^2) с базой T(1) = O(1)&lt;br /&gt;
## Используя основную теорему.&lt;br /&gt;
## Используя дерево рекурсий.&lt;br /&gt;
## Методом подстановки.&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2)) + n является \Theta(n lg n).&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2) + 17) + n является \Theta(n lg n).&lt;br /&gt;
# Решите уравнения, считая, что T(1) = O(1):&lt;br /&gt;
## T(n) = T(n-1) + n&lt;br /&gt;
## T(n) = 2*T(floor(sqrt(n))) + lg n. Указание: попробуйте использовать замену переменных.&lt;br /&gt;
## T(n) = 3*T(sqrt(n)) + lg n&lt;br /&gt;
# Дайте верхнюю и нижнюю оценки функции T(n). Постарайтесь, чтобы оценки были как можно более точные&lt;br /&gt;
## T(n) = 4T(n/3) + n*lg(n)&lt;br /&gt;
## T(n) = 3T(n/3) + n/lg(n)&lt;br /&gt;
## T(n) = 4T(n/2) + n^2*sqrt(n)&lt;br /&gt;
## T(n) = T(n/2) + T(n/4) + T(n/8) + n&lt;br /&gt;
## T(n) = T(n-1) + 1/n&lt;br /&gt;
## T(n) = T(n-2) + 1/lg(n)&lt;br /&gt;
## T(n) = sqrt(n) * T(sqrt(n)) + n&lt;br /&gt;
&#039;&#039;&#039;Анализ и построение алгоритмов&#039;&#039;&#039;&lt;br /&gt;
# Числа Фибоначчи F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; можно выразить через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, используя матрицу: https://yadi.sk/i/Pm_aNzHCforFU. &lt;br /&gt;
## Покажите как вычислить F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;.&lt;br /&gt;
## Как вычислить F&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;n+1&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;?&lt;br /&gt;
## Напишите алгоритм.&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
## Ускорьте его так, чтобы он работал за O(log n).&lt;br /&gt;
# Дана последовательность символов. Какое минимальное количество символов нужно удалить из неё, чтобы получить палиндром?&lt;br /&gt;
## Напишите алгоритм (на псевдокоде или на любом языке программирования).&lt;br /&gt;
## Оцените время работы алгоритма.&lt;br /&gt;
# Какую структуру данных вы бы использовали для реализации упорядоченного множества (http://neerc.ifmo.ru/wiki/index.php?title=Упорядоченное_множество)? Какая будет сложность каждой из операций над множеством?&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 16 (до 20.04)===&lt;br /&gt;
# Решите 6 задач из первой части и 6 из второй. (Укажите какие именно.) Каждый из подпунктов является отдельной задачей.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм и теорема Форда-Фалкерсона (16.04)==&lt;br /&gt;
# Базовые определения (пропускные способности, сток, исток и пр.). Пример. &lt;br /&gt;
# Ограничения на поток (сохранение и что меньше пропускных способностей).&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, пример работы&lt;br /&gt;
# Разрез, определение, пример.&lt;br /&gt;
# Утверждение: максимальный поток &amp;lt;= любого разреза.&lt;br /&gt;
# Теорема Форда-Фалкерсона (с доказательством).&lt;br /&gt;
# Пример на котором алгоритм Форда-Фалкерсонаработает работает очень долго при неудачном выборе путей.&lt;br /&gt;
# Сложность алгоритма Форда-Фалкерсона.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №3==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
В [https://official.contest.yandex.ru/contest/1196 домашнем задании] пять задач. Они разделены на два варианта, помеченные римскими цифрами I и II. Свой вариант нужно узнать [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing здесь на вкладке HW3]. Третья задача — общая для двух вариантов; ее решение необходимо снабдить доказательством корректности алгоритма. На выполнение задания дается примерно 2 недели (см. точное время окончания в контесте). Каждую задачу можно написать на С++ или Python.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Форда-Фалкерсона и Эдмондса-Карпа(20.04)==&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, напоминание: базовые определения, пример работы, пример на котором алгоритм работает долго, сложность.&lt;br /&gt;
# Алгоритм Эдмодса-Карпа. Доказательство асимптотики времени работы.&lt;br /&gt;
&lt;br /&gt;
==(23.04)==&lt;/div&gt;</summary>
		<author><name>Kassalanche</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=8518</id>
		<title>Алгоритмы и структуры данных. Подгруппа 105-1</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=8518"/>
		<updated>2015-04-23T20:00:16Z</updated>

		<summary type="html">&lt;p&gt;Kassalanche: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==О курсе==&lt;br /&gt;
[[Алгоритмы_и_структуры_данных|План лекций и список рекомендуемой литературы.]]&lt;br /&gt;
&lt;br /&gt;
[[Алгоритмы_и_структуры_данных._Подгруппа_105-1._FAQ|FAQ.]]&lt;br /&gt;
&lt;br /&gt;
[[Reviewboard|Инструкция по использованию Reviewboard.]]&lt;br /&gt;
&lt;br /&gt;
[[Практические_занятия_по_курсу_ОиМП/C++_check|Style guide.]]&lt;br /&gt;
&lt;br /&gt;
==Итоговая оценка за курс==&lt;br /&gt;
Итоговая оценка (ИО) зависит от&lt;br /&gt;
* оценок за пять больших домашних заданий (БДЗ1, БДЗ2, ..., БДЗ5),&lt;br /&gt;
* оценок за домашние задания (ДЗ1, ДЗ2, ...),&lt;br /&gt;
* оценки за контрольную работу (КР),&lt;br /&gt;
* оценки за экзамен (ЭКЗ),&lt;br /&gt;
и может быть вычислена по формуле:&lt;br /&gt;
 ИО = 0.7 * (0.3 * КР + 0.7 *(ИДЗ1 + ИДЗ2 + ИДЗ3 + ИДЗ4 + ИДЗ5)/5) + 0.3 * ЭКЗ =&lt;br /&gt;
    = 0.21*КР + 0.98*ИДЗ1 + 0.98*ИДЗ2 + 0.98*ИДЗ3 + 0.98*ИДЗ4 + 0.98*ИДЗ5 + 0.3*ЭКЗ,&lt;br /&gt;
где&lt;br /&gt;
 ИДЗi = min (10, 0.7 * БДЗi + 0.4 * &amp;lt;cредняя оценка за ДЗj, прошедшие с предыдущего БДЗ по i-ое&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
==Порядок сдачи домашних работ==&lt;br /&gt;
===Большие домашние работы===&lt;br /&gt;
# Получить OK за задачу в контесте.&lt;br /&gt;
# Залить исходный код на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* На каждую задачу создавайте отдельный запрос на ревью. &lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении суток приходят замечания к коду. &#039;&#039;&#039;Если в течении суток замечаний или Ship It не появилось, проверьте, что вы правильно отправили запрос и, если всё сделано правильно, спросите у семинариста получил ли он запрос.&#039;&#039;&#039;&lt;br /&gt;
# Вы их исправляете, проверяете в контесте, что программа по-прежнему проходит все тесты, заливаете новую версию в Review Board. Штрафов за посылки НЕ будет.&lt;br /&gt;
# Процесс повторяется пока остаются замечания к коду или пока не истёк дедлайн. После закрытия контеста будут ещё одни сутки на доработку замечаний в Review Board.&lt;br /&gt;
# Оценивается только последняя версия работы в Review Board.&lt;br /&gt;
&lt;br /&gt;
===Маленькие домашние работы===&lt;br /&gt;
# Залить решение на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* Желаемые форматы: txt, py, cpp, h. Допускаются любые другие.&lt;br /&gt;
#* На каждую домашнюю работу создавайте отдельный запрос на ревью. Обязательно указывайте номер домашней работы.&lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении неопределенного промежутка времени придут оценки по каждому из заданий.&lt;br /&gt;
&lt;br /&gt;
==Оценивание домашних работ==&lt;br /&gt;
* Все задания предполагаются индивидуальными. Запрещены любые заимствования без ссылки на автора.&lt;br /&gt;
* Решения после установленного дедлайна не принимаются. Дедлайн указан в заголовке каждого задания.&lt;br /&gt;
* Везде, где требуется написать алгоритм, можно использовать любой язык программирования или псевдокод.&lt;br /&gt;
* Там, где требуется построить алгоритм с заданной асимптотикой, приведите обоснование, что полученный алгоритм удовлетворяет этому условию.&lt;br /&gt;
* Эти правила не действуют, если в задании явно оговорено иное.&lt;br /&gt;
&lt;br /&gt;
==Мотивация к изучению алгоритмов. Подсчёт числа операций (12.01)==&lt;br /&gt;
# Числа Фибоначчи. Определение. Примитивный рекурсивный алгоритм вычисления i-ого числа. Оценка числа операций. Анализ причин неэффективности. Алгоритм с запоминанием вычисленных ранее значений. Оценка числа операций. Сравнение с предыдущим. (подробнее: глава 0, страницы 8-10 из книги &amp;lt;&amp;lt;Алгоритмы&amp;gt;&amp;gt;, [[Алгоритмы_и_структуры_данных|см. список рекомендованной литературы]])&lt;br /&gt;
# Задача о ханойской башне. Постановка задачи. Рекурсивный алгоритм. Рекуррентная формула для числа перемещений. Замкнутая формула для числа перемещений (+ доказательство). Доказательство того, что эту задачу нельзя решить используя меньшее число перемещений дисков. ([https://www.dropbox.com/s/t8cbs7ttu4iasvj/algo-0-recursion.pdf?dl=0 Разбор задачи о ханойской башне], автор Сергей Объедков)&lt;br /&gt;
# Сортировка пузырьком. Алгоритм. Подсчёт количество операций сравнения и обмена (swap). Анализ наилучшего и наихудшего случаев ([https://ru.wikipedia.org/wiki/Сортировка_пузырьком Википедия])&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 1 (12.01 - 26.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
Во всех задачах, если не оговорено иного, предполагаем, что работаем с целыми неотрицательными числами. Для первых 7 задач необходимо&lt;br /&gt;
* описать что можно считать наилучшим и наихудшим случаями,&lt;br /&gt;
* для каждого из двух случаев подсчитать отдельно количество операций сравнения и swap (если есть).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Даны три числа, требуется вернуть наименьшее.&lt;br /&gt;
# Даны три числа, требуется отсортировать их.&lt;br /&gt;
# Дана последовательность A из n элементов и число x, требуется найти элемент равный x. Примечание: если таких значений i несколько, вернуть любое; если такого элемента нет, функция должна сообщить об этом.&lt;br /&gt;
# * Дана упорядоченная последовательность A из n элементов и число x, требуется найти такое i, что A[i] равно x. Алгоритм должен быть эффективней, чем в предыдущем пункте и использовать то, что последовательность упорядочена.&lt;br /&gt;
# Дана последовательность из 100 000 чисел от 0 до 100. Напишите эффективный алгоритм сортировки, который бы учитывал специфику входных данных.&lt;br /&gt;
# * Дано 32 битное неотрицательное число. Требуется номер первого ненулевого бит. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения, считая, что числа распределены равномерно.&lt;br /&gt;
# * Даны 32 битные неотрицательные числа m и n. Требуется вывести True, если m &amp;lt; n, иначе False. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения битов, считая, что числа распределены равномерно.&lt;br /&gt;
# Напишите рекурсивную функцию, вычисляющую n-ое число Фибоначчи (как на занятии). Подсчитайте количество рекурсивных вызовов.&lt;br /&gt;
# * Напишите функцию, вычисляющую n-ое число Фибоначчи, у которой число операций — полином от n, и которая использует количество памяти, независящее от n.&lt;br /&gt;
&lt;br /&gt;
==O-символика и стратегия &amp;quot;разделяй и властвуй&amp;quot; (15.01)==&lt;br /&gt;
# Сортировка слиянием. Алгоритм, рекуррентное соотношение для времени сортировки, сложность. Подробнее: [https://dl.dropboxusercontent.com/u/829163/draft.pdf §2.3 Сортировка слиянием (стр. 54)].&lt;br /&gt;
# О-символика. [https://dl.dropboxusercontent.com/u/829163/draft.pdf §0.3 О-символика (стр. 10)].&lt;br /&gt;
# Задача о слиянии m упорядоченных массивов по n элементов. Три алгоритма решения: последовательное слияние, слияние &amp;quot;деревом&amp;quot; (обе функции используют Merge из MergeSort), аналог Merge для m массивов. Анализ сложности каждого из них.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 2 (15.01-29.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
* Во всех задачах, если не оговорено иного, для простоты &#039;&#039;можно&#039;&#039; считать, что n является степенью какого-либо числа, например, степенью двойки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Дана функция F, определённая ниже. Сколько строк она напечатает? Указание: для обоих подпунктов рассмотрите два случая: 1. n является степенью двойки, 2. n не является степенью двойки.&lt;br /&gt;
## Запишите рекуррентное соотношение для числа строк.&lt;br /&gt;
## Решите уравнение, полученное в предыдущем пункте, то есть, выведите замкнутую (нерекуррентную формулу). Для простоты можно считать, что n является степенью двойки.&lt;br /&gt;
# В массиве A размера n записана возрастающая последовательность целых чисел. Постройте алгоритм типа &amp;quot;разделяй и властвуй&amp;quot;, который проверяет, существует ли такой индекс i, что A[i] = i&lt;br /&gt;
## за время O(n),&lt;br /&gt;
## * за время O(log n).&lt;br /&gt;
## Какие случаи для вашего алгоритма являются наихудшими и наилучшими? Какого время работы в лучшем и худшем случаях?&lt;br /&gt;
# Дан бесконечный массив A, первые n элементов которого содержат возрастающую последовательность положительных чисел, а дальше стоят -1. Значение n не дано. Постройте алгоритм, который получает на вход целое число x и находит это x в массиве --- или говорит, что там его нет, &lt;br /&gt;
## за время O(n),&lt;br /&gt;
## за время O(log n).&lt;br /&gt;
# Рассмотрим алгоритм вычисления наибольшего общего делителя (НОД) двух положительных чисел, основанный на методе &amp;quot;разделяй и властвуй&amp;quot;.&lt;br /&gt;
## (задание не оценивается) Прочитайте [https://dl.dropboxusercontent.com/u/829163/draft.pdf §1.2.3 Алгоритм Евклида (стр. 23)].&lt;br /&gt;
## * Докажите, что определение НОД-а, приведённое ниже, корректно.&lt;br /&gt;
## Постройте алгоритм, основанный на этом определении.&lt;br /&gt;
## Какой алгоритм будет быстрее для n-битовых чисел a и b при больших значениях n --- ваш или алгоритм Евклида?&lt;br /&gt;
# * Покажите как за время O(n log n) удалить из массива размера n все дубликаты, то есть оставить каждый элемент в одном экземпляре.&lt;br /&gt;
# * Даны два упорядоченных массива размера m и n. Постройте алгоритм, находящий k-й по величине элемент в объединении этих массивов за время O(log(n+m)). &lt;br /&gt;
&lt;br /&gt;
Функция F(n).&lt;br /&gt;
  если n &amp;gt; 1:&lt;br /&gt;
    напечатать &amp;quot;всё ещё работаю&amp;quot;&lt;br /&gt;
    F(n/2)&lt;br /&gt;
    F(n/2)&lt;br /&gt;
&lt;br /&gt;
Определение НОД-а.&lt;br /&gt;
             2НОД(a/2, b/2), если а и b чётны,&lt;br /&gt;
  НОД(a,b) = НОД(a, b/2), если а нечётно, b чётно,&lt;br /&gt;
             НОД((a-b)/2, b), если а и b нечётны.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;lt;nowiki&amp;gt;Задачи взяты из книги &amp;quot;Алгоритмы&amp;quot;, глава 2 (см. список рекомендованной литературы).&amp;lt;/nowiki&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Сложение и умножение (19.01)==&lt;br /&gt;
# Алгоритм сложения, его сложность (§1.1.1 Сложение*)&lt;br /&gt;
# &amp;quot;Школьный&amp;quot; алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Рекурсивный алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Алгоритм умножения, реализующий стратегию &amp;quot;разделяй и властвуй&amp;quot;, анализ сложности (§2.1 Умножение чисел*)&lt;br /&gt;
 * [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать.]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 3 (19.01 - 2.02)===&lt;br /&gt;
* Во всех задачах для простоты можно считать, что n является степенью какого-либо числа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Найдите произведение чисел 10011011 и 10111010 (в двоичной системе счисления), используя алгоритм умножения чисел, основанный на методе «разделяй и властвуй». Необходимо не только дать ответ, но и привести ход решения.&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 3 рекурсивных вызова для подзадач размера n-1 и комбинирует из них решение исходной задачи за О(n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте три верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 10 рекурсивных вызовов для подзадач размера n/2 и комбинирует из них решение исходной задачи за О(5n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте два верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Докажите, что 3m² + m = O(m²).&lt;br /&gt;
# Докажите, что lg m = O(m/1000), где lg m — это логарифм с двоичным основанием.&lt;br /&gt;
# Докажите, что из равенства f(n) = O(g(n)) не следует, что g(n) = O(f(n)).&lt;br /&gt;
# Докажите, что O(m) содержится в O(m²).&lt;br /&gt;
&lt;br /&gt;
==Решение рекуррентных уравнений (22.01)==&lt;br /&gt;
# Примеры решений рекуррентных уравнений (см. [https://www.dropbox.com/s/6a0r410zjm9qwe7/algo-3-recurrences.pdf?dl=0 конспект]).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 4 (до 14.02)===&lt;br /&gt;
* Нельзя использовать утверждение основной теоремы о решении рекуррентных соотношений.&lt;br /&gt;
* &#039;&#039;Можно&#039;&#039; использовать метод построения дерева рекурсии или подстановку (метод с угадыванием ответа).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Какой из трёх приведённых ниже алгоритмов вы бы предпочли? Обоснуйте свой ответ.&lt;br /&gt;
#* Алгоритм A, решая задачу, производит пять рекурсивных вызовов для подзадач вдвое меньшего размера, после чего строит ответ для исходной задачи за линейное время.&lt;br /&gt;
#* Алгоритм B, решая задачу размера n, делает два рекурсивных вызова для задач размера n − 1, после чего находит ответ за время O(1).&lt;br /&gt;
#* Алгоритм C, решая задачу размера n, рекурсивно решает девять задач размера n/3 и строит ответ за время O(n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Найдите T(n) в замкнутой форме для любых 7 из 10 приведённых ниже рекуррентных соотношений:&lt;br /&gt;
## T(n) ≤ 2T(n/3) + 1;&lt;br /&gt;
## T(n) ≤ 7T(n/7) + n;&lt;br /&gt;
## T(n) ≤ 9T(n/3) + n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 8T(n/2) + n&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 49T(n/25) + n&amp;lt;sup&amp;gt;3/2&amp;lt;/sup&amp;gt;log n;&lt;br /&gt;
## T(n) ≤ T(n − 1) + 2;&lt;br /&gt;
## T(n) ≤ T(n − 1) + n&amp;lt;sup&amp;gt;c&amp;lt;/sup&amp;gt;, где c ≥ 1 –– константа;&lt;br /&gt;
## T(n) ≤ T(n − 1) + c&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;, где c &amp;gt; 1 –– константа;&lt;br /&gt;
## T(n) ≤ 2T(n − 1) + 1;&lt;br /&gt;
## T(n) ≤ T(sqrt(n)) + 1.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №1==&lt;br /&gt;
Необходимо реализовать все 6 задач из [https://official.contest.yandex.ru/contest/1002 контеста]. Каждую задачу можно писать на С++ или Python. На выполнение работы отводится две недели. Каждая задача оценивается в 10/6 балла. Оценка &#039;&#039;может&#039;&#039; быть снижена за плохой код, но не более чем на 25%.&lt;br /&gt;
&lt;br /&gt;
==Бинарное дерево поиска (26.01)==&lt;br /&gt;
# Определение. Пример.&lt;br /&gt;
# Не модифицирующие алгоритмы: поиск (рекурсивный и итеративный алгоритмы), поиск минимума, inordered обход (вывод значений узлов в отсортированном порядке), поиск следующего по возрастанию.&lt;br /&gt;
# Модифицирующие алгоритмы: вставка (рекурсивная реализация), удаление (только идея).&lt;br /&gt;
 [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 13, стр. 248]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 5 (до 16.02)===&lt;br /&gt;
* Для получения максимальной оценки можно выполнить или все задачи без звёздочки, или задачу со звёздочкой. Преподаватель понимает, что реализацию БДП сложно не найти в интернете, но от копипасты не будет никакой пользы. Напротив, самостоятельная реализация очень полезна и приветствуется, даже если не получится выполнить всех пунктов задания.&lt;br /&gt;
* Задачи с двумя звёздочками необязательны.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Нарисуйте бинарные деревья поиска высотой 2, 3, 4, 5 и 6 для множества ключей {1, 4, 5, 10, 16, 17, 21}. Корень дерева имеет высоту 0.&lt;br /&gt;
# &#039;&#039;&#039;Сортировка с использованием БДП.&#039;&#039;&#039;&lt;br /&gt;
## Какова асимптотическая сложность алгоритма вставки элемента в дерево высоты d? Почему? Назовите наилучший и наиухдший случаи.&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который строит БДП в узлах которого стоят элементы данной последовательности. Можно использовать функцию Insert. Назовите наилучший и наихудший случаи. Есть теорема о том, что полученный алгоритм будет работать в среднем случае за время O(n * log n).&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который выводит их в порядке возрастания. Используйте бинарное дерево поиска. Какова в среднем случае сложность этого алгоритма? Назовите наилучший и наихудший случаи. Какова сложность в наихудшем случае?&lt;br /&gt;
# Напишите функцию GetRoot, которой на вход подаётся указатель на произвольный узел дерева, а она возвращает указатель на корень.&lt;br /&gt;
# Напишите процедуру PrintLeafs, которой на вход подаётся указатель на корень дерева, и она печатает листья дерева&lt;br /&gt;
## по возрастанию,&lt;br /&gt;
## по убыванию.&lt;br /&gt;
# ** Альтернативный обход в порядке возрастания бинарного дерева поиска с n узлами (или центрированный (inordered) обход) можно осуществить путём поиска минимального элемента дерева с помощью функции Minimum с последующий n-1 вызовом функции Next. Каково время работы такого алгоритма?&lt;br /&gt;
# * Реализуйте на С++ структуру данных бинарное дерево поиска, [https://yadi.sk/i/gi2SEStreFfSb используя заготовку].&lt;br /&gt;
## Нарисуйте бинарное дерево поиска, которое строится в функции getTreeExample.&lt;br /&gt;
## Реализуйте следующие алгоритмы: &lt;br /&gt;
### поиск минимума, &lt;br /&gt;
### inordered обход (вывод значений узлов в отсортированном порядке),&lt;br /&gt;
### поиск следующего по возрастанию,&lt;br /&gt;
### вставка элемента в дерево,&lt;br /&gt;
### сортировка последовательности с использованием БДП (дан вектор чисел, необходимо вывести их по возрастанию),&lt;br /&gt;
### ** удаление.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Карацубы, Штрассена. Быстрая сортировка (29.01)==&lt;br /&gt;
# Алгоритм Карацубы.&lt;br /&gt;
# Алгоритм Штрассена. [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать Дасгупту и др., §2.5 Умножение матриц]&lt;br /&gt;
# Быстрая сортировка и доказательство того, что в среднем случае она работает за О(n * log n). [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 8 Быстрая сортировка, стр. 148]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 6 (до 18.02)===&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Пусть мы хотим найти двоичное представление десятичного числа 10&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;. Будем считать, что n --- степень двойки (n = 2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt;).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Pwr2Bin(n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть 1010&lt;br /&gt;
    z = ...&lt;br /&gt;
    вернуть Multiply(z, z)&amp;lt;/source&amp;gt;&lt;br /&gt;
Multiply --- функция, перемножающая два n-битовых двоичных числа x и y по алгоритму Карацубы за O(n&amp;lt;sup&amp;gt;log&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;3&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Пусть мы хотим перевести произвольное десятичное число x в записи которого n=2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; чисел в двоичную систему счисления.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Dec2Bin(x, n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть binary[x]&lt;br /&gt;
    разделить x на два десятичных числа xl и xr из n/2 цифр.&lt;br /&gt;
    вернуть ...&amp;lt;/source&amp;gt;&lt;br /&gt;
Здесь binary --- это массив, содержащий двоичное представление десятичных цифр.&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Докажите, что математическое ожидание времени работы алгоритма быстрой сортировки (усреднение по всем вариантам выбора опорного элемента) на любом входе размера n удовлетворяет соотношению: T(n) ≤ O(n) + 1/n * &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt; (T(i-1) + T(n-i)).&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Найдите решение соотношения из предыдущего пункта.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Динамическое программирование (ДП). Первые примеры (02.01)==&lt;br /&gt;
# Нахождение самой длинной возрастающей подпоследовательности.&lt;br /&gt;
# Нахождение редакционного расстояния (или редакционной стоимости, расстояния Левенштейна).&lt;br /&gt;
# Нахождение представителя большинства.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 7 (до 20.02)===&lt;br /&gt;
* В этом задании везде, где требуется реализовать алгоритм, необходимо привести код на любом языке программирования.&lt;br /&gt;
* Для получения максимальной оценки нужно решить все задачи без звёздочек. Одна решённая задача со звёздочкой заменяет одну задачу без звёздочки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения редакционного расстояния (алгоритм Вагнера — Фишера). Например, редакционное расстояние между словами &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равно 6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения длины наибольшей общей подстроки. Например, длина наибольшей общей подстроки &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равна 8 (&amp;quot;antholog&amp;quot;). Чем больше это значение, тем схожей строки.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Предположим теперь, что сравниваемые строки состоят из символов A, С, G и T; за удаление или вставку мы платим -5; за замену буквы x на y платим w[x, y], где x, y принадлежат множеству {A, С, G, T}, a w — это матрица весов:&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
!-!! A!! G!! C!! T&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! A&lt;br /&gt;
|10||-1||-3||-4&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
!G&lt;br /&gt;
||-1||7||-5||-3&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! C&lt;br /&gt;
||-3||-5||9||0&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! T&lt;br /&gt;
||-4||-3||0||8&lt;br /&gt;
|}&lt;br /&gt;
Тогда выравнивание:&lt;br /&gt;
 AGACTAGTTAC&lt;br /&gt;
 CGA‒‒‒GACGT&lt;br /&gt;
будет иметь следующую оценку:&lt;br /&gt;
 w[A,C] + w[G,G] + w[A,A] + 3*(-5) + w[G,G] + w[T,A] + w[T,C] + w[A,G] + w[C,T] = -3 + 7 + 10 - 3*5 + 7 + (-4) + 0 + (-1) + 0 = 1.&lt;br /&gt;
&lt;br /&gt;
Напишите алгоритм, который находит максимальную стоимость всех возможных выравниваний. Верно ли, что чем больше это значение, тем непохожей строки?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как давно один народ отделился от другого? Кто похожей — итальянец и китаец или якут и эфиоп? На эти вопросы можно отвечать с разных точек зрения — культурной, исторической, лингвистической, ... В последние же годы человечество научилось секвенировать геном, что позволило исследовать этот вопрос с точки зрения генетики. Секвенирование генома — это процесс записи ДНК в виде нуклеотидной последовательности, которая представляет собой последовательность из четырёх символов — A, С, G и T. Существуют базы, которые хранят генетическую информацию о людях из разных стран и континентов, например, [http://www.mtdb.igp.uu.se/ http://www.mtdb.igp.uu.se/ → Download mtDNA sequences]. Чем больше сходство между геномами, тем сильнее родственные связи между их обладателями. Используя решение предыдущего пункта, выполните задания:&lt;br /&gt;
# Определите, кто похожей — итальянец и китаец или якут и эфиоп?&lt;br /&gt;
# Найдите нескольких похожих и нескольких непохожих народностей.&lt;br /&gt;
# * Выберите одну народность. Найдите самых похожих и самых непохожих на неё.&lt;br /&gt;
# * Найдите самые похожие и самые непохожие народности.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Задача о разрезании стержня (05.01)==&lt;br /&gt;
# Постановка задачи.&lt;br /&gt;
# Решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Решение с нахождением максимума по p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Восходящий алгоритм с запоминанием. Вывод длин кусочков стержня. Оценка сложности.&lt;br /&gt;
# Нисходящий алгоритм с запоминанием. Оценка сложности.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.1 Разрезание стержня, стр. 393]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 8 (до 22.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Решая задачу о разрезании стержня мы вначале построили рекурсивное решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt; для всех 1 ≤ i &amp;lt; n. Его сложность описывалась рекуррентной формулой T(n) = n + &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n-1&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt;(T(i) + T(n-i)), T(1) = 1.&lt;br /&gt;
# Объясните эту формулу.&lt;br /&gt;
# Покажите с помощью метода подстановок, что T(n) ≤ 2&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Покажите с помощью контрпримера, что описанная далее жадная стратегия не всегда определяет оптимальный способ разрезания стержня. Определим плотность стержня длиной i как p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;/i, то есть как стоимость единицы его длины. Жадная стратегия для стержня длиной n отрезает от стержня первую часть длиной i, где 1 ≤ i ≤ n, имеющую максимальную плотность. Затем та же жадная стратегия применяется к оставшейся части длиной n-i.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Рассмотрим модификацию задачи разрезания стержня, в которой в дополнение к цене p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; каждого стержня добавляется фиксированная цена разреза c. Теперь прибыль, связанная с решением, представляет собой сумму цен частей стержня минус стоимость разрезов. Разработайте алгоритм динамического программирования для этой модифицированной задачи.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Непрерывным участком называется группа подряд идущих элементов. Например, для последовательности&lt;br /&gt;
 5, 15, −30, 10, −5, 40, 10&lt;br /&gt;
элементы 15, −30, 10 образуют непрерывный участок, а 5, 15, 40 -- нет. Постройте линейный алгоритм для следующей задачи:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Вход: список чисел a1, a2, ... ‌, an.&lt;br /&gt;
Выход: непрерывный участок с максимальной суммой (сумма участка нулевой длины равна нулю).&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Для приведённого примера ответом будет 10, −5, 40, 10 с суммой 55. Какова сложность алгоритма? Почему?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Надо заплатить v рублей, имея купюры в x1, x2, ‌..., xn рублей (купюр каждого типа сколько угодно). Это не всегда возможно (скажем, купюрами в&lt;br /&gt;
10 и 25 рублей можно заплатить 45 рублей, но не 47 и не 15). Постройте основанный на методе динамического программирования алгоритм со временем работы O(nv), выясняющий, возможна ли уплата.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как решить предыдущую задачу, если каждая купюра имеется в единственном экземпляре? (Например, купюрами в 1, 5, 10, 20 рублей можно заплатить 16 = 1 + 5 + 10 и 31 = 1 + 10 + 20 рублей, но не 40 (не хватит денег). Время работы алгоритма по-прежнему O(nv).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Ещё один вариант той же задачи: купюр каждого типа сколько угодно, но всего разрешается использовать не более k купюр. (Например, если есть купюры в 5 и 10 рублей, а k = 6, то 55 разменять можно, а 65 –– нет).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Перемножение цепочки матриц. Оптимальное бинарное дерево поиска (начало) (09.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о перемножении цепочки матриц. Постановка задачи.Пример. Нисходящий алгоритм.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.2 Перемножение цепочки матриц, стр. 403]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 9 (до 24.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Найдите оптимальную расстановку скобок в произведении последовательности матриц, размерности которых равны 5×10, 10×3, 3×12, 12×5, 5×50, 50×6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Напишите восходящий алгоритм для поиска оптимальной расстановки скобок.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Расстановка пробелов. Оптимальное бинарное дерево поиска (середина) (12.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о расстановке пробелов. Постановка задачи. Решения для трёх случаев: 1. нужно вернуть можно ли разбить текст на слова; 2. вернуть разбивку на слова; 3. слова встречаются не равновероятно, вернуть наиболее вероятную разбивку на слова.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи. Вывод математического ожидания времени поиска.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Праздничное домашнее задание 10 (до 02.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[&amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;,&amp;quot;, &amp;quot;.&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;,&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;.&amp;quot;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Подсказка:&#039;&#039;&#039; разбейте текст на слова из списка и посмотрите на азбуку Морзе.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Способы представления графов в памяти (16.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Разбор ошибок в домашнем задании.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Графы. Способы представления графов в памяти (матрица смежности, список рёбер, список соседей (список смежностей), матрица инцидентности). Зависимость сложности алгоритмов от способа представления.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §22.1 Представление графов, стр. 626]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 11 (до 02.03)===&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача A.]&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача B.]&lt;br /&gt;
# Нарисуйте неориентированный граф с 5 вершинами и 8 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Нарисуйте ориентированный граф с 4 вершинами и 3 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Дан ориентированный граф. &#039;&#039;Исходящая степень вершины v&#039;&#039; --- это количество исходящих из неё рёбер, &#039;&#039;входящая степень v&#039;&#039; --- это количество рёбер входящих в  v. Имеется представление ориентированного графа с использование списка соседей. Как долго будут вычисляться исходящие степени всех вершин графа? А входящие степени?&lt;br /&gt;
# Дан граф G = (V, E). Какие из рассмотренных способов хранения графов используют меньше всего памяти для хранения G и почему? Указание: рассмотрите случаи |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;lt; |E| и |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;gt; |E|.&lt;br /&gt;
# Пусть C --- это матрица смежности графа G.&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
# Пусть B --- это матрица инцидентности ориентированного графа G. Как связаны элементы матрицы BB&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
&lt;br /&gt;
==Реализация поиска в глубину (19.02)==&lt;br /&gt;
# Реализация поиска в глубину и смежных задач.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 12 (до 5.03)===&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Выберите любой способ хранения графа. Реализуйте поиск в глубину.&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Напишите алгоритм, который возвращает данные о том, какие вершины лежат в одной компоненте связности.&lt;br /&gt;
# &#039;&#039;(любой ЯП или псевдокод)&#039;&#039; Напишите алгоритм проверки сильной связности ориентированного графа. Какова его сложность?&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №2==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
Необходимо реализовать 3 задачи из [https://official.contest.yandex.ru/contest/1085 контеста], см. [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing распределение задач]. Каждую задачу можно написать на С++ или Python. На выполнение работы отводится две недели (см. время окончания контеста). [https://official.contest.yandex.ru/contest/1123 Дорешивание.]&lt;br /&gt;
&lt;br /&gt;
==ДП и графы (26.02)==&lt;br /&gt;
==ДП и графы (02.03)==&lt;br /&gt;
==Жадные алгоритмы (12.03)==&lt;br /&gt;
===Домашнее задание 13 (до 23.03)===&lt;br /&gt;
# Вася хочет купить по одной акции каждой компании. Все акции стоят одинаково, но дорожают по-разному. Каждый месяц акция i-ой компании дорожает в r_i раз. В один месяц можно купить только одну акцию.&lt;br /&gt;
## Напишите алгоритм, который выводит оптимальную последовательность покупок (такую, что на покупку всех акций потратится меньше денег).&lt;br /&gt;
## Докажите корректность алгоритма, то есть докажите, что последовательность покупок, которую выводит ваш алгоритм, оптимальна.&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список, очередь (16.03)==&lt;br /&gt;
# Реализация линейного двусвязного списка (С++).&lt;br /&gt;
# Реализация очереди ограниченной длины на базе вектора (С++).&lt;br /&gt;
# Реализация очереди на базе списка (С++).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14 (до 23.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте (на С++) структуру данных Стек. У стека должно быть три операции:&lt;br /&gt;
* push --- положить элемент на вершину стека;&lt;br /&gt;
* pop --- удалить верхний элемент;&lt;br /&gt;
* front --- вернуть значение верхнего элемента.&lt;br /&gt;
Оцените время работы каждой функции.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список (19.03)==&lt;br /&gt;
===Домашнее задание 13 (до 30.03)===&lt;br /&gt;
#Для приведённой реализации класса List (https://yadi.sk/i/c5r_79WdfMyNS).&lt;br /&gt;
## Допишите print, push_back и push_front.&lt;br /&gt;
## В функции insert_after и delete_node вставьте необходимые проверки так, чтобы они работали для крайних случаев.&lt;br /&gt;
## Напишите main в котором&lt;br /&gt;
### создаётся объект класса List, &lt;br /&gt;
### заполняется элементами с помощью функций push_back, push_front и insert_after и&lt;br /&gt;
### удаляется i-ый элемент.&lt;br /&gt;
&lt;br /&gt;
==Повторение (30.03)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Для данных пар функций выясните их связь в терминах O-, o-, Ω-, ω-, Θ-обозначений. Поставьте галочку в клетке с Ω, если f(x) = Ω(g(x)) и прочерк, если равенства нет. [https://ru.wikipedia.org/wiki/«O»_большое_и_«o»_малое#.D0.94.D1.80.D1.83.D0.B3.D0.B8.D0.B5_.D0.BF.D0.BE.D0.B4.D0.BE.D0.B1.D0.BD.D1.8B.D0.B5_.D0.BE.D0.B1.D0.BE.D0.B7.D0.BD.D0.B0.D1.87.D0.B5.D0.BD.D0.B8.D1.8F Википедия]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! f(x)!! g(x)!! O!! o!! Ω!! ω!! Θ&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! 2^100&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n * log(n)&lt;br /&gt;
! 2^100 * n * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n&lt;br /&gt;
! 2^100 * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n!&lt;br /&gt;
! 2^(2015n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n*2^n&lt;br /&gt;
! 3^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 5^n&lt;br /&gt;
! 5^(n+1)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n + n^2 + n^3 + ... + n^1000&lt;br /&gt;
! 7^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм Quickselect нахождения k-ого элемента по возрастанию: http://en.wikipedia.org/wiki/Quickselect&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;На улице стоит ряд домов. В каждом из домов лежит сколько-то денег. Вор хочет обокрасть дома на переулке. Он не может обокрасть два соседних дома, потому что хозяин дома, который он обокрал, сразу предупредит соседей. Нужно найти, какую максимальную сумму вор может украсть с переулка. На вход программы подается массив неотрицательных целых чисел - количество долларов в доме с номером i. Соседние дома в массиве представлены соседними элементами. Например, пусть задан массив { 1, 4, 5 } - тогда вор максимум может украсть $6, обокрав дома 1 и 3. Пусть задан массив { 1, 7, 2 } - тогда вор максимум может украсть $7, обокрав дом 2.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Алфавит из всех маленьких латинских букв и пробела закодирован числами следующим способом:&lt;br /&gt;
  &#039;a&#039; -&amp;gt; 1&lt;br /&gt;
  &#039;b&#039; -&amp;gt; 2&lt;br /&gt;
  &#039;c&#039; -&amp;gt; 3&lt;br /&gt;
  ...&lt;br /&gt;
  &#039;z&#039; -&amp;gt; 26&lt;br /&gt;
  &#039; &#039; -&amp;gt; 27&lt;br /&gt;
На вход программы подается строка из цифр. Нужно посчитать, сколькими способами можно раскодировать эту строку.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Дан граф, заданный матрицей смежности. Вывести пары вершин между которыми нет пути.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Повторение (02.04) ==&lt;br /&gt;
Решали и разбирали первые 4 задачи из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14* (до 11.03)===&lt;br /&gt;
Решите любые две задачи (подпункты НЕ считаются отдельными задачами) с предыдущей пары (Повторение (30.03)).&lt;br /&gt;
&lt;br /&gt;
== Повторение (06.04) ==&lt;br /&gt;
Будем решать вторую половину задач из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 15 (до 16.04)===&lt;br /&gt;
# Приведите пример графа, который содержит отрицательные рёбра, не содержит циклов отрицательного веса и для которого алгоритм Дейкстры возвращает неверный результат.&lt;br /&gt;
# Используется ли в алгоритме Дейкстры то, что веса рёбер неотрицательны? Если &amp;quot;да&amp;quot;, то где именно?&lt;br /&gt;
# Пусть граф содержит рёбра с весами &amp;gt;= -100. Если прибавить к каждому ребру 101 и при помощи алгоритма Дейкстры найти кратчайшие пути. Будут ли эти пути кратчайшими в исходном графе? Почему?&lt;br /&gt;
&lt;br /&gt;
== Повторение (07.04) ==&lt;br /&gt;
&#039;&#039;&#039;Решение рекуррентных соотношений&#039;&#039;&#039;&lt;br /&gt;
# Решите уравнение: T(n) = 4*T(n/2) + O(n^2) с базой T(1) = O(1)&lt;br /&gt;
## Используя основную теорему.&lt;br /&gt;
## Используя дерево рекурсий.&lt;br /&gt;
## Методом подстановки.&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2)) + n является \Theta(n lg n).&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2) + 17) + n является \Theta(n lg n).&lt;br /&gt;
# Решите уравнения, считая, что T(1) = O(1):&lt;br /&gt;
## T(n) = T(n-1) + n&lt;br /&gt;
## T(n) = 2*T(floor(sqrt(n))) + lg n. Указание: попробуйте использовать замену переменных.&lt;br /&gt;
## T(n) = 3*T(sqrt(n)) + lg n&lt;br /&gt;
# Дайте верхнюю и нижнюю оценки функции T(n). Постарайтесь, чтобы оценки были как можно более точные&lt;br /&gt;
## T(n) = 4T(n/3) + n*lg(n)&lt;br /&gt;
## T(n) = 3T(n/3) + n/lg(n)&lt;br /&gt;
## T(n) = 4T(n/2) + n^2*sqrt(n)&lt;br /&gt;
## T(n) = T(n/2) + T(n/4) + T(n/8) + n&lt;br /&gt;
## T(n) = T(n-1) + 1/n&lt;br /&gt;
## T(n) = T(n-2) + 1/lg(n)&lt;br /&gt;
## T(n) = sqrt(n) * T(sqrt(n)) + n&lt;br /&gt;
&#039;&#039;&#039;Анализ и построение алгоритмов&#039;&#039;&#039;&lt;br /&gt;
# Числа Фибоначчи F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; можно выразить через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, используя матрицу: https://yadi.sk/i/Pm_aNzHCforFU. &lt;br /&gt;
## Покажите как вычислить F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;.&lt;br /&gt;
## Как вычислить F&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;n+1&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;?&lt;br /&gt;
## Напишите алгоритм.&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
## Ускорьте его так, чтобы он работал за O(log n).&lt;br /&gt;
# Дана последовательность символов. Какое минимальное количество символов нужно удалить из неё, чтобы получить палиндром?&lt;br /&gt;
## Напишите алгоритм (на псевдокоде или на любом языке программирования).&lt;br /&gt;
## Оцените время работы алгоритма.&lt;br /&gt;
# Какую структуру данных вы бы использовали для реализации упорядоченного множества (http://neerc.ifmo.ru/wiki/index.php?title=Упорядоченное_множество)? Какая будет сложность каждой из операций над множеством?&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 16 (до 20.04)===&lt;br /&gt;
# Решите 6 задач из первой части и 6 из второй. (Укажите какие именно.) Каждый из подпунктов является отдельной задачей.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм и теорема Форда-Фалкерсона (16.04)==&lt;br /&gt;
# Базовые определения (пропускные способности, сток, исток и пр.). Пример. &lt;br /&gt;
# Ограничения на поток (сохранение и что меньше пропускных способностей).&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, пример работы&lt;br /&gt;
# Разрез, определение, пример.&lt;br /&gt;
# Утверждение: максимальный поток &amp;lt;= любого разреза.&lt;br /&gt;
# Теорема Форда-Фалкерсона (с доказательством).&lt;br /&gt;
# Пример на котором алгоритм Форда-Фалкерсонаработает работает очень долго при неудачном выборе путей.&lt;br /&gt;
# Сложность алгоритма Форда-Фалкерсона.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №3==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
В [https://official.contest.yandex.ru/contest/1196 домашнем задании] пять задач. Они разделены на два варианта, помеченные римскими цифрами I и II. Свой вариант нужно узнать [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing здесь на вкладке HW3]. Третья задача — общая для двух вариантов; ее решение необходимо снабдить доказательством корректности алгоритма. На выполнение задания дается примерно 2 недели (см. точное время окончания в контесте). Каждую задачу можно написать на С++ или Python.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Форда-Фалкерсона и Эдмондса-Карпа(20.04)==&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, напоминание: базовые определения, пример работы, пример на котором алгоритм работает долго, сложность.&lt;br /&gt;
# Алгоритм Эдмодса-Карпа. Доказательство асимптотики времени работы.&lt;br /&gt;
&lt;br /&gt;
==(23.04)==&lt;/div&gt;</summary>
		<author><name>Kassalanche</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=8490</id>
		<title>Алгоритмы и структуры данных. Подгруппа 105-1</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_105-1&amp;diff=8490"/>
		<updated>2015-04-23T18:32:49Z</updated>

		<summary type="html">&lt;p&gt;Kassalanche: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==О курсе==&lt;br /&gt;
[[Алгоритмы_и_структуры_данных|План лекций и список рекомендуемой литературы.]]&lt;br /&gt;
&lt;br /&gt;
[[Алгоритмы_и_структуры_данных._Подгруппа_105-1._FAQ|FAQ.]]&lt;br /&gt;
&lt;br /&gt;
[[Reviewboard|Инструкция по использованию Reviewboard.]]&lt;br /&gt;
&lt;br /&gt;
[[Практические_занятия_по_курсу_ОиМП/C++_check|Style guide.]]&lt;br /&gt;
&lt;br /&gt;
==Итоговая оценка за курс==&lt;br /&gt;
Итоговая оценка (ИО) зависит от&lt;br /&gt;
* оценок за пять больших домашних заданий (БДЗ1, БДЗ2, ..., БДЗ5),&lt;br /&gt;
* оценок за домашние задания (ДЗ1, ДЗ2, ...),&lt;br /&gt;
* оценки за контрольную работу (КР),&lt;br /&gt;
* оценки за экзамен (ЭКЗ),&lt;br /&gt;
и может быть вычислена по формуле:&lt;br /&gt;
 ИО = 0.7 * (0.3 * КР + 0.7 *(ИДЗ1 + ИДЗ2 + ИДЗ3 + ИДЗ4 + ИДЗ5)/5) + 0.3 * ЭКЗ =&lt;br /&gt;
    = 0.21*КР + 0.98*ИДЗ1 + 0.98*ИДЗ2 + 0.98*ИДЗ3 + 0.98*ИДЗ4 + 0.98*ИДЗ5 + 0.3*ЭКЗ,&lt;br /&gt;
где&lt;br /&gt;
 ИДЗi = min (10, 0.7 * БДЗi + 0.4 * &amp;lt;cредняя оценка за ДЗj, прошедшие с предыдущего БДЗ по i-ое&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
==Порядок сдачи домашних работ==&lt;br /&gt;
===Большие домашние работы===&lt;br /&gt;
# Получить OK за задачу в контесте.&lt;br /&gt;
# Залить исходный код на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* На каждую задачу создавайте отдельный запрос на ревью. &lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении суток приходят замечания к коду. &#039;&#039;&#039;Если в течении суток замечаний или Ship It не появилось, проверьте, что вы правильно отправили запрос и, если всё сделано правильно, спросите у семинариста получил ли он запрос.&#039;&#039;&#039;&lt;br /&gt;
# Вы их исправляете, проверяете в контесте, что программа по-прежнему проходит все тесты, заливаете новую версию в Review Board. Штрафов за посылки НЕ будет.&lt;br /&gt;
# Процесс повторяется пока остаются замечания к коду или пока не истёк дедлайн. После закрытия контеста будут ещё одни сутки на доработку замечаний в Review Board.&lt;br /&gt;
# Оценивается только последняя версия работы в Review Board.&lt;br /&gt;
&lt;br /&gt;
===Маленькие домашние работы===&lt;br /&gt;
# Залить решение на Review Board. [[Reviewboard|Инструкция по использованию Review Board.]]&lt;br /&gt;
#* Желаемые форматы: txt, py, cpp, h. Допускаются любые другие.&lt;br /&gt;
#* На каждую домашнюю работу создавайте отдельный запрос на ревью. Обязательно указывайте номер домашней работы.&lt;br /&gt;
#* В поле Reviewers - People указать логин семинариста (avalanche) и учебного ассистента (kudrandrew).&lt;br /&gt;
#* Не забудьте нажать Publish.&lt;br /&gt;
#* &#039;&#039;&#039;Работы, которые не были отправлены в RB, не оцениваются.&#039;&#039;&#039;&lt;br /&gt;
# В течении неопределенного промежутка времени придут оценки по каждому из заданий.&lt;br /&gt;
&lt;br /&gt;
==Оценивание домашних работ==&lt;br /&gt;
* Все задания предполагаются индивидуальными. Запрещены любые заимствования без ссылки на автора.&lt;br /&gt;
* Решения после установленного дедлайна не принимаются. Дедлайн указан в заголовке каждого задания.&lt;br /&gt;
* Везде, где требуется написать алгоритм, можно использовать любой язык программирования или псевдокод.&lt;br /&gt;
* Там, где требуется построить алгоритм с заданной асимптотикой, приведите обоснование, что полученный алгоритм удовлетворяет этому условию.&lt;br /&gt;
* Эти правила не действуют, если в задании явно оговорено иное.&lt;br /&gt;
&lt;br /&gt;
==Мотивация к изучению алгоритмов. Подсчёт числа операций (12.01)==&lt;br /&gt;
# Числа Фибоначчи. Определение. Примитивный рекурсивный алгоритм вычисления i-ого числа. Оценка числа операций. Анализ причин неэффективности. Алгоритм с запоминанием вычисленных ранее значений. Оценка числа операций. Сравнение с предыдущим. (подробнее: глава 0, страницы 8-10 из книги &amp;lt;&amp;lt;Алгоритмы&amp;gt;&amp;gt;, [[Алгоритмы_и_структуры_данных|см. список рекомендованной литературы]])&lt;br /&gt;
# Задача о ханойской башне. Постановка задачи. Рекурсивный алгоритм. Рекуррентная формула для числа перемещений. Замкнутая формула для числа перемещений (+ доказательство). Доказательство того, что эту задачу нельзя решить используя меньшее число перемещений дисков. ([https://www.dropbox.com/s/t8cbs7ttu4iasvj/algo-0-recursion.pdf?dl=0 Разбор задачи о ханойской башне], автор Сергей Объедков)&lt;br /&gt;
# Сортировка пузырьком. Алгоритм. Подсчёт количество операций сравнения и обмена (swap). Анализ наилучшего и наихудшего случаев ([https://ru.wikipedia.org/wiki/Сортировка_пузырьком Википедия])&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 1 (12.01 - 26.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
Во всех задачах, если не оговорено иного, предполагаем, что работаем с целыми неотрицательными числами. Для первых 7 задач необходимо&lt;br /&gt;
* описать что можно считать наилучшим и наихудшим случаями,&lt;br /&gt;
* для каждого из двух случаев подсчитать отдельно количество операций сравнения и swap (если есть).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Даны три числа, требуется вернуть наименьшее.&lt;br /&gt;
# Даны три числа, требуется отсортировать их.&lt;br /&gt;
# Дана последовательность A из n элементов и число x, требуется найти элемент равный x. Примечание: если таких значений i несколько, вернуть любое; если такого элемента нет, функция должна сообщить об этом.&lt;br /&gt;
# * Дана упорядоченная последовательность A из n элементов и число x, требуется найти такое i, что A[i] равно x. Алгоритм должен быть эффективней, чем в предыдущем пункте и использовать то, что последовательность упорядочена.&lt;br /&gt;
# Дана последовательность из 100 000 чисел от 0 до 100. Напишите эффективный алгоритм сортировки, который бы учитывал специфику входных данных.&lt;br /&gt;
# * Дано 32 битное неотрицательное число. Требуется номер первого ненулевого бит. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения, считая, что числа распределены равномерно.&lt;br /&gt;
# * Даны 32 битные неотрицательные числа m и n. Требуется вывести True, если m &amp;lt; n, иначе False. Разрешается использовать операцию обращения к i-тому биту. В дополнение к заданиям в преамбуле укажите математическое ожидание количества операций сравнения битов, считая, что числа распределены равномерно.&lt;br /&gt;
# Напишите рекурсивную функцию, вычисляющую n-ое число Фибоначчи (как на занятии). Подсчитайте количество рекурсивных вызовов.&lt;br /&gt;
# * Напишите функцию, вычисляющую n-ое число Фибоначчи, у которой число операций — полином от n, и которая использует количество памяти, независящее от n.&lt;br /&gt;
&lt;br /&gt;
==O-символика и стратегия &amp;quot;разделяй и властвуй&amp;quot; (15.01)==&lt;br /&gt;
# Сортировка слиянием. Алгоритм, рекуррентное соотношение для времени сортировки, сложность. Подробнее: [https://dl.dropboxusercontent.com/u/829163/draft.pdf §2.3 Сортировка слиянием (стр. 54)].&lt;br /&gt;
# О-символика. [https://dl.dropboxusercontent.com/u/829163/draft.pdf §0.3 О-символика (стр. 10)].&lt;br /&gt;
# Задача о слиянии m упорядоченных массивов по n элементов. Три алгоритма решения: последовательное слияние, слияние &amp;quot;деревом&amp;quot; (обе функции используют Merge из MergeSort), аналог Merge для m массивов. Анализ сложности каждого из них.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 2 (15.01-29.01)===&lt;br /&gt;
* Для получения максимального балла требуется решить или все задачи без звёздочек, или все задачи со звёздочками.&lt;br /&gt;
* Во всех задачах, если не оговорено иного, для простоты &#039;&#039;можно&#039;&#039; считать, что n является степенью какого-либо числа, например, степенью двойки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Дана функция F, определённая ниже. Сколько строк она напечатает? Указание: для обоих подпунктов рассмотрите два случая: 1. n является степенью двойки, 2. n не является степенью двойки.&lt;br /&gt;
## Запишите рекуррентное соотношение для числа строк.&lt;br /&gt;
## Решите уравнение, полученное в предыдущем пункте, то есть, выведите замкнутую (нерекуррентную формулу). Для простоты можно считать, что n является степенью двойки.&lt;br /&gt;
# В массиве A размера n записана возрастающая последовательность целых чисел. Постройте алгоритм типа &amp;quot;разделяй и властвуй&amp;quot;, который проверяет, существует ли такой индекс i, что A[i] = i&lt;br /&gt;
## за время O(n),&lt;br /&gt;
## * за время O(log n).&lt;br /&gt;
## Какие случаи для вашего алгоритма являются наихудшими и наилучшими? Какого время работы в лучшем и худшем случаях?&lt;br /&gt;
# Дан бесконечный массив A, первые n элементов которого содержат возрастающую последовательность положительных чисел, а дальше стоят -1. Значение n не дано. Постройте алгоритм, который получает на вход целое число x и находит это x в массиве --- или говорит, что там его нет, &lt;br /&gt;
## за время O(n),&lt;br /&gt;
## за время O(log n).&lt;br /&gt;
# Рассмотрим алгоритм вычисления наибольшего общего делителя (НОД) двух положительных чисел, основанный на методе &amp;quot;разделяй и властвуй&amp;quot;.&lt;br /&gt;
## (задание не оценивается) Прочитайте [https://dl.dropboxusercontent.com/u/829163/draft.pdf §1.2.3 Алгоритм Евклида (стр. 23)].&lt;br /&gt;
## * Докажите, что определение НОД-а, приведённое ниже, корректно.&lt;br /&gt;
## Постройте алгоритм, основанный на этом определении.&lt;br /&gt;
## Какой алгоритм будет быстрее для n-битовых чисел a и b при больших значениях n --- ваш или алгоритм Евклида?&lt;br /&gt;
# * Покажите как за время O(n log n) удалить из массива размера n все дубликаты, то есть оставить каждый элемент в одном экземпляре.&lt;br /&gt;
# * Даны два упорядоченных массива размера m и n. Постройте алгоритм, находящий k-й по величине элемент в объединении этих массивов за время O(log(n+m)). &lt;br /&gt;
&lt;br /&gt;
Функция F(n).&lt;br /&gt;
  если n &amp;gt; 1:&lt;br /&gt;
    напечатать &amp;quot;всё ещё работаю&amp;quot;&lt;br /&gt;
    F(n/2)&lt;br /&gt;
    F(n/2)&lt;br /&gt;
&lt;br /&gt;
Определение НОД-а.&lt;br /&gt;
             2НОД(a/2, b/2), если а и b чётны,&lt;br /&gt;
  НОД(a,b) = НОД(a, b/2), если а нечётно, b чётно,&lt;br /&gt;
             НОД((a-b)/2, b), если а и b нечётны.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;lt;nowiki&amp;gt;Задачи взяты из книги &amp;quot;Алгоритмы&amp;quot;, глава 2 (см. список рекомендованной литературы).&amp;lt;/nowiki&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Сложение и умножение (19.01)==&lt;br /&gt;
# Алгоритм сложения, его сложность (§1.1.1 Сложение*)&lt;br /&gt;
# &amp;quot;Школьный&amp;quot; алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Рекурсивный алгоритм умножения и его сложность (§1.1.2 Умножение*)&lt;br /&gt;
# Алгоритм умножения, реализующий стратегию &amp;quot;разделяй и властвуй&amp;quot;, анализ сложности (§2.1 Умножение чисел*)&lt;br /&gt;
 * [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать.]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 3 (19.01 - 2.02)===&lt;br /&gt;
* Во всех задачах для простоты можно считать, что n является степенью какого-либо числа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Найдите произведение чисел 10011011 и 10111010 (в двоичной системе счисления), используя алгоритм умножения чисел, основанный на методе «разделяй и властвуй». Необходимо не только дать ответ, но и привести ход решения.&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 3 рекурсивных вызова для подзадач размера n-1 и комбинирует из них решение исходной задачи за О(n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте три верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Алгоритм, решая задачу размера n, производит 10 рекурсивных вызовов для подзадач размера n/2 и комбинирует из них решение исходной задачи за О(5n).&lt;br /&gt;
## Напишите рекуррентную формулу, описывающую количество операций.&lt;br /&gt;
## Нарисуйте два верхних уровня дерева вызовов.&lt;br /&gt;
## Сколько всего будет уровней?&lt;br /&gt;
## Сколько подзадач на i-ом уровне?&lt;br /&gt;
## Какой размер каждой подзадачи на i-ом уровне?&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
# Докажите, что 3m² + m = O(m²).&lt;br /&gt;
# Докажите, что lg m = O(m/1000), где lg m — это логарифм с двоичным основанием.&lt;br /&gt;
# Докажите, что из равенства f(n) = O(g(n)) не следует, что g(n) = O(f(n)).&lt;br /&gt;
# Докажите, что O(m) содержится в O(m²).&lt;br /&gt;
&lt;br /&gt;
==Решение рекуррентных уравнений (22.01)==&lt;br /&gt;
# Примеры решений рекуррентных уравнений (см. [https://www.dropbox.com/s/6a0r410zjm9qwe7/algo-3-recurrences.pdf?dl=0 конспект]).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 4 (до 14.02)===&lt;br /&gt;
* Нельзя использовать утверждение основной теоремы о решении рекуррентных соотношений.&lt;br /&gt;
* &#039;&#039;Можно&#039;&#039; использовать метод построения дерева рекурсии или подстановку (метод с угадыванием ответа).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Какой из трёх приведённых ниже алгоритмов вы бы предпочли? Обоснуйте свой ответ.&lt;br /&gt;
#* Алгоритм A, решая задачу, производит пять рекурсивных вызовов для подзадач вдвое меньшего размера, после чего строит ответ для исходной задачи за линейное время.&lt;br /&gt;
#* Алгоритм B, решая задачу размера n, делает два рекурсивных вызова для задач размера n − 1, после чего находит ответ за время O(1).&lt;br /&gt;
#* Алгоритм C, решая задачу размера n, рекурсивно решает девять задач размера n/3 и строит ответ за время O(n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Найдите T(n) в замкнутой форме для любых 7 из 10 приведённых ниже рекуррентных соотношений:&lt;br /&gt;
## T(n) ≤ 2T(n/3) + 1;&lt;br /&gt;
## T(n) ≤ 7T(n/7) + n;&lt;br /&gt;
## T(n) ≤ 9T(n/3) + n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 8T(n/2) + n&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;;&lt;br /&gt;
## T(n) ≤ 49T(n/25) + n&amp;lt;sup&amp;gt;3/2&amp;lt;/sup&amp;gt;log n;&lt;br /&gt;
## T(n) ≤ T(n − 1) + 2;&lt;br /&gt;
## T(n) ≤ T(n − 1) + n&amp;lt;sup&amp;gt;c&amp;lt;/sup&amp;gt;, где c ≥ 1 –– константа;&lt;br /&gt;
## T(n) ≤ T(n − 1) + c&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;, где c &amp;gt; 1 –– константа;&lt;br /&gt;
## T(n) ≤ 2T(n − 1) + 1;&lt;br /&gt;
## T(n) ≤ T(sqrt(n)) + 1.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №1==&lt;br /&gt;
Необходимо реализовать все 6 задач из [https://official.contest.yandex.ru/contest/1002 контеста]. Каждую задачу можно писать на С++ или Python. На выполнение работы отводится две недели. Каждая задача оценивается в 10/6 балла. Оценка &#039;&#039;может&#039;&#039; быть снижена за плохой код, но не более чем на 25%.&lt;br /&gt;
&lt;br /&gt;
==Бинарное дерево поиска (26.01)==&lt;br /&gt;
# Определение. Пример.&lt;br /&gt;
# Не модифицирующие алгоритмы: поиск (рекурсивный и итеративный алгоритмы), поиск минимума, inordered обход (вывод значений узлов в отсортированном порядке), поиск следующего по возрастанию.&lt;br /&gt;
# Модифицирующие алгоритмы: вставка (рекурсивная реализация), удаление (только идея).&lt;br /&gt;
 [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 13, стр. 248]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 5 (до 16.02)===&lt;br /&gt;
* Для получения максимальной оценки можно выполнить или все задачи без звёздочки, или задачу со звёздочкой. Преподаватель понимает, что реализацию БДП сложно не найти в интернете, но от копипасты не будет никакой пользы. Напротив, самостоятельная реализация очень полезна и приветствуется, даже если не получится выполнить всех пунктов задания.&lt;br /&gt;
* Задачи с двумя звёздочками необязательны.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
# Нарисуйте бинарные деревья поиска высотой 2, 3, 4, 5 и 6 для множества ключей {1, 4, 5, 10, 16, 17, 21}. Корень дерева имеет высоту 0.&lt;br /&gt;
# &#039;&#039;&#039;Сортировка с использованием БДП.&#039;&#039;&#039;&lt;br /&gt;
## Какова асимптотическая сложность алгоритма вставки элемента в дерево высоты d? Почему? Назовите наилучший и наиухдший случаи.&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который строит БДП в узлах которого стоят элементы данной последовательности. Можно использовать функцию Insert. Назовите наилучший и наихудший случаи. Есть теорема о том, что полученный алгоритм будет работать в среднем случае за время O(n * log n).&lt;br /&gt;
## Дана последовательность из n чисел. Напишите алгоритм, который выводит их в порядке возрастания. Используйте бинарное дерево поиска. Какова в среднем случае сложность этого алгоритма? Назовите наилучший и наихудший случаи. Какова сложность в наихудшем случае?&lt;br /&gt;
# Напишите функцию GetRoot, которой на вход подаётся указатель на произвольный узел дерева, а она возвращает указатель на корень.&lt;br /&gt;
# Напишите процедуру PrintLeafs, которой на вход подаётся указатель на корень дерева, и она печатает листья дерева&lt;br /&gt;
## по возрастанию,&lt;br /&gt;
## по убыванию.&lt;br /&gt;
# ** Альтернативный обход в порядке возрастания бинарного дерева поиска с n узлами (или центрированный (inordered) обход) можно осуществить путём поиска минимального элемента дерева с помощью функции Minimum с последующий n-1 вызовом функции Next. Каково время работы такого алгоритма?&lt;br /&gt;
# * Реализуйте на С++ структуру данных бинарное дерево поиска, [https://yadi.sk/i/gi2SEStreFfSb используя заготовку].&lt;br /&gt;
## Нарисуйте бинарное дерево поиска, которое строится в функции getTreeExample.&lt;br /&gt;
## Реализуйте следующие алгоритмы: &lt;br /&gt;
### поиск минимума, &lt;br /&gt;
### inordered обход (вывод значений узлов в отсортированном порядке),&lt;br /&gt;
### поиск следующего по возрастанию,&lt;br /&gt;
### вставка элемента в дерево,&lt;br /&gt;
### сортировка последовательности с использованием БДП (дан вектор чисел, необходимо вывести их по возрастанию),&lt;br /&gt;
### ** удаление.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Карацубы, Штрассена. Быстрая сортировка (29.01)==&lt;br /&gt;
# Алгоритм Карацубы.&lt;br /&gt;
# Алгоритм Штрассена. [https://dl.dropboxusercontent.com/u/829163/draft.pdf Читать Дасгупту и др., §2.5 Умножение матриц]&lt;br /&gt;
# Быстрая сортировка и доказательство того, что в среднем случае она работает за О(n * log n). [http://e-maxx.ru/bookz/files/cormen.pdf Читать Кормена и др., глава 8 Быстрая сортировка, стр. 148]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 6 (до 18.02)===&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Пусть мы хотим найти двоичное представление десятичного числа 10&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;. Будем считать, что n --- степень двойки (n = 2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt;).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Pwr2Bin(n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть 1010&lt;br /&gt;
    z = ...&lt;br /&gt;
    вернуть Multiply(z, z)&amp;lt;/source&amp;gt;&lt;br /&gt;
Multiply --- функция, перемножающая два n-битовых двоичных числа x и y по алгоритму Карацубы за O(n&amp;lt;sup&amp;gt;log&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;3&amp;lt;/sup&amp;gt;).&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Пусть мы хотим перевести произвольное десятичное число x в записи которого n=2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; чисел в двоичную систему счисления.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Dec2Bin(x, n):&lt;br /&gt;
    если n == 1:&lt;br /&gt;
        вернуть binary[x]&lt;br /&gt;
    разделить x на два десятичных числа xl и xr из n/2 цифр.&lt;br /&gt;
    вернуть ...&amp;lt;/source&amp;gt;&lt;br /&gt;
Здесь binary --- это массив, содержащий двоичное представление десятичных цифр.&lt;br /&gt;
# Впишите недостающую строку псевдокода.&lt;br /&gt;
# Запишите рекуррентное соотношение на время работы и решите его.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Докажите, что математическое ожидание времени работы алгоритма быстрой сортировки (усреднение по всем вариантам выбора опорного элемента) на любом входе размера n удовлетворяет соотношению: T(n) ≤ O(n) + 1/n * &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt; (T(i-1) + T(n-i)).&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Найдите решение соотношения из предыдущего пункта.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Динамическое программирование (ДП). Первые примеры (02.01)==&lt;br /&gt;
# Нахождение самой длинной возрастающей подпоследовательности.&lt;br /&gt;
# Нахождение редакционного расстояния (или редакционной стоимости, расстояния Левенштейна).&lt;br /&gt;
# Нахождение представителя большинства.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 7 (до 20.02)===&lt;br /&gt;
* В этом задании везде, где требуется реализовать алгоритм, необходимо привести код на любом языке программирования.&lt;br /&gt;
* Для получения максимальной оценки нужно решить все задачи без звёздочек. Одна решённая задача со звёздочкой заменяет одну задачу без звёздочки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задачи&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения редакционного расстояния (алгоритм Вагнера — Фишера). Например, редакционное расстояние между словами &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равно 6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм нахождения длины наибольшей общей подстроки. Например, длина наибольшей общей подстроки &amp;quot;anthropology&amp;quot; и &amp;quot;anthologies&amp;quot; равна 8 (&amp;quot;antholog&amp;quot;). Чем больше это значение, тем схожей строки.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Предположим теперь, что сравниваемые строки состоят из символов A, С, G и T; за удаление или вставку мы платим -5; за замену буквы x на y платим w[x, y], где x, y принадлежат множеству {A, С, G, T}, a w — это матрица весов:&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
!-!! A!! G!! C!! T&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! A&lt;br /&gt;
|10||-1||-3||-4&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
!G&lt;br /&gt;
||-1||7||-5||-3&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! C&lt;br /&gt;
||-3||-5||9||0&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! T&lt;br /&gt;
||-4||-3||0||8&lt;br /&gt;
|}&lt;br /&gt;
Тогда выравнивание:&lt;br /&gt;
 AGACTAGTTAC&lt;br /&gt;
 CGA‒‒‒GACGT&lt;br /&gt;
будет иметь следующую оценку:&lt;br /&gt;
 w[A,C] + w[G,G] + w[A,A] + 3*(-5) + w[G,G] + w[T,A] + w[T,C] + w[A,G] + w[C,T] = -3 + 7 + 10 - 3*5 + 7 + (-4) + 0 + (-1) + 0 = 1.&lt;br /&gt;
&lt;br /&gt;
Напишите алгоритм, который находит максимальную стоимость всех возможных выравниваний. Верно ли, что чем больше это значение, тем непохожей строки?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как давно один народ отделился от другого? Кто похожей — итальянец и китаец или якут и эфиоп? На эти вопросы можно отвечать с разных точек зрения — культурной, исторической, лингвистической, ... В последние же годы человечество научилось секвенировать геном, что позволило исследовать этот вопрос с точки зрения генетики. Секвенирование генома — это процесс записи ДНК в виде нуклеотидной последовательности, которая представляет собой последовательность из четырёх символов — A, С, G и T. Существуют базы, которые хранят генетическую информацию о людях из разных стран и континентов, например, [http://www.mtdb.igp.uu.se/ http://www.mtdb.igp.uu.se/ → Download mtDNA sequences]. Чем больше сходство между геномами, тем сильнее родственные связи между их обладателями. Используя решение предыдущего пункта, выполните задания:&lt;br /&gt;
# Определите, кто похожей — итальянец и китаец или якут и эфиоп?&lt;br /&gt;
# Найдите нескольких похожих и нескольких непохожих народностей.&lt;br /&gt;
# * Выберите одну народность. Найдите самых похожих и самых непохожих на неё.&lt;br /&gt;
# * Найдите самые похожие и самые непохожие народности.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Задача о разрезании стержня (05.01)==&lt;br /&gt;
# Постановка задачи.&lt;br /&gt;
# Решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Решение с нахождением максимума по p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt;. Алгоритм. Дерево рекурсивных вызовов. Оценка сложности.&lt;br /&gt;
# Восходящий алгоритм с запоминанием. Вывод длин кусочков стержня. Оценка сложности.&lt;br /&gt;
# Нисходящий алгоритм с запоминанием. Оценка сложности.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.1 Разрезание стержня, стр. 393]&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 8 (до 22.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Решая задачу о разрезании стержня мы вначале построили рекурсивное решение с нахождением максимума по r&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; + r&amp;lt;sub&amp;gt;n-i&amp;lt;/sub&amp;gt; для всех 1 ≤ i &amp;lt; n. Его сложность описывалась рекуррентной формулой T(n) = n + &amp;lt;big&amp;gt;Σ&amp;lt;/big&amp;gt;&amp;lt;sup&amp;gt;n-1&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;i=1&amp;lt;/sub&amp;gt;(T(i) + T(n-i)), T(1) = 1.&lt;br /&gt;
# Объясните эту формулу.&lt;br /&gt;
# Покажите с помощью метода подстановок, что T(n) ≤ 2&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Покажите с помощью контрпримера, что описанная далее жадная стратегия не всегда определяет оптимальный способ разрезания стержня. Определим плотность стержня длиной i как p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;/i, то есть как стоимость единицы его длины. Жадная стратегия для стержня длиной n отрезает от стержня первую часть длиной i, где 1 ≤ i ≤ n, имеющую максимальную плотность. Затем та же жадная стратегия применяется к оставшейся части длиной n-i.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Рассмотрим модификацию задачи разрезания стержня, в которой в дополнение к цене p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; каждого стержня добавляется фиксированная цена разреза c. Теперь прибыль, связанная с решением, представляет собой сумму цен частей стержня минус стоимость разрезов. Разработайте алгоритм динамического программирования для этой модифицированной задачи.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Непрерывным участком называется группа подряд идущих элементов. Например, для последовательности&lt;br /&gt;
 5, 15, −30, 10, −5, 40, 10&lt;br /&gt;
элементы 15, −30, 10 образуют непрерывный участок, а 5, 15, 40 -- нет. Постройте линейный алгоритм для следующей задачи:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Вход: список чисел a1, a2, ... ‌, an.&lt;br /&gt;
Выход: непрерывный участок с максимальной суммой (сумма участка нулевой длины равна нулю).&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Для приведённого примера ответом будет 10, −5, 40, 10 с суммой 55. Какова сложность алгоритма? Почему?&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Надо заплатить v рублей, имея купюры в x1, x2, ‌..., xn рублей (купюр каждого типа сколько угодно). Это не всегда возможно (скажем, купюрами в&lt;br /&gt;
10 и 25 рублей можно заплатить 45 рублей, но не 47 и не 15). Постройте основанный на методе динамического программирования алгоритм со временем работы O(nv), выясняющий, возможна ли уплата.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Как решить предыдущую задачу, если каждая купюра имеется в единственном экземпляре? (Например, купюрами в 1, 5, 10, 20 рублей можно заплатить 16 = 1 + 5 + 10 и 31 = 1 + 10 + 20 рублей, но не 40 (не хватит денег). Время работы алгоритма по-прежнему O(nv).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Ещё один вариант той же задачи: купюр каждого типа сколько угодно, но всего разрешается использовать не более k купюр. (Например, если есть купюры в 5 и 10 рублей, а k = 6, то 55 разменять можно, а 65 –– нет).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Перемножение цепочки матриц. Оптимальное бинарное дерево поиска (начало) (09.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о перемножении цепочки матриц. Постановка задачи.Пример. Нисходящий алгоритм.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.2 Перемножение цепочки матриц, стр. 403]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 9 (до 24.02)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Найдите оптимальную расстановку скобок в произведении последовательности матриц, размерности которых равны 5×10, 10×3, 3×12, 12×5, 5×50, 50×6.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Напишите восходящий алгоритм для поиска оптимальной расстановки скобок.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ДП. Расстановка пробелов. Оптимальное бинарное дерево поиска (середина) (12.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Задача о расстановке пробелов. Постановка задачи. Решения для трёх случаев: 1. нужно вернуть можно ли разбить текст на слова; 2. вернуть разбивку на слова; 3. слова встречаются не равновероятно, вернуть наиболее вероятную разбивку на слова.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Построение оптимального дерева поиска. Постановка задачи. Вывод математического ожидания времени поиска.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §15.5 Оптимальные бинарные деревья поиска, стр. 431]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Праздничное домашнее задание 10 (до 02.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[&amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;quot;, &amp;quot;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;quot;, &amp;quot;,&amp;quot;, &amp;quot;.&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;,&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#10085;&amp;amp;#10085;&amp;amp;#9825;&amp;amp;#9825;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#9829;&amp;lt;/big&amp;gt;&amp;amp;#9825;.&amp;quot;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Подсказка:&#039;&#039;&#039; разбейте текст на слова из списка и посмотрите на азбуку Морзе.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Способы представления графов в памяти (16.02)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Разбор ошибок в домашнем задании.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Графы. Способы представления графов в памяти (матрица смежности, список рёбер, список соседей (список смежностей), матрица инцидентности). Зависимость сложности алгоритмов от способа представления.&lt;br /&gt;
 [http://vk.com/doc10903696_305548249?hash=e650748a79ddfa0a8a&amp;amp;dl=a55f6d994a02c2957e Читать Кормена и др., 3-е изд., §22.1 Представление графов, стр. 626]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 11 (до 02.03)===&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача A.]&lt;br /&gt;
# [https://official.contest.yandex.ru/contest/1066 Задача B.]&lt;br /&gt;
# Нарисуйте неориентированный граф с 5 вершинами и 8 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Нарисуйте ориентированный граф с 4 вершинами и 3 рёбрами. Напишите его матрицу смежности, список рёбер, список соседей (список смежностей), матрицу инцидентности.&lt;br /&gt;
# Дан ориентированный граф. &#039;&#039;Исходящая степень вершины v&#039;&#039; --- это количество исходящих из неё рёбер, &#039;&#039;входящая степень v&#039;&#039; --- это количество рёбер входящих в  v. Имеется представление ориентированного графа с использование списка соседей. Как долго будут вычисляться исходящие степени всех вершин графа? А входящие степени?&lt;br /&gt;
# Дан граф G = (V, E). Какие из рассмотренных способов хранения графов используют меньше всего памяти для хранения G и почему? Указание: рассмотрите случаи |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;lt; |E| и |V|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;gt; |E|.&lt;br /&gt;
# Пусть C --- это матрица смежности графа G.&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
## Как связаны элементы матрицы С&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
# Пусть B --- это матрица инцидентности ориентированного графа G. Как связаны элементы матрицы BB&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt; и граф G?&lt;br /&gt;
&lt;br /&gt;
==Реализация поиска в глубину (19.02)==&lt;br /&gt;
# Реализация поиска в глубину и смежных задач.&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 12 (до 5.03)===&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Выберите любой способ хранения графа. Реализуйте поиск в глубину.&lt;br /&gt;
# &#039;&#039;(С++)&#039;&#039; Напишите алгоритм, который возвращает данные о том, какие вершины лежат в одной компоненте связности.&lt;br /&gt;
# &#039;&#039;(любой ЯП или псевдокод)&#039;&#039; Напишите алгоритм проверки сильной связности ориентированного графа. Какова его сложность?&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №2==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
Необходимо реализовать 3 задачи из [https://official.contest.yandex.ru/contest/1085 контеста], см. [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing распределение задач]. Каждую задачу можно написать на С++ или Python. На выполнение работы отводится две недели (см. время окончания контеста). [https://official.contest.yandex.ru/contest/1123 Дорешивание.]&lt;br /&gt;
&lt;br /&gt;
==ДП и графы (26.02)==&lt;br /&gt;
==ДП и графы (02.03)==&lt;br /&gt;
==Жадные алгоритмы (12.03)==&lt;br /&gt;
===Домашнее задание 13 (до 23.03)===&lt;br /&gt;
# Вася хочет купить по одной акции каждой компании. Все акции стоят одинаково, но дорожают по-разному. Каждый месяц акция i-ой компании дорожает в r_i раз. В один месяц можно купить только одну акцию.&lt;br /&gt;
## Напишите алгоритм, который выводит оптимальную последовательность покупок (такую, что на покупку всех акций потратится меньше денег).&lt;br /&gt;
## Докажите корректность алгоритма, то есть докажите, что последовательность покупок, которую выводит ваш алгоритм, оптимальна.&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список, очередь (16.03)==&lt;br /&gt;
# Реализация линейного двусвязного списка (С++).&lt;br /&gt;
# Реализация очереди ограниченной длины на базе вектора (С++).&lt;br /&gt;
# Реализация очереди на базе списка (С++).&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14 (до 23.03)===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте (на С++) структуру данных Стек. У стека должно быть три операции:&lt;br /&gt;
* push --- положить элемент на вершину стека;&lt;br /&gt;
* pop --- удалить верхний элемент;&lt;br /&gt;
* front --- вернуть значение верхнего элемента.&lt;br /&gt;
Оцените время работы каждой функции.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Структуры данных: список (19.03)==&lt;br /&gt;
===Домашнее задание 13 (до 30.03)===&lt;br /&gt;
#Для приведённой реализации класса List (https://yadi.sk/i/c5r_79WdfMyNS).&lt;br /&gt;
## Допишите print, push_back и push_front.&lt;br /&gt;
## В функции insert_after и delete_node вставьте необходимые проверки так, чтобы они работали для крайних случаев.&lt;br /&gt;
## Напишите main в котором&lt;br /&gt;
### создаётся объект класса List, &lt;br /&gt;
### заполняется элементами с помощью функций push_back, push_front и insert_after и&lt;br /&gt;
### удаляется i-ый элемент.&lt;br /&gt;
&lt;br /&gt;
==Повторение (30.03)==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Для данных пар функций выясните их связь в терминах O-, o-, Ω-, ω-, Θ-обозначений. Поставьте галочку в клетке с Ω, если f(x) = Ω(g(x)) и прочерк, если равенства нет. [https://ru.wikipedia.org/wiki/«O»_большое_и_«o»_малое#.D0.94.D1.80.D1.83.D0.B3.D0.B8.D0.B5_.D0.BF.D0.BE.D0.B4.D0.BE.D0.B1.D0.BD.D1.8B.D0.B5_.D0.BE.D0.B1.D0.BE.D0.B7.D0.BD.D0.B0.D1.87.D0.B5.D0.BD.D0.B8.D1.8F Википедия]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! f(x)!! g(x)!! O!! o!! Ω!! ω!! Θ&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 1 &lt;br /&gt;
! 2^100&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n * log(n)&lt;br /&gt;
! 2^100 * n * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n&lt;br /&gt;
! 2^100 * log(n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n!&lt;br /&gt;
! 2^(2015n)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n*2^n&lt;br /&gt;
! 3^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! 5^n&lt;br /&gt;
! 5^(n+1)&lt;br /&gt;
| || || || ||&lt;br /&gt;
|- align=&amp;quot;right&amp;quot;&lt;br /&gt;
! n + n^2 + n^3 + ... + n^1000&lt;br /&gt;
! 7^n&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Реализуйте алгоритм Quickselect нахождения k-ого элемента по возрастанию: http://en.wikipedia.org/wiki/Quickselect&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;На улице стоит ряд домов. В каждом из домов лежит сколько-то денег. Вор хочет обокрасть дома на переулке. Он не может обокрасть два соседних дома, потому что хозяин дома, который он обокрал, сразу предупредит соседей. Нужно найти, какую максимальную сумму вор может украсть с переулка. На вход программы подается массив неотрицательных целых чисел - количество долларов в доме с номером i. Соседние дома в массиве представлены соседними элементами. Например, пусть задан массив { 1, 4, 5 } - тогда вор максимум может украсть $6, обокрав дома 1 и 3. Пусть задан массив { 1, 7, 2 } - тогда вор максимум может украсть $7, обокрав дом 2.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Алфавит из всех маленьких латинских букв и пробела закодирован числами следующим способом:&lt;br /&gt;
  &#039;a&#039; -&amp;gt; 1&lt;br /&gt;
  &#039;b&#039; -&amp;gt; 2&lt;br /&gt;
  &#039;c&#039; -&amp;gt; 3&lt;br /&gt;
  ...&lt;br /&gt;
  &#039;z&#039; -&amp;gt; 26&lt;br /&gt;
  &#039; &#039; -&amp;gt; 27&lt;br /&gt;
На вход программы подается строка из цифр. Нужно посчитать, сколькими способами можно раскодировать эту строку.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Дан граф, заданный матрицей смежности. Вывести пары вершин между которыми нет пути.&lt;br /&gt;
# Придумайте алгоритм, решающий эту задачу.&lt;br /&gt;
# Реализуйте приведённый алгоритм на С++ или Python.&lt;br /&gt;
# Оцените сложность алгоритма.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Повторение (02.04) ==&lt;br /&gt;
Решали и разбирали первые 4 задачи из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 14 (до 11.03)===&lt;br /&gt;
Решите любые две задачи (подпункты НЕ считаются отдельными задачами) с предыдущей пары (Повторение (30.03)).&lt;br /&gt;
&lt;br /&gt;
== Повторение (06.04) ==&lt;br /&gt;
Будем решать вторую половину задач из списка https://yadi.sk/i/2hqNdboefgrQB&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 15 (до 16.04)===&lt;br /&gt;
# Приведите пример графа, который содержит отрицательные рёбра, не содержит циклов отрицательного веса и для которого алгоритм Дейкстры возвращает неверный результат.&lt;br /&gt;
# Используется ли в алгоритме Дейкстры то, что веса рёбер неотрицательны? Если &amp;quot;да&amp;quot;, то где именно?&lt;br /&gt;
# Пусть граф содержит рёбра с весами &amp;gt;= -100. Если прибавить к каждому ребру 101 и при помощи алгоритма Дейкстры найти кратчайшие пути. Будут ли эти пути кратчайшими в исходном графе? Почему?&lt;br /&gt;
&lt;br /&gt;
== Повторение (07.04) ==&lt;br /&gt;
&#039;&#039;&#039;Решение рекуррентных соотношений&#039;&#039;&#039;&lt;br /&gt;
# Решите уравнение: T(n) = 4*T(n/2) + O(n^2) с базой T(1) = O(1)&lt;br /&gt;
## Используя основную теорему.&lt;br /&gt;
## Используя дерево рекурсий.&lt;br /&gt;
## Методом подстановки.&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2)) + n является \Theta(n lg n).&lt;br /&gt;
# Покажите, что решением T(n) = 2 T(floor(n/2) + 17) + n является \Theta(n lg n).&lt;br /&gt;
# Решите уравнения, считая, что T(1) = O(1):&lt;br /&gt;
## T(n) = T(n-1) + n&lt;br /&gt;
## T(n) = 2*T(floor(sqrt(n))) + lg n. Указание: попробуйте использовать замену переменных.&lt;br /&gt;
## T(n) = 3*T(sqrt(n)) + lg n&lt;br /&gt;
# Дайте верхнюю и нижнюю оценки функции T(n). Постарайтесь, чтобы оценки были как можно более точные&lt;br /&gt;
## T(n) = 4T(n/3) + n*lg(n)&lt;br /&gt;
## T(n) = 3T(n/3) + n/lg(n)&lt;br /&gt;
## T(n) = 4T(n/2) + n^2*sqrt(n)&lt;br /&gt;
## T(n) = T(n/2) + T(n/4) + T(n/8) + n&lt;br /&gt;
## T(n) = T(n-1) + 1/n&lt;br /&gt;
## T(n) = T(n-2) + 1/lg(n)&lt;br /&gt;
## T(n) = sqrt(n) * T(sqrt(n)) + n&lt;br /&gt;
&#039;&#039;&#039;Анализ и построение алгоритмов&#039;&#039;&#039;&lt;br /&gt;
# Числа Фибоначчи F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; можно выразить через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, используя матрицу: https://yadi.sk/i/Pm_aNzHCforFU. &lt;br /&gt;
## Покажите как вычислить F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;.&lt;br /&gt;
## Как вычислить F&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;n+1&amp;lt;/sub&amp;gt; через F&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, F&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;?&lt;br /&gt;
## Напишите алгоритм.&lt;br /&gt;
## Какова сложность алгоритма?&lt;br /&gt;
## Ускорьте его так, чтобы он работал за O(log n).&lt;br /&gt;
# Дана последовательность символов. Какое минимальное количество символов нужно удалить из неё, чтобы получить палиндром?&lt;br /&gt;
## Напишите алгоритм (на псевдокоде или на любом языке программирования).&lt;br /&gt;
## Оцените время работы алгоритма.&lt;br /&gt;
# Какую структуру данных вы бы использовали для реализации упорядоченного множества (http://neerc.ifmo.ru/wiki/index.php?title=Упорядоченное_множество)? Какая будет сложность каждой из операций над множеством?&lt;br /&gt;
&lt;br /&gt;
===Домашнее задание 16 (до 20.04)===&lt;br /&gt;
# Решите 6 задач из первой части и 6 из второй. (Укажите какие именно.) Каждый из подпунктов является отдельной задачей.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм и теорема Форда-Фалкерсона (16.04)==&lt;br /&gt;
# Базовые определения (пропускные способности, сток, исток и пр.). Пример. &lt;br /&gt;
# Ограничения на поток (сохранение и что меньше пропускных способностей).&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, пример работы&lt;br /&gt;
# Разрез, определение, пример.&lt;br /&gt;
# Утверждение: максимальный поток &amp;lt;= любого разреза.&lt;br /&gt;
# Теорема Форда-Фалкерсона (с доказательством).&lt;br /&gt;
# Пример на котором алгоритм Форда-Фалкерсонаработает работает очень долго при неудачном выборе путей.&lt;br /&gt;
# Сложность алгоритма Форда-Фалкерсона.&lt;br /&gt;
&lt;br /&gt;
==Большое домашнее задание №3==&lt;br /&gt;
Задание индивидуальное. В случае нарушения академических норм, ставится 0 за весь контест. &lt;br /&gt;
&lt;br /&gt;
В [https://official.contest.yandex.ru/contest/1196 домашнем задании] пять задач. Они разделены на два варианта, помеченные римскими цифрами I и II. Свой вариант нужно узнать [https://docs.google.com/spreadsheets/d/1BmLS8mirr6yQYh-0pNTkX_qs9SaexTqvzssB-IJJB9A/edit?usp=sharing здесь на вкладке HW3]. Третья задача — общая для двух вариантов; ее решение необходимо снабдить доказательством корректности алгоритма. На выполнение задания дается примерно 2 недели (см. точное время окончания в контесте). Каждую задачу можно написать на С++ или Python.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Форда-Фалкерсона и Эдмондса-Карпа(20.04)==&lt;br /&gt;
# Алгоритм Форда-Фалкерсона, напоминание: базовые определения, пример работы, пример на котором алгоритм работает долго, сложность.&lt;br /&gt;
# Алгоритм Эдмодса-Карпа. Доказательство асимптотики времени работы.&lt;br /&gt;
&lt;br /&gt;
==(23.04)==&lt;/div&gt;</summary>
		<author><name>Kassalanche</name></author>
	</entry>
</feed>