最小生成树
生成树被定义为包含图的所有顶点的连通无向图的树状子图。 或者,用外行的话来说,它是形成一棵树(无环)的图的边的子集,其中图的每个节点都是树的一部分。
最小生成树具有生成树的所有属性,并附加了在所有可能的生成树中具有最小可能权重的约束。与生成树一样,图也可以有许多可能的 MST。
生成树属性:
- 图和生成树中的顶点数 (V) 相同
- 生成树中有固定数量的边,该数量等于顶点总数减一(E = V-1)
- 生成树不应断开连接
- 生成树应该是无环的,这意味着树中不会有任何循环
- 生成树的总成本(或权重)定义为生成树所有边的边权重之和
- 图可以有多种可能的生成树
最小生成树具有生成树的所有属性,并附加了在所有可能的生成树中具有最小可能权重的约束。与生成树一样,图也可以有许多可能的最小生成树。
Prim(普里姆)算法
这也是一种贪心算法。该算法有以下工作流程:
- 首先选择任意顶点,然后将其添加到最小生成树
- 然后,它重复检查将最小生成树的一个顶点连接到尚未在最小生成树中的另一个顶点的最小边权重
- 这个过程一直持续到所有的顶点都包含在最小生成树中
为了有效地为每次迭代选择最小权重边,该算法使用priority_queue来存储当前按最小边权重排序的顶点。 它还同时使用数组或其他适合考虑其存储的数据类型的数据结构来跟踪最小生成树。
该算法可用于各种场景,例如基于颜色、纹理或其他特征的图像分割。对于路线选择,例如寻找两点之间供送货卡车遵循的最短路径。
Kruskal(克鲁斯卡尔)算法
这是从连通的无向图中查找最小生成树的流行算法之一。这是一种贪心算法。算法工作流程如下:
- 首先,它按权重对图的所有边进行排序
- 然后开始迭代寻找生成树
- 在每次迭代中,算法都会将下一个权重最低的边逐一添加,使得到目前为止所选取的边不会形成循环
该算法可以使用 DSU(不相交集)数据结构,跟踪图的连接组件来有效实现。适用场景,例如网络设计、集群和数据分析。
贪心算法
贪心算法被定义为一种通过做出决策来解决优化问题的方法,无论最终结果如何,都会产生最明显和最直接的益处。 它适用于最小化或最大化导出所需解决方案的情况。
对于使用贪婪方法解决的问题,它必须遵循几个主要特征:
- 有一个有序的资源列表(利润、成本、价值等)
- 获取所有资源的最大值(最大利润、最大价值等)。
- 例如,在分数背包问题中,首先根据可用容量取最大值/重量。
贪心算法是一种用于优化问题的方法,其目标是在每个阶段做出局部最优选择,以期找到全局最优值。 之所以称为“贪婪”,是因为它试图通过在每一步中做出最佳选择来找到最佳解决方案,而不考虑未来的步骤或当前决策的后果。
常见用例如:调度和资源分配、最小生成树、硬币找零问题、霍夫曼编码。
所有贪心算法都遵循一个基本结构:
- 声明空结果 = 0
- 我们进行贪心选择来选择,如果选择可行则将其添加到最终结果中
- 返回结果
Prim 最小生成树算法
Python示例:
import sysclass Graph():def __init__(self, vertices):self.V = verticesself.graph = [[0 for column in range(vertices)]for row in range(vertices)]def printMST(self, parent):print("Edge \tWeight")for i in range(1, self.V):print(parent[i], "-", i, "\t", self.graph[i][parent[i]])def minKey(self, key, mstSet):min = sys.maxsizefor v in range(self.V):if key[v] < min and mstSet[v] == False:min = key[v]min_index = vreturn min_indexdef primMST(self):key = [sys.maxsize] * self.Vparent = [None] * self.V key[0] = 0mstSet = [False] * self.Vparent[0] = -1 for cout in range(self.V):u = self.minKey(key, mstSet)mstSet[u] = Truefor v in range(self.V):if self.graph[u][v] > 0 and mstSet[v] == False \and key[v] > self.graph[u][v]:key[v] = self.graph[u][v]parent[v] = uself.printMST(parent)
C++示例、Java示例、C#示例、JavaScript示例
Kruskal 最小生成树算法
Python示例、C++示例、Java示例、C#示例、JavaScript示例