Рубрики
Без рубрики

Реализация механической проверки двумя диаграммы в Python

Как разработчик программного обеспечения, я пытаюсь сделать рутину, которая включает в себя практикую моих навыков для решения математики … Помечено Python, алгоритмы, GoogleCodejam, Challenge.

В качестве разработчика программного обеспечения я стараюсь сделать рутину, которая включает в себя практикую своих навыков для решения проблем с математическими/алгоритмами. Несколько дней назад я обнаружил, что годовой код Google Google называется кодом варенья и самая первая проблема, которую я видел озадачен Меня (я расскажу об этом). После некоторых исследований я смог решить его через алгоритм проверки бипартизатора графа и решил написать путь, который я взял, чтобы придумать решение. Давай сделаем это.

График представляет собой нелинейную абстрактную структуру данных, хорошо известную в математике. Они используются для моделирования парных отношений между объектами через структуры/концепции, как узлы (или просто «точки») и края (также называются «ссылками», «дугами» или «линиями», которые соединяют два узла) [1][2]. Изучение графов и его свойств называется теорией графа и была разработана Dénes König в 1936 году, блестящий математик, который написал самую первую книгу о теории графика [3]. Графики используются для моделирования множества ситуаций, которые происходят в реальном мире, как наиболее эффективный путь самолета из X до Y или кратчайшего расстояния между двумя точками города (алгоритмы GPS) и так далее.

2014 Град тест – практика раунда.

Проблема плохих лошадей

Как лидер злой лиги зла, плохая лошадь имеет много проблем иметь дело с. Совсем недавно в лиге было слишком много аргументов, и намного было слишком много в лиге, так что плохая лошадь решила разделить лигу на два отделения, чтобы отделить проблемных членов. Будучи чистокровным грехом, плохая лошадь не собирается тратить свое ценное время, выяснение, как разделить членов лиги. Это то, что он получил тебя – его лояльный приспешник – за.

https://code.google.com/codejam/contest/2933486/dashboard

После прочтения описания некоторые идеи пришли к моему мнению, прежде чем инициировать с кодом возможного решения.

Во-первых, мне придется Магазин названий пар И как-то представлять отношение между потом. Кроме того, я должен быть в состоянии проверить возможность отделить пары на 2 группы – пара не должна быть в одной группе. С немного больше поисковых поисков я обнаружил, что это классическая проблема График бипартит .

Я понял, что это важный шаг перед началом кодирования в стиле Super Matrix Hacker. Проанализируйте его, возьмитесь в голову проблем.

Бипартитный график

Бипартитный график представляет собой график, который все его узлы могут быть разделены в двух группах, чтобы каждый элемент одной группы связан только с элементами другой группы. Это также известно как Bi цветной график (каждая группа будет представлять собой цвет, поэтому каждый элемент на графике относится только к другому цветовому элементу). Они очень используются в сети Петри (симуляция ресурсов систем параллелизма) и другие реальные мировые ситуации [4].

Алгоритм для проверки диаграммы BiPArtition может быть очень похоже на DFS в структурах данных деревьев (первого поиска глубины). Алгоритм DFS используется для поиска глубины дерева и работает, выбрав корневой элемент и погрузиться в своих соседей, пока нет ребенка или листа элемента.

Любопытный факт: каждое дерево – график бипартита

Чтобы добавить функцию проверки бипартинга, нам нужно инициировать другую структуру для хранения группы (или цвета) информации каждого элемента. Кроме того, необходимо также проверить группы, принадлежащие каждому узеру графа, учитывая его соседей группы

Анализ псевдокода будет разделен на две части к лучшему пониманию.

Давайте проверим псевдоалгоритм.

Первая часть будет функционировать в качестве инициализации или «контроллера», уложив, что рутина будет выполнена для всех узлов на графике.

OBS: объяснить псевдокод, я собираюсь предположить следующие константы узел 01 значение Структура данных представлена в коде 02 Значение

