Вы находитесь на странице: 1из 9

Лекций по программированию Гольдина Виктора Даниловича

Алгоритмы
1. Рекурсивные алгоритмы, рекурсивные функции.
2. Алгоритм поиска с возвратом
3. Работа с множеством данных, расположенных в одномерном массиве
Задача поиска элемента
Добавление поиска элемента к множеству
Удаление элемента из множества
4. Упорядочение данных в одномерном массиве – Сортировка
5. Хеширование – специальный алгоритм хранения множества элементов.

Эффективность и сложность алгоритмов.

1.Рекурсивные функции – способ реализации рекурсивных алгоритмов

Рекурсивные объект – объект, при определении которого есть ссылка на самого себя.
- фрактальные множества,
- кривая Пеано,
- ковер Серпинского.

Рекурсивные алгоритм – алгоритм, при детальной реализации которого используется


он сам с другим исходным данным
- Рекурсивное вычисление факториала
- Построение рекуррентной последовательности
- Функция Аккермана – для эффективность компилятора
- функция Маккарти (91) – вычисляется при больших данных
Рекурсивные алгоритмы можно реализовать с помощью рекурсивных функций

Рекурсивная функция – функция, которая из своего тела вызывает саму себя


- Прямая рекурсия
- Косвенная рекурсия

Действия компьютера при вызове рекурсивных функций ничем не отличается от


действий при вызове обычных функций.
Действия компьютера:
- поиск описания,
- выделение памяти под параметры (создание переменных),
- пересылка аргументов в параметры,
- переход на первый оператор внутри функции,
- выполнение операций внутри функции,
- при выполнении оператора return вычисляемое выражение передается в место
вызова,
- освобождение ранее выделенной памяти.

Выводы
- Каждый вызов функции приводит к созданию в оперативной памяти (в стеке
функции) нового экземпляра формальных параметров.
- У рекурсивного алгоритма должна быть нерекурсивная ветвь, иначе он никогда
на закончится
- Завершение работы на каком-то уровне рекурсии приводит к возврату на
предыдущий уровень с освобождением ранее выделенной памяти.
- Выполнение любой рекурсивной функции сводится к некоторому циклу
Глубина рекурсии – это максимальное число рекурсивных вызовов подпрограммы без
возвратов, которое происходит во время выполнения программы.

Правила конструктирования
1. В рекурсивной функций обязательно должна быить нерекурсивная ветвь.(if или
switch)
2. Необходимо доказать, что глубина рекурсии конечна.
3. Формальные параметры и локальные переменные не должны занимать много
места в оперативной памяти.

Рекурсивное решение задачи о Ханойске башня

1. Первоначально множество 𝐒 является пустым. Предварительное описание


алгоритма: 2. Пусть на некотором шаге алгоритма множество 𝐒 сформировано, но оно
еще не удовлетворяет условию задачи. 3. Рассматриваются всевозможные варианты
добавления к нему одного элемента (поиск). 4. После добавления элемента к 𝐒
проверяется условие 𝑳. Если оно выполнено, то задача решена, если же нет, то поиск
продолжается. 5. Если никакие продолжения не привели к решению, то добавленный в
п.4 элемент удаляется из 𝐒 (возврат). 6. Если при переборе всех вариантов не удалось
найти решения, то при данном 𝐒 решение не существует.

18.02.2022
Алгоритм поиска с возвратом file:///C:/Users/Daniel/Downloads/Search.pdf

1) Поиск пути в дорожной сети: что является результатом.


Метод пошаговой детализации
Задача разбивается на подзадачи: чтение исходных данных→ подготовка к
поиску пути → построение пути →вывод результатов
Решение каждой задачи удобно оформить в виде функции
В языке C каждая функция – это объект, изолированный от других частей
программы.
В качестве глобальных переменных
#include istream //для работы с файлами (чтение исходных данных и запись
результатов)
// Описание глобальных переменных
// Исходные данные
//результаты
//функция чтения исходных данных
//функция вывода результатов
//функция построения пути
//головная функция
Построение пути: для решения используем алгоритм поиска с возвратом

Другие конкретные задачи, решаемые этим алгоритмом:


Коммутация пакетов. Построение маршрута передачи сообщений в Internet.
Задача поиска выхода из алгоритмов.
Множество шахматных задач:
обойти шахматную доску ходом коня;
Разбить множество положительных чисел на два множества, чтобы была минимальной
разность сумм из элементов.

Недостаток: алгоритм близок к полному перебору подмножеств.


Улучшение:
Теория графов

Матрица соединения

