24
Хакасский государственный университет им. Н.Ф. Катанова Структуры и алгоритмы обработки данных Лекция: Линейные структуры данных Николай Гребенщиков, www.grebenshikov.ru

Лекция №5. Линейные структуры данных. Предмет "Структуры и алгоритмы обработки данных"

Embed Size (px)

Citation preview

Хакасский государственный университет им. Н.Ф. Катанова

Структуры и алгоритмы обработки данных

Лекция: Линейные структуры данных

Николай Гребенщиков, www.grebenshikov.ru

Линейное представление - простейшее представление мно-жества элементов.

{a, b, c, d, e} → (a, b, c, d, e)

Задачи:

• Информационный поиск

• Трансляция программных языков

• Моделирование

• и т.д.

1

Последовательность - это упорядоченный список элемен-тов некоторого множества.

Пусть дано множество X. Тогда конечной последователь-ностью его элементов называют функцию n 7→ x(n), n ∈{1, . . . , N}, x(n) ∈ X. Элемент x(n) называют членом после-довательности с номером n, а натуральное число N ∈ N на-зывается их общим количеством.

2

АТД “Список”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

Реализация списка с помощью массива

4

Реализация списка с помощью массива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

Реализация списка с помощью массива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

Реализация списка с помощью указателей

7

Реализация списка с помощью указателей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 result14 }15 }

8

Реализация списка с помощью указателей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

Реализация списка с помощью указателей: Вставка

10

Реализация списка с помощью указателей: Удаление

11

Дважды связанный список

1 class PointerListElement {2 public object data = null;3 public PointerListElement next = null;4 public PointerListElement previous = null;5 }

12

Стек

13

Стек - это специальный тип списка, в котором все вставки иудаления выполняются только на одном конце, называемомвершиной.

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

Реализация стека с помощью массива

15

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

Очередь - это специальный тип списка, в котором все встав-ки выполняются с одного конца, а удаления с другого.

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

Реализация очереди с помощью указателей1 class PointerQueue {2 PointerListElement front, rear;3 void enqueue(object o) {4 PointerListElement newElement =5 new PointerListElement();6 newElement.data = o;7 newElement.next = null;8 rear.next = newElement;9 rear = newElement;10 }11 void isEmpty() {12 return front == rear;13 }14 }

18

19

Реализация очереди с помощью циклического массива

20

Реализация очереди с помощью циклического массива1 class ArrayQueue {2 private final int MAX_COUNT = 1000;3 private Object[] objects = new Object[MAX_COUNT];4 int front = 0, rear = MAX_COUNT - 1;5 void enqueue(Object o) {6 if ((rear + 2) % MAX_COUNT == front) {7 error(‘‘Очередь полная’’);8 } else {9 rear = (rear + 1) % MAX_COUNT;10 objects[rear] = o;11 }12 }13 void isEmpty() {14 return (rear + 1) % MAX_COUNT == front;15 }16 }

21

Отображение - это функция определенная на множествеэлементов (области определения) одного типа, и принимаю-щая значения из множества элементов (области значений)другого типа.

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

Список литературы

• Ахо А., Хопкрофт Д., Ульман Д. Структуры данных иалгоритмы. - М. : Издательский дом “Вильямс”, 2000.сс.45-76.

• Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К. Алгорит-мы: построение и анализ, 2-е издание. - М. : Издатель-ский дом “Вильямс”, 2007. сс.260-268.

• Кнут Д, Искусство программирования, том 1. Основныеалгоритмы, 3-е изд. - М. : Издательский дома “Вильямс”,2000. сс.277-351.

23