- Главная
- Информатика
- Алгоритмы и структуры данных. Лекция 2
Содержание
- 2. Теоретические сведения Сортировка - это процесс расстановки элементов в некотором порядке. Сортировка двух записей состоит из
- 3. Сортировка с помощью прямого обмена Сортировка с помощью прямого обмена (сортировка стандартным обменом, сортировка методом пузырька)
- 4. Сортировка с помощью прямого обмена Анализ В приведенном выше алгоритме переменные имеют следующие назначения: t -
- 5. Сортировка с помощью прямого выбора Сортировка с помощью прямого выбора включает в себя следующие шаги. 1.
- 6. Сортировка с помощью прямого выбора В приведенном выше алгоритме переменные имеют следующие назначения: j - определяет
- 7. Сортировка с помощью прямого включения Сортировка с помощью прямого включения (сортировка вставками) основана на последовательной вставке
- 8. Сортировка с помощью прямого включения Алгоритм сортировки прямым включением состоит из следующих шагов. 1. i=2. 2.
- 9. Сортировка с помощью прямого включения Число сравнений: минимальное - (n – 1) среднее - (n2 +
- 10. Быстрая сортировка Если количество элементов в массиве не многим меньше максимального их значения, то в данном
- 11. Быстрая сортировка Алгоритм реализуется при помощи рекурсивных вызов, поэтому зададим процедуру Сортировка(iLo, iHi). Она реализует следующие
- 12. Сортировка Шелла Сортировка вставками не относится к категории быстродействующих, поскольку единственный вид операции обмена, который она
- 13. Сортировка Шелла Последовательность шагов 1 4 13 40 121 364 093 3280 9841 ... . Она
- 14. Сортировка Шелла Свойство 1. Сортировка методом Шелла выполняет менее N(h — l)(k — l)/g операций сравнения
- 15. Сортировка Шелла Свойство 4. Сортировка методом Шелла выполняет менее 0(N( logN)2) операций сравнения для последовательности шагов
- 16. Эмпирические исследования последовательностей шагов сортировки методом Шелла Сортировка методом Шелла выполняется в несколько раз быстрее по
- 17. Рост функций Для большинства алгоритмов главным параметром (primary parameter) является N, который оказывает существенное влияние на
- 18. Рост функций log N Когда время выполнения программы описывается логарифмической (logarithmic) зависимостью, программа немного утрачивает быстродействие
- 19. Рост функций N 2 Когда время выполнения алгоритма является квадратичным (quadratic), он полезен для практического использования
- 20. Рост функций Время выполнения конкретной программы, скорее всего, будет некоторой константой, умноженной на одно из перечисленных
- 21. Рост функций секунды 102 1,7 минуты 104 2,8 часа 105 1,1 дня 106 1,6 недели 107
- 22. Рост функций В этой таблице сравниваются значения, принимаемые рядом функций, с которыми нам придется часто сталкиваться
- 23. Рост функций При анализе алгоритмов можно воспользоваться еще несколькими функциями. Например, алгоритм с N2 входными данными,
- 25. Скачать презентацию
Теоретические сведения
Сортировка - это процесс расстановки элементов в некотором порядке. Сортировка
Теоретические сведения
Сортировка - это процесс расстановки элементов в некотором порядке. Сортировка
Методы сортировки делятся на внутренние и внешние.
Внутренние методы предполагают, что сортируемые данные целиком располагаются в оперативной памяти.
Внешние методы используются для сортировки файлов данных, которые слишком велики, чтобы полностью поместиться в оперативной памяти.
Сортировка с помощью прямого обмена
Сортировка с помощью прямого обмена (сортировка стандартным
Сортировка с помощью прямого обмена
Сортировка с помощью прямого обмена (сортировка стандартным
Алгоритм сортировки прямым обменом состоит из следующих шагов.
1. t='Истина'; j=n-1.
2. Если t - 'Ложь', то 'Массив отсортирован'. Закончить.
3. t='Ложь'.
4. i=1.
5. Если s[i]>s[i+1], то t='Истина' и поменять местами s[i] и s[i+1]
6. i=i+1.
7. Если i<=j, то на шаг 5.
8. j=j-1. На шаг 2.
Сортировка с помощью прямого обмена
Анализ
В приведенном выше алгоритме переменные имеют
Сортировка с помощью прямого обмена
Анализ
В приведенном выше алгоритме переменные имеют
t - признак отсортированности массива (признак окончания сортировки);
j - определяет количество (j+1) сортируемых в данном проходе элементов;
i - определяет сравниваемые элементы (s[i] и s[i+1]).
Рассматриваемый алгоритм отличается от большинства алгоритмов сортировки тем, что он "замечает" отсортированность массива. Для этого используется логическая переменная (в рассмотренном алгоритме - переменная t), которая принимает значение "Истина", если при очередном проходе была хотя бы одна перестановка. Если же перестановок не было, то массив уже отсортирован, и переменная t будет иметь значение "Ложь".
Число сравнений:
минимальное - (n-1),
среднее - ((n2)/2) - (3n/4),
максимальное - n*(n-1)/2.
Число обменов:
минимальное - 0,
среднее - (n2/4),
максимальное - (n2/2).
Следовательно, алгоритм сортировки методом прямого обмена имеет сложность O(n2).
Сортировка с помощью прямого выбора
Сортировка с помощью прямого выбора включает в
Сортировка с помощью прямого выбора
Сортировка с помощью прямого выбора включает в
1. Среди элементов массива S[1], ..., S[n] выбрать элемент с наибольшим значением.
2. Найденный элемент поменять местами с элементом S[n].
3. Выполнить шаги 1 и 2 для оставшихся n-1 элементов, n-2 элементов и т.д. до тех пор, пока не останется один, самый маленький элемент.
Алгоритм сортировки прямым выбором состоит из следующих шагов.
1. j=n.
2. M=S[1]; k=1; i=2.
3. Если M
5. Если i<=j, то на шаг 3.
6. Иначе, поменять местами S[i] и S[k].
7. j=j-1.
8. Если j>1, то на шаг 2.
9. Иначе, "Массив отсортирован".
Сортировка с помощью прямого выбора
В приведенном выше алгоритме переменные имеют
Сортировка с помощью прямого выбора
В приведенном выше алгоритме переменные имеют
j - определяет количество сортируемых в данном проходе элементов;
M - максимальный элемент;
k - индекс максимального элемента.
Число сравнений:
среднее - (n2 - n)/2
Число обменов:
минимальное – 3*(n - 1)
среднее – (n - 1)
максимальное – n2/4+3*(n – 1)
Анализ
Алгоритм сортировки прямым выбором "не замечает" отсортированности массива. Поэтому количество просмотров всегда постоянно и равно (n - 1). Если сравнивать быстродействие алгоритмов прямого обмена и прямого выбора, то последний в среднем работает быстрее. Это объясняется тем, что количество сравнений в обоих алгоритмах одинаково. Среднее количество перестановок в алгоритме прямого обмена - (n2)/4. Количество перестановок в алгоритме прямого выбора равно (n - 1), что значительно меньше. Алгоритм сортировки методом прямого выбора имеет сложность O(n2).
Сортировка с помощью прямого включения
Сортировка с помощью прямого включения (сортировка
Сортировка с помощью прямого включения
Сортировка с помощью прямого включения (сортировка
Сортировка с помощью прямого включения
Алгоритм сортировки прямым включением состоит из
Сортировка с помощью прямого включения
Алгоритм сортировки прямым включением состоит из
1. i=2.
2. S[0]=S[i].
3. j=i-1.
4. Если S[0]>=S[j], то на шаг 7.
5. S[j+1]=S[j].
6. j=j-1. На шаг 4.
7. S[j+1]=S[0].
8. i=i+1. Если i<=n, то на шаг 2.
9. Иначе, "Массив отсортирован".
В приведенном выше алгоритме переменные имеют следующие назначения:
S[i] - вставляемый элемент;
S[0] - "барьер".
Сортировка с помощью прямого включения
Число сравнений:
минимальное - (n –
Сортировка с помощью прямого включения
Число сравнений:
минимальное - (n –
среднее - (n2 + n -2)/4
максимальное – (n2 +n -4)/4
Число обменов:
минимальное – 3*(n-1)
среднее – (n2 +9n - 10)/4
максимальное – (n2 +3n -4)/2
Анализ
Алгоритм сортировки прямым включением "не замечает" отсортированности массива. Поэтому количество просмотров всегда постоянно и равно (n - 1). Если сравнивать быстродействие алгоритмов прямого включения и прямого выбора, то первый в среднем работает быстрее. Это объясняется тем, что при примерно равном количестве перестановок количество сравнений в алгоритме сортировки прямым
включением в среднем в два раза меньше. Алгоритм сортировки методом прямого выбора имеет сложность O(n2).
Быстрая сортировка
Если количество элементов в массиве не многим меньше
Быстрая сортировка
Если количество элементов в массиве не многим меньше
Быстрая сортировка
Алгоритм реализуется при помощи рекурсивных вызов, поэтому
зададим
Быстрая сортировка
Алгоритм реализуется при помощи рекурсивных вызов, поэтому
зададим
Она реализует следующие шаги:
1. Lo=iLo, Hi=iHi, Mid=A[(Lo+Hi) div 2];
2. Если A[Lo] < Mid, то Lo=Lo+1, на шаг 2
3. Если A[Hi] > Mid, то Hi=Hi-1, на шаг 3
4. Если Lo > Hi, на шаг 8
5. Поменять местами A[Lo] и A[Hi]
6. Lo=Lo+1, Hi=Hi-1
7. Если Lo <= Hi, на шаг 3
8. Если Hi > iLo, Вывов Сортировка(A,iLo,Hi)
9. Если Lo < iHi, Вывов Сортировка(A,Lo,iHi)
10. Возврат (на предыдущий уровень рекурсии)
Анализ
Данный алгоритм является наиболее быстрым из известных и имеет несколько модификаций. Однако средняя скорость его работы определяется выражением O(N * lgN).
Сортировка Шелла
Сортировка вставками не относится к категории быстродействующих, поскольку единственный
Сортировка Шелла
Сортировка вставками не относится к категории быстродействующих, поскольку единственный
Возникает вопрос: какую последовательность шагов следует использовать? В общем случае на этот вопрос трудно найти правильный ответ. В литературе опубликованы результаты исследований различных последовательностей шагов; некоторые из них хорошо зарекомендовали себя на практике, однако наилучшую последовательность, по-видимому, отыскать не удалось. В общем случае на практике используются убывающие последовательности шагов, близкие к геометрической прогрессии в результате чего число шагов находится в логарифмической зависимости от размеров файлов. Например, если размер следующего шага равен примерно половине предыдущего, то для сортировки файла, состоящего из 1 миллиона элементов, потребуется примерно 20 шагов, если же такое соотношение примерно равно одной четвертой, то достаточно будет 10 шагов. Использование как можно меньшего числа шагов — это весьма важное требование.
Практический результат от обнаружения хорошей последовательности шагов, по-видимому, ограничен повышением быстродействия алгоритма на 25%, в то время сама проблема представляет собой довольно таки увлекательную головоломку
Сортировка Шелла
Последовательность шагов 1 4 13 40 121 364 093 3280
Сортировка Шелла
Последовательность шагов 1 4 13 40 121 364 093 3280
Она просто вычисляется (начав с 1, получить значение следующего шага, множив предыдущее значение на 3 и добавив 1) и обеспечивает реализацию сравнительно эффективной сортировки даже в случае относительно больших файлов.
Многие другие последовательности шагов позволяет получить еще более эффективную сортировку, однако довольно трудно превзойти эффективность более чем на 20% даже в случае сравнительно больших значений N.
Одной из таких последовательностей является 1 8 23 77 281 1073 193 16577 ..., т.е. последовательность 4i+1 +3*2i+ для i > 0. Можно доказать, что приведенная последовательность обеспечивает повышенное быстродействие для самых трудных случаев сортировки.
С другой стороны, существуют и плохие последовательности шагов: например,
1 2 4 8 16 32 64 128 256 512 1024 2048 ...
(первая последовательность шагов, предложенная Шеллом еще в 1959 г. скорее всего, служит причиной низкой эффективности сортировки, поскольку элементы на нечетных позициях не сравниваются с элементами на четных позициях вплоть до последнего прохода.
Этот эффект заметен на файлах с произвольной организацией, и он становится катастрофическим в наихудших случаях: эффективность метода резко снижается и время выполнения сортировки становится пропорциональным квадрату N, если, например, половина элементов файла с меньшими значениями находится в четных позициях, а другая половина элементов (с большими значениями) — в нечетных позициях
Сортировка Шелла
Свойство 1. Сортировка методом Шелла выполняет менее N(h — l)(k
Сортировка Шелла
Свойство 1. Сортировка методом Шелла выполняет менее N(h — l)(k
Свойство 2. Сортировка методом Шелла выполняет менее О (N 3/2) операций сравнения для последовательности шагов 1 4 13 40 121 364 1093 3280 9841...
Для больших шагов, когда имеются h подфайлов размером N/h, в наихудшем случае расходы составляют примерно N2/h. При малых шагах из свойства 1 следует, что стоимость составляет приблизительно Nh. Все зависит от того, насколько успешно удается вписаться в эти границы на каждом шаге. Это справедливо для каждой относительно простой последовательности, возрастающей экспоненциально.
Свойство 3. Сортировка методом Шелла выполняет менее О (N 4/3) операций сравнения для последовательности шагов 1 8 23 77 281 1073 4193 16577...
Последовательности шагов, которые рассматривались до сих пор, эффективны в силу того, что следующие один за другим элементы последовательности взаимно просты. Другое семейство последовательностей шагов эффективно именно благодаря тому, что такие элементы не являются взаимно простыми.
Сортировка Шелла
Свойство 4. Сортировка методом Шелла выполняет менее 0(N( logN)2) операций
Сортировка Шелла
Свойство 4. Сортировка методом Шелла выполняет менее 0(N( logN)2) операций
Рассмотрим треугольник, составленный из шагов, в котором каждое число в два раза больше, чем число выше и правее, и в три раза больше, чем число выше и, если мы используем эти числа снизу вверх и справа налево как последовательность шагов в рамках сортировки методом Шелла, то каждому шагу х в нижнем ряду предшествуют значения 2х и Зх, так что каждый подфайл оказывается 2-упорядочен и 3-упорядочен, при этом ни один элемент не передвигается больше, чем на одну позицию в процессе всей сортировки!
Число шагов из треугольника, которое меньше N по величине, и подавно будет меньше (Log2 N)2
Эмпирические исследования последовательностей
шагов сортировки методом Шелла
Сортировка методом Шелла выполняется в
Эмпирические исследования последовательностей
шагов сортировки методом Шелла
Сортировка методом Шелла выполняется в
Рост функций
Для большинства алгоритмов главным параметром (primary parameter) является N, который
Рост функций
Для большинства алгоритмов главным параметром (primary parameter) является N, который
1 Большинство инструкций большинства программ выполняется один или максимум несколько раз. Если все инструкции программы обладают этим свойством, мы говорим, что время выполнения программы постоянно (constant).
Рост функций
log N Когда время выполнения программы описывается логарифмической (logarithmic) зависимостью,
Рост функций
log N Когда время выполнения программы описывается логарифмической (logarithmic) зависимостью,
когда N — тысяча, log N равно 3, если основание равно 10, либо примерно 10, если основание равно 2; когда N равно миллиону, значения log N всего лишь удвоится. При удвоении N значение logN возрастет на постоянную величину, а удваивается лишь, когда N увеличится до N2.
N Когда время выполнения программы линейно (linear), это обычно означает, что каждый элемент ввода подвергается небольшой обработке. Когда N равно миллиону, такого же порядка и время выполнения алгоритма. Когда N удваивается, то же происходит и со временем выполнения. Эта ситуация оптимальна для алгоритма, который должен обработать N вводов (или произвести N выводов).
NlogN Время выполнения, пропорциональное .N log N имеет место, когда алгоритм решает задачу, разбивая ее на подзадачи меньших размеров, решая их независимо и затем объединяя решения. Из-за отсутствия подходящего прилагательного ("линерифмический" "linerithmic") мы просто говорим, что время выполнения такого алгоритма равно N log N. Когда N равно 1 миллион, N log N возрастает примерно до 20 миллионов. Когда N удваивается, то время выполнения возрастает более чем вдвое (но не намного более).
Рост функций
N 2 Когда время выполнения алгоритма является квадратичным (quadratic), он
Рост функций
N 2 Когда время выполнения алгоритма является квадратичным (quadratic), он
N3 Аналогичный алгоритм, обрабатывающий элементы данных тройками (возможно, в цикле тройного уровня вложения), имеет кубическое (cubic) время выполнения и практически применим лишь для решения малых задач. Когда N равно 100, время выполнения равно 1 миллиону. Когда N удваивается, время выполнения увеличивается в восемь раз.
2N Лишь немногие алгоритмы с экспоненциальным (exponential) временем выполнения имеют практическое применение, хотя такие алгоритмы возникают естественным образом при попытках решения задачи "в лоб". Когда N равно 20, время выполнения равно 1 миллиону.
Когда N удваивается, время выполнения увеличивается в четыре раза!
Рост функций
Время выполнения конкретной программы, скорее всего, будет некоторой константой, умноженной
Рост функций
Время выполнения конкретной программы, скорее всего, будет некоторой константой, умноженной
В итоге, чтобы уменьшить общее время выполнения программы, мы минимизируем количество инструкций во внутреннем цикле. Каждую инструкцию, необходимо подвергнуть исследованию: нужна ли она вообще? Существует ли более эффективный способ выполнить ту же задачу? Некоторые программисты считают, что автоматические инструменты, содержащиеся в современных компиляторах, могут создавать наилучший машинный код; другие утверждают, что наилучшим способом является написание внутренних циклов вручную на машинном языке, или ассемблере. Как правило, мы будем воздерживаться от рассмотрения вопросов оптимизации на таком уровне, хотя время от времени будем указывать, сколько машинных инструкций требуется для выполнения определенных операций, чтобы показать, почему на практике одни алгоритмы могут оказаться быстрее других.
Рост функций
секунды
102 1,7 минуты
104 2,8 часа
105 1,1 дня
106 1,6 недели
107 3,8 месяца
108 3,1 года
109 3,1 десятилетия
1010 3,1 столетия
1011 никогда
Перевод секунд:
Рост функций
секунды
102 1,7 минуты
104 2,8 часа
105 1,1 дня
106 1,6 недели
107 3,8 месяца
108 3,1 года
109 3,1 десятилетия
1010 3,1 столетия
1011 никогда
Перевод секунд:
Для многих приложений нашим единственным шансом решить крупную задачу остается использование эффективного алгоритма. В этой таблице показано минимальное количество времени, необходимое для решения задач размером 1 миллион и 1 миллиард с использованием линейных алгоритмов, алгоритмов с зависимостью N log N и квадратичных алгоритмов на компьютерах с быстродействием 1 миллион, ! миллиард и 1 триллион операций в секунду. Быстрый алгоритм помогает существенно ускорить решение задачи на медленной машине, однако быстрая машина не сможет выручить, когда используется медленный алгоритм.
Рост функций
В этой таблице сравниваются значения, принимаемые рядом функций, с которыми
Рост функций
В этой таблице сравниваются значения, принимаемые рядом функций, с которыми
Рост функций
При анализе алгоритмов можно воспользоваться еще несколькими функциями. Например, алгоритм
Рост функций
При анализе алгоритмов можно воспользоваться еще несколькими функциями. Например, алгоритм
Логарифмическая функция играет особую роль при разработке и анализе алгоритмов, поэтому ее стоит рассмотреть подробнее. Поскольку нам часто приходится давать оценку аналитическим результатам, в которых опущен постоянный множитель, мы будем пользоваться записью "logN", опуская основание. Изменение основания логарифма с одной константы на другую меняет значение логарифма лишь на постоянный множитель, однако в определенных контекстах мы используем конкретные значения оснований логарифмов. В математике настолько важным является понятие натуральный логарифм (natural logarithm) с основанием е = 2.71828..., что широкое распространение получило следующее сокращение: log e N = In N. В вычислительной технике очень важен двоичный логарифм (binary logarithm) (т.е. по основанию 2), поэтому используется сокращение log 2 N = Ig N.
Иногда нам приходится вычислять логарифмы, особенно в отношении больших чисел. Например, lg lg 2256 = lg 256 = 8. Из этого примера должно быть понятно, что в большинстве практических случаев lg IgN рассматривается как константа, поскольку значение этого выражения достаточно мало даже для очень больших N.
.