Архив автора: admin

Алгоритм Прима

Минимальное связующее дерево:

Граф, не имеющий направлений, называется неориентированным графом. Каждый граф должен иметь путь от одного узла к другому узлу. Остовное дерево также является неориентированным связным графом, в котором присутствуют все узлы графа с минимальным количеством ребер. Если остовное дерево не имеет всех узлов графа, то мы не можем сказать, что это остовное дерево. Суммарные веса остовного дерева будут меньше исходного веса графа, так как мы соединили его через ребра минимального веса. Покрывающее дерево также не имеет цикла. Любой граф имеет более одного остовного дерева, но только одно из них будет уникальным. Мы называем это минимальным остовным деревом, поскольку пытаемся создать полный граф со всеми узлами, сохраняя при этом низкий вес.

Мы можем нарисовать остовное дерево с помощью следующих двух методов:

  1. Алгоритм Крускала
  2. Алгоритм Прима

 

В этой статье мы собираемся обсудить алгоритм Прима. Алгоритм Крускала будет рассмотрен в следующей статье.

 

Алгоритм Прима:

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

 

Шаги алгоритма Прима:

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

  • Шаг 1: Выберите любую исходную вершину в графе.
  • Шаг 2: Найдите ребро минимального веса, которое примыкает к источнику, а затем соедините его с остовным деревом.
  • Шаг 3: Повторяйте шаг 2, пока все узлы не будут добавлены в минимальное остовное дерево.

 

Пример :

Ниже приведен пример поиска минимального остовного дерева с использованием алгоритма Прима.

1. Выбираем любой случайный узел из графа G и добавляем его в MST (минимальное остовное дерево). Мы выбираем здесь узел 0.

Алгоритм Прима

 

2. Теперь мы выбираем то ребро, которое является смежным с исходным узлом (0), но с наименьшим весом, а затем добавляем этот узел с наименьшим весом в минимальное остовное дерево.

Алгоритм Прима

 

3. Теперь мы выбираем то ребро, которое является смежным с исходным узлом (0 или 1), но с наименьшим весом, а затем добавляем этот узел с наименьшим весом в минимальное остовное дерево.

Алгоритм Прима

 

4. Теперь мы выбираем то ребро, которое является смежным с исходным узлом (0, 1 или 3), но с наименьшим весом, а затем добавляем этот узел с наименьшим весом в минимальное остовное дерево.

Алгоритм Прима

 

5. Теперь мы выбираем то ребро, которое является смежным с исходным узлом (0, 1, 3 или 4), но с наименьшим весом, а затем добавляем этот узел с наименьшим весом в минимальное остовное дерево.

Алгоритм Прима

 

6. Теперь мы выбираем то ребро, которое является смежным с исходным узлом (0, 1, 3, 4 или 6), но с наименьшим весом, а затем добавляем этот узел с наименьшим весом в минимальное остовное дерево.

Алгоритм Прима

 

7. Теперь мы выбираем то ребро, которое является смежным с исходным узлом (0, 1, 3, 4, 6 или 2), но с наименьшим весом, а затем добавляем этот узел с наименьшим весом в минимальное остовное дерево.

Алгоритм Прима

 

Выше наш окончательный MST (минимальное остовное дерево), а общая стоимость равна 6.

 

Программа C++ Prim MST (минимальное связующее дерево):

#include<iostream>



#include<vector>



#include<queue>



#include<algorithm>



#include<cstring>



typedef std :: pair<int,int> SII;



typedef std :: vector<SII> SSII;



