SlideShare une entreprise Scribd logo
1  sur  25
Анализ комбинаторных
алгоритмов
Лекция №3
Элементарные
структуры данных
Часть I
Общие понятия
 Изменяющиеся множества принято называть
динамическими.
 Структура данных, поддерживающая операции
добавления и удаления элементов, а также
позволяющая проверить принадлежность
элемента динамическому множеству,
называется словарем.
 Обычно, элемент множества – запись. Одно из
полей служит для идентификации и называется
Общие понятия
 Во многих случаях все ключи элементов
различны (уникальны), и тогда множество
можно рассматривать как функцию, которая
каждому значению ключа ставит в соот-
ветствие дополнительную информацию.
 Часто у ключей имеется естественный
линейный порядок. В таком случае можно
говорить о максимуме, минимуме, а также
следующем и предыдущем элементе
множества.
Общие понятия
 Поиск элемента с ключом k.
 Вставка нового элемента.
 Удаление элемента.
 Получение минимального элемента.
 Получение максимального элемента.
 Получение следующего элемента.
 Получение предыдущего элемента.
Основные операции с множествами:
Связанные списки
 Связанные списки являются способом
хранения динамических множеств, при
котором элементы множества линейно
упорядочены, но порядок определяется не
номерами, как в массиве, а указателями
(ссылками).
 Связанные списки позволяют реализовать все
основные операции над динамическим
множеством.
Связанные списки
 Если каждый элемент списка содержит ссылку
на следующий элемент, то список –
односторонне связанный.
 В двусторонне связанном списке каждый
элемент содержит ссылки на предыдущий и
следующий элементы.
9 16 258
9 16 258
ключ следующий
ключ следующийпредыдущий
Связанные списки
 Если ссылка на предыдущий элемент пуста
(равна NULL), то этот элемент – голова
списка.
 Если ссылка на следующий элемент пуста
(равна NULL), то этот элемент – хвост списка.
 Для того, чтобы иметь доступ к любому
элементу списка, достаточно иметь
переменную, ссылающуюся на его голову.
Связанные списки
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;
Связанные списки
void ListInsert(head,x){
x->next = head;
x->prev = null;
if(head!=null) {
head->prev = x;
}
head=x;
}
16
25
8
голова
Добавляемый
элемент
Связанные списки
void ListDelete(head,x){
if(x->prev!=null) {
x->prev->next =
x->next; }
else{ head = x->next};
if(x->next!=null) {
x->next->prev =
x->prev;
}
16
25
8
Удаляемый
элемент
Преимущества связанных списков
 Снимается ограничение на общий размер
элементов (по сравнению с массивами).
 Возможность объединения в список
разнотипных элементов.
 Возможность реализации разреженных
массивов данных.
 Возможность простой организации
специфических структур (кольцевой список,
очередь, стек).
Кольцевой список
 В кольцевом списке следующим элементом
для хвоста является голова списка, и наоборот
предыдущим элементом для головы - хвост.
9
16
25
8
голова
хвост
Очереди
 Очередь представляет собой линейный
список, доступ к элементам которого
осуществляется по принципу FIFO (first-in,
first-out).
 Вновь добавленный элемент стоит в голове
очереди.
 Удаляется только элемент, стоящий в хвосте
очереди.
Системы массового обслуживания
 Модели систем массового обслуживания
(СМО, Q-схемы) предназначены для
организации и описания ситуации, когда
имеется определенный ресурс, которым
пытается воспользоваться некоторое
ограниченное число конкурирующих сторон.
 Очередь является основополагающим
понятием теории СМО.
Системы массового обслуживания
Д1 Д2
П1
П2
Пn
Потоки
задач
Диспетчер-
постановка в
очередь
Q1
Q2
Qn
p1
p2
pn
Очереди
Выборка задач
Обслуживающие
устройства
Системы массового обслуживания
СМО описывается тремя компонентами:
 Поток поступающих задач.
 Процесс обслуживания заявок (решения
задач).
 Дисциплина обслуживания, которая
описывает способ разрешения конфликта, т.е.
процедуру доступа вызовов к
обслуживающему устройству.
Стеки
 Стек (магазин) - представляет собой
линейный список, доступ к элементам
которого осуществляется по принципу LIFO
(last-in, first-out).
 Вновь добавленный элемент стоит в голове
стека.
 Удаляется только элемент стоящий в голове
стека.
Дискретная задача о рюкзаке
 Пусть вор пробрался на склад, на котором
хранится n вещей. Вещь с номером I стоит v
рублей весит w килограмм. Максимальный
вес, который он может унести, равен W. Вещи
ломать и дробить нельзя. Какие вещи должен
положить в рюкзак вор, чтобы получить
больше денег?
Дискретная задача о рюкзаке
№ 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
…
Дискретная задача о рюкзаке
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;}
}
}
Стеки
 Стековая структура применяется в основной
