Prim算法,请解释
Prim's Algorithem, please explain
谁能给我解释一下这个循环中目前发生了什么?
这是我在 Prim 算法上的作业代码的一部分。
我得到了:虽然 countIcluded 不是 vertices.length,部分。
我需要了解下面发生的事情。
值得一提的是 included
是一个布尔数组。
希望我是新手,因为我是新手,请尽可能简单地解释(如果可能),以便我能理解基础知识。
while (countIncluded != vertices.length) {
// find the not included vertex with minimum cost
int u = -1;
for (int i = 0; i < vertices.length; i++) {
if (!included[i]) {
if (u == -1 || C[u] > C[i])
u = i;
}
}
// include in MST
included[u] = true;
countIncluded++;
}
所以基本上这个算法所做的是遍历一个顶点列表,并根据从一个顶点到另一个顶点的成本创建一条路径。成本只是一个术语,用来解释从一个顶点到另一个顶点的难度,通常只是距离。让我们进入代码。
while (countIncluded != vertices.length) {
我知道你说你明白这意味着什么,但我还是会复习一遍。此 while 循环将确保您 运行 遍历数组中的每个顶点,以便每个顶点都至少连接到另一个顶点。
int u = -1;
for (int i = 0; i < vertices.length; i++) {
我将这两行结合起来,因为第一行的作用不大。变量 u
是当前相关顶点的索引。它最初设置为 -1,因为那不是数组中的有效位置。下一行 for
循环只是遍历给定数组中的每个顶点。
if (!included[i]) {
if (u == -1 || C[u] > C[i])
u = i;
第一行简单地检查 i
的当前值或当前顶点是否已经包含在树中。如果是,我们就不用再检查了,继续下一个。下一行首先检查 u
是否等于 -1。如上所述,-1 只是一个临时占位符值,此检查可确保它始终指向有效顶点。第二个检查是检查 u
的成本是否大于 i
的成本。这就是实际执行算法的过程。它基本上做的是获取 u
或临时顶点的成本。然后根据 i
的成本检查它。如果 i
的成本小于 u
的成本,则将 u
设置为 i
。在这样做的过程中,它会找到成本最低的顶点,因为它会在整个过程中记住 u
的值。
included[u] = true;
countIncluded++;
第一行将数组中 u
的索引设置为 true。这将确保不会在您的算法中再次检查它,以防止每次迭代都检查相同顶点的无限循环。之后,countIncluded
递增以跟踪当前添加的顶点数。
希望对您有所帮助!不要犹豫,让我澄清任何事情!
看看评论是否清楚:
while (countIncluded != vertices.length) {
//u represents a previous i value
int u = -1; //value serves as flag for "first time use"
//the purpose of this loop is to iterate over included array, which presumably
//if of the same length as vertices.
for (int i = 0; i < vertices.length; i++) {
if (!included[i]) { //execute if the value of included[i] is false
/* execute if one of these apply:
u value is -1 : meaning that it is the first time
included[i] is false (and there is not previous value to compare to).
OR C[u] > C[i] : previous vertex value > current vertex value
*/
if (u == -1 || C[u] > C[i])
u = i; //keep i value, the index of the lowest vertex
//value so far
}
}
//at the end of the for loop u is the index of the lowest C[u]
included[u] = true;
countIncluded++;
}
谁能给我解释一下这个循环中目前发生了什么? 这是我在 Prim 算法上的作业代码的一部分。
我得到了:虽然 countIcluded 不是 vertices.length,部分。
我需要了解下面发生的事情。
值得一提的是 included
是一个布尔数组。
希望我是新手,因为我是新手,请尽可能简单地解释(如果可能),以便我能理解基础知识。
while (countIncluded != vertices.length) {
// find the not included vertex with minimum cost
int u = -1;
for (int i = 0; i < vertices.length; i++) {
if (!included[i]) {
if (u == -1 || C[u] > C[i])
u = i;
}
}
// include in MST
included[u] = true;
countIncluded++;
}
所以基本上这个算法所做的是遍历一个顶点列表,并根据从一个顶点到另一个顶点的成本创建一条路径。成本只是一个术语,用来解释从一个顶点到另一个顶点的难度,通常只是距离。让我们进入代码。
while (countIncluded != vertices.length) {
我知道你说你明白这意味着什么,但我还是会复习一遍。此 while 循环将确保您 运行 遍历数组中的每个顶点,以便每个顶点都至少连接到另一个顶点。
int u = -1;
for (int i = 0; i < vertices.length; i++) {
我将这两行结合起来,因为第一行的作用不大。变量 u
是当前相关顶点的索引。它最初设置为 -1,因为那不是数组中的有效位置。下一行 for
循环只是遍历给定数组中的每个顶点。
if (!included[i]) {
if (u == -1 || C[u] > C[i])
u = i;
第一行简单地检查 i
的当前值或当前顶点是否已经包含在树中。如果是,我们就不用再检查了,继续下一个。下一行首先检查 u
是否等于 -1。如上所述,-1 只是一个临时占位符值,此检查可确保它始终指向有效顶点。第二个检查是检查 u
的成本是否大于 i
的成本。这就是实际执行算法的过程。它基本上做的是获取 u
或临时顶点的成本。然后根据 i
的成本检查它。如果 i
的成本小于 u
的成本,则将 u
设置为 i
。在这样做的过程中,它会找到成本最低的顶点,因为它会在整个过程中记住 u
的值。
included[u] = true;
countIncluded++;
第一行将数组中 u
的索引设置为 true。这将确保不会在您的算法中再次检查它,以防止每次迭代都检查相同顶点的无限循环。之后,countIncluded
递增以跟踪当前添加的顶点数。
希望对您有所帮助!不要犹豫,让我澄清任何事情!
看看评论是否清楚:
while (countIncluded != vertices.length) {
//u represents a previous i value
int u = -1; //value serves as flag for "first time use"
//the purpose of this loop is to iterate over included array, which presumably
//if of the same length as vertices.
for (int i = 0; i < vertices.length; i++) {
if (!included[i]) { //execute if the value of included[i] is false
/* execute if one of these apply:
u value is -1 : meaning that it is the first time
included[i] is false (and there is not previous value to compare to).
OR C[u] > C[i] : previous vertex value > current vertex value
*/
if (u == -1 || C[u] > C[i])
u = i; //keep i value, the index of the lowest vertex
//value so far
}
}
//at the end of the for loop u is the index of the lowest C[u]
included[u] = true;
countIncluded++;
}