int PrimsMST (int sourceNode, std :: vector<SSII> & graph){



    // В этой очереди будут храниться сведения о каждом узле

    // вместе с их весовой ценностью.



    std :: priority_queue<SII, std :: vector<SII>, std :: greater<SII>> k;



 



    k.push(std :: make_pair(0, sourceNode));



    bool nodesAdded[graph.size()];



    memset(nodesAdded, false, sizeof(bool)*graph.size());



    int mst_tree_cost = 0;



    while (!k.empty()) {



        // We are selecting here the node which has minimum cost



        SII itemNode;



        itemNode = k.top();



        k.pop();



        int Node = itemNode.second;



        int Cost = itemNode.first;



        // Здесь мы проверяем, не был ли какой-либо узел добавлен в MST,



        // затем добавляем этот узел.



        if (!nodesAdded[Node]) {



            mst_tree_cost += Cost;



            nodesAdded[Node] = true;



            // Выполните итерацию по узлам negibour, которые недавно были удалены



            // из очереди приоритетов.



            // и добавлен в MST, который еще не добавлен



            for (auto & pair_node_cost : graph[Node]) {



                int adjency_node = pair_node_cost.second;



                if (nodesAdded[adjency_node] == false) {



                    k.push(pair_node_cost);



                }



            }



        }



    }



    return mst_tree_cost;



}



    int main(){



    // Подробная информация о графике со стоимостью и узлом смежности.



    SSII fromNode_0_in_graph_1  = { {1,1}, {2,2}, {1,3},



    {1,4}, {2,5}, {1,6} };



    SSII fromNode_1_in_graph_1   = { {1,0}, {2,2}, {2,6} };



    SSII fromNode_2_in_graph_1   = { {2,0}, {2,1}, {1,3} };



    SSII fromNode_3_in_graph_1 = { {1,0}, {1,2}, {2,4} };



    SSII fromNode_4_in_graph_1  = { {1,0}, {2,3}, {2,5} };



    SSII fromNode_5_in_graph_1  = { {2,0}, {2,4}, {1,6} };



    SSII fromNode_6_in_graph_1   = { {1,0}, {2,2}, {1,5} };



    int num_of_nodes = 7; // Total Nodes (0 to 6)



    std :: vector<SSII> primsgraph;



    primsgraph.resize(num_of_nodes);



    primsgraph[0] = fromNode_0_in_graph_1;



    primsgraph[1] = fromNode_1_in_graph_1;



    primsgraph[2] = fromNode_2_in_graph_1;



    primsgraph[3] = fromNode_3_in_graph_1;



    primsgraph[4] = fromNode_4_in_graph_1;



    primsgraph[5] = fromNode_5_in_graph_1;



    primsgraph[6] = fromNode_6_in_graph_1;



    // Как мы уже знаем, мы должны выбрать исходную вершину,



    // поэтому мы начинаем с узла вершины 0.



    std :: cout << "Общая стоимость минимального связующего дерева после алгоритма Прима : "



                "" << PrimsMST(0, primsgraph) << std :: endl;





    return 0;



}

Выход:

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



Process finished with exit code 0

Временная сложность алгоритма MST Prim:

  1. Общее время, необходимое для обработки и выбора определенного узла очереди с приоритетом, который еще не добавлен в MST, составляет logV. Но поскольку это работает для каждой вершины, общая временная сложность составляет V (logV).
  2. Граф неориентированный, и общее количество ребер будет 2E. Поскольку мы должны поместить узлы в приоритетную очередь, это займет журнал общего времени (V). Однако, поскольку у нас есть в общей сложности 2E ребра, наша общая операция отправки будет 2E (log (V)).
  3. Общая сложность после операции 1 и 2 составляет O( (E + V ) log (V )).

 

Заключение:

Мы изучили минимальное остовное дерево Prim, которое большинство людей предпочитает в первую очередь, когда им нужно найти граф MST из графа. Алгоритм Prim прост для понимания и реализации в реальном приложении. Алгоритм Prim очень полезен в реальных приложениях, например, при соединении железнодорожных путей с целыми городами. Так что это всего лишь один пример, но его применение огромно, поэтому мы должны понять этот алгоритм.



2022-03-10T18:08:39
Программирование

Как получить свой виртуальный номер сегодня. Прием СМС онлайн

Хотите получить виртуальный номер быстро, не тратя лишних нервов и денег? Читайте нашу статью.

 

Что такое виртуальный номер

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

Виртуальный номер — это ваш обычный номер телефона, который хранится на физической SIM-карте. Однако, несмотря на это, между виртуальным номером и обычным номером есть существенная разница. Разница, однако, в том, что вам не обязательно иметь ту самую SIM-карту.

 

Получите виртуальный номер за 5 минут

Получить виртуальный номер можно благодаря интернету. После этого освободите 5 минут своего времени с помощью интернет-площадок, торгующих поддельными номерами. А если вы уже зарегистрированы в системе интернет-магазина продавца, покупка займет пару минут.

 

