Advertisement
Guest User

Untitled

a guest
Nov 15th, 2019
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.89 KB | None | 0 0
  1.  
  2. \documentclass[12pt]{article}
  3.  
  4. \usepackage{amsfonts,amssymb}
  5. \usepackage[utf8]{inputenc}
  6. \usepackage[english,russian]{babel}
  7. \usepackage{graphicx}
  8. \usepackage{listings}
  9. \usepackage{hyperref}
  10. \usepackage{graphicx}
  11. \usepackage{color}
  12. \usepackage{listings}
  13. \usepackage{hyperref}
  14.  
  15. \usepackage{tikz}
  16. \usepackage{float}
  17.  
  18.  
  19. \lstset{language=C++,
  20. basicstyle=\footnotesize \ttfamily,
  21. keywordstyle=\color{blue}\ttfamily,
  22. stringstyle=\color{red}\ttfamily,
  23. commentstyle=\color{green}\ttfamily,
  24. morecomment=[l][\color{magenta}]{\#}
  25. }
  26.  
  27.  
  28. %\textheight=230mm
  29. %\textwidth=180mm
  30. %\topmargin=-5mm
  31.  
  32. \textheight=230mm
  33. \textwidth=190mm
  34. %\oddsidemargin=5mm
  35. %\evensidemargin=-5mm
  36. \marginparwidth=0pt
  37. \topmargin=0cm
  38. \renewcommand{\baselinestretch}{0.9}
  39. %\footnotesep=3ex
  40.  
  41. \title{Алгоритмы и структуры данных. \\ Сортировки и порядковые статистики, решаем вместе.}
  42.  
  43. %\author{Артюхин С., Евстропов Г., Иващенко Д., Смирнов И. \\ hse.algo@gmail.com}
  44. \date{}
  45.  
  46. \begin{document}
  47.  
  48. \voffset=-10mm
  49. \hoffset=-30mm
  50. \font\Got=eufm10 scaled\magstep2 \font\Got=eufm10
  51.  
  52. \maketitle
  53. \begin{enumerate}
  54.  
  55. \item Обсудите рандомизированный алгоритм поиска порядковой статистики. Используя схему доказательства асимптотики алгоритма по индукции, покажите, что рандомизированный поиск порядковой статистики работает за ожидаемое линейное время.
  56. % Это упражнение на тренировку доказательства асимптотики алгоритма по индукции, его обязательно нужно сделать именно так.
  57. % Пусть ожидаемое время работы алгоритма t(n) = O(n), то есть существует C, такое что t(n) <= c * n.
  58. % Выпишем рекурсивную оценку. t(n) <= Theta(n) + max_k (1 / n (sum_{i = 1}^{k} t(n - i) + sum_{i = k}^{n} t(i))), то есть мы платим линию за раскидывание массива на две части и дальше идём в ту часть, куда попало число k. Для оценки сверху нас устроит каждый раз выбирать наиболее неподходящее значение k.
  59. % Подставим рекурсивную оценку на t(n - i) и t(i)
  60. % t(n) <= A * n + max_k (1 / n (sum_{i = 1}^k c * (n - i) + sum_{i = k}^{n} c * (i))) <= A * n + max_k c * (k * (2n - k) / 2 + ((n - k + 1) * (n + k) / 2)) / n <= |k = n / 2| <= A * n + c * (1 / n) * ((n / 2) * (3n/2) / 2 + (n / 2) * (3n / 2) / 2) <= A * n + c * 3/4 * n <= |C >= 4 * A| <= c * n
  61. % Почему можно так дерзко подставить k = n / 2? Способы по убыванию дерзости.
  62. % 1. Просто в силу симметрии это очевидно
  63. % 2. Функция от k - парабола, причём выпуклая вверх, так как при k^2 стоит минус. В силу симметрии
  64.  
  65. \item Покажите, как реализовать алгоритм сортировки вставками, чтобы время его работы составляло $O(n + inv)$, где $inv$~--- количество инверсий в массиве.
  66. % При добавлении нового элемента мы свапаем его пока свапается, каждый раз убивая одну инверсию.
  67.  
  68. \item Пусть у вас есть массив с элементами некоторого типа, для любой пары элементов вам доступна операция сравнения. Некоторые элементы равны, но при этом всё равно отличимы по вспомогательной информации. Разрешается изменять вспомогательную информацию элементов (то есть никак не используемую при сравнении). Также имеется функция \emph{MagicSort} которая за линейное время сортирует массив элементов данного типа. Обращение к данной функции возможно только как к чёрному ящику. Предложите, как на основе функции \emph{MagicSort} построить устойчивый алгоритм сортировки за линейное время.
  69. % Не принимать решения вида "посортируем пары", так как алгоритм именно чёрный ящик - не разрешается менять используемые при сортировке поля.
  70. % Правильные решения бывают разные, одно из них: в качестве вспомогательной информации будем тащить номер элемента в массиве, после сортировки выделим классы эквивалентности и с помощью сортировки подсчётом отсортируем пары <класс эквивалентности, номер в массиве>
  71.  
  72. \item Оцените время работы алгоритма быстрой сортировки Хоара, в случае если в качестве $pivot$ элемента выбирается:
  73. \begin{enumerate}
  74. \item Элемент стоящий посередине, то есть $a[(lb + rb) / 2]$. Оцените время работы в худшем случае, в среднем (ожидаемое) и на случайных данных.
  75. \item Медиана случайных $\sqrt{rb - lb + 1}$ элементов. Оцените время работы в худшем, в среднем (ожидаемое) и на случайных данных.
  76. \end{enumerate}
  77. % пункт 1: в худшем и в среднем O(n^2), на случайных O(n \log n)
  78. % в худшем можно построить явно пример, где на середину всё время подсовывается максимум или минимум. Понятие "ожидаемое" не имеет смысла, так как схема детерменированная.
  79. % Почему на случайных n log n? Мы не готовы это строго аргументировать, первый элемент понятно почему случайный, дальше в рекурсивных кусках "примерно" случайные перестановки.
  80. % пункт 2: в худшем O(n \sqrt{n}), так как всегда отрезаем хотя бы корень пополам. В среднем и на случайных O(n \log n)
  81. % Если за линейное время отрезать корень, то получаем t(n) = Theta(n) + t(n - sqrt{n}), можно доказать по индукции (а можно и не доказывать).
  82. % Почему медиана случайных даёт оценку O(n log n)?
  83. % Мы знаем рекурсивную оценку для случайного выбора ведущего элемента:
  84. % t(n) = Theta(n) + sum_k (t(k) + t(n - k)) / n.
  85. % При этом мы знаем, что во-первых эта рекуррента решается в O(n log n), во-вторых для сортировки тем хуже, чем ближе k к 1 или к n.
  86. % Из соображений здравого смысла понятно, что у медианы sqrt(n) случайных распределение ближе к середине, чем у просто случайно выбранного.
  87. % Если хочется доказать прям строго, то можно записать рекурренту так:
  88. % t(n) <= Theta(n) + P(k < n / 4 or k > 3n / 4) * t(n - 1) + P(k >= n / 4 and k <= 3n / 4) * (t(3n / 4) + t(n / 4)). Теперь надо оценить вероятность, что больше половины загремит в первую четверть, или наоборот в последнюю четверть. Заметим, что рекуррента сойдётся к O(n log n) даже если показать P(k < n / 4 or k > 3n / 4) <= 1 / 2, как для случайного выбора вещущего элемента. Вероятность, что медианным будет элемент с индексом k равняется c(k - 1, sqrt(n) / 2) * c(n - k, sqrt(n) / 2) / c(n, sqrt(n)), то есть количество выбрать половину слева, умноженное на количество способов выбрать половину справа, поделить на количество способов выбрать sqrt(n) из n всего. Тут уже можно выписать явную формулу и честно предъявить, что монотонно растёт с приближением к середине, значит вероятность медиане загреметь в первую или последнюю четверть ниже 1 / 2.
  89.  
  90. \item Даны $n$ строк суммарной длины $L$. Чему будет равно математическое ожидание времени работы алгоритма быстрой сортировки, при условии что лексикографическое сравнение двух строк выполняется наивно?
  91. % L log n, потому что на каждом шаге каждый элемент только один раз будет сравниваться с барьерным, то есть суммарное время работы на одном уровне рекурсии не превосходит L.
  92.  
  93. \item Инверсией называется пара $(i, j)$, такая что $i < j$ и $a_i > a_j$. Обсудите как модифицировать алгоритм сортировки слиянием, чтобы параллельно вычислять число инверсий.
  94. % При слиянии двух списков, когда берём минимальный элемент из правого списка, прибавляем к числу инверсий текущий размер левого списка.
  95.  
  96. \pagebreak
  97.  
  98. \item Супер-инверсией называется тройка $(i, j, k)$, такая что $i < j < k$ и $a_i > a_j > a_k$. Предложите алгоритм подсчёта количества супер-инверсий за время $O(n \log n)$, основанный на сортировке слиянием. Как обобщить алгоритм на поиск $k$-инверсий, то есть наборов $i_1 < i_2 < \ldots < l_k$, что $a_{i_1} > a_{i_2} > \ldots > a_{i_k}$.
  99. % Заметим, что в алгоритме сортировки слиянием мы могли не просто считать число инверсий, но и для любого элемента хранить, для какого количества инверсий он является правым концом. Вычислим это первой итерацией.
  100. % Теперь делаем вторую итерацию, но когда в слиянии раньше происходило прибавление размера левого списка, теперь происходит прибавление суммы вычисленной ранее функции количества обычных инверсий по всему левому списку.
  101.  
  102. \item Пусть некоторый алгоритм выбирает случайную пару элементов $(i, j)$ и меняет их местами, если они нарушают условие упорядоченности. Покажите, что математическое ожидание количества действий данного алгоритма:
  103. \begin{enumerate}
  104. \item $O(n^4)$;
  105. \item $O(n^2 \log n)$;
  106. \end{enumerate}
  107. % Пусть в массиве сейчас x инверсий, тогда мы ткнёмся в неправильную пару с вероятностью не менее x / n^2. Тогда ожидаемое количество действий до уменьшения инверсии не более n^2. Поскольку инверсий не более n^2, получаем n^2 * n^2 = n^4
  108. % Однако, на самом деле это оценка сильно сверху. Нам требуется просуммировать n^2 / i по всем i от 1 до n^2, это будет n^2 log n.
  109. % Мб и эту оценку можно улучшить, потому что мы можем убивать больше одной инверсии за раз. Но я не знаю как там что-то доказать.
  110.  
  111. \item Докажите, что поиск элемента в отсортированном массиве, использующий лишь операции сравнения, в худшем случае работает не быстрее, чем за $O(\log~n)$.
  112. % Рассмотрим дерево работы программы в зависимости от сравнений. У дерева должно быть хотя бы n листьев, значит его глубина состваляет хотя бы log n
  113.  
  114.  
  115. \end{enumerate}
  116.  
  117.  
  118. \end{document}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement