Skip to content

Commit

Permalink
Update PrimsSpanningTreeAlgorithm.rst
Browse files Browse the repository at this point in the history
  • Loading branch information
Natalie committed Oct 22, 2014
1 parent f6013c4 commit fb6fc50
Showing 1 changed file with 6 additions and 6 deletions.
12 changes: 6 additions & 6 deletions pythonds/source/Graphs/PrimsSpanningTreeAlgorithm.rst
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
Алгоритм Прима для островного дерева
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Для нашего последнего алгоритма на графах давайте рассмотрим задачу, с которой часто сталкиваются разработчики онлайн игр и провайдеры интернет-радио. Проблема в том, что им нужно эффективно передавать части информации для всех и каждого, кто может её услышать. Это важно в играх, поскольку все игроки должны знать последний ход каждого из них. Это важно для интернет-радио, потому что настроенные на него слушатели должны получить все данные, по которым можно было бы воссоздать прослушиваемую песню. Задача о вещании проиллюстрирована :ref:`рисунком 9 <fig_bcast1>`.
Предлагаем для нашего последнего алгоритма на графах рассмотреть задачу, с которой часто сталкиваются разработчики онлайн игр и провайдеры интернет-радио. Проблема в том, что им нужно эффективно передавать информационные пакеты для всех и каждого, кто может её услышать. Это важно в играх, поскольку все игроки должны знать последний ход каждого из них. Это важно для интернет-радио, потому что настроенные на него слушатели должны получить все данные, по которым можно было бы воссоздать прослушиваемую песню. Задача о вещании проиллюстрирована :ref:`рисунком 9 <fig_bcast1>`.

.. _fig_bcast1:

Expand All @@ -21,13 +21,13 @@

Существует несколько способов её решения путём непосредственного перебора. С них мы и начнём, чтобы лучше разобраться в вопросе. Так же это поможет вам оценить решение, которое мы в итоге предложим. Начнём с того, что станция вещания имеет некую информацию, которая должна быть передана всем слушателям. Простейшим решением станет хранить список всех слушателей и отсылать им индивидуальные сообщения. На :ref:`рисунке 9 <fig_bcast1>` показана небольшая сеть с передатчиком и несколько слушателей. Используя первый подход, следует отправлять по четыре копии каждого сообщения. Предполагая, что используется путь с наименьшими затратами, давайте посмотрим, сколько времени каждый маршрутизатор потратит на расылку одинаковых сообщений.

Все сообщения от вещателя идут через маршрутизатор А, поэтому он видит все четыре копии каждого. Маршрутизатор С видит уже по одной из них, однако маршрутизаторы B и D увидят по три копии сообщений, поскольку через них проходит кратчайший путь к слушателям 1, 2 и 3. С учётом того, что для радиовещания станция должен расслылать сотни сообщений каждую секунду, получается огромный объём лишнего трафика.
Все сообщения от вещателя идут через маршрутизатор А, поэтому он "видит" по четыре копии каждого. Маршрутизатор С "видит" уже по одной из них, однако, для B и D это число равно трём, поскольку через них проходят кратчайшие пути к слушателям 1, 2 и 3. С учётом того, что для радиовещания станция должен расслылать сотни сообщений каждую секунду, получается огромный объём лишнего трафика.

Решение методом перебора состоит в том, что станция вещания посылает единственную копию сообщения и позволяет маршрутизаторам дальше разбираться самим. В этом случае простейшим решением станет стратегия под названием **неконтролируемое наводнение**. Работает она так. Каждое сообщение выпускается с временем жизни (``ttl`` - от англ. *time to live*), установленным в некоторую величину, большую или равную количеству рёбер между станцией вещания и наиболее удалённым слушателем. Каждый маршрутизатор получает копию сообщения и рассылает его *всем* своим соседям, уменьшая ``ttl`` на единицу. Так продолжается до тех пор, пока значение ``ttl`` не станет равным нулю. Можно легко убедиться, что неконтролируемое наводнение генерирует намного больше ненужных сообщений, чем наша первая стратегия.
Метод перебора состоит в том, что станция вещания посылает единственную копию сообщения и позволяет маршрутизаторам дальше разбираться самим. В этом случае простейшим решением станет стратегия под названием **неконтролируемое наводнение**. Работает она так. Каждое сообщение выпускается с временем жизни, или ``ttl`` (от англ. *time to live* - прим. переводчика), установленным в некоторую величину, большую или равную количеству рёбер между станцией вещания и наиболее удалённым слушателем. Каждый маршрутизатор получает копию сообщения и рассылает его *всем* своим соседям, уменьшив ``ttl`` на единицу. Те, в свою очередь, поступают аналогично. Так продолжается до тех пор, пока значение ``ttl`` не станет равным нулю. Можно легко убедиться, что неконтролируемое наводнение генерирует намного больше ненужных сообщений, чем наша первая стратегия.

