Скачать презентацию Тема 5 I Фундаментальные структуры данных 1 2 Скачать презентацию Тема 5 I Фундаментальные структуры данных 1 2

Тема5_1.ppt

  • Количество слайдов: 26

Тема 5 I. Фундаментальные структуры данных 1. 2. 3. 4. 5. Массив Линейный список Тема 5 I. Фундаментальные структуры данных 1. 2. 3. 4. 5. Массив Линейный список Стек Очередь Дек

Структура данных o o – это класс однородных математических объектов, ориентированный на эффективное представление Структура данных o o – это класс однородных математических объектов, ориентированный на эффективное представление данных в некотором классе задач. – это систематизированный способ организации данных и доступа к ним. Примеры: o Конечные последовательности однотипных или разнотипных элементов (массивы, кортежи, записи, списки и т. д. ). o Таблицы. o Деревья. o Кучи. 2

Требования, предъявляемые к структурам данных: o o o Эффективность представления, Экономное расходование памяти, Быстрый Требования, предъявляемые к структурам данных: o o o Эффективность представления, Экономное расходование памяти, Быстрый доступ к элементам структуры. 3

1. 1. Массив o o – с. д. для представления множества элементов, однотипных по 1. 1. Массив o o – с. д. для представления множества элементов, однотипных по структуре и способу использования. Массивы относятся к структурам данных со случайным доступом : для выделения некоторой компоненты к имен массива добавляется индекс (значение специального типа), который можно вычислить, потому элементы массива иногда называют переменным с индексами. 4

Базовые операции для массива: 1. поиск элемента, равного x n n 2. В произвольном Базовые операции для массива: 1. поиск элемента, равного x n n 2. В произвольном массиве T(n) = Θ(n). В отсортированном массиве T(n) = Θ(log n), поиск максимального (минимального) элемента. n n В произвольном массиве T(n) = Θ(n). В отсортированном массиве T(n) = Θ(1). T(n) – трудоемкость этой операции Упр. 1: реализовать базовые операции для массива. 5

! Обычный прием работы с массивами – это n n поиск, выборочное изменение отдельных ! Обычный прием работы с массивами – это n n поиск, выборочное изменение отдельных компонент массива. o Основные операции над массивами не предполагают включения новых элементов или исключения элементов. o Однако на практике часто необходимо выполнять процедуры включения и исключения отдельных элементов, что приводит к необходимости разработки структур данных, поддерживающих эти операции. 6

1. 2. Линейный список o o o Список – упорядоченная последовательность данных, характеризующих однородные 1. 2. Линейный список o o o Список – упорядоченная последовательность данных, характеризующих однородные объекты, отличающиеся значениями своих признаков. – конечная последовательность элементов, порядок которых определяется с помощью ссылок. Линейный список – конечная последовательность элементов (множество), структурные свойства которой ограничиваются лишь линейным (одномерным) относительным порядком элементов. Множество x 1 , … , xk– 1 , xk+1 , … , xn, n ≥ 0, 1 < k < n. 7

Базовые операции для линейного списка: 1. 2. 3. 4. 5. 6. формирование списка, просмотр Базовые операции для линейного списка: 1. 2. 3. 4. 5. 6. формирование списка, просмотр списка, поиск некоторого заданного элемента с ключом х, поиск максимального (минимального) элемента, T(n) = Θ(n) включение элемента с ключом x, исключение элемента. T(n) = Θ(1) 8

o Однонаправленный список – список, в котором предусмотрен жесткий порядок перебора элементов – от o Однонаправленный список – список, в котором предусмотрен жесткий порядок перебора элементов – от первого к последнему. o Двунаправленный список – список, структура которого предусматривает возможность перебора элементов как в прямом, так и в обратном порядке. o Способы представления одно- и двунаправленного списков аналогичны. 9

Способы реализации линейного списка: 1. В виде двух массивов А и В: n n Способы реализации линейного списка: 1. В виде двух массивов А и В: n n n Пусть i - индекс элемента в списке, тогда А[i] - сам элемент, В[i] - индекс следующего элемента в списке А. В[k] = 0, где k - индекс последнего элемента в списке. Две переменные: nz -индекс начала занятых компонент, ns - индекс начала свободных компонент. nz = 1, ns = 4 с А В 8 5 13 * * * 1 Список: 8, 13, 5 2 3 4 5 6 3 0 2 5 6 0 10

Способы реализации линейного списка: 2. С использованием последовательности связанных компонент (линейный список): n Каждая Способы реализации линейного списка: 2. С использованием последовательности связанных компонент (линейный список): n Каждая компонента списка состоит из двух ячеек памяти (первая содержит сам элемент либо указатель на его местоположение, а вторая – указатель на следующий элемент) Список: 8, 13, 5 8 13 5 null 11

Упр. 2: реализовать базовые операции для одно- и двунаправленного списка, реализованного через массивы. Упр. Упр. 2: реализовать базовые операции для одно- и двунаправленного списка, реализованного через массивы. Упр. 3: реализовать базовые операции для одно- и двунаправленного списка, реализованного через последовательности связанных компонент. 12

Включение элемента в начало (конец) списка до (после) элемента, на который указывает заданная ссылка Включение элемента в начало (конец) списка до (после) элемента, на который указывает заданная ссылка p. 1. 2. tail head 1 5 1 head 3 р 3 5 tail × 1 3 null р 5 × 1 5 3 13

