ОПК № 5 – Составные типы данных, списки
DESCRIPTION
1. Записи 2. Массивы. 3. Адресация в многомерных массивах: C-style, FORTRAN-style. 4. Данные как «белый ящик» и как «черный ящик». 5. Стеки, очереди и их применение в различных задачах. 6. Реализация стека с помощью массива в С. 7. Связные списки: структура и свойства. 8. Операции над списками. 9. Реализация стека с помощью связного списка в С. 10. Двусвязные списки, кольцевые списки, двусвязные кольцевые списки.TRANSCRIPT
![Page 1: ОПК № 5 – Составные типы данных, списки](https://reader033.vdocuments.mx/reader033/viewer/2022052909/5598ca741a28ab4c568b47bd/html5/thumbnails/1.jpg)
ОСНОВЫ ПРОГРАММНОГО КОНСТРУИРОВАНИЯ
Лекция № 519 марта 2013 г.
![Page 2: ОПК № 5 – Составные типы данных, списки](https://reader033.vdocuments.mx/reader033/viewer/2022052909/5598ca741a28ab4c568b47bd/html5/thumbnails/2.jpg)
СОСТАВНЫЕ ТИПЫ ДАННЫХ
![Page 3: ОПК № 5 – Составные типы данных, списки](https://reader033.vdocuments.mx/reader033/viewer/2022052909/5598ca741a28ab4c568b47bd/html5/thumbnails/3.jpg)
ЗАПИСИ
•Объединяют разнотипные данные, относящиеся к одному объекту из предметной области.
struct Point { double x, y, z;};
struct Planet { const char *name; double mass; double radius; /* .... */};
struct Order { struct User *user; struct Date date; int nitems; struct OrderItem *items;};
![Page 4: ОПК № 5 – Составные типы данных, списки](https://reader033.vdocuments.mx/reader033/viewer/2022052909/5598ca741a28ab4c568b47bd/html5/thumbnails/4.jpg)
МАССИВЫ
•Множество однотипных данных:
• Набор временных отсчетов.
• Векторы и матрицы.
• Набор строк.
• Элементы массива хранятся в смежных ячейках памяти.
![Page 5: ОПК № 5 – Составные типы данных, списки](https://reader033.vdocuments.mx/reader033/viewer/2022052909/5598ca741a28ab4c568b47bd/html5/thumbnails/5.jpg)
ОДНОМЕРНЫЙ МАССИВ
• A0 – адрес начала массива.
• s – размер элемента массива.
• Чему равен A(n) – адрес n-го элемента массива?
ИндексАдрес
0 1 2 3 4A0 ? ? ? ?
int a[5];
![Page 6: ОПК № 5 – Составные типы данных, списки](https://reader033.vdocuments.mx/reader033/viewer/2022052909/5598ca741a28ab4c568b47bd/html5/thumbnails/6.jpg)
ОДНОМЕРНЫЙ МАССИВ
A(n) = A0 + n⋅s
![Page 7: ОПК № 5 – Составные типы данных, списки](https://reader033.vdocuments.mx/reader033/viewer/2022052909/5598ca741a28ab4c568b47bd/html5/thumbnails/7.jpg)
ДВУМЕРНЫЙ МАССИВ
kkk
mm0 1 2
3 4 5
или
n = 3m+k n = 2k+m
С-style FORTRAN-style
int a[2][3];
kkk
mm0 2 4
1 3 5
a[m][k]
![Page 8: ОПК № 5 – Составные типы данных, списки](https://reader033.vdocuments.mx/reader033/viewer/2022052909/5598ca741a28ab4c568b47bd/html5/thumbnails/8.jpg)
N-МЕРНЫЙ МАССИВ
• K размерностей: A[NK][NK-1]....[N1].
• А(nK, nK-1, …, n1) = A0 + s⋅n(nK, nK-1, …, n1).
• n(nK, nK-1, …, n1) = ?
![Page 9: ОПК № 5 – Составные типы данных, списки](https://reader033.vdocuments.mx/reader033/viewer/2022052909/5598ca741a28ab4c568b47bd/html5/thumbnails/9.jpg)
C-STYLE
• Уменьшаем порядок задачи на единицу (K → K−1), «откусывая» последнюю размерность:
• n(nK, nK−1, …, n1) = n(nK, nK−1, …, n2, 0) + n1
• n(nK, nK−1, …, n2, 0) = n(nK, nK−1, …, n2)⋅N1
• В итоге:
• n(nK, nK-1, …, n1) = (((…(nK⋅NK−1+nK−1)…))⋅N2+n2)⋅N1+n1
![Page 10: ОПК № 5 – Составные типы данных, списки](https://reader033.vdocuments.mx/reader033/viewer/2022052909/5598ca741a28ab4c568b47bd/html5/thumbnails/10.jpg)
FORTRAN-STYLE
• «Откусываем» первую размерность:
• n(nK, nK−1, …, n1) = n(0, nK−1, …, n1) + nK
• n(0, nK−1, …, n1) = n(nK−1, …, n1)⋅NK
![Page 11: ОПК № 5 – Составные типы данных, списки](https://reader033.vdocuments.mx/reader033/viewer/2022052909/5598ca741a28ab4c568b47bd/html5/thumbnails/11.jpg)
ДВА СПОСОБА СМОТРЕТЬ НА ДАННЫЕ
«Белый ящик» (прозрачный)
«Черный ящик» (непрозрачный)
Устройство Операции
![Page 12: ОПК № 5 – Составные типы данных, списки](https://reader033.vdocuments.mx/reader033/viewer/2022052909/5598ca741a28ab4c568b47bd/html5/thumbnails/12.jpg)
ОПЕРАЦИИ НАД ДАННЫМИ
• Записи:
• Прочитать элемент по имени.
• Изменить элемент по имени.
• Добавить новый элемент.
• Удалить элемент.
• Массив:
• Прочитать элемент по индексу.
• Изменить элемент по индексу.
• Изменить размер массива.
• Добавить элемент.
• Удалить элемент.
![Page 13: ОПК № 5 – Составные типы данных, списки](https://reader033.vdocuments.mx/reader033/viewer/2022052909/5598ca741a28ab4c568b47bd/html5/thumbnails/13.jpg)
«ПРОДВИНУТОСТЬ» СТРУКТУР ДАННЫХ
• Количество «степеней свободы» (возможных операций со структурой данных).
• Рост количества степеней свободы возможен:
• за счет усложнения внутренней структуры;
• за счет понижения быстродействия.
![Page 14: ОПК № 5 – Составные типы данных, списки](https://reader033.vdocuments.mx/reader033/viewer/2022052909/5598ca741a28ab4c568b47bd/html5/thumbnails/14.jpg)
СТЕК
• Абстрактный тип данных.
• Базовые операции:
• Вставка элемента (push).
• Извлечение элемента (pop).
• Принцип LIFO (last-in, first-out) – «последним вошел, первым вышел».
push pop
![Page 15: ОПК № 5 – Составные типы данных, списки](https://reader033.vdocuments.mx/reader033/viewer/2022052909/5598ca741a28ab4c568b47bd/html5/thumbnails/15.jpg)
ПРИМЕНЕНИЯ СТЕКА
•Машинный стек.
• Вычисление выражений в обратной польской записи:
• (1+2*4+3) → 1 2 4 * + 3 +
• Язык Postscript.
• Поиск пути в лабиринте.
• Задачи с иерархией элементов (обход дерева).
![Page 16: ОПК № 5 – Составные типы данных, списки](https://reader033.vdocuments.mx/reader033/viewer/2022052909/5598ca741a28ab4c568b47bd/html5/thumbnails/16.jpg)
ОЧЕРЕДЬ
• Абстрактный тип данных.
• Базовые операции:
• Вставка элемента (enqueue).
• Извлечение элемента (dequeue).
• Принцип FIFO (first-in, first-out) – «первым вошел, первым вышел».
enqueue
dequeue
![Page 17: ОПК № 5 – Составные типы данных, списки](https://reader033.vdocuments.mx/reader033/viewer/2022052909/5598ca741a28ab4c568b47bd/html5/thumbnails/17.jpg)
ПРИМЕНЕНИЕ ОЧЕРЕДЕЙ
•Обработка отложенных запросов.
Порождение запросов
Обработка запросов
оооооооооооооооочередь
![Page 18: ОПК № 5 – Составные типы данных, списки](https://reader033.vdocuments.mx/reader033/viewer/2022052909/5598ca741a28ab4c568b47bd/html5/thumbnails/18.jpg)
РЕАЛИЗАЦИЯ СТЕКА
• Статический массив достаточно большого размера.
int stack[99999];int sp = 0;
stack[sp] = 10;sp++;
stack[sp] = 20;sp++;
sp--;stack[sp]; // => 20
![Page 19: ОПК № 5 – Составные типы данных, списки](https://reader033.vdocuments.mx/reader033/viewer/2022052909/5598ca741a28ab4c568b47bd/html5/thumbnails/19.jpg)
СВЯЗНЫЕ СПИСКИ
• Связный список (linked list) – линейно упорядоченный набор элементов, каждый из которых содержит связь со следующим элементом.
Голова
Хвост
![Page 20: ОПК № 5 – Составные типы данных, списки](https://reader033.vdocuments.mx/reader033/viewer/2022052909/5598ca741a28ab4c568b47bd/html5/thumbnails/20.jpg)
ОПЕРАЦИИ СО СВЯЗНЫМ СПИСКОМ
• Вставка элемента в голову.
• Вставка в середину.
• Удаление элемента.
•Обход списка.
• Поиск элемента по критерию.
![Page 21: ОПК № 5 – Составные типы данных, списки](https://reader033.vdocuments.mx/reader033/viewer/2022052909/5598ca741a28ab4c568b47bd/html5/thumbnails/21.jpg)
СВОЙСТВА СВЯЗНОГО СПИСКА
• Динамическая структура данных.
• Вставка и удаление выполняются за O(1).
•Медленный поиск по номеру (индексирование): O(n).
![Page 22: ОПК № 5 – Составные типы данных, списки](https://reader033.vdocuments.mx/reader033/viewer/2022052909/5598ca741a28ab4c568b47bd/html5/thumbnails/22.jpg)
ПРИМЕРЫ ИСПОЛЬЗОВАНИЯ СПИСКОВ
•Многочлены (символьная алгебра).
• Реализация стеков и очередей.
• Цепочки кластеров в файловых системах.
![Page 23: ОПК № 5 – Составные типы данных, списки](https://reader033.vdocuments.mx/reader033/viewer/2022052909/5598ca741a28ab4c568b47bd/html5/thumbnails/23.jpg)
РЕАЛИЗАЦИЯ СТЕКА• Связный список с использованием динамической памяти
(malloc и free).struct StackNode { int n; struct StackNode *next;};
struct StackNode *root, *n1, *n2;
n1 = (struct StackNode *)malloc( sizeof(struct StackNode));n1->n = 10;n1->next = 0;root = n1;
n2 = (struct StackNode *)malloc( sizeof(struct StackNode));n2->n = 20;n2->next = root;root = n2;
root->n; // => 20root = root->next;
![Page 24: ОПК № 5 – Составные типы данных, списки](https://reader033.vdocuments.mx/reader033/viewer/2022052909/5598ca741a28ab4c568b47bd/html5/thumbnails/24.jpg)
ДВУСВЯЗНЫЙ СПИСОК
Голова
Хвост
Преимущество: одинаковая легкость операций в обе стороны
![Page 25: ОПК № 5 – Составные типы данных, списки](https://reader033.vdocuments.mx/reader033/viewer/2022052909/5598ca741a28ab4c568b47bd/html5/thumbnails/25.jpg)
КОЛЬЦЕВОЙ СВЯЗНЫЙ СПИСОК
Голова?
![Page 26: ОПК № 5 – Составные типы данных, списки](https://reader033.vdocuments.mx/reader033/viewer/2022052909/5598ca741a28ab4c568b47bd/html5/thumbnails/26.jpg)
ПРИМЕНЕНИЕ КОЛЬЦЕВЫХ СПИСКОВ
• Список вершин многоугольника.
• Список процессов в системе с разделением времени.
• Кольцо буферов ввода/вывода.
![Page 27: ОПК № 5 – Составные типы данных, списки](https://reader033.vdocuments.mx/reader033/viewer/2022052909/5598ca741a28ab4c568b47bd/html5/thumbnails/27.jpg)
ДВУСВЯЗНЫЙ КОЛЬЦЕВОЙ СПИСОК
![Page 28: ОПК № 5 – Составные типы данных, списки](https://reader033.vdocuments.mx/reader033/viewer/2022052909/5598ca741a28ab4c568b47bd/html5/thumbnails/28.jpg)
КОНЕЦ ПЯТОЙ ЛЕКЦИИЧем больше степеней свободы, тем лучше.
Если не приходится за это слишком дорого платить.
Конец