25.02.2022 file:///C:/Users/Daniel/Downloads/Lecture_3.pdf
Структурное программирование.
требование хорошего алгоритма:
1. Структурность
2. Легко читается человеком:
3. Легкость доказательство ее правильность
4. Легкая отладка
5. Хорошо документирован
Как сравнивать алгоритм → Ресурсорть соемкость
оперативная памяти~ количество перемен
время работы процессора ~количество операций
Пространственная сложность~ количество байтов
Временная сложность (время работы компьютера до достижения результата) ~
машинное время (секундов)
Определение. Пространственная сложность алгоритма – объём используемой
оперативной памяти. Пропорциональна количество используемых переменных
простого типа. Определение. Временна’я сложность алгоритма (сложность по
времени) – – время работы компьютера до достижения результата. Пропорционально
количеству элементарных операций процессора.

Надо использовать хорошие алгоритм и типа данных


Трехмерный массив
n – количество исходных данных
S(n) – сложность по памяти (пространство)
V(n) – сложность по времени (временная)

Какой сложность бывают алгоритмов


- логарифмическая
- линейная
- квадратная
- степенная
- полиномиальное
- экспоненциальность
- факториал (задача коммивояжера)
Задача коммивояжера. На множестве из 𝑛 пунктов имеется дорожная сеть, с
указанием расстояния между соседними пунктами этой сети. Требуется найти такой
путь обхода всех её пунктов, чтобы суммарное пройденное расстояние было
минимальным

Алгоритмы
Алгоритмы работа с множествами данных
задача:
1. Поиск
2. Добавление
3. Удаление элемента

S(n)~O(M)
V(n)~
теория вероятности чтобы определить лучший и худший случае
2. Задача вставка:
3. Удаление: дано x – типа T, удалить из массив A, а уменьшить n.

Лекция 04.03.2022
Двоичный (бинарный) поиск.

Задача поиска: Для значение X типа Т определть


Элементы с номерами из отрезка – множество
Докажем правильность этого алгоритма.
Сложность
Инвариантом цикла при бинарном поиске

Задача вставки:
Заданное значение x тима Т добавить в множества, Особенность этой – вставить x
нужно так, чтобы массив остался упорядоченным.

внешняя память
локальный память
ключ индекс

Алгоритмы сортировки (в оперативной памяти)


Переставить элементы так, чтобы они располагались в порядке возрастания по
некоторому ключу.
Алгоритмов отличается по времени зависит от начало размещения данных в массиве
1. Сортировка с помощью прямого включения (Сортировка
вставками~Insertion Sort )
На произвольном шаге этого алгоритма массив считается разбитым на 2
множества: упорядоченное множество элементов в начале массива и
неупорядоченное множество остальных элементов.

Оценка сложности.
В лучшем случае, когда A[k] больше всех предыдущих, цикл сразу завершится и будет
содержать только одну операцию сравнения.

В худшем случае, когда когда меньше всех предыдущих, цикл будет содержать 2k
операций.
Метод Шелла – улучшение метода прямого включения
являющийся усовершенствованным вариантом сортировки вставками.

При сортировке Шелла сначала сравниваются и сортируются между собой значения,


стоящие один от другого на некотором расстоянии d (о выборе значения d). После
этого процедура повторяется для некоторых меньших значений d, а завершается
сортировка Шелла упорядочиванием элементов при d=1.
2. Сортировка методом “прямого” выбора
Найти минимальный элемент массива и меняется с первым элементом
массива.
Найти минимальный элемент среди оставшихся
Преимущество: Меньше количество перемещения (по сравнению с
сортировкой вставками)
Недостаток – двойной цикл необходимо делать даже в том случае, когда массив
уже отсортирован.

1. Находится минимальный элемент в массиве – во множестве 𝐴 0 , 𝐴 1 , … , 𝐴[𝑛


− 1] ; и меняется местами с первым элементом массива 𝐴 0 .
2. Ищется минимальный элемент среди оставшихся 𝐴 1 , 𝐴 2 , … , 𝐴[𝑛 − 1] ; он
меняется местами с 𝐴 1 .
3. На произвольном шаге – минимальный элемент множества 𝐴 𝑗 , 𝐴 𝑗 + 1 , … ,
𝐴[𝑛 − 1] меняется с 𝐴 𝑗 .
4. Последний шаг – минимальный элемент из 𝐴 𝑛 − 2 , 𝐴[𝑛 − 1] меняется с 𝐴 𝑛 − 2
.

void selection_sort(type_arr *arr, int size)


{
for (int i = 0; i < size - 1; i++)
{
int min_index = i;
for (int j = i + 1; j < size; j++)
{
if (arr[j] < arr[min_index])
{
min_index = j;
}
}
if (min_index != i)
{
swap(arr[i], arr[min_index]);
}
}
}

