03 - Линейные структуры данных.ppt
- Количество слайдов: 44
Алгоритмы и структуры данных. Линейные структуры данных
1. Типы данных Тип данных определяет: • Формат представления в памяти компьютера • Множество допустимых значений, которые может принимать принадлежащая к выбранному типу переменная или константа • Множество допустимых операций, применимых к этому типу.
1. Типы данных Существует несколько основных типов данных: • • • Встроенные типы данных, т. е. типы, предопределенные в языке программирования. . “Уточняемый тип данных" - существует возможность определения типа на основе встроенного типа данных, значения которого упорядочены. Перечисляемые типы данных - явно определяемые целые типы с конечным числом именованных значений. Конструируемые типы (иногда их называют составными). Указательные типы - дают возможность работы с типизированными множествами абстрактных адресов переменных, содержащих значения некоторого типа.
1. Типы данных Встроенные типы данных – Целочисленные типы – Логический тип – Символьный тип – Перечисляемый тип – Интервальный тип – Вещественный тип
1. Типы данных Конструируемые типы – Массив – Множество – Запись
Конструируемые типы - массив Массив - это фиксированное количество элементов данных, которые хранятся последовательно и доступны по индексу Пример: Type Arr 1 = array[1. . 100] of Real; Arr 2 = array[boolean, 1. . 10, Size] of Real; Arr 3 = array[1. . 10, 1. . 8] of Boolean;
Конструируемые типы - запись • Запись - это тип данных, позволяющий хранить вместе переменные, имеющие различные типы данных. • определения на языке Си: struct complex { float re; float im; }
Конструируемые типы - запись • определения на языке Си: struct complex { float re; float im; }
Конструируемые типы - множества • Множество - это набор элементов базового типа. • Переменная множественного типа может принимать как все значения множества, так и ни одного. Любой множественный тип может принимать значение [], которое называется пустым множеством.
Конструируемые типы - множества • Пример: type Digits = set of 0. . 9; Letters = set of 'A'. . 'Z';
Конструируемые типы - множества • Операции над множествами Опера ция Действие Результат + Объедине Порядковое значение c содержится в a+b только тогда, когда ние оно содержится в a или в b. - Разность * Порядковое значение c содержится в a-b только тогда, когда оно содержится в a и не содержится в b. Пересечен Порядковое значение c содержится в a*b только тогда, когда ие он содержится в обоих множествах a и b.
Указательные типы Понятие указателя является абстракцией понятия машинного адреса. Подобно тому, как зная машинный адрес можно обратиться к нужному элементу памяти, имея значение указателя, можно обратиться к соответствующей переменной.
Указательные типы При решении ряда задач иногда просто невозможно обойтись использованием памяти, выделяемой компилятором и системой поддержки времени выполнения в соответствии с явными описаниями переменных в программе. Почти во всех языках имеется возможность явно запрашивать и использовать области так называемой динамической памяти. Такие области принято называть "динамическими переменными". Динамическая переменная не имеет статически заданного имени, и доступ к такой переменной возможен только через указатель.
Указательные типы Используя структурные типы, указатели и динамические переменные, можно создавать разнообразные динамические структуры памяти - списки, деревья, графы и т. д.
2. Основные структуры данных. Структура данных (data structure) — это способ хранения и организации данных, облегчающий доступ к этим данным и их модификацию. Ни одна структура данных не является универсальной и не может подходить для всех целей, поэтому важно знать преимущества и ограничения, присущие некоторым из них.
2. 1 Массивы. . . Массив • • • Легок в использовании Прямой доступ Быстрый поиск Локальность Медленные вставки/удаления Не тратит дополнительной памяти
2. 1 Массивы. . . • Массив: 2 способа организации: – статический: • обычно быстро работает • обычно локально располагается в памяти • проблема – неиспользуемое пространство и ограничение по размеру на этапе компиляции – динамический: • обычно дольше работает • не всегда локально располагается в памяти • есть возможность выделения памяти по мере необходимости
2. 2 Списки. . . Список • • • Сложнее в использовании Доступ последовательный Медленный переборный поиск Быстрые вставки и удаления Тратит дополнительную память
2. 2 Списки. . . • Классификация 1: – линейные – иерархические (деревья) – сетевые (сети) Подвид: циклический. • Классификация 2: – односвязный – двухсвязный – многосвязный Подвид: с головой. • Классификация 3 (по способу реализации): – на массивах – на указателях (будем рассматривать этот вариант)
2. 2 Списки Классификация 1… Наиболее употребительны: • Линейные • Иерархические
2. 2 Списки Классификация 2 • Связность – количество отношений следования. • Смысл: – ссылки вперед/назад – для удобства навигации. – разный порядок по разным признакам! • Чем больше связность: – тем больше тратится памяти; – тем медленнее операции; – тем лучше навигация и шире функциональность.
2. 2 Списки Разновидности • Циклический: чтобы не обрабатывать отдельно конец списка. • С головой: заводится 1 -е фиктивное звено для представления списком пустых структур (пустая структура, равная «нулю» ) – тоже структура. • Часто циклический список с головой.
2. 3 Массивы и списки • Массивы и списки – структуры хранения • Основные операции со структурами хранения: – Поиск – Вставка – Удаление Операция Поиск Вставка Удаление Массив неупорядоченный Массив упорядоченный Список N/2 1 N/2+N/2 log. N + N/2 1 N/2
2. 4 Матрицы Введение • Храним двумерным массивом (хранится по строкам в C, по столбцам в Pascal и Fortran). • Особый случай – матрицы специального вида. • Зная вид матрицы, можно сэкономить память!
3. Абстрактные структуры данных • • • Стек Очередь Дек Ассоциативный массив Хеш-таблица
3. 1 Стек • Стек (Stack) - такой последовательный список с переменной длиной, включение и исключение элементов из которого выполняются только с одной стороны списка, называемого вершиной стека. • LIFO (Last - In - First- Out - "последним пришел - первым исключается")
3. 1 Стек • Примеры стека в жизни…
3. 1 Стек Основные операции: • Push • Pop
3. 2 Очередь • Очередь (Queue) - последовательный список с переменной длиной, в котором включение элементов выполняется только с одной стороны списка (эту сторону часто называют концом или хвостом очереди), а исключение - с другой стороны (называемой началом или головой очереди) • FIFO (First - In - First- Out - "первым пришел - первым исключается")
3. 2 Очередь
3. 3 Дек • Дек (Deque) - это такой последовательный список, в котором как включение, так и исключение элементов может осуществляться с любого из двух концов списка. Частный случай дека - дек с ограниченным входом и дек с ограниченным выходом.
3. 3 Дек Типовые операции: • Push. Back — добавление в конец очереди. • Push. Front — добавление в начало очереди. • Pop. Back — выборка с конца очереди. • Pop. Front — выборка с начала очереди. • Проверка наличия элементов. • Очистка.
3. 3 Дек
3. 4 Ассоциативный массив • Ассоциативный массив (словарь) — абстрактный тип данных (интерфейс к хранилищу данных), позволяющий хранить пары вида «(ключ, значение)» и поддерживающий операции добавления пары, а также поиска и удаления пары по ключу: • INSERT(ключ, значение) • FIND(ключ) • REMOVE(ключ)
3. 4 Ассоциативный массив
3. 5 Хеш-таблицы
4. Польская запись Обычные арифметические выражения называют инфиксными выражениями. Порядок выполнения действий в таких выражениях определяется старшинством опреаций и скобками. Вычисление и компиляция таких выражений подразумевает их предварительный анализ с целью выявления порядка выполнения операций. Существуют формы записи арифметических выражений без скобок, в которых порядок действий задается порядком знаков операций в выражении. Такие формы записи называются польской или бесскобочной записью. Вычисление и компиляция бесскобочных выражений оказывается проще, чем выражений со скобками, поскольку операции должны выполняться в порядке описания и предварительный анализ не требуется.
4. 1 Определение Префиксную польскую запись (Пр. ПЗ) определим так: 1) Если инфиксное выражение Е представляет собой один операнд а, то Пр. ПЗ выражение Е - это просто а. 2) Если инфиксное выражение Е 1*Е 2, где * - знак операции, а Е 1 и Е 2 инфиксные выражения для операндов, то Пр. ПЗ этого выражения - это *Е 1'E 2', где E 1', E 2' - Пр. ПЗ выражений Е 1 и Е 2. 3) Если (Е) есть инфиксное выражение, то Пр. ПЗ этого выражения есть Пр. ПЗ Е.
4. 1 Определение Постфиксную польскую запись (Пр. ПЗ) определим так: 1) Если инфиксное выражение Е представляет собой один операнд а, то Пр. ПЗ выражение Е - это просто а. 2) Если инфиксное выражение Е 1*Е 2, где * - знак операции, E 1, E 2 - инфиксные выражения для операндов, то По. ПЗ этого выражения это - Е 1'E 2'*, где Е 1', E 2' - постфиксные выражения Е 1, Е 2. 3) Если (Е) есть инфиксное выражение, то Пр. ПЗ этого выражения есть Пр. ПЗ Е.
4. 1 Определение (a + b) * (c - d) E 1 = (a + b) и E 2 = (c - d). Согласно определению префиксная запись выражения Е 1*Е 2 - это *E 1'E 2', где Е 1', Е 2' -префиксные записи выражений Е 1 и Е 2. Выполняя построение постфиксных записей для этих выражений, E 1' = +ab, E 2' = -cd, окончательно получаем результат в виде : *+ab-cd – префиксная форма ab+cd-* - постфиксная форма
4. 2 Вычисление префиксных польских записей 1. Просматриваем выражение слева направо, пока не найдем знак операции, за которым следуют два операнда. 2. Выполняем операцию и результат записываем на место выбранной тройки. 3. Повторяем пункт (1), пока не получим вместо выражения один результат. 1. 2. 3. 4. Вычисление построчного префиксного выражения можно представить в следующем виде: *+ab-cd *R 1 R 2 R 3
4. 2 Вычисление постфиксных записей 1. Просматриваем выражение слева направо пока не найдем два стоящих рядом операнда, за которыми следует знак операции. 2. Выполняем операцию и записываем результат вместо выбранных операндов и операций. 3. Повторяем пункт (1) пока не получим вместо выражения единственный результат. Вычисление построенного постфиксного выражения можно представить в следующем виде: 1. ab+cd-* 2. R 1 cd-* 3. R 1 R 2* 4. R 3
4. 2 Вычисление постфиксных записей На практике вычисление постфиксных выражений реализуется с применением магазина. В этом случае вычисления выполняются по следующим правилам. 1. Прочитать очередной символ входной цепочки. 2. Если входной символ - операнд, то выполнить его запись в магазин. 3. Если входной символ - оператор, то прочитать два операнда из магазина, выполнить операцию и результат занести в магазин как операнд. 4. Повторять п. 1, пока во входной цепочке не будут прочитаны все символы.
4. 2 Вычисление постфиксных записей