2. Общие понятия
Изменяющиеся множества принято называть
динамическими.
Структура данных, поддерживающая операции
добавления и удаления элементов, а также
позволяющая проверить принадлежность
элемента динамическому множеству,
называется словарем.
Обычно, элемент множества – запись. Одно из
полей служит для идентификации и называется
3. Общие понятия
Во многих случаях все ключи элементов
различны (уникальны), и тогда множество
можно рассматривать как функцию, которая
каждому значению ключа ставит в соот-
ветствие дополнительную информацию.
Часто у ключей имеется естественный
линейный порядок. В таком случае можно
говорить о максимуме, минимуме, а также
следующем и предыдущем элементе
множества.
4. Общие понятия
Поиск элемента с ключом k.
Вставка нового элемента.
Удаление элемента.
Получение минимального элемента.
Получение максимального элемента.
Получение следующего элемента.
Получение предыдущего элемента.
Основные операции с множествами:
5. Связанные списки
Связанные списки являются способом
хранения динамических множеств, при
котором элементы множества линейно
упорядочены, но порядок определяется не
номерами, как в массиве, а указателями
(ссылками).
Связанные списки позволяют реализовать все
основные операции над динамическим
множеством.
6. Связанные списки
Если каждый элемент списка содержит ссылку
на следующий элемент, то список –
односторонне связанный.
В двусторонне связанном списке каждый
элемент содержит ссылки на предыдущий и
следующий элементы.
9 16 258
9 16 258
ключ следующий
ключ следующийпредыдущий
7. Связанные списки
Если ссылка на предыдущий элемент пуста
(равна NULL), то этот элемент – голова
списка.
Если ссылка на следующий элемент пуста
(равна NULL), то этот элемент – хвост списка.
Для того, чтобы иметь доступ к любому
элементу списка, достаточно иметь
переменную, ссылающуюся на его голову.
8. Связанные списки
struct Element{
Element* next;
int key;
Element* prev;
}
void ListSearch(head,k){
x = head;
while((x!=null)&&
(x->key!=k))
{x = x->next;}
return x;
}
Element* head;
11. Преимущества связанных списков
Снимается ограничение на общий размер
элементов (по сравнению с массивами).
Возможность объединения в список
разнотипных элементов.
Возможность реализации разреженных
массивов данных.
Возможность простой организации
специфических структур (кольцевой список,
очередь, стек).
12. Кольцевой список
В кольцевом списке следующим элементом
для хвоста является голова списка, и наоборот
предыдущим элементом для головы - хвост.
9
16
25
8
голова
хвост
13. Очереди
Очередь представляет собой линейный
список, доступ к элементам которого
осуществляется по принципу FIFO (first-in,
first-out).
Вновь добавленный элемент стоит в голове
очереди.
Удаляется только элемент, стоящий в хвосте
очереди.
14. Системы массового обслуживания
Модели систем массового обслуживания
(СМО, Q-схемы) предназначены для
организации и описания ситуации, когда
имеется определенный ресурс, которым
пытается воспользоваться некоторое
ограниченное число конкурирующих сторон.
Очередь является основополагающим
понятием теории СМО.
15. Системы массового обслуживания
Д1 Д2
П1
П2
Пn
Потоки
задач
Диспетчер-
постановка в
очередь
Q1
Q2
Qn
p1
p2
pn
Очереди
Выборка задач
Обслуживающие
устройства
16. Системы массового обслуживания
СМО описывается тремя компонентами:
Поток поступающих задач.
Процесс обслуживания заявок (решения
задач).
Дисциплина обслуживания, которая
описывает способ разрешения конфликта, т.е.
процедуру доступа вызовов к
обслуживающему устройству.
17. Стеки
Стек (магазин) - представляет собой
линейный список, доступ к элементам
которого осуществляется по принципу LIFO
(last-in, first-out).
Вновь добавленный элемент стоит в голове
стека.
Удаляется только элемент стоящий в голове
стека.
18. Дискретная задача о рюкзаке
Пусть вор пробрался на склад, на котором
хранится n вещей. Вещь с номером I стоит v
рублей весит w килограмм. Максимальный
вес, который он может унести, равен W. Вещи
ломать и дробить нельзя. Какие вещи должен
положить в рюкзак вор, чтобы получить
больше денег?
19. Дискретная задача о рюкзаке
№ 1 2 3 4
Вес 1 5 2 10
Стоимость 5 6 17 3
Общий вес < 13
3
2
1
2
3
1
4
3
1
2
4
1
3
1
2
1
3
2
…
20. Дискретная задача о рюкзаке
void knapsack(){
i=0;
while(1){
i++;
if (store[i].exist == 1){
push(stack,i); store[i].exist = 0; i=0;}
if (Weight(stack)>W) {StoreAlt(stack);}
if (i>n-1) {
if (stack.empty()) return;
i = pop(stack); store[i].exist = 1;}
}
}
21. Стеки
Стековая структура применяется в основной
архитектуре ЭВМ. При вызове подпрограмм
(процедур, функций) их параметры
помещаются в системный стек, а потом
извлекаются оттуда.
Практически любую процедуру,
использующую стековую структуру, можно
записать в рекуррентной форме.
22. Дискретная задача о рюкзаке
void knapsack(k,weight,money,print_str){
if (weight>W) {StoreAlt(weight,money,print_str);
return;}
for(i=k; i<n; i++){
if (store[i].exist == 1){
store[i].exist = 0;
knapsack(i, weight+ store[i].weight, money+
store[i].money, print_str+String(k));
store[i].exist = 1;
}
}
}
23. Дискретная задача о рюкзаке
Подобные алгоритмы принято называть
алгоритмами поиска с возвратом или
бэктрекинга.
Подобный подход можно применить в задаче
поиска выхода из лабиринта или обхода
препятствий на плоскости.
24. Поиск пути в лабиринте.
Для реализации алгоритма поиска пути в
лабиринте следует изменить исходный
алгоритм следующим образом:
Хранить в стеке (считать ключом) не одно
число (порядковый номер), а пару чисел
<x,y> (координаты).
Установить правила изменения координат и их
очередность.
Проверять возможность осуществления
каждого шага, используя матрицу лабиринта.