Абстрактные типы данных. Списки
-
Upload
olga-maksimenkova -
Category
Education
-
view
231 -
download
5
Transcript of Абстрактные типы данных. Списки
![Page 1: Абстрактные типы данных. Списки](https://reader034.fdocuments.net/reader034/viewer/2022051318/587ac62a1a28ab760f8b45ab/html5/thumbnails/1.jpg)
ВВЕДЕНИЕ ВПРОГРАММИРОВАНИЕ
ЛЕКЦИЯ 8
АБСТРАКТНЫЕ ТИПЫ ДАННЫХ
НЕКОТОРЫЕ ВИДЫ ПОСЛЕДОВАТЕЛЬНОСТЕЙ
СПИСКИ
1Максименкова О.В., 2015
![Page 2: Абстрактные типы данных. Списки](https://reader034.fdocuments.net/reader034/viewer/2022051318/587ac62a1a28ab760f8b45ab/html5/thumbnails/2.jpg)
НЕМНОГО ОБ АБСТРАКТНЫХТИПАХ ДАННЫХ
ДЕК, СТЕК, ОЧЕРЕДЬ
Максименкова О.В., 2015 2
![Page 3: Абстрактные типы данных. Списки](https://reader034.fdocuments.net/reader034/viewer/2022051318/587ac62a1a28ab760f8b45ab/html5/thumbnails/3.jpg)
АБСТРАКТНЫЕ ТИПЫ ДАННЫХ
Максименкова О.В., 2015 3
• АБСТРАКТНЫЙ ТИП ДАННЫХ (АТД) [ABSTRACT LOGIC DESIGN] –
ФУНКЦИОНАЛЬНОЕ ОПИСАНИЕ НЕКОТОРОГО КЛАССА СУЩНОСТЕЙ В
ТЕРМИНАХ ОПЕРАЦИЙ, КОТОРЫЕ МОГУТ ВЫПОЛНЯТЬСЯ НАД НИМИ.
• ИНТЕРФЕЙС АТД – ФОРМАЛЬНОЕ И ОДНОЗНАЧНОЕ ОПИСАНИЕ
СИНТАКСИСА И СЕМАНТИКИ ОПЕРАЦИЙ, КОТОРЫЕ МОГУТ ВЫПОЛНЯТЬСЯ
НАД ЭКЗЕМПЛЯРАМИ АТД.
ТАК ЖЕ, КАК ОПИСАНИЕ ЯЗЫКА ПРОГРАММИРОВАНИЯ
НЕ ОПРЕДЕЛЯЕТ ОСОБЕННОСТИ ЕГО РЕАЛИЗАЦИИ, ТАК
И ИНТЕРФЕЙС АТД НЕ ОПРЕДЕЛЯЕТ РЕАЛИЗАЦИЮ АТД.
![Page 4: Абстрактные типы данных. Списки](https://reader034.fdocuments.net/reader034/viewer/2022051318/587ac62a1a28ab760f8b45ab/html5/thumbnails/4.jpg)
КОНТЕЙНЕР
Максименкова О.В., 2015 4
• КОНТЕЙНЕР [CONTAINER] – АБСТРАКТНЫЙ ТИП ДАННЫХ,
ПРЕДСТАВЛЯЮЩИЙ СОБОЙ СТРУКТУРИРОВАННУЮ КОЛЛЕКЦИЮ
ИНФОРМАЦИОННЫХ ЭЛЕМЕНТОВ, ДОСТУП К КОТОРЫМ ОПРЕДЕЛЯЕТСЯ
СТРУКТУРОЙ КОНТЕЙНЕРА.
• ДОБАВЛЕНИЕ И УДАЛЕНИЕ ЭЛЕМЕНТОВ КОНТЕЙНЕРА НАЗОВЁМ ЕГО
ТРАНСФОРМАЦИЕЙ.
• ДОСТУП К ЭЛЕМЕНТУ КОНТЕЙНЕРА – ОПЕРАЦИЯ ПОЛУЧЕНИЯ ИЛИ
ИЗМЕНЕНИЯ ЗНАЧЕНИЯ ЭТОГО ЭЛЕМЕНТА.
• ПОСЛЕДОВАТЕЛЬНОСТЬ [SEQUENCE] – КОНТЕЙНЕР, В КОТОРОМ
ЭЛЕМЕНТЫ УПОРЯДОЧЕНЫ ПО ИНДЕКСАМ (ПРОНУМЕРОВАНЫ).
![Page 5: Абстрактные типы данных. Списки](https://reader034.fdocuments.net/reader034/viewer/2022051318/587ac62a1a28ab760f8b45ab/html5/thumbnails/5.jpg)
НЕКОТОРЫЕ ВИДЫПОСЛЕДОВАТЕЛЬНОСТЕЙ
• ВЕКТОР [VECTOR]
• ПОСЛЕДОВАТЕЛЬНОСТЬ, В КОТОРОЙ ВОЗМОЖЕН ДОСТУП К
ЛЮБОМУ ЭЛЕМЕНТУ ПО ИНДЕКСУ ЭЛЕМЕНТА
• ДЕК
• СТЕК
• ОЧЕРЕДЬ
Максименкова О.В., 2015 5
ДАЛЕЕ ПОДРОБНЕЕ….
![Page 6: Абстрактные типы данных. Списки](https://reader034.fdocuments.net/reader034/viewer/2022051318/587ac62a1a28ab760f8b45ab/html5/thumbnails/6.jpg)
ДЕК
Максименкова О.В., 2015 6
ДЕК [DEQUE, DOUBLE ENDED QUEUE] – ПОСЛЕДОВАТЕЛЬНОСТЬ, В
КОТОРОЙ ВОЗМОЖНЫ ТОЛЬКО:
1. ДОСТУП: К КОНЦЕВЫМ ЭЛЕМЕНТАМ;
2. ДОБАВЛЕНИЕ: ДО НАЧАЛЬНОГО И ПОСЛЕ КОНЕЧНОГО ЭЛЕМЕНТА;
3. УДАЛЕНИЕ: КОНЦЕВЫХ ЭЛЕМЕНТОВ.
Рисунок взят из статьи о Деке с сайта Kvodo [http://kvodo.ru/deque.html]
![Page 7: Абстрактные типы данных. Списки](https://reader034.fdocuments.net/reader034/viewer/2022051318/587ac62a1a28ab760f8b45ab/html5/thumbnails/7.jpg)
СТЕК
Максименкова О.В., 2015 7
СТЕК [STACK] – ДЕК, В КОТОРОМ ВОЗМОЖНЫ ТОЛЬКО:
1. ДОСТУП: К КОНЕЧНОМУ ЭЛЕМЕНТУ;
2. ДОБАВЛЕНИЕ: ПОСЛЕ КОНЕЧНОГО ЭЛЕМЕНТА;
3. УДАЛЕНИЕ: КОНЕЧНОГО ЭЛЕМЕНТА.
КОНЕЧНЫЙ ЭЛЕМЕНТ СТЕКА НАЗЫВАЮТ ВЕРШИНОЙ СТЕКА.
удалениеpopдобавление
push
![Page 8: Абстрактные типы данных. Списки](https://reader034.fdocuments.net/reader034/viewer/2022051318/587ac62a1a28ab760f8b45ab/html5/thumbnails/8.jpg)
ОЧЕРЕДЬ
Максименкова О.В., 2015 8
ОЧЕРЕДЬ [QUEUE] – ДЕК, В КОТОРОМ ВОЗМОЖНЫ ТОЛЬКО:
1. ДОСТУП: К НАЧАЛЬНОМУ ЭЛЕМЕНТУ;
2. ДОБАВЛЕНИЕ: ПОСЛЕ КОНЕЧНОГО ЭЛЕМЕНТА;
3. УДАЛЕНИЕ: НАЧАЛЬНОГО ЭЛЕМЕНТА.
КОНЕЧНЫЙ ЭЛЕМЕНТ ОЧЕРЕДИ ЧАСТО НАЗЫВАЮТ ХВОСТОМ ОЧЕРЕДИ,
А НАЧАЛЬНЫЙ – ГОЛОВОЙ ОЧЕРЕДИ. удалениеpop
добавлениеpush
![Page 9: Абстрактные типы данных. Списки](https://reader034.fdocuments.net/reader034/viewer/2022051318/587ac62a1a28ab760f8b45ab/html5/thumbnails/9.jpg)
ТРАНСФОРМАЦИИ СТЕКА И ОЧЕРЕДИ
Максименкова О.В., 2015 9
ТИПЫ ТРАНСФОРМАЦИЙ СТЕКА И ОЧЕРЕДИ ЧАСТО ОБОЗНАЧАЮТ
АББРЕВИАТУРАМИ:
• LIFO (LAST IN – FIRST OUT, ПОСЛЕДНИМ ПРИШЁЛ – ПЕРВЫМ ВЫШЕЛ)
• FIFO (FIRST IN – FIRST OUT, ПЕРВЫМ ПРИШЁЛ – ПЕРВЫМ ВЫШЕЛ).
http://neerc.ifmo.ru/wiki/index.php?title=Очередь
![Page 10: Абстрактные типы данных. Списки](https://reader034.fdocuments.net/reader034/viewer/2022051318/587ac62a1a28ab760f8b45ab/html5/thumbnails/10.jpg)
ПРИМЕР РЕАЛИЗАЦИИ СТЕКА
Максименкова О.В., 2015 10
class Stack {// вершина стека - последний элемент массиваint[] stack; // массив для элементовpublic void Push(int x) {
if (stack == null) {stack = new int[] { x };return;
}Array.Resize(ref stack, stack.Length + 1);stack[stack.Length - 1] = x;
}public void Pop () {
if (stack == null) return;if (stack.Length == 1) { stack = null; return; }Array.Resize(ref stack, stack.Length - 1);
}}
![Page 11: Абстрактные типы данных. Списки](https://reader034.fdocuments.net/reader034/viewer/2022051318/587ac62a1a28ab760f8b45ab/html5/thumbnails/11.jpg)
КОНСТРУКТОР И ВСПОМОГАТЕЛЬНЫЙМЕТОД
Максименкова О.В., 2015 11
public Stack() { stack = null; }public string ToString() {
if (stack == null) return "Стек пуст";// выводить будем в привычном порядке слева на правоstring tmp = "Stack: ";for (int i = stack.Length - 1; i > 0; i--)
tmp += (stack[i]+" -> ");tmp += stack[0];return tmp;
}
Пример реализации стека в рамках структурного подхода [http://neerc.ifmo.ru/wiki/index.php?title=Стек]
![Page 12: Абстрактные типы данных. Списки](https://reader034.fdocuments.net/reader034/viewer/2022051318/587ac62a1a28ab760f8b45ab/html5/thumbnails/12.jpg)
КОД ДЛЯ ОТЛАДКИ ОБЪЕКТА КЛАССАSTACK
Максименкова О.В., 2015 12
Stack example = new Stack();Console.WriteLine(example.ToString());example.Push(13);Console.WriteLine(example.ToString());example.Pop(); Console.WriteLine(example.ToString());example.Push(1);example.Push(2);example.Push(3);Console.WriteLine(example.ToString());
Стек пустStack: 13Стек пустStack: 3 -> 2 -> 1
![Page 13: Абстрактные типы данных. Списки](https://reader034.fdocuments.net/reader034/viewer/2022051318/587ac62a1a28ab760f8b45ab/html5/thumbnails/13.jpg)
СПИСКИОДНОСВЯЗНЫЙ И ДВУСВЯЗНЫЙ СПИСОК
Максименкова О.В., 2015 13
![Page 14: Абстрактные типы данных. Списки](https://reader034.fdocuments.net/reader034/viewer/2022051318/587ac62a1a28ab760f8b45ab/html5/thumbnails/14.jpg)
СПИСОК
• СПИСОК ПРЕДСТАВЛЯЕТ СОБОЙ ТАКУЮ РЕАЛИЗАЦИЮ
ПОСЛЕДОВАТЕЛЬНОСТИ ОДНОТИПНЫХ ЭЛЕМЕНТОВ, КОГДА ЭЛЕМЕНТЫ
СВЯЗАНЫ ДРУГ С ДРУГОМ ПОСРЕДСТВОМ ССЫЛОК.
• КАЖДЫЙ ЭЛЕМЕНТ СПИСКА СОДЕРЖИТ НЕ ТОЛЬКО ИНФОРМАЦИОННОЕ
ПОЛЕ, НО ОДНО ИЛИ БОЛЕЕ ПОЛЕЙ СО ССЫЛКАМИ НА ДРУГИЕ
ЭЛЕМЕНТЫ.
Максименкова О.В., 2015 14
![Page 15: Абстрактные типы данных. Списки](https://reader034.fdocuments.net/reader034/viewer/2022051318/587ac62a1a28ab760f8b45ab/html5/thumbnails/15.jpg)
НАИБОЛЕЕ РАСПРОСТРАНЁННЫЕ СПИСКИ
• ОДНОСВЯЗНЫЕ СПИСКИ: КАЖДЫЙ ЭЛЕМЕНТ, КРОМЕ ПОСЛЕДНЕГО,
СОДЕРЖИТ ССЫЛКУ НА СЛЕДУЮЩИЙ, ПОСЛЕДНИЙ ЭЛЕМЕНТ
ССЫЛАЕТСЯ НА NULL
• ДВУХСВЯЗНЫЕ СПИСКИ: КАЖДЫЙ ЭЛЕМЕНТ, КРОМЕ ПЕРВОГО И
ПОСЛЕДНЕГО, СОДЕРЖИТ ССЫЛКИ НА ПРЕДЫДУЩИЙ И СЛЕДУЮЩИЙ
Максименкова О.В., 2015 15
![Page 16: Абстрактные типы данных. Списки](https://reader034.fdocuments.net/reader034/viewer/2022051318/587ac62a1a28ab760f8b45ab/html5/thumbnails/16.jpg)
ОДНОСВЯЗНЫЙ СПИСОК
Максименкова О.В., 2015 16
Value Value Value null ...
Начало списка [Top]
5 7 10 null ...
foo bar baz null ...
Примеры
![Page 17: Абстрактные типы данных. Списки](https://reader034.fdocuments.net/reader034/viewer/2022051318/587ac62a1a28ab760f8b45ab/html5/thumbnails/17.jpg)
Максименкова О.В., 2015 17
Value Value Value null ...
Начало списка [Top]
public class MyListItem {// значение элементаpublic int Value { get; set; }//ссылка на следующий элемент спискаpublic MyListItem Next { get; set; }public MyList() { }public MyList(int val) {
Value = val;Next = null;
}}
Промоделируем элемент односвязного списка
![Page 18: Абстрактные типы данных. Списки](https://reader034.fdocuments.net/reader034/viewer/2022051318/587ac62a1a28ab760f8b45ab/html5/thumbnails/18.jpg)
Максименкова О.В., 2015 18
MyListItem head = new MyListItem(1);head.Next = new MyListItem(2);head.Next.Next = new MyListItem(3);head.Next.Next.Next = new MyListItem(4);
MyListItem tmp = head;while(tmp != null) {
Console.WriteLine(tmp.Value);tmp = tmp.Next;
}
![Page 19: Абстрактные типы данных. Списки](https://reader034.fdocuments.net/reader034/viewer/2022051318/587ac62a1a28ab760f8b45ab/html5/thumbnails/19.jpg)
ВСТАВКА ЭЛЕМЕНТА В ОДНОСВЯЗНЫЙСПИСОК
Максименкова О.В., 2015 19
ПУСТЬ ИМЕЕТСЯ НЕКОТОРЫЙ ОДНОСВЯЗНЫЙ СПИСОК И ССЫЛКА Р НАЭЛЕМЕНТ, ПОСЛЕ КОТОРОГО МЫ ХОТИМ ВСТАВИТЬ НОВЫЙ ЭЛЕМЕНТ.
Value Value ...
n n+1
...
Предшествующий
элемент
Состояние списка перед добавление элемента
1. создание нового элемента2. присвоение значений его полям3. добавление связи с элементом, следующим за P4. добавление связи с элементом P
Алгоритм добавления элемента
![Page 20: Абстрактные типы данных. Списки](https://reader034.fdocuments.net/reader034/viewer/2022051318/587ac62a1a28ab760f8b45ab/html5/thumbnails/20.jpg)
СОЗДАНИЕ ЭЛЕМЕНТА
Максименкова О.В., 2015 20
?
Новый элемент [Tmp]
?
New
Новый элемент [Tmp]
?
1. Создание нового элемента
2. Присвоение значений его полям
MyListItem Tmp = new MyListItem();
Tmp.Value = 2;
![Page 21: Абстрактные типы данных. Списки](https://reader034.fdocuments.net/reader034/viewer/2022051318/587ac62a1a28ab760f8b45ab/html5/thumbnails/21.jpg)
ДОБАВЛЕНИЕ СВЯЗЕЙ
Максименкова О.В., 2015 21
Value Value ...
n n+1
...
New
Новый элемент [Tmp]
Предшествующий
элемент [P]
Value Value ...
n n+1
...
New
Новый элемент [Tmp]
Предшествующий
элемент [P]
3. добавление связи с элементом, следующим за P
4. добавление связи с элементом P
Tmp.Next = p.Next;
p.Next = Tmp;
![Page 22: Абстрактные типы данных. Списки](https://reader034.fdocuments.net/reader034/viewer/2022051318/587ac62a1a28ab760f8b45ab/html5/thumbnails/22.jpg)
УДАЛЕНИЕ ЭЛЕМЕНТА ИЗ ОДНОСВЯЗНОГОСПИСКА
Максименкова О.В., 2015 22
ПУСТЬ ИМЕЕТСЯ НЕКОТОРЫЙ ОДНОСВЯЗНЫЙ СПИСОК И ССЫЛКА Р НАЭЛЕМЕНТ, ПРЕДШЕСТВУЮЩИЙ ТОМУ, КОТОРЫЙ МЫ ХОТИМ УДАЛИТЬ.
Состояние списка перед удалением элемента
1. добавление связи между P и следующим за удаляемым элементом
Алгоритм удаления элемента
Value Value
n n+1
...
Предшествующий
элемент [P]
Value ...
n+2
![Page 23: Абстрактные типы данных. Списки](https://reader034.fdocuments.net/reader034/viewer/2022051318/587ac62a1a28ab760f8b45ab/html5/thumbnails/23.jpg)
ИЗМЕНЕНИЕ ССЫЛОК
Максименкова О.В., 2015 23
Value
Value
nn+1
...
Предшествующий
элемент [P]
Value ...
n+2
Удаляется сборщиком
мусора
![Page 24: Абстрактные типы данных. Списки](https://reader034.fdocuments.net/reader034/viewer/2022051318/587ac62a1a28ab760f8b45ab/html5/thumbnails/24.jpg)
Максименкова О.В., 2015 24
public void AddNext(MyListItem newItem) {// нужно заменить ссылкиnewItem.Next = this.Next;this.Next = newItem;
}
Немного упростим добавление элемента, добавим экземплярныйметод в класс
![Page 25: Абстрактные типы данных. Списки](https://reader034.fdocuments.net/reader034/viewer/2022051318/587ac62a1a28ab760f8b45ab/html5/thumbnails/25.jpg)
ДВУСВЯЗНЫЙ СПИСОК
Максименкова О.В., 2015 25
Value Valuenull Value ... null
Начало списка [Head] Конец списка [Tail]
5 7null 9 ... null
![Page 26: Абстрактные типы данных. Списки](https://reader034.fdocuments.net/reader034/viewer/2022051318/587ac62a1a28ab760f8b45ab/html5/thumbnails/26.jpg)
Максименкова О.В., 2015 26
Value Valuenull Value ... null
Начало списка [Head] Конец списка [Tail]
public class DoulbleLinkyItem {public int Value { get; set; }public DoulbleLinkyItem Next { get; set; }public DoulbleLinkyItem Prev { get; set; }
}
Промоделируем элемент односвязного списка
![Page 27: Абстрактные типы данных. Списки](https://reader034.fdocuments.net/reader034/viewer/2022051318/587ac62a1a28ab760f8b45ab/html5/thumbnails/27.jpg)
ЗАКОЛЬЦОВАННЫЕ СПИСКИ
Максименкова О.В., 2015 27
ЗАКОЛЬЦЕВАТЬ СПИСОК МОЖНО ПУТЁМ ИЗМЕНЕНИЯ ССЫЛКИПОСЛЕДНЕГО ЭЛЕМЕНТА ТАКИМ ОБРАЗОМ, ЧТОБЫ ОНА УКАЗЫВАЛА НАПЕРВЫЙ ЭЛЕМЕНТ И НАОБОРОТ.