Формирование списка 1. Начиная с пустого списка последовательно включаем элементы в начало списка. n Формирование списка 1. Начиная с пустого списка последовательно включаем элементы в начало списка. n n 2. не надо обрабатывать отдельно ситуацию, когда включается элемент в пустой список, порядок следования элементов в списке обратен порядку их включения. Включаем элементы в конец списка. n n n порядок следования элементов совпадает с порядком их включения, необходимо ввести указатель на последний поступивший элемент (tail), первый включаемый элемент обрабатывается иначе, чем остальные элементы. 14

Исключение элемента из списка 1. 2. O р стоящего после элемента, на который указывает Исключение элемента из списка 1. 2. O р стоящего после элемента, на который указывает заданная ссылка p § § р – указатель не на последний элемент, р – указатель на последний элемент. × O q × O O O р q … O null s Техника барьера: Барьер – пустой элемент в конце списка, его адрес в переменной s. 15

Поиск элемента x в неупорядоченном списке 1. осуществляется последовательным просмотром элементов, § § § Поиск элемента x в неупорядоченном списке 1. осуществляется последовательным просмотром элементов, § § § ! заканчивается либо при обнаружении требуемого элемента, либо при достижении конца списка. чтобы оптимизировать условие окончания просмотра, будем использовать технику барьера (s. key ← x). переменная head указывает на начало списка. для того, чтобы процедура отработала правильно в случае когда список пустой, необходимо при формировании списка выполнить оператор: head ← s. 16

Поиск элемента x в упорядоченном списке o o o можно заканчивать при обнаружении первого Поиск элемента x в упорядоченном списке o o o можно заканчивать при обнаружении первого ключа, со значением большем x. упорядоченность списка достигается путем включения нового элемента в подходящее для него место, что позволяет полностью использовать гибкость списковой структуры. Однако, даже упорядоченные линейные списки не позволяют организовать ничего подобного на двоичный поиск в массивах. 17

Операции работы со списками o Конкатенация (сцепление) двух списков. В результате образуется единый список. Операции работы со списками o Конкатенация (сцепление) двух списков. В результате образуется единый список. n n o T = Θ(1), если имеются адреса первого и последнего элементов списков. Если известны только начальные адреса, то Т = Θ(п + т), где п, т – количество элементов в сцепляемых списках. Расцепление списка. n T = Θ(1), если известен указатель на элемент непосредственно предшествующий месту расцепления. Упр. 4: реализовать операции конкатенации и расцепления одно- и двунаправленного списка, реализованного через массивы и через последовательности связанных компонент. 18

1. 3. Стек o – линейный однонаправленный список, в котором все включения и исключения 1. 3. Стек o – линейный однонаправленный список, в котором все включения и исключения элементов (и обычно всякий доступ) делаются в одном конце списка. o Реализуется принцип “последний вошел – первый вышел” (last-in, first-out – LIFO). n null Алгоритмы решения таких известных задач, как проверка баланса скобок в арифметическом выражении, вычисление значения выражения, используют стек. top O O 19

o Если заранее известно максимальное количество элементов, одновременно хранящихся в стеке, то целесообразно моделировать o Если заранее известно максимальное количество элементов, одновременно хранящихся в стеке, то целесообразно моделировать стек на массиве постоянной длины. n o Переменная top содержит индекс последнего включенного стек элемента (первоначально top = 0). В случае, когда количество элементов заранее неизвестно, стек может быть реализован виде списковой структуры. n Переменная top содержит адрес последнего включенного в стек элемента (первоначально top = null). 20

o o Операция добавления элемента в стек часто обозначается Push, а операция удаления – o o Операция добавления элемента в стек часто обозначается Push, а операция удаления – Pop. Трудоемкость процедур включения и исключения элемента из стека есть Θ(1). Упр. 5: реализовать операции добавления и удаления элемента в стеке, реализованном через массивы и через последовательности связанных компонент. 21

1. 4. Очередь o – линейный список, в котором все включения элементов производятся в 1. 4. Очередь o – линейный список, в котором все включения элементов производятся в одном конце списка, а все исключения (и обычно всякий доступ) делаются в другом его конце. o Реализуется принцип “первый вошел первый вышел” (firstin, first-out – FIFO). n O head С необходимостью работы с очередью мы уже сталкивались при рассмотрении алгоритма лексикографической сортировки. O O O null tail 22

o Если максимальное количество элементов, одновременно хранящихся в очереди не превосходит l, то можно o Если максимальное количество элементов, одновременно хранящихся в очереди не превосходит l, то можно смоделировать очередь на массиве постоянной длины l. n n Переменные head и tail, определяют индексы первого и последнего элементов очереди (первоначально head= 1 и tail =0); В случае циклической очереди необходима переменная булевского типа empty, которая равна true в случае, когда очередь пуста. O head O O O tail 23

o Если количество элементов очереди заранее не известно, то для реализации очереди используются списковые o Если количество элементов очереди заранее не известно, то для реализации очереди используются списковые структуры. n Переменная head содержит адрес первого элемента очереди, а tail – адрес последнего элементов очереди (первоначально head, tail = null). 24

o Трудоемкость процедур включения и исключения элемента из очереди есть Θ(1). Упр. 6: реализовать o Трудоемкость процедур включения и исключения элемента из очереди есть Θ(1). Упр. 6: реализовать операции добавления и удаления элемента в обычной и в циклической очереди, реализованном через массивы и через последовательности связанных компонент. 25

1. 5. Дек (двунаправленная очередь) o o – линейный список, в котором все включения 1. 5. Дек (двунаправленная очередь) o o – линейный список, в котором все включения и исключения элементов (и обычно всякий доступ) делаются на обоих концах списка. Deque (double-ended queue) – очередь с двусторонним доступом. tailer header O O O Упр. 7: реализовать операции добавления и удаления элемента в дек (и в начало и в конец очереди), реализованном через массивы и через последовательности связанных компонент. 26