Upgrade to Pro — share decks privately, control downloads, hide ads and more …

№ 5. Составные типы данных, стек, очередь, списки, очередь с приоритетом

ОПК
March 15, 2021

№ 5. Составные типы данных, стек, очередь, списки, очередь с приоритетом

1. Записи.
2. Массивы.
3. Стеки, очереди и их применение в различных задачах.
4. Реализация стека с помощью динамического массива.
5. Связные списки: структура и свойства.
6. Операции над списками.
7. Двусвязные списки, кольцевые списки, двусвязные кольцевые списки.
8. Данные как «белый ящик» и как «черный ящик».
9. Отличия абстрактных типов данных от структур данных.
10. Очередь с приоритетом.

ОПК

March 15, 2021
Tweet

More Decks by ОПК

Other Decks in Programming

Transcript

  1. ЗАПИСИ Объединяют разнотипные данные (элементы, поля), относящиеся к одному объекту

    из предметной области. class Planet: pass e = Planet() e.name = "Earth" e.radius = 6.371e6 e.mass = 5.9726e24
 class Satellite: pass m = Satellite() m.name = "Moon" m.planet = e Классы (именованные изменяемые элементы): student = ("Иван Петров", 19307) print(student[0]) # Иван Петров Кортежи (tuple) (индексируемые неизменяемые элементы):
  2. МАССИВЫ Последовательность однотипных данных. Модуль array для примитивных типов: import

    array xs = array.array(‘i', [37, 42, 99]) print(xs[1]) # 42 Тип list*: ys = ["thirty seven", "42", "0x63"] print(ys[1]) # "42"
  3. КАК ЭТО РАБОТАЕТ?! print(ys) # ['thirty seven', '42', '0x63'] ys.append("Boom!")

    print(ys.pop(0)) # "thirty seven" print(ys) # ['42', '0x63', 'Boom!'] if believe_in_flat_earth: e.flat = Tru e print(e.__dict__) # {'name': 'Earth', 'flat': True, # 'radius': 6371000.0, 'mass': 5.9726e+24}
  4. СТЕК • Абстрактный тип данных . • Базовые операции :

    • Вставка элемента (push) . • Извлечение элемента (pop) . • Принцип LIFO (last-in, fi rst- out) – «последним вошел, первым вышел». push pop
  5. ПРИМЕНЕНИЯ СТЕКА • Машинный стек . • Вычисление выражений в

    обратной польской записи : • (1+2*4+3) → 1 2 4 * + 3 + • Язык Forth, Postscript. • Поиск пути в лабиринте . • Задачи с иерархией элементов (обход дерева).
  6. ОЧЕРЕДЬ • Абстрактный тип данных . • Базовые операции :

    • Вставка элемента (enqueue) . • Извлечение элемента (dequeue) . • Принцип FIFO ( fi rst-in, fi rst- out) – «первым вошел, первым вышел». enqueue dequeue
  7. СТЕК ЧЕРЕЗ 
 СТАТИЧЕСКИЙ МАССИВ Статический массив достаточно большого размера.

    stack = [None] * 99999 sp = 0 stack[sp] = 10 sp += 1 stack[sp] = 20 sp += 1 sp -= 1 print(stack[sp]) # 20
  8. СТЕК ЧЕРЕЗ ДИНАМИЧЕСКИЙ МАССИВ • Динамически расширяющийся массив . •

    Храним N элементов в массиве размера M (N ≤ M) . • Если при добавлении N становится больше M, то увеличиваем массив до размера 2M, копируя содержимое . • Если при удалении N становится меньше M/4, то уменьшаем массив до размера M/2, копируя содержимое.
  9. СТЕК ЧЕРЕЗ ДИНАМИЧЕСКИЙ МАССИВ • Временная сложность операции в стеке

    : • В лучшем случае потребуется просто изменить элемента массива: O(1) . • В худшем случае потребуется скопировать все N элементов и затем изменить один элемент: O(N).
  10. ЗАДАЧКА О СЛОЖНОСТИ • Докажите, что амортизационная временная сложность операции

    добавления в стек, реализованный с помощью динамически расширяющегося массива, равна O(1) . • Подсказка: оцените сложность добавления N элементов в стек.
  11. АНАЛИЗ Тип list в Python реализован как динамически расширяющийся массив

    . • вставка/удаление в конец – O(1 ) • доступ по индексу – O(1) • вставка/удаление в середину/начало – O(N ) list как стек – хорошо, list как очередь – плохо.
  12. СВЯЗНЫЕ СПИСКИ Связный список (linked list) – линейно упорядоченный набор

    элементов, каждый из которых содержит связь со следующим элементом. Голова Хвост
  13. ОПЕРАЦИИ СО СВЯЗНЫМ СПИСКОМ • Вставка элемента в голову .

    • Вставка в середину . • Удаление элемента . • Обход списка . • Поиск элемента по критерию. Голова Хвост
  14. СВОЙСТВА СВЯЗНОГО СПИСКА • Динамическая структура данных . • Вставка

    и удаление выполняются за O(1) . • Медленный поиск по номеру (индексирование): O(N).
  15. СТЕК ЧЕРЕЗ 
 СВЯЗНЫЙ СПИСОК Связный список с использованием динамической

    памяти. class StackNode: pass stack = None n1 = StackNode() n1.value = 10 n1.next = stack stack = n1 n2 = StackNode() n2.value = 20 n2.next = stack stack = n2 print(stack.value) # 20 stack = stack.next
  16. ПРИМЕРЫ ИСПОЛЬЗОВАНИЯ СПИСКОВ • Многочлены (символьная алгебра) . • Реализация

    стеков и очередей . • Цепочки кластеров в файловых системах.
  17. ПРИМЕНЕНИЕ КОЛЬЦЕВЫХ СПИСКОВ • Список вершин многоугольника . • Список

    процессов в системе с разделением времени . • Кольцо буферов ввода/вывода.
  18. ИЕРАРХИЯ • Абстрактные типы данных : • Последовательности 
 (стек,

    очередь, дек ) • Множеств а • Словар и • Графы 
 • Структуры данных : • Массив ы • Связанные списк и • Деревья (дерево поиска, двоичная куча ) • Хеш-таблицы
  19. ОЧЕРЕДЬ С ПРИОРИТЕТОМ АТД очередь с приоритетом (priority queue). 


    Основные операции : • добавление элементов с некоторым приоритетом ; • извлечение элемента с максимальным приоритетом. Маша 9 Вася 5 Петя 7 Женя 4 Коля 1 Дима 6
  20. ОЧЕРЕДЬ С ПРИОРИТЕТОМ: РЕАЛИЗАЦИЯ • Через неотсортированный массив (или список):

    
 добавление за O(1), извлечение за O(N) 
 
 • Через отсортированный массив (или список): 
 добавление за O(N), извлечение за O(1) Маша 9 Вася 5 Петя 7 Женя 4 Коля 1 Дима 6 Маша 9 Вася 5 Петя 7 Женя 4 Коля 1 Дима 6
  21. ОЧЕРЕДЬ С ПРИОРИТЕТОМ : ЭФФЕКТИВНАЯ РЕАЛИЗАЦИЯ • Через пирамиду (binary

    heap) . • Максимальный элемент в корне . • Сложность: добавление и извлечение за O(log N). Маша 9 Вася 5 Петя 7 Женя 4 Коля 1 Дима 6
  22. ОЧЕРЕДЬ С ПРИОРИТЕТОМ : ИЗВЛЕЧЕНИЕ • Запоминаем элемент из корн

    я • Переставляем последний элемент пирамиды в корен ь • «Топим» корень для наведения порядка (функция sink из пирамидальной сортировки ) • Возвращаем запомненный элемент
  23. ОЧЕРЕДЬ С ПРИОРИТЕТОМ : ДОБАВЛЕНИЕ • Добавляем последний элемент в

    конец пирамид ы • «Всплываем» последний элемент для наведения порядка (функция swim, аналогичная sink)