Решение задачи лежит в создании **островного дерева** с минимальным весом. Формальное определение минимального островного дерева :math:`T` для графа :math:`G = (V,E)` следующее: :math:`T` - это ацикличное подмножество :math:`E`, соединяющее все вершины в :math:`V`. Сумма весов рёбер в :math:`T` - минимальна.

:ref:`Рисунок 10 <fig_mst1>` показывает упрощённую версию графа вещания и выделяет рёбра его минимального островного дерева. Теперь, чтобы решить задачу вещания, станция просто направляет единственную копию сообщения в сеть. Каждый из маршрутизаторов пересылает его тому своему соседу, который является частью островного дерева, за исключеннием источника посылки. В нашем примере А перешлёт сообщение В, В - C и D. D отправит сообщение E, который передаст его F, а тот - G. Никто из маршрутизаторов не увидит больше одной копии сообщения, а все слушатели смогут его услышать.
:ref:`Рисунок 10 <fig_mst1>` показывает упрощённую версию графа вещания и выделяет рёбра его минимального островного дерева. Теперь, чтобы решить задачу вещания, станция просто направляет единственную копию сообщения в сеть. Каждый из маршрутизаторов пересылает его тому своему соседу, который является частью островного дерева, за исключеннием источника посылки. В нашем примере А перешлёт сообщение В, В - C и D. D отправит сообщение E, который передаст его F, а тот - G. Никто из маршрутизаторов не "увидит" больше одной копии сообщения, а все слушатели смогут его услышать.

.. _fig_mst1:

Expand All @@ -36,7 +36,7 @@

Рисунок 10: Минимальное островное дерево графа вещания

Алгоритм, который мы используем для решения этой задачи, называется алгоритмом Прима. Он входит в семейство под названием "жадные алгоритмы", поскольку на каждом шаге выбирается наименее затратный из предлагаемых шагов. В данном случае таковым будет перемещение по ребру с наименьшим весом. Наше последнее задание: реализовать алгоритм Прима.
Алгоритм, который мы используем для решения этой задачи, называется алгоритмом Прима. Он входит в семейство под названием "жадные алгоритмы", поскольку на каждом шаге выбирается наименее затратный из предлагаемых путей. В данном случае таковым будет перемещение по ребру с наименьшим весом. Наше последнее задание: реализовать алгоритм Прима.

Основная идея для создания островного дерева состоит в следующем:

Expand All @@ -46,7 +46,7 @@
Найти ребро, которое можно безопасно добавить к дереву
Добавить новое ребро в T

Загвоздка состоит в пункте, направляющем нас "найти ребро для безопасного добавления". Определим безопасное ребро как то, которое соединяет вершину из островного дерева с вершиной вне его. Это гарантирует, что дерево всегда останется деревом и не будет иметь циклов.
Загвоздка состоит в пункте "найти ребро для безопасного добавления". Определим безопасное ребро как то, которое соединяет вершину из островного дерева с вершиной вне его. Это гарантирует, что дерево всегда останется деревом и не будет иметь циклов.

Код на Python для реализации алгоритма Прима показан в :ref:`листинге 2 <lst_prims>`. Он похож на алгоритм Дейкстры в том, что оба они используют очередь с приоритетом для выбора следующей вершины, которая будет добавлена в растущий граф.

Expand Down

0 comments on commit fb6fc50

Please sign in to comment.