28
ОСНОВЫ ПРОГРАММНОГО КОНСТРУИРОВАНИЯ Лекция 5 19 марта 2013 г.

ОПК № 5 – Составные типы данных, списки

Embed Size (px)

DESCRIPTION

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

Citation preview

Page 1: ОПК № 5 – Составные типы данных, списки

ОСНОВЫ ПРОГРАММНОГО КОНСТРУИРОВАНИЯ

Лекция № 519 марта 2013 г.

Page 2: ОПК № 5 – Составные типы данных, списки

СОСТАВНЫЕ ТИПЫ ДАННЫХ

Page 3: ОПК № 5 – Составные типы данных, списки

ЗАПИСИ

•Объединяют разнотипные данные, относящиеся к одному объекту из предметной области.

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 – Составные типы данных, списки

МАССИВЫ

•Множество однотипных данных:

• Набор временных отсчетов.

• Векторы и матрицы.

• Набор строк.

• Элементы массива хранятся в смежных ячейках памяти.

Page 5: ОПК № 5 – Составные типы данных, списки

ОДНОМЕРНЫЙ МАССИВ

• A0 – адрес начала массива.

• s – размер элемента массива.

• Чему равен A(n) – адрес n-го элемента массива?

ИндексАдрес

0 1 2 3 4A0 ? ? ? ?

int a[5];

Page 6: ОПК № 5 – Составные типы данных, списки

ОДНОМЕРНЫЙ МАССИВ

A(n) = A0 + n⋅s

Page 7: ОПК № 5 – Составные типы данных, списки

ДВУМЕРНЫЙ МАССИВ

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 – Составные типы данных, списки

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 – Составные типы данных, списки

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 – Составные типы данных, списки

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 – Составные типы данных, списки

ДВА СПОСОБА СМОТРЕТЬ НА ДАННЫЕ

«Белый ящик» (прозрачный)

«Черный ящик» (непрозрачный)

Устройство Операции

Page 12: ОПК № 5 – Составные типы данных, списки

ОПЕРАЦИИ НАД ДАННЫМИ

• Записи:

• Прочитать элемент по имени.

• Изменить элемент по имени.

• Добавить новый элемент.

• Удалить элемент.

• Массив:

• Прочитать элемент по индексу.

• Изменить элемент по индексу.

• Изменить размер массива.

• Добавить элемент.

• Удалить элемент.

Page 13: ОПК № 5 – Составные типы данных, списки

«ПРОДВИНУТОСТЬ» СТРУКТУР ДАННЫХ

• Количество «степеней свободы» (возможных операций со структурой данных).

• Рост количества степеней свободы возможен:

• за счет усложнения внутренней структуры;

• за счет понижения быстродействия.

Page 14: ОПК № 5 – Составные типы данных, списки

СТЕК

• Абстрактный тип данных.

• Базовые операции:

• Вставка элемента (push).

• Извлечение элемента (pop).

• Принцип LIFO (last-in, first-out) – «последним вошел, первым вышел».

push pop

Page 15: ОПК № 5 – Составные типы данных, списки

ПРИМЕНЕНИЯ СТЕКА

•Машинный стек.

• Вычисление выражений в обратной польской записи:

• (1+2*4+3) → 1 2 4 * + 3 +

• Язык Postscript.

• Поиск пути в лабиринте.

• Задачи с иерархией элементов (обход дерева).

Page 16: ОПК № 5 – Составные типы данных, списки

ОЧЕРЕДЬ

• Абстрактный тип данных.

• Базовые операции:

• Вставка элемента (enqueue).

• Извлечение элемента (dequeue).

• Принцип FIFO (first-in, first-out) – «первым вошел, первым вышел».

enqueue

dequeue

Page 17: ОПК № 5 – Составные типы данных, списки

ПРИМЕНЕНИЕ ОЧЕРЕДЕЙ

•Обработка отложенных запросов.

Порождение запросов

Обработка запросов

оооооооооооооооочередь

Page 18: ОПК № 5 – Составные типы данных, списки

РЕАЛИЗАЦИЯ СТЕКА

• Статический массив достаточно большого размера.

int stack[99999];int sp = 0;

stack[sp] = 10;sp++;

stack[sp] = 20;sp++;

sp--;stack[sp]; // => 20

Page 19: ОПК № 5 – Составные типы данных, списки

СВЯЗНЫЕ СПИСКИ

• Связный список (linked list) – линейно упорядоченный набор элементов, каждый из которых содержит связь со следующим элементом.

Голова

Хвост

Page 20: ОПК № 5 – Составные типы данных, списки

ОПЕРАЦИИ СО СВЯЗНЫМ СПИСКОМ

• Вставка элемента в голову.

• Вставка в середину.

• Удаление элемента.

•Обход списка.

• Поиск элемента по критерию.

Page 21: ОПК № 5 – Составные типы данных, списки

СВОЙСТВА СВЯЗНОГО СПИСКА

• Динамическая структура данных.

• Вставка и удаление выполняются за O(1).

•Медленный поиск по номеру (индексирование): O(n).

Page 22: ОПК № 5 – Составные типы данных, списки

ПРИМЕРЫ ИСПОЛЬЗОВАНИЯ СПИСКОВ

•Многочлены (символьная алгебра).

• Реализация стеков и очередей.

• Цепочки кластеров в файловых системах.

Page 23: ОПК № 5 – Составные типы данных, списки

РЕАЛИЗАЦИЯ СТЕКА• Связный список с использованием динамической памяти

(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 – Составные типы данных, списки

ДВУСВЯЗНЫЙ СПИСОК

Голова

Хвост

Преимущество: одинаковая легкость операций в обе стороны

Page 25: ОПК № 5 – Составные типы данных, списки

КОЛЬЦЕВОЙ СВЯЗНЫЙ СПИСОК

Голова?

Page 26: ОПК № 5 – Составные типы данных, списки

ПРИМЕНЕНИЕ КОЛЬЦЕВЫХ СПИСКОВ

• Список вершин многоугольника.

• Список процессов в системе с разделением времени.

• Кольцо буферов ввода/вывода.

Page 27: ОПК № 5 – Составные типы данных, списки

ДВУСВЯЗНЫЙ КОЛЬЦЕВОЙ СПИСОК

Page 28: ОПК № 5 – Составные типы данных, списки

КОНЕЦ ПЯТОЙ ЛЕКЦИИЧем больше степеней свободы, тем лучше.

Если не приходится за это слишком дорого платить.

Конец