архитектуре ЭВМ. При вызове подпрограмм
(процедур, функций) их параметры
помещаются в системный стек, а потом
извлекаются оттуда.
 Практически любую процедуру,
использующую стековую структуру, можно
записать в рекуррентной форме.
Дискретная задача о рюкзаке
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;
}
}
}
Дискретная задача о рюкзаке
 Подобные алгоритмы принято называть
алгоритмами поиска с возвратом или
бэктрекинга.
 Подобный подход можно применить в задаче
поиска выхода из лабиринта или обхода
препятствий на плоскости.
Поиск пути в лабиринте.
Для реализации алгоритма поиска пути в
лабиринте следует изменить исходный
алгоритм следующим образом:
 Хранить в стеке (считать ключом) не одно
число (порядковый номер), а пару чисел
<x,y> (координаты).
 Установить правила изменения координат и их
очередность.
 Проверять возможность осуществления
каждого шага, используя матрицу лабиринта.
Поиск пути в лабиринте.
1 1 1 1 1 2 2 *1
1 2 2 2 1 2 2 1
1 1 2 1 1 1 1 1
2 2 2 1 2 2 2
2 1 2 1 2 2
2 1 1 1 2
2 1 2 2 2 2 2
*1 1
1
2
3
4

Contenu connexe

Tendances

Лекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные спискиЛекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные списки
Mikhail Kurnosov
 
Алгоритмы и структуры данных осень 2013 лекция 3
Алгоритмы и структуры данных осень 2013 лекция 3Алгоритмы и структуры данных осень 2013 лекция 3
Алгоритмы и структуры данных осень 2013 лекция 3
Technopark
 
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)
Mikhail Kurnosov
 
Лекция 7: Бинарные кучи (пирамиды)
Лекция 7: Бинарные кучи (пирамиды)Лекция 7: Бинарные кучи (пирамиды)
Лекция 7: Бинарные кучи (пирамиды)
Mikhail Kurnosov
 
Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)
Mikhail Kurnosov
 
Лекция 4: Стек. Очередь
Лекция 4: Стек. ОчередьЛекция 4: Стек. Очередь
Лекция 4: Стек. Очередь
Mikhail Kurnosov
 

Tendances (20)

List - списки
List - списки List - списки
List - списки
 
Лекция 6 Элементарные структуры данных часть 4
Лекция 6 Элементарные структуры данных часть 4Лекция 6 Элементарные структуры данных часть 4
Лекция 6 Элементарные структуры данных часть 4
 
Лекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные спискиЛекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные списки
 
Олег Алистратов — Сортировка списков в Perl и Python
Олег Алистратов — Сортировка списков в Perl и PythonОлег Алистратов — Сортировка списков в Perl и Python
Олег Алистратов — Сортировка списков в Perl и Python
 
Алгоритмы и структуры данных осень 2013 лекция 3
Алгоритмы и структуры данных осень 2013 лекция 3Алгоритмы и структуры данных осень 2013 лекция 3
Алгоритмы и структуры данных осень 2013 лекция 3
 
Lec 4
Lec 4Lec 4
Lec 4
 
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)
 
Алгоритмы поиска и сортировки
Алгоритмы  поиска и сортировкиАлгоритмы  поиска и сортировки
Алгоритмы поиска и сортировки
 
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
 
03 двоичные деревья поиска и очередь с приоритетами
03 двоичные деревья поиска и очередь с приоритетами03 двоичные деревья поиска и очередь с приоритетами
03 двоичные деревья поиска и очередь с приоритетами
 
Лекция 7: Бинарные кучи (пирамиды)
Лекция 7: Бинарные кучи (пирамиды)Лекция 7: Бинарные кучи (пирамиды)
Лекция 7: Бинарные кучи (пирамиды)
 
C++ Базовый. Занятие 06.
C++ Базовый. Занятие 06.C++ Базовый. Занятие 06.
C++ Базовый. Занятие 06.
 
Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)
 
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
 
Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)
 
