- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我已经查看了有关此的问题,但仍然遇到一些问题。我在尝试实现 Prim 算法时究竟出了什么问题?我觉得这与它有关,只有当它是树中的最小权重时才将它添加到生成树中,但我看不到如何实现它。到目前为止,这是我尝试过的方法,我将在顶部包含优先级队列入队方法。它似乎将所有顶点添加到树中。我从顶点 0 开始得到的输出如下..
(0, 5), (1, 5), (2, 5), (3, 5), (4, 5), (5, 5), (0, 1), (1 , 1), (2, 1), (3, 1)
(4, 1), (0, 2), (2, 2), (3, 2), (4, 2), (0, 4), (3, 4), (4, 4)
def dequeue(self):
weight, data = self.queue.pop(0)
self.size -= 1
return data
def enqueue(self, data, weight):
curr_index = 0
while (curr_index < self.size and
self.queue[curr_index][WEIGHT] < weight):
curr_index += 1
self.queue.insert(curr_index, (weight, data))
self.size += 1
def add_edges(self, p_queue, vertex, vertices):
for i in range(len(self.adjacency_matrix)):
weight = self.adjacency_matrix[vertex][i]
if weight != 0:
p_queue.enqueue(vertex, weight)
if (i, vertex) not in vertices:
vertices.append((i, vertex))
return vertices
def init_pqu(self, p_queue, start_vertex):
for i in range(len(self.adjacency_matrix)):
weight = self.adjacency_matrix[start_vertex][i]
if weight != 0:
p_queue.enqueue(start_vertex, weight)
def prim(self, start_vertex):
vertices = []
priority_queue = pq.priority_queue()
self.init_pqu(priority_queue, start_vertex)
while len(priority_queue.queue) > 0:
source = priority_queue.dequeue()
vertices = self.add_edges(priority_queue, source, vertices)
return vertices
最佳答案
您的代码存在多个问题,我可以立即发现:
1)不清楚你提供的enqueue方法和你调用的pq.enqueue
是否一样。如果相同,那么您的队列有两个参数(顶点和权重),但您只将顶点传递给它,因此权重始终作为 None 传递,使优先级队列每次都返回随机顶点。
如果不一样,那么首先你永远不会调用你的入队,你总是调用pq.enqueue
,其次,你插入vertex ids到您的优先级队列,因此它按顶点 ID 排序,而不是按边的权重排序。优先级队列按权重排序对于Prima算法至关重要。
2)这段代码也不正确:
if (vertex, i) not in vertices:
vertices.append((i, vertex))
因为您检查了 (vertex, i)
,但附加了 (i, vertex)
,所以您的条件要么永远不会触发,要么以错误的方式触发。
3) 您的 add_edges
例程有一个参数 p_queue
,但使用 pq
代替。 pq
是您拥有的某种全局优先级队列吗?
更新:在所有这些都被修复之后,现在也只将一个顶点添加到队列中,如果它之前没有被添加的话,换句话说,而不是这样做:
p_queue.enqueue(vertex, weight)
if (i, vertex) not in vertices:
vertices.append((i, vertex))
这样做:
if (i, vertex) not in vertices:
p_queue.enqueue(vertex, weight)
vertices.append((i, vertex))
关于python - python中的prim算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29642545/
我正在尝试用 javascript 创建一个随机迷宫生成器。 可能已经有可用的示例,但我正在尝试自己解决这个问题(好吧,尽可能多) 我遇到的问题是我的脚本只运行了几个 block 然后就停止了。 我认
一 点睛 在生成树的过程中,把已经在生成树中的节点看作一个集合,把剩下的节点看作另外一个集合,从连接两个集合的边中选择一条权值最小的边即可。 二 算法介绍 首先任选一个节点,例如节点1,把它放在集合
“因此,Prim 算法的总时间为 O(V lg V + E lg V) = O(E lg V),这与我们实现 Kruskal 算法的渐进时间相同。” 来自http://serverbob.3x.ro/
def prim(graph): que = queue.PriorityQueue() mst = [] visited = set() # Generate edg
我正在尝试使用优先级队列在 Java 中实现 Prim 的算法。 我找不到我的错误。 :/我只是认识到队列没有正确排序节点。 图表示例: 0 4 7 5 4 0 2 3 7 2 0 1 5 3 1 0
我的算法课正在讨论 Prim 算法作为一种寻找加权图的最小生成树的方法。我们的教授让我们试着想一个图的例子,Prim 的算法需要 N^2 时间来解决(N = 顶点数)。类没有人能凭空想到一个,所以我问
prim 算法的简单实现应该给出 O(mn) 的运行时间。但我在 Prim 函数中有 3 个 for 循环(使运行时间立方)。我哪里出错了? void Graph::Prim (const int s
我正在尝试实现一种近似算法来解决旅行商问题 (TSP),当三角不等式对边权重成立时可以使用该算法。正如 Cormen 等人在算法简介(第 3 3d.)中所述,伪代码是: 这是一个例子: 我苦恼的是如何
我发现 there are two ways to implement Prim algorithm ,并且邻接矩阵的时间复杂度为 O(V^2),而堆和邻接列表的时间复杂度为 O(E lg(V))。
我正在查看 Wikipedia entry对于 Prim 的算法,我注意到它与邻接矩阵的时间复杂度是 O(V^2),它与堆和邻接列表的时间复杂度是 O(E lg(V)),其中 E 是边数,V 是图中的
我正在尝试使用 Prim 的最小生成树算法优化图形。但我没有得到想要的答案。 算法: 1. Construct min heap array. The array consists of nodes
我有以下函数来查找父数组,以便使用 Prim 算法获得图的最小生成树。 #include #include #include int printMST(int parent[], int n, i
Prim 算法思想: 从任意一顶点 v0 开始选择其最近顶点 v1 构成树 T1,再连接与 T1 最近顶点 v2 构成树 T2, 如此重复直到所有顶点均在所构成树中为止。 最小生成树(MST):权值
这个问题在这里已经有了答案: what is the meaning of "let x = x in x" and "data Float#" in GHC.Prim in Haskell (2 个
所以我检查了之前发布的 prims 算法帖子。我找不到一个能满足老师要求的。我和他一起编写了这段代码,并且大部分工作正常。然而,由于某种原因,当它到达某个点时,它会破裂并走向错误的边缘。 '''pub
我必须从 Prim 算法创建一个迷宫,更准确地说是使用这个算法:(随机 Prim 算法)。 http://en.wikipedia.org/wiki/Maze_generation # Randomi
我正在尝试使用 Prim 算法实现一个随机生成的迷宫。但是该程序无法正确生成迷宫。请看看并给我一些建议 这是我的迷宫图片: 迷宫应该是这样的: Prim 算法: private void Prims(
我正在一个项目中使用 Dijkstra 算法,但想尝试使用策略模式实现 Prims 算法,看看它有什么更好的地方,但我不确定如何使用策略模式。我以前从未使用过模式,所以我不知道从哪里开始。 packa
我正在尝试将房间放置在 ASCII 屏幕上,然后使用 Prim's algorithm用迷宫“填充”房间之间的空间,但实际上并没有闯入房间。我已经修补了几个小时,但我无法找到一种方法来阻止我的算法闯入
我正在尝试使用 JGraphT 实现 Prim 的最小生成树算法。看起来怎么样? 我遇到的一个问题是 JGraphT 按照指示处理所有事情。因此,有时需要进行一些尴尬的调用来反转 g.getEdgeS
我是一名优秀的程序员,十分优秀!