FOR each graph node v
    Initialize v group/color c with a neutral value, representing no color/group
end FOR

FOR each graph node V
    Initialize V group value C = C1
end FOR
FOR every graph node V
    IF group C is C1:
        IF NOT SET_GROUP_VALUE(graph, V, C1)
            return FALSE
        end IF
    end IF
end FOR
return TRUE

На первом петле мы собираемся инициировать все узлы с группой 01. На втором цикле для каждого узла, который имеет значение группы 01, мы собираемся проверить своих соседей и, если возможно, установите его другое групповое значение.

Вторая часть – это рекурсивный алгоритм, который содержит логику, чтобы проверить, может ли узел быть частью другой группы, чем его соседи.

-- Start a routine SET_GROUP_VALUE(graph, V, C) -- Ignore this line

SET the group of V as C
FOR every neighbors W of V
    IF group value C of W is neutral
        IF NOT SET_GROUP_VALUE(graph, W, C2)
            return FALSE
        end IF
    ELSE
        IF group value of W is C
            return FALSE
        end IF
    end ELSE
end FOR
return TRUE

Первый цикл начинает нырять в подмножество узлов V (поддерево с корнем в V). Если V’s Bound W имеет значение Group 01, то алгоритм проверит, можно ли дать группу 02 значение.

Как описано в проблеме, наша цель – выполнить тестовые случаи М Пары элементов описаны в файле. Первая строка этого файла будет содержать T Значение, сопровождаемое М Количество пар, таким образом, следующий М линии будут содержать М Пары информации. Вывод также будет файлом, который описывает номер теста, а если набор М Имена пар можно разделить на две группы или, если набор пар можно представить как двусторонний график.

-- Input file example -- Ignore this line
2
1
Dead_Bowie Fake_Thomas_Jefferson
3
Dead_Bowie Fake_Thomas_Jefferson
Fake_Thomas_Jefferson Fury_Leika
Fury_Leika Dead_Bowie
-- Output file example -- Ignore this line
Case #1: Yes
Case #2: No

Есть несколько способов представлять график в коде [5] [5], один из них является матрицей смежности, и именно то, как она будет представлять в этой статье, но с некоторыми небольшими модификациями решения может быть в состоянии работать. Здесь я представлю его в качестве словаря Python: ключи будут узлами, а значение ключа будет списком всех его соседей. Вот пример

g = { 
    "a" : ["d"],
    "b" : ["c"],
    "c" : ["b", "c", "d", "e"],
    "d" : ["a", "c"],
    "e" : ["c"],
    "f" : []
}

Давайте проверим мою реализацию псевдокода. OBS: значение

Из строки от 1 до 27 реализовано алгоритм, который мы видели раньше в псевдокоде. В строке 31 я получаю от входного файла (который был в том же каталоге этого кода) количество тестов, которые будут сделаны.

От линии 35 до конца файла мы собираемся:

  • Для каждого тестового чехола ( iteStcase ), извлеките количество пар ( НП ) Это будет проанализировано.
  • Для каждой пары мы собираемся получить описанные имена.
  • Из строки 40 до 50 он собирается построить словарь на основе соединения в паре, описанном в файле.

Вывод говорит нам, какой тестовый случай представляет собой бипартт или нет.

Я младший разработчик программного обеспечения в Бразилии, и я просто очаровал технологией и программированием.

Поэтому, пожалуйста, любые сомнения, подсказки или комментарии более чем приветствуются!

Следуй за мной в Github, Twitter или LinkedIn.

[1] https://mathworld.wolfram.com/graph.html . [2] https://en.wikipedia.org/wiki/Graph_theory [3] https://pt.wikipedia.org/wiki/d%C3%A9NES_K%C3%B6NIG [4] https://pt.wikipedia.org/wiki/grafo_biPartido. [5] https://www.geeksforgeeks.org/graph-and-its-representations/

Оригинал: “https://dev.to/iranneto/implementing-graph-bipartition-checker-in-python-25e6”