Лекция 10. Биномиальные кучи (Binomial heaps)
Лекция 10. Биномиальные кучи (Binomial heaps)Лекция 10. Биномиальные кучи (Binomial heaps)
Лекция 10. Биномиальные кучи (Binomial heaps)
 
Лекция 4. Стеки и очереди
Лекция 4. Стеки и очередиЛекция 4. Стеки и очереди
Лекция 4. Стеки и очереди
 
Лекция 5. Бинарные деревья поиска
Лекция 5. Бинарные деревья поискаЛекция 5. Бинарные деревья поиска
Лекция 5. Бинарные деревья поиска
 
Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)
 
Лекция 4: Стек. Очередь
Лекция 4: Стек. ОчередьЛекция 4: Стек. Очередь
Лекция 4: Стек. Очередь
 

Similaire à Лекция 3 Элементарные структуры данных Часть 1

Лекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные спискиЛекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные списки
Mikhail Kurnosov
 
Лекция 4: Стеки и очереди
Лекция 4: Стеки и очередиЛекция 4: Стеки и очереди
Лекция 4: Стеки и очереди
Mikhail Kurnosov
 
Scala and LiftWeb presentation (Russian)
Scala and LiftWeb presentation (Russian)Scala and LiftWeb presentation (Russian)
Scala and LiftWeb presentation (Russian)
Dmitry Stropalov
 
Multiprocessor Programming Intro (lecture 3)
Multiprocessor Programming Intro (lecture 3)Multiprocessor Programming Intro (lecture 3)
Multiprocessor Programming Intro (lecture 3)
Dmitry Tsitelov
 
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?
tfmailru
 
Java осень 2013 лекция 2
Java осень 2013 лекция 2Java осень 2013 лекция 2
Java осень 2013 лекция 2
Technopark
 

Similaire à Лекция 3 Элементарные структуры данных Часть 1 (20)

Lecture 2
Lecture 2Lecture 2
Lecture 2
 
Персистентные структуры данных и архитектура
Персистентные структуры данных и архитектураПерсистентные структуры данных и архитектура
Персистентные структуры данных и архитектура
 
Лекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные спискиЛекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные списки
 
Лекция 4: Стеки и очереди
Лекция 4: Стеки и очередиЛекция 4: Стеки и очереди
Лекция 4: Стеки и очереди
 
Лекция 2. Алгоритмы сортировки
Лекция 2. Алгоритмы сортировкиЛекция 2. Алгоритмы сортировки
Лекция 2. Алгоритмы сортировки
 
Java Core. Lecture# 4. Collections.
Java Core. Lecture# 4. Collections.Java Core. Lecture# 4. Collections.
Java Core. Lecture# 4. Collections.
 
[JAM 1.1] Clean Code (Paul Malikov)
[JAM 1.1] Clean Code (Paul Malikov)[JAM 1.1] Clean Code (Paul Malikov)
[JAM 1.1] Clean Code (Paul Malikov)
 
01 линейные структуры данных
01 линейные структуры данных01 линейные структуры данных
01 линейные структуры данных
 
Sergii Tsypanov "Performance 1001 Tips"
Sergii Tsypanov "Performance 1001 Tips"Sergii Tsypanov "Performance 1001 Tips"
Sergii Tsypanov "Performance 1001 Tips"
 
Лекция 7. Бинарные кучи. Пирамидальная сортировка
Лекция 7. Бинарные кучи. Пирамидальная сортировкаЛекция 7. Бинарные кучи. Пирамидальная сортировка
Лекция 7. Бинарные кучи. Пирамидальная сортировка
 
Scala and LiftWeb presentation (Russian)
Scala and LiftWeb presentation (Russian)Scala and LiftWeb presentation (Russian)
Scala and LiftWeb presentation (Russian)
 
Лекция 5. Встроенные коллекции и модуль collections.
Лекция 5. Встроенные коллекции и модуль collections.Лекция 5. Встроенные коллекции и модуль collections.
Лекция 5. Встроенные коллекции и модуль collections.
 
Multiprocessor Programming Intro (lecture 3)
Multiprocessor Programming Intro (lecture 3)Multiprocessor Programming Intro (lecture 3)
Multiprocessor Programming Intro (lecture 3)
 
Основы языка R
Основы языка RОсновы языка R
Основы языка R
 
C++ STL & Qt. Занятие 01.
C++ STL & Qt. Занятие 01.C++ STL & Qt. Занятие 01.
C++ STL & Qt. Занятие 01.
 
Scala - my path
Scala - my pathScala - my path
Scala - my path
 
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?
 
