- •Оглавление
- •Алгоритмы на перестановках
- •Введение
- •Перестановки. Произведение перестановок
- •Обратные перестановки. Алгоритмы
- •Рекурсия
- •Информационные структуры
- •Последовательное и связанное распределение данных
- •Стеки и очереди
- •Организация связанного распределения на основе стеков и очередей
- •Деревья
- •Представление деревьев
- •Прохождение деревьев, леса
- •Алгоритмы на графах
- •Графы. Представления графов. Связность и расстояние
- •Остовные деревья
- •Поиск по графу в глубину. Топологическая сортировка
- •Топологическая сортировка
- •Транзитивное замыкание. Поиск кратчайшего пути на графе
- •Поиск кратчайшего пути
- •4. Генерирование случайных последовательностей
- •4.1. Генерирование равномерно распределенных случайных чисел
- •Джон фон Нейман
- •4.2. Основные критерии проверки случайных наблюдений
- •4.3. Эмпирические критерии
- •Критерий равномерности (критерий частот)
- •Критерий серий
- •Критерий интервалов
- •Покер-критерий (критерий разбиений)
- •4.4. Численные распределения
- •Случайный выбор из ограниченного множества
- •Общие методы для непрерывных распределений
- •Нормальное распределение
- •Показательное распределение
- •4.5. Что такое случайная последовательность
- •Процедура получения простейшего генератора случайных чисел
- •Литература
Министерство образования и науки РФ Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования Самарский государственный архитектурно-строительный университет Факультет информационных систем и технологий Кафедра прикладной математики и вычислительной техники
|
ИНФОРМАЦИОННЫЕ ТЕХНОЛОГИИ. Часть 2. |
Курс лекций для студентов специальности 230400 – «Информационные системы и технологии» |
|
Прохорова О.В. |
01.01.2013 |
Рассматриваются общие требования к методологии и проектированию ПО. Приводятся основные положения алгоритмизации на примерах работы с перестановками. Разбираются аспекты применения рекурсии. Изучаются основные информационные структуры ПО. Разбираются алгоритмы и программы генерирования случайных последовательностей. Приводятся примеры конструирования программ на языке С++. |
Оглавление
1. Алгоритмы на перестановках 3
2. Информационные структуры 14
3. Алгоритмы на графах 35
Литература 66
Алгоритмы на перестановках
Введение
Понятие алгоритма является основным для всей области компьютерного программирования. Истоки понятия «алгоритм» ассоциируются с процессом нахождения наибольшего общего делителя двух чисел [3].
Алгоритм Евклида (Е). Даны два целых положительных числа m и n. Требуется найти их наибольший делитель, т.е. наибольшее целое число, которое нацело делит оба числа m и n.
Е1. [Нахождение остатка]. Разделим m на n и, пусть остаток от деления будет равен
r (где 0 r < n).
E2. [Сравнение с нулем]. Если r = 0, то выполнение алгоритма прекращается: n —
искомое значение.
Е3. [Замещение]. Присвоить m n, n r и вернуться к шагу Е1.
Каждый шаг любого алгоритма начинается заключенной в квадратные скобки фразой, которая как можно более кратко выражает содержание
данного шага. Обычно эта фраза отображается в сопровождающей алгоритм блок-схеме, как показано на рисунке.
В алгоритмах “” обозначает операцию замещения, например, n n+1 (n+1 n противоречит стандартным соглашениям).
Современное значение слова алгоритм во многом аналогично таким понятиям, как рецепт, процесс, метод, способ, процедура, программа, но все-таки слово алгоритм имеет дополнительный смысловой оттенок.
Алгоритм — это не просто набор конечного числа правил, задающих последовательность выполнения операций для решения задачи. Помимо этого, он имеет 5 важных особенностей:
конечность. Алгоритм всегда должен заканчиваться после выполнения конечного числа шагов;
определенность. Каждый шаг алгоритма должен быть определен;
ввод. Алгоритм имеет некоторое (возможно, равное нулю) число входных данных, т.е. величин, которые задаются до начала его работы или определяются динамически во время его работы;
вывод. У алгоритма есть одно или несколько выходных данных, т.е. величин, имеющих вполне определенную связь с входными данными.
эффективность. Алгоритм обычно считается эффективным, если все его операторы достаточно просты для того, чтобы их можно было точно выполнить в течение конечного промежутка времени.
В дальнейшем перейдем к рассмотрению принципов, методов и алгоритмов, используемых при программировании.
Перестановки. Произведение перестановок
Перестановкой n объектов называется способ последовательного расположения n различных объектов с учетом порядка [1].
Например, для трех объектов {a, b, c} существует шесть перестановок
abc, acb, bac, bca, cab, cba. (1.1)
Свойства перестановок играют важную роль в анализе алгоритмов.
Поставим задачу сосчитать перестановки для n объектов. Существует n способов выбора крайнего объекта слева (первого); после того как этот выбор сделан, существует n-1 способ выбора следующего за ним объекта. Таким образом, получаем общее число перестановок равное n (n – 1) … (1).
Обозначим через количество способов выбораk объектов из n с учетом порядка.
Для прикладных целей важное значение имеет процесс построения всех перестановок из n объектов методом индукции в предположении, что все перестановки из n-1 объектов уже построены. Перепишем (1.1), заменив буквы {a, b, c} цифрами {1, 2, 3}, тогда получим следующие перестановки: 123, 132, 213, 231, 312, 321.
Зададим вопрос, как с использованием этого набора получить все возможные перестановки из четырех цифр {1, 2, 3, 4} и т.д.
Метод. Для каждой перестановки a1 a2 … an-1 из {1, 2, … n-1} объектов построим еще n перестановок, помещая число n на всевозможные места, в результате получим:
n a1 a2 … an-1 ; a1 n a2 … an-1 ; … a1 a2 … n an-1 ; a1 a2 … an-1 n
Например, для перестановки 231 получим 4231 2431 2341 2314 и т.д.
Очевидно, этот метод дает все возможные перестановки из n объектов, причем ни одна из них не повторяется. Отметим, что Pn = = n (n – 1) … (1) является очень важной математической величиной, ее называют n-факториалом и записывают
n! = 1 2 … n = .
Отметим важные свойства факториала 0! = 1; n! = (n – 1)! n.
В дальнейшем нам понадобится формула определения . Приведем ее известный вид:
.
Обычно перестановку рассматривают как расположение объектов в ряд. Но возможен и другой способ. Перестановку можно рассматривать как переупорядочение или переименование объектов. При такой интерпретации обычно используют двух строчную запись, например:
(1.2)
С точки зрения переупорядочения это означает, что объект с переходит на место, которое ранее занимал объект а. А если это рассматривать как переименование, то можно считать, что объект а переименован в с. При использовании двух строчной записи изменение порядка столбцов в перестановке никакой роли не играет. Например, перестановку (1.2) можно записать в виде
,
а также еще 718 способами [1].
В связи с описанной интерпретацией часто используют циклическую запись. Перестановку (1.2) можно записать в виде
(a c f) (b d) (1.3)
Запись перестановки в виде цикла не является единственной. Например, записи
(b d) (a c f) ; (c f a)(b d) ; (d b) (f a c)
эквивалентны (1.3), а перестановка (a f c) (b d) им не эквивалентна.
В программировании эти понятия применяются каждый раз, когда некоторый набор из n объектов нужно расположить в другом порядке. Чтобы переупорядочить объекты, не перемещая их в какое-либо другое место, необходимо придерживаться циклической структуры.
Например, чтобы переупорядочить (1.2), т.е. присвоить
(a, b, c, d, e, f) (c, d, f, b, e, a),
будем следовать циклической структуре (1.3) и последовательно присваивать t a, a c, c f, f t, t b, b d, d t . То есть (c f a) (d b)
Замечание. Любое подобное преобразование характерно только для непересекающихся циклов.
Две перестановки можно перемножить в том смысле, что их произведение означает применение одной перестановки вслед за другой, например,
(1.4)
Замечание. Произведение перестановок не обладает свойством коммутативности, т.е. , гдеи— перестановки.
Пользуясь циклической записью, запишем равенство (1.4) следующим образом:
(a c f) (b d)* (a b d) (e f) = (a c e f b) (1.5)
Рассмотрим следующий подход к перемножению перестановок, представленных в виде циклов.
Например, вычисляя произведение перестановок
(a c f g) (b c d) (a e d) (f a d e) (b g f a e) (1.6)
находим (двигаясь слева направо), что a переходит в с, d c, a d, d a и d остается без изменений. Т.о. конечным результатом первого прохода формулы (1.6) является то, что d a и мы запишем “( a d” в качестве частичного ответа. Теперь выясним, что происходит с d: b d, g b. Следовательно, имеем частичный результат “( a d g”.
Рассмотрев, что происходит с g, находим, что a f e a g, т.о. первый цикл заканчивается: “(a d g)”.
Теперь выберем новый элемент, который еще не встречался, например, с. Находим, что e c … и т.д.
Окончательный ответ: (a d g) (c e b).