void StraightSelection (T *A, int n){


T c; int k;
for (int i = 0; i < n-1; i++){
c = A[i]; k = i;
for (int j = i+1; i < n; j++)
if (A[j] < c) {
c = A[j]; k = j;}
A[k] = A[i]; A[i] = c;
}
}

Пирамидальная сортировка(Heapsort) – это усовершенствованный метод сортировка


выбором

𝑇(𝑛)~ 𝑛 2 log2 n

3. Сортировка с помощью прямого обмена (метод пузырька)


Метод основан на сравнении соседних элементов массив
Массив просматривается либо слева направо (от начального до последнего),
либо в обратном порядке.
Максимальный элемент занимает свое место, опускается вниз.
void BubbleSort (T *A, int n){
for (int k = n-1; k >0; k--)
for (int j = 1; j <= k; j++)
if (A[j-1] > A[j]){
T c = A[j];
A[j] = A[j-1]; A[j-1] = c; }
}

Оцениваем сложность;

Самый медленный метод сортировки!!!!


Как улучшить этот метод
Главный путь улучшения – уменьшить количество проходов.
Если массив уже упорядочен, то никаких проходов не требуется.

Шейкер-сортировки.

Кнут Д.

18.03.2022
Алгоритмы сортировки
4. Сортировка с помощью разделения (быстрая сортировка)
Разделения массива на 2 части:

Сложность алгоритма по времени: T(n) ~ n logn

5. Сортировка слиянием (разбиение сличением)


Объединения двух упорядоченных последовательностей (массивов) в одну
упорядоченную.
Сложность алгоритма T(n) n logn
Он легко обобщается на сортировку данных, расположенных во внешней
памяти.

25.03.2022
Хеш-функция представляет собой функцию, которая получает
строку(последовательность байтов) и возвращает число: отображает строки на числа.
Разным последовательностям байтов должны соответствовать разные числа.
Написать такую функцию почты невозможно.

В идеале каждое входное слово должно отображаться на свое число.

Хеш-функция неизменно связывает название с одним индексом.


В идеале хеш-функция должна распределять ключи равномерно по всему хешу.
Если связанные списки становятся слишком длинными, работа с хэш-таблицей сильно
замедляется.
Хорошая хеш-функция создает минимальное число коллизий.

О (1): Операции не выполняются мгновенно; просто время остается постоянным


независимо от размера хеш-таблицы.

Для предотвращения коллизий необходимы: низкий коэффициент заполнения ,


хорошая хеш-функция.

Какой бы язык программирования вы ни выбрали, в нем найдется готовая реализация


хеш-таблиц, не сомневаясь в том, что она имеет хорошую эффективность.

Хэширование основано на другой идее:


Место размещения элемента данных в массиве зависит от значения элемента.
Хеш – функция – отображение

2. Для ограниченного множество вещественных чисел.


3. Если Ω – множество строк
строку можно рассматривать как целое число в 256-
преобразование текста в числу.

Схема размещения данных в массиве:


Как пустое место в массиве
Оперативное памяти пустые п
На незанятые места нужно помещать какое-нибудь специальное значение free, не
принадлежащее Ω.
#define free 0;

Задачи с хэшированием
1. Задача поиска: для заданного , определить, есть ли в массиве.
Задача решается за 2 шага – время не зависит от количество хранящихся
данных : O(1).
floor – функция окружения внизу.
2. Задача вставки: заданное ч разместить в массиве.
Коллизия – ситуация когда двум ключам назначается один элемент массива.
при хэшировании коллизия нередка ситуация.
Алгоритм решающие коллизи
Решения коллизия (автоматическим способом):
Основные требования:
Главное преимущество хэширование – быстрый поиск. и небольшое число
шагов с константным временем.

Алгоритм квадратичных проб разрешения коллизий:

Вопрос – всегда ли найдется свободное место, нет ли зацикливания?


Ответ : только в случае, когда массив заполнен более, чем на половину.

Компилятор – это программа, которая переводит исходный код в компьютерный


язык. Также определяет и выделяет памяти для переменных.

Достоинство технологии хэширования – малое количество шагов при поиске и


вставке в случае удачной хэш функций и хорошем алгоритме разрешения
коллизий

Недостатки:
сложно хорошую хэш функции

функция которая ищет пути( 2 варианта)


сортировка с влиянием (сколько памяти требует)
5 методы сортировки(функция которая реализует эти действия)
Хеширование

Рекурсивные функции не будут


Перемножения матриц
матриц одного

Вам также может понравиться