Swift School #2
Swift School #2Swift School #2
Swift School #2
 
Java осень 2013 лекция 2
Java осень 2013 лекция 2Java осень 2013 лекция 2
Java осень 2013 лекция 2
 
Python и его тормоза
Python и его тормозаPython и его тормоза
Python и его тормоза
 

Plus de simple_people

Plus de simple_people (16)

Лекция 15 Поиск подстрок
Лекция 15 Поиск подстрокЛекция 15 Поиск подстрок
Лекция 15 Поиск подстрок
 
Лекция 16 Вычислительная геометрия
Лекция 16 Вычислительная геометрияЛекция 16 Вычислительная геометрия
Лекция 16 Вычислительная геометрия
 
Лекция 17 Арифметические схемы
Лекция 17 Арифметические схемыЛекция 17 Арифметические схемы
Лекция 17 Арифметические схемы
 
Лекция 7 Элементарные структуры данных часть 5
Лекция 7 Элементарные структуры данных часть 5Лекция 7 Элементарные структуры данных часть 5
Лекция 7 Элементарные структуры данных часть 5
 
Лекция 14 Матрицы
Лекция 14 МатрицыЛекция 14 Матрицы
Лекция 14 Матрицы
 
Лекция 13 Теоретико-числовые алгоритмы Часть 2
Лекция 13 Теоретико-числовые алгоритмы Часть 2Лекция 13 Теоретико-числовые алгоритмы Часть 2
Лекция 13 Теоретико-числовые алгоритмы Часть 2
 
Лекция 11 Приближенные алгоритмы
Лекция 11 Приближенные алгоритмыЛекция 11 Приближенные алгоритмы
Лекция 11 Приближенные алгоритмы
 
Лекция 12 Теоретико-числовые алгоритмы Часть 1
Лекция 12 Теоретико-числовые алгоритмы Часть 1Лекция 12 Теоретико-числовые алгоритмы Часть 1
Лекция 12 Теоретико-числовые алгоритмы Часть 1
 
Лекция 10 NP-полнота
Лекция 10 NP-полнотаЛекция 10 NP-полнота
Лекция 10 NP-полнота
 
Лекция 9 Жадные алгоритмы
Лекция 9 Жадные алгоритмыЛекция 9 Жадные алгоритмы
Лекция 9 Жадные алгоритмы
 
Лекция 8 Динамическое программирование
Лекция 8 Динамическое программированиеЛекция 8 Динамическое программирование
Лекция 8 Динамическое программирование
 
Лекция 4 Элементарные структуры данных часть 2
Лекция 4 Элементарные структуры данных часть 2Лекция 4 Элементарные структуры данных часть 2
Лекция 4 Элементарные структуры данных часть 2
 
Лекция 5 Элементарные структуры данных часть 3
Лекция 5 Элементарные структуры данных часть 3Лекция 5 Элементарные структуры данных часть 3
Лекция 5 Элементарные структуры данных часть 3
 
Лекция 2 Сортировки, поиск и порядковые статистики
Лекция 2 Сортировки, поиск и порядковые статистикиЛекция 2 Сортировки, поиск и порядковые статистики
Лекция 2 Сортировки, поиск и порядковые статистики
 
Лекция 1 Скорость роста функций
Лекция 1 Скорость роста функцийЛекция 1 Скорость роста функций
Лекция 1 Скорость роста функций
 
Мобильные Сервисные Службы
Мобильные Сервисные СлужбыМобильные Сервисные Службы
Мобильные Сервисные Службы
 

Лекция 3 Элементарные структуры данных Часть 1

  • 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;
  • 9. Связанные списки void ListInsert(head,x){ x->next = head; x->prev = null; if(head!=null) { head->prev = x; } head=x; } 16 25 8 голова Добавляемый элемент
  • 10. Связанные списки void ListDelete(head,x){ if(x->prev!=null) { x->prev->next = x->next; } else{ head = x->next}; if(x->next!=null) { x->next->prev = x->prev; } 16 25 8 Удаляемый элемент
  • 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> (координаты).  Установить правила изменения координат и их очередность.  Проверять возможность осуществления каждого шага, используя матрицу лабиринта.
  • 25. Поиск пути в лабиринте. 1 1 1 1 1 2 2 *1 1 2 2 2 1 2 2 1 1 1 2 1 1 1 1 1 2 2 2 1 2 2 2 2 1 2 1 2 2 2 1 1 1 2 2 1 2 2 2 2 2 *1 1 1 2 3 4