6 причин использовать виртуальный номер

  1. Вам не нужна SIM-карта

    Напомним, что вам не нужна физическая SIM-карта, чтобы купить и использовать виртуальный номер. Однако, если вам не нужно будет ходить в салоны сотовой связи вашего абонента, стоять в очередях и заполнять скучные документы.
  2. Вы можете купить номер любой страны и использовать его для покупок или регистрации в социальных сетях, мессенджерах

    В сегодняшних реалиях сложно представить, что можно свободно пользоваться физическими сим-картами разных стран и штатов. Магазины виртуальных номеров, такие как Online sim, решат эту проблему за вас. Сайт предлагает номера из всех стран. Вы можете выбрать тот, который вы хотите.
  3. Вы можете использовать номер для регистрации в любом сервисе мира

    Как и в предыдущем пункте, только для регистрации на сервисах, платформах, мессенджерах, интернет-магазинах. Это означает, что вы не сможете там зарегистрироваться со своим стандартным номером, если приложение не работает в вашей стране.
  4. Техническая поддержка на всех этапах покупки и оформления номера

    Кстати, Online sim заботится о подборе нужного номера для каждой заявки. Так что даже если у вас возникли проблемы с покупкой, служба техподдержки всегда готова срочно помочь в онлайн-чате на сайте или в Telegram.
  5. Ваши данные защищены службой продажи виртуальных номеров.

    Все ваши регистрации, покупки и заполнение форм остаются строго конфиденциальными. Ваш номер мобильного телефона позволяет в особых случаях идентифицировать все ваши данные, где вы когда-либо регистрировались. Вот почему так важно не забывать о безопасности и сохранении конфиденциальности ваших личных данных.
  6. Безопасность данных в Online sim

    Мы продолжим использовать его в качестве примера, чтобы рассказать вам, как должна работать хорошая компания. Поскольку Online sim хранит все ваши данные в строгой конфиденциальности, они не утекают в сторонние компании, банки или службы безопасности. В заключение, вы можете зарегистрироваться на всех сервисах и платформах со своим виртуальным номером, который стоит всего несколько центов.

 

Как заказать СМС онлайн на виртуальный номер в Online sim

Три простых шага для получения смс бесплатно через интернет:

 

01. Закажите номер в кабинете

Например, если вы хотите создать вторую страничку для ВКонтакте, то перейдите в кабинет, выберите страну, а после – зайдите на сайт социальной сети.

 

02. Используйте его для получения смс

Скопируйте выданный номер и вставьте в форму регистрации ВКонтакте для получения СМС с кодом регистрации.

 

03. Принимайте смс с сайтов

После поступления СМС сообщения вам остается скопировать код подтверждения и использовать его для завершения активации аккаунта.



2022-03-10T17:51:47
Сети

Базовое имя Python

Python предоставляет различные методы взаимодействия с операционной системой для управления именами файлов и именами каталогов через модуль os. В этой статье обсуждается один из встроенных методов Python, используемых для получения базового имени файла по заданному пути: метод os.path.basename(), который позволяет нам извлечь имя файла из указанного пути.

Мы должны использовать os.path.basename() в коде, импортируя модуль os. Этот метод os.path.basename() дополнительно использует функцию split() для разделения строки пути на пару, которая будет возвращать начало и конец. Головная часть предназначена для имени каталога, а хвостовая часть возвращается методом os.path.basename(). Давайте подробнее об этом методе.

 

Синтаксис базового имени Python:

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

Os.path.basename(path)

 

Os.path — это подрежим модуля os для манипулирования именами путей. Итак, сначала нам нужно импортировать модуль os для этого метода базового имени.

 

Параметр передается в базовом имени python:

Этот метод os.path.name() принимает только указанную строку пути, представляющую путь к файловой системе.

 

Возвращаемое значение в базовом имени python:

os.path.basename() вернет значение в строке заданного пути, которое является базовым именем файла. Теперь у нас будет простой пример реализации того, как работает этот метод os.path.basename().

 

Пример 1:

В Windows и Unix у нас есть разные форматы для извлечения базового имени файла с указанным путем, поэтому в этом примере мы собираемся извлечь базовое имя с синтаксисом окна и синтаксисом Unix. Сначала у нас есть пример окна.

В окне используется разделитель с обратной косой чертой ‘’; мы можем проверить или подтвердить этот разделитель с помощью метода os.path.sep(). Переменная «file_dir» имеет путь «UsersabcDownloadsMy Window», который является именем каталога файла, а «file_name» имеет путь, заданный «UsersabcDownloadsMy Windowindex.html». Обе переменные возвращают базовое имя файла с синтаксисом Window. Мы также будем печатать разделитель окон с помощью метода os.path.sep().

import os.path



file_dir = os.path.basename("UsersabcDownloadsMy Window")



print(file_dir)



file_name = os.path.basename("UsersabcDownloadsMy Windowindex.html")



print(file_name)



print(os.path.sep)

 

Экран консоли покажет выходные данные, печатающие имя каталога файла, базовое имя файла и знак разделителя.

Теперь у нас есть разделитель Unix, используемый в этом примере ниже. Unix использует косую черту ‘/’ в качестве разделителя пути. Мы можем получить этот разделитель, напечатав метод os.path.sep().

import os.path



file_dir = os.path.basename("/Downloads/ My Unix")



print(file_dir)



file_name = os.path.basename("/Downloads/ My Unix /unix.txt")



print(file_name)

 

Пример 2:

