- •1. Cтруктуры данных и алгоритмы
- •1.1. Понятие структур данных и алгоритмов
- •1.2. Информация и ее представление в памяти
- •1.3. Классификация структур данных
- •1.4. Операции над структурами данных
- •1.5. Структурность данных и технология программирования
- •2. Простые структуры данных
- •2.1. Числовые типы
- •2.1.1. Целые типы
- •2.1.2. Вещественные типы
- •1). Десятичное число 15.375;
- •2). Десятичное число -0.5;
- •3). Десятичное число -25.75;
- •4). Число 0.0;
- •5). Числа верхней и нижней границ положительного диапазона
- •2.1.3. Операции над числовыми типами
- •2.2. Битовые типы
- •2.3. Логический тип
- •2.4. Символьный тип
- •2.5. Перечислимый тип
- •2.6. Интервальный тип
- •2.7. Указатели
- •2.7.1. Физическая структура указателя
- •2.7.2. Представление указателей в языках программирования
- •2.7.3. Операции над указателями.
- •3. Статические структуры данных
- •3.1. Векторы
- •3.2. Массивы
- •3.2.1. Логическая структура
- •3.2.2. Физическая структура
- •3.2.3. Операции
- •3.3 Множества
- •3.3.1 Множества и математика
- •3.3.1.1 Способы задания множеств
- •3.3.1.2 Операции над множествами
- •3.3.1.3 Множественный тип и его свойства
- •3.3.1.4 Переменные и константы множественных типов
- •3.3.1.5. Выражения множественного типа
- •3.3.2. Представление множеств в памяти эвм
- •3.3.2.1. Числовые множества
- •3.3.2.2. Символьные множества
- •3.3.2.3. Множество из элементов перечислимого типа
- •3.3.2.4. Множество от интервального типа
- •3.3.2.5. Операции над множествами
- •3.4. Записи
- •3.4.1. Логическое и машинное представление записей
- •3.4.2. Операции над записями
- •3.5. Таблицы
- •3.6.2. О сложности алгоритмов
- •3.6.3. Сортировка подсчетом
- •3.6.4. Сортировка включением
- •3.6.4.1. Простое включение
- •3.6.4.2.Метод Шелла (модифицированный)
- •3.6.5. Сортировка извлечением
- •3.6.5.1.Простое извлечение
- •3.6.5.2.Древесная сортировка(модифицированный)
- •3.6.6. Сортировка обменами
- •3.6.6.1. Пузырьковая сортировка
- •3.6.6.2. Быстрая сортировка (Хоара) (модифицированный)
- •3.6.7. Сортировка слиянием
- •3.6.8. Сортировка распределением
- •3.6.8.1. Вырожденное распределение
- •3.6.8.2. Сортировка распределением
- •3.6.9. Сравнительный анализ
- •3.7. Операции логического уровня над статическими структурами. Поиск
- •3.7.1. Линейный (последовательный) поиск
- •3.7.2. Быстрый последовательный список
- •3.7.3. Дихотомический (бинарный) поиск
- •3.7.4. Интерполяционный поиск
3.6.2. О сложности алгоритмов
При рассмотрении методов будем оперировать понятиями временной T и пространственной O теоретической сложности (в дальнейшем будем опускать слово «теоретическая») алгоритма, поэтому вкратце упомянем, что это такое.
Сложность алгоритма - одночлен, отражающий порядок величины требуемого ресурса (времени/дополнительной памяти) в зависимости от размерности задачи.
Например, если число тактов (действий), необходимое для работы метода, выражается как 11*n2+19*n*log(n)+3*n+4, где n-размерность задачи, то мы имеем дело с алгоритмом со сложностью T(n2). Фактически, мы из всех слагаемых оставляем только слагаемое, вносящее наибольший вклад при больших n (в этом случае остальными слагаемыми можно пренебречь) и игнорируем коэффициент перед ним.
В большинстве случаев оказывается довольно трудно найти точную практическую сложность алгоритма (функцию от n, позволяющую точно определить требуемое время работы/объем памяти). Однако, теоретическую сложность найти можно и это достаточно просто.
Временная (пространственная) сложность не позволяет определить время (необходимый объем дополнительной памяти) работы алгоритма, но она позволяет оценить динамику роста времени (объема дополнительной памяти), необходимого для работы метода, при увеличении размерности задачи. Например, для алгоритма с временной сложностью T(n2) при достаточно больших n можно утверждать, что при увеличении размера задачи (при сортировке - размера массива) в 3 раза время работы алгоритма увеличится в 32=9 раз.
Если операция выполняется за фиксированное число шагов, не зависящее от размера задачи, то принято писать T(1).
Надо помнить, что перед одночленом, отражающим сложность, стоит некоторый коэффициент C. Поэтому алгоритмы с одинаковой сложностью могут сильно отличаться временем исполнения.
Практически время выполнения алгоритма зависит не только от объема множества данных (размера задачи), но и от их значений, например, время работы некоторых алгоритмов сортировки значительно сокращается, если первоначально данные частично упорядочены, тогда как другие методы оказываются нечувствительными к этому свойству. Чтобы учитывать этот факт, полностью сохраняя при этом возможность анализировать алгоритмы независимо от данных, различают:
- максимальную сложность или сложность наиболее неблагоприятного случая, когда метод работает дольше всего;
- среднюю сложность - сложность метода в среднем;
- минимальную сложность - сложность в наиболее благоприятном случае, когда метод справляется быстрее всего.
Алгоритмы, рассматриваемые в дальнейшем, имеют временные сложности T(n2), T(n*log(n)), T(n). Минимальная сложность всякого алгоритма сортировки не может быть меньше T(n). Максимальная сложность метода, оперирующего сравнениями, не может быть меньше T(n*log(n)). Доказательство последнего факта можно найти в многочисленной серьезной теоретической литературе, посвященной проблемам сортировки. Однако есть методы, которые не сравнивают элементы между собой. Мы рассмотрим один из них - сортировку распределением.
