- •1. Понятие алгоритмической сложности
- •Примеры
- •2. Сравнить структуры данных массив и список
- •3. Сортировки. Назначение, типы, сравнение.
- •4. Стек очередь двунаправленная очередь
- •5. Деревья.
- •6. Пирамидальная сортировка
- •7. Быстрая сортировка
- •8. Алгоритм Дийкстры
- •Первый шаг
- •Второй шаг
- •10. Шаблон проектирования “фабричный метод”
- •11. Шаблон проектирования “адаптер”
- •12. Шаблон проектирования “стратегия”
- •Дополнительно к 10 – 12
8. Алгоритм Дийкстры
Алгоритм Дейкстры - алгоритм на графах. Находит кратчайшее расстояние от одной из вершин графа до всех остальных. Работает только для графов без рёбер отрицательного веса.
Пусть требуется найти кратчайшие расстояния от 1-й вершины до всех остальных.
Кружками обозначены вершины, линиями – пути между ними (ребра графа). В кружках обозначены номера вершин, над ребрами обозначен их вес – длина пути. Рядом с каждой вершиной красным обозначена метка – длина кратчайшего пути в эту вершину из вершины 1.
Первый шаг
Минимальную метку имеет вершина 1. Её соседями являются вершины 2, 3 и 6. Обходим соседей вершины по очереди.
Первый сосед вершины 1 – вершина 2, потому что длина пути до неё минимальна. Длина пути в неё через вершину 1 равна сумме кратчайшего расстояния до вершины 1, значению её метки, и длины ребра, идущего из 1-й в 2-ю, то есть 0 + 7 = 7. Это меньше текущей метки вершины 2 (10000), поэтому новая метка 2-й вершины равна 7.
Аналогично находим длины пути для всех других соседей (вершины 3 и 6).
Все соседи вершины 1 проверены. Текущее минимальное расстояние до вершины 1 считается окончательным и пересмотру не подлежит. Вершина 1 отмечается как посещенная.
Второй шаг
Шаг 1 алгоритма повторяется. Снова находим «ближайшую» из непосещенных вершин. Это вершина 2 с меткой 7.
Снова пытаемся уменьшить метки соседей выбранной вершины, пытаясь пройти в них через 2-ю вершину. Соседями вершины 2 являются вершины 1, 3 и 4.
Вершина 1 уже посещена. Следующий сосед вершины 2 — вершина 3, так как имеет минимальную метку из вершин, отмеченных как не посещённые. Если идти в неё через 2, то длина такого пути будет равна 17 (7 + 10 = 17). Но текущая метка третьей вершины равна 9, а 9 < 17, поэтому метка не меняется.
Ещё один сосед вершины 2 — вершина 4. Если идти в неё через 2-ю, то длина такого пути будет равна 22 (7 + 15 = 22). Поскольку 22<10000, устанавливаем метку вершины 4 равной 22.
Все соседи вершины 2 просмотрены, помечаем её как посещенную.
Третий шаг
Повторяем шаг алгоритма, выбрав вершину 3. После её «обработки» получим следующие результаты.
Четвертый шаг
Пятый шаг
Шестой шаг
Таким образом, кратчайшим путем из вершины 1 в вершину 5 будет путь через вершины 1 — 3 — 6 — 5, поскольку таким путем мы набираем минимальный вес, равный 20.
9. шаблоны проектирования. что? зачем? почему?
Шаблоны проектирования (или паттерны) - повторяемая архитектурная конструкция, представляющая собой решение проблемы проектирования, в рамках некоторого часто возникающего контекста.
В отличие от готовых функций или библиотек, паттерн нельзя просто взять и скопировать в программу. Паттерн представляет собой не какой-то конкретный код, а общую концепцию решения той или иной проблемы, которую нужно будет ещё подстроить под нужды вашей программы.
Из чего состоит паттерн? Описание паттернов обычно очень формальны и чаще всего состоят из таких пунктов:
- проблема, которую решает паттерн
- мотивации к решению проблемы способом, который предлагает паттерн
- структуры классов, составляющих решение
- пример на одном из языков программирования
- особенности реализации в различных контекстах
- связи с другими паттернами
Зачем знать паттерны?
Проверенные решения. Вы тратите меньше времени, используя готовые решения, вместо повторного изобретения велосипеда.
Стандартизация кода. Вы делаете меньше просчётов при проектировании, используя типовые унифицированные решения, так как все скрытые проблемы в них уже давно найдены.
Общий программистский словарь. Вы произносите название паттерна, вместо того чтобы час объяснять другим программистам суть своей программы.
Достоинства и недостатки:
Основная польза от использования шаблонов состоит в снижении сложности разработки за счёт готовых абстракций для решения целого класса проблем;
Шаблон даёт решению своё имя, что облегчает коммуникацию между разработчиками, позволяя ссылаться на известные шаблоны;
Применение шаблонов равносильно использованию готовых библиотек кода. Правильно сформулированный шаблон проектирования позволяет, отыскав удачное решение, пользоваться им снова и снова. Набор шаблонов помогает разработчику выбрать возможный, наиболее подходящий вариант проектирования.
слепое следование некоторому выбранному шаблону может привести к усложнению программы.
у разработчика может возникнуть желание попробовать некоторый шаблон в деле без особых оснований.
Классификация
Самые низкоуровневые и простые паттерны - идиомы. Они не универсальны, поскольку применимы только в рамках одного языка программирования.
Самые универсальные - архитектурные паттерны, которые можно реализовать практически на любом языке. Они нужны для проектирования всей программы, а не отдельных её элементов.
Паттерны отличаются и предназначением, три основных группы:
- Структурные паттерны проектирования – отвечают за построение удобных в поддержке иерархий классов (показывают различные способы построения связей между объектами) # адаптер
- Поведенческие паттерны проектирования – эти паттерны решают задачи эффективного и безопасного взаимодействия между объектами программы # статегия
- Порождающие паттерны проектирования – отвечают за удобное и безопасное создание новых объектов или даже целых семейств объектов (беспокоятся о гибком создании объектов без внесения в программу лишних зависимостей) # фабричный метод