Давайте рассмотрим пример извлечения имени файла с помощью метода os.path.basename(). Мы импортировали os.path для доступа к методу os.path.basename() в этом конкретном примере. У нас есть «базовое имя», которое вернет базовое имя файла, которое мы назначили в os.path.basename. С оператором print() у нас будет базовое имя.

import os.path



basename = os.path.basename("/home/example/exampleFile.txt")



print(basename)

 

Здесь у нас есть «/home/example/» в качестве имени пути и «exampleFile.txt» в качестве базового имени.

 

Пример 3:

В этом примере мы найдем базовое имя каталога или имени папки. Имя папки или каталога также имеет базовое имя в полном пути. В этом примере у нас есть «Документы» в качестве базового имени из пути «/home/MyDocuments/Documents», который передается в os.path.basename(). Переменная ‘basename’ вернет вывод, который вызывается в функции print().

import os.path



basename = os.path.basename("/home/MyDocuments/Documents")



print(basename)

 

Мы получим «Документы» в качестве базового имени из приведенного выше кода.

 

Пример 4:

Чтобы получить базовое имя из URL-адреса, нам нужно импортировать библиотеку из модуля стандартного пакета urllib, который называется urlparse. Это поможет нам разделить строки URL на компоненты или снова объединить строку URL в компоненты.

В этом примере будет получено базовое имя URL-адреса для формирования переменной «URL», которая имеет строковый URL-адрес «https://docs.python.org/3/download.html». URL-адрес передается в метод urlparse() в качестве аргумента, который разделит URL-адрес на части. Этот анализ URL-адреса хранится в новой переменной «x», которая будет отображать строку разделенного пути URL-адреса. На этот раз мы используем os.path.basename() через оператор печати.

import os



from urllib.parse import urlparse



url = "https://docs.python.org/3/download.html"



x = urlparse(url)



print(x.path)



print(os.path.basename(x.path))

 

Отображение разделенной строки URL-адреса и базового имени из URL-адреса.

 

Пример 5:

В этом примере используется метод os.path.split() для возврата пары «голова» и «хвост» по отдельности. Для этого мы должны передать указанный путь в качестве аргумента в метод os.path.split(). Мы получим «голову» и «хвост» отдельно через оператор печати.

import os



path = "/Users/Desktop/Article/python/code.py"



head_tail = os.path.split(path)



print(head_tail)

 

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

 

Пример 6:

Мы извлекли базовое имя и расширение, определенные в этом примере. Мы будем извлекать имя файла без расширения с помощью другого метода os.path.splitext(). Этот метод даст только базовое имя, определенное в os.path.basename().

Мы назначили путь как «home/example/example3.txt» в переменной «basename». Используйте индекс как «0», чтобы получить базовое имя без расширения.

import os.path



path_name="home/example/example3.txt"



basename = os.path.splitext(os.path.basename(path_name))[0]



print(basename)




 

У нас есть вывод basename как «example3» без расширения на экране консоли.

 

Заключение

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



2022-03-10T17:23:26
Python

Внедрение зависимостей на платформе .NET

Внедрение зависимостей на платформе .NET

Парадигма внедрения зависимостей (DI) в течение минувшего десятилетия де-факто стала одной из доминирующих на платформе .NET и теперь обязательна к изучению для всех .NET-разработчиков.

Это переработанное и дополненное издание классической книги «Внедрение зависимостей в .NET».

Вы научитесь правильно внедрять зависимости для устранения жесткой связи между компонентами приложения. Читать

Высокопроизводительный код на платформе .NET

Высокопроизводительный код на платформе .NET

Книга: Высокопроизводительный код на платформе .NET. Хотите выжать из вашего кода на .NET максимум производительности?

Эта книга развеивает мифы о CLR, рассказывает, как писать код, который будет просто летать.

Воспользуйтесь ценнейшим опытом специалиста, участвовавшего в разработке одной из крупнейших .NET-систем в мире. В этом издании перечислены все достижения и улучшения, внесенные в .NET за последние несколько лет, в нем также значительно расширен охват инструментов, содержатся дополнительные темы и руководства. Читать

Изучаем SQL. Генерация, выборка и обработка данных

Изучаем SQL. Генерация, выборка и обработка данных

Книга: Изучаем SQL. Генерация, выборка и обработка данных.

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

Такую возможность эффективной выборки и обработки данных уже несколько десятилетий предоставляет разработчикам язык SQL. Он тесно связан с реляционными базами данных.

Но несмотря на это в последнее время, когда все большее значение приобретают большие объемы данных, упомянутый язык развивается таким образом, чтобы облегчить поиск данныхв базах данных, построенных на различных технологиях. Читать