From fb6fc504f93425853c2cc2ea2b3e3c7d3a748304 Mon Sep 17 00:00:00 2001 From: Natalie Date: Wed, 22 Oct 2014 12:12:21 +0400 Subject: [PATCH] Update PrimsSpanningTreeAlgorithm.rst --- .../source/Graphs/PrimsSpanningTreeAlgorithm.rst | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/pythonds/source/Graphs/PrimsSpanningTreeAlgorithm.rst b/pythonds/source/Graphs/PrimsSpanningTreeAlgorithm.rst index 2540e544f..602cb0969 100644 --- a/pythonds/source/Graphs/PrimsSpanningTreeAlgorithm.rst +++ b/pythonds/source/Graphs/PrimsSpanningTreeAlgorithm.rst @@ -10,7 +10,7 @@ Алгоритм Прима для островного дерева ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Для нашего последнего алгоритма на графах давайте рассмотрим задачу, с которой часто сталкиваются разработчики онлайн игр и провайдеры интернет-радио. Проблема в том, что им нужно эффективно передавать части информации для всех и каждого, кто может её услышать. Это важно в играх, поскольку все игроки должны знать последний ход каждого из них. Это важно для интернет-радио, потому что настроенные на него слушатели должны получить все данные, по которым можно было бы воссоздать прослушиваемую песню. Задача о вещании проиллюстрирована :ref:`рисунком 9 `. +Предлагаем для нашего последнего алгоритма на графах рассмотреть задачу, с которой часто сталкиваются разработчики онлайн игр и провайдеры интернет-радио. Проблема в том, что им нужно эффективно передавать информационные пакеты для всех и каждого, кто может её услышать. Это важно в играх, поскольку все игроки должны знать последний ход каждого из них. Это важно для интернет-радио, потому что настроенные на него слушатели должны получить все данные, по которым можно было бы воссоздать прослушиваемую песню. Задача о вещании проиллюстрирована :ref:`рисунком 9 `. .. _fig_bcast1: @@ -21,13 +21,13 @@ Существует несколько способов её решения путём непосредственного перебора. С них мы и начнём, чтобы лучше разобраться в вопросе. Так же это поможет вам оценить решение, которое мы в итоге предложим. Начнём с того, что станция вещания имеет некую информацию, которая должна быть передана всем слушателям. Простейшим решением станет хранить список всех слушателей и отсылать им индивидуальные сообщения. На :ref:`рисунке 9 ` показана небольшая сеть с передатчиком и несколько слушателей. Используя первый подход, следует отправлять по четыре копии каждого сообщения. Предполагая, что используется путь с наименьшими затратами, давайте посмотрим, сколько времени каждый маршрутизатор потратит на расылку одинаковых сообщений. -Все сообщения от вещателя идут через маршрутизатор А, поэтому он видит все четыре копии каждого. Маршрутизатор С видит уже по одной из них, однако маршрутизаторы 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 ` показывает упрощённую версию графа вещания и выделяет рёбра его минимального островного дерева. Теперь, чтобы решить задачу вещания, станция просто направляет единственную копию сообщения в сеть. Каждый из маршрутизаторов пересылает его тому своему соседу, который является частью островного дерева, за исключеннием источника посылки. В нашем примере А перешлёт сообщение В, В - C и D. D отправит сообщение E, который передаст его F, а тот - G. Никто из маршрутизаторов не увидит больше одной копии сообщения, а все слушатели смогут его услышать. +:ref:`Рисунок 10 ` показывает упрощённую версию графа вещания и выделяет рёбра его минимального островного дерева. Теперь, чтобы решить задачу вещания, станция просто направляет единственную копию сообщения в сеть. Каждый из маршрутизаторов пересылает его тому своему соседу, который является частью островного дерева, за исключеннием источника посылки. В нашем примере А перешлёт сообщение В, В - C и D. D отправит сообщение E, который передаст его F, а тот - G. Никто из маршрутизаторов не "увидит" больше одной копии сообщения, а все слушатели смогут его услышать. .. _fig_mst1: @@ -36,7 +36,7 @@ Рисунок 10: Минимальное островное дерево графа вещания -Алгоритм, который мы используем для решения этой задачи, называется алгоритмом Прима. Он входит в семейство под названием "жадные алгоритмы", поскольку на каждом шаге выбирается наименее затратный из предлагаемых шагов. В данном случае таковым будет перемещение по ребру с наименьшим весом. Наше последнее задание: реализовать алгоритм Прима. +Алгоритм, который мы используем для решения этой задачи, называется алгоритмом Прима. Он входит в семейство под названием "жадные алгоритмы", поскольку на каждом шаге выбирается наименее затратный из предлагаемых путей. В данном случае таковым будет перемещение по ребру с наименьшим весом. Наше последнее задание: реализовать алгоритм Прима. Основная идея для создания островного дерева состоит в следующем: @@ -46,7 +46,7 @@ Найти ребро, которое можно безопасно добавить к дереву Добавить новое ребро в T -Загвоздка состоит в пункте, направляющем нас "найти ребро для безопасного добавления". Определим безопасное ребро как то, которое соединяет вершину из островного дерева с вершиной вне его. Это гарантирует, что дерево всегда останется деревом и не будет иметь циклов. +Загвоздка состоит в пункте "найти ребро для безопасного добавления". Определим безопасное ребро как то, которое соединяет вершину из островного дерева с вершиной вне его. Это гарантирует, что дерево всегда останется деревом и не будет иметь циклов. Код на Python для реализации алгоритма Прима показан в :ref:`листинге 2 `. Он похож на алгоритм Дейкстры в том, что оба они используют очередь с приоритетом для выбора следующей вершины, которая будет добавлена в растущий граф.