Лекция №1. Введение. Предмет "Структуры и алгоритмы обработки данных"
Лекция №5. Линейные структуры данных. Предмет "Структуры и алгоритмы обработки данных"
1. Хакасский государственный университет им. Н.Ф. Катанова
Структуры и алгоритмы обработки данных
Лекция: Линейные структуры данных
Николай Гребенщиков, www.grebenshikov.ru
2. Линейное представление - простейшее представление мно-
жества элементов.
{a, b, c, d, e} → (a, b, c, d, e)
Задачи:
• Информационный поиск
• Трансляция программных языков
• Моделирование
• и т.д.
1
3. Последовательность - это упорядоченный список элемен-
тов некоторого множества.
Пусть дано множество X. Тогда конечной последователь-
ностью его элементов называют функцию n → x(n), n ∈
{1, . . . , N }, x(n) ∈ X. Элемент x(n) называют членом после-
довательности с номером n, а натуральное число N ∈ N на-
зывается их общим количеством.
2
4. АТД “Список”
1 interface List {
2 void insert(object o, Position position);
3 Position getPosition(object o);
4 object getAt(Position position);
5 void deleteAt(Position position);
6 Position next(Position position);
7 Position previous(Position position);
8 Position end();
9 Position first();
10 void clear();
11 }
3
6. Реализация списка с помощью массива
1 class ArrayList {
2 private final int MAX_COUNT = 1000;
3 private Object[] objects = new Object[MAX_COUNT];
4 private int last = 0;
5 int end() {
6 return last + 1;
7 }
8 }
5
7. Реализация списка с помощью массива
1 void insert(object o, int position) {
2 int q;
3 if (last >= MAX_COUNT) { error(‘‘Список полон’’); }
4 else if (position > last || p < 0) {
5 error(‘‘Позиция не существует’’);
6 } else {
7 for (int i = last; i >= p; i--) {
8 objects[i+1] = object[i];
9 }
10 last++;
11 objects[p] = o;
12 }
13 }
6
9. Реализация списка с помощью указателей
1 class PointerListElement {
2 public object data = null;
3 public PointerListElement next = null;
4 }
5 class PointerList {
6 private PointerListElement head =
7 new PointerListElement();
8 PointerListElement end() {
9 PointerListElement result = head;
10 while(result.next != null) {
11 result = result.next;
12 }
13 return result
14 }
15 }
8
10. Реализация списка с помощью указателей
1 void insert(object o, PointerListElement position) {
2 PointerListElement newElement =
3 new PointerListElement();
4 newElement.data = o;
5 newElement.next = position.next;
6 position.next = newElement;
7 }
9
13. Дважды связанный список
1 class PointerListElement {
2 public object data = null;
3 public PointerListElement next = null;
4 public PointerListElement previous = null;
5 }
12
15. Стек - это специальный тип списка, в котором все вставки и
удаления выполняются только на одном конце, называемом
вершиной.
LIFO - last in first out.
АТД “Стек”
1 interface Stack {
2 void push(object o);
3 object pop();
4 object top();
5 boolean isEmpty();
6 void clear();
7 }
14
17. 1 class ArrayStack {
2 private final int MAX_COUNT = 1000;
3 private Object[] objects = new Object[MAX_COUNT];
4 private int top = MAX_COUNT;
5 void push(object o) {
6 if (top <= 0) { error(‘‘Стек полон’’); }
7 else {
8 top--;
9 objects[top] = o;
10 }
11 }
12 .
13 .
14 .
15 }
16
18. Очередь - это специальный тип списка, в котором все встав-
ки выполняются с одного конца, а удаления с другого.
FIFO - first in first out.
АТД “Очередь”
1 interface Queue {
2 void enqueue(object o);
3 object dequeue();
4 object front();
5 boolean isEmpty();
6 void clear();
7 }
17
23. Отображение - это функция определенная на множестве
элементов (области определения) одного типа, и принимаю-
щая значения из множества элементов (области значений)
другого типа.
1 interface Map {
2 void clear();
3 void set(Object index, Object value);
4 void get(Object index);
5 }
1 Map map = new Map();
2 String s1 = ‘‘abc’’, s2 = ‘‘zxc’’;
3 map.set(s1, s2);
4 map.get(s1) => ?
22
24. Список литературы
• Ахо А., Хопкрофт Д., Ульман Д. Структуры данных и
алгоритмы. - М. : Издательский дом “Вильямс”, 2000.
сс.45-76.
• Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К. Алгорит-
мы: построение и анализ, 2-е издание. - М. : Издатель-
ский дом “Вильямс”, 2007. сс.260-268.
• Кнут Д, Искусство программирования, том 1. Основные
алгоритмы, 3-е изд. - М. : Издательский дома “Вильямс”,
2000. сс.277-351.
23