- •Понятие алгоритма и его свойства
- •Оценка порядка (временная оценка)
- •Общий случай определения сложности
- •Виды функций оценки сложности алгоритмов
- •Экспериментальный метод оценки трудоемкости (сложности) алгоритма
- •Оценка пространственной (емкостной) сложности
- •Классификация структур данных
- •Линейные структуры данных
- •Сетевые структуры данных
- •Табличные структуры данных
- •Иерархические структуры данных
- •Сложность типовых операций при работе с линейными структурами данных
- •Представление данных в памяти эвм
- •Базовые алгоритмы обработки данных
- •1. Алгоритмы поиска
- •1.1. Алгоритм линейного поиска
- •1.2. Алгоритм дихотомического поиска
- •3. Алгоритмы сортировки
- •3.1. Основные определения и классы алгоритмов
- •Классификация алгоритмов сортировки
- •Наиболее распространенные простые алгоритмы внутренней сортировки (массивов)
- •Сортировка вставками
- •Сортировка выбором
- •3.2.3. Сортировка обменом (Пузырьковая сортировка)
- •3.2.4.Сортировка Шейкером
- •Эффективные методы внутренней сортировки
- •Сортировка Шелла
- •3.3.2. Быстрая сортировка
- •Алгоритмы внешней сортировки
- •Простая сортировка слиянием
- •Сортировка с помощью естественных слияний
- •3.4.3. Сортировка Боуза - Нельсона
Сложность типовых операций при работе с линейными структурами данных
Структуры данных оказывают существенное влияние на методы решения задач и сложность типовых алгоритмов. Можно привести оценки сложности основных операций с линейными структурами данных, таких как добавление, удаление и поиск элемента по индексу или ключу. Элементарными операциями, в данном случае, являются операции сравнения, перебора, вычисления адреса или перестановки элементов набора структуры данных. В сводной таблице, помимо верхней оценки сложности, также приведены соответствующие перечисленным структурам данных компоненты библиотеки BCL. Таким образом, основные линейные структуры данных уже есть в готовом виде и доступны всем разработчикам программного обеспечения на платформе Microsoft .NET Framework.
Структура |
Вставка |
Удаление |
Поиск |
Компонент BCL |
Массив |
- |
- |
O(1) |
Базовый тип Array |
Список |
O(N) |
O(N) |
O(N) |
List<T> |
Связанный список |
O(1) |
O(1) |
O(N) |
LinkedList<T> |
Стек |
O(1) (добавление в конец) |
O(1) (удаление последнего) |
O(N) |
Stack<T> |
Очередь |
O(1) (добавление в конец) |
O(1) (удаление первого) |
O(N) |
Queue<T> |
Хэш-таблица |
O(1) |
O(1) |
O(1) |
Dictionary<TKey, TValue |
Представление данных в памяти эвм
Данные хранятся в памяти компьютера. При этом различают логическую (в программе) и физическую (в памяти) структуры данных. Эффективность алгоритмов зависит от того, насколько согласованы обе эти структуры.
Память современных ЭВМ имеет линейную организацию. Она представляет собой последовательность ячеек (строк). Наименьшей адресуемой единицей является байт. Данные имеют размер, равный 1 или нескольким байтам. Память для них выделяется компилятором.
Так для простых (скалярных) типов данных в разных компьютерах и языках программирования используются следующие объемы памяти.
Булевский тип – 1 байт (причем для задания значений «истина» или «ложь» достаточно 1 бита, оно берется из младшего разряда байта);
Символьный – 1 байт ( в java – 2 байта);
Целочисленный – 2 или 4 байта;
Вещественный – 4 или 8 байт;
Строковый – до 256 байт.
Сложные типы могут размещаться в смежных ячейках памяти или произвольно.
Например массивы, как уже отмечалось, располагаются в последовательных ячейках. Для нахождения физического адреса любого элемента используется адрес начального элемента и смещение (индекс).
Имя
Адрес (элемент(index)) = Начало + размер_ячейки * index.
Такой подход облегчает работу с массивом. Его элементы могут обрабатываться последовательно или в любом порядке.
Линейные списки обычно располагаются в памяти последовательно (как массивы). Этот порядок часто нарушается при выполнении операций вставок и удалений.
Связные списки требуют дополнительного объема памяти для размещения таблицы связей. В них более просто реализуются операции вставки и удаления элементов.
Деревья представляют собой связные списки соответствующей структуры. Они хранятся аналогично.
Графы и таблицы принято представлять таблицами связности, смежности и др., т.е. двумерными массивами.
Файлы обычно описываются файловой переменной некоторого типа. Его элементы располагаются последовательно, как правило, на внешних запоминающих устройствах.
Важной особенностью рассматриваемых структур является то, что память для скалярных переменных, массивов и файловой переменной выделяется до выполнения программы на все время ее работы. Такой способ называют статическим. Для списков и деревьев память выделяется непосредственно во время выполнения программы. Такой способ называют динамическим.
Наиболее простой и естественный способ обработки данных всех типов – последовательный. Массивы, таблицы и файлы могут также обрабатываться в любом (произвольном) порядке. Для списков используется только последовательный доступ. При этом добавление и удаление элементов возможно в любом месте списка.
