Algorithm 为什么当我们将G中每一条边的成本更改为c';=log17和xFF08;c);,G中的每个MST仍然是G中的一个MST′;(反之亦然)?

Algorithm 为什么当我们将G中每一条边的成本更改为c';=log17和xFF08;c);,G中的每个MST仍然是G中的一个MST′;(反之亦然)?,algorithm,data-structures,Algorithm,Data Structures,备注:c'是以17为基数的对数c MST表示(最小生成树) 当我们使用线性函数变换每条边的代价时,很容易证明结论是正确的。 但是对数函数不是线性函数,我不明白为什么这个结论是正确的。 补充说明: 我没有考虑具体的算法,如贪心算法。简单地考虑了变换后两棵树的权之和之间的关系。 如果(a+b)>(c+d),(loga+logb)可能不是>(logc+logd)。 如果由G生成的树有两条边a和b,则由G生成的另一棵树有c和d,a+b(c+d),(loga+logb)可能不是>(logc+logd),我

备注:c'是以17为基数的对数c
MST表示(最小生成树)
当我们使用线性函数变换每条边的代价时,很容易证明结论是正确的。
但是对数函数不是线性函数,我不明白为什么这个结论是正确的。
补充说明:

我没有考虑具体的算法,如贪心算法。简单地考虑了变换后两棵树的权之和之间的关系。 如果(a+b)>(c+d),(loga+logb)可能不是>(logc+logd)。
如果由G生成的树有两条边a和b,则由G生成的另一棵树有c和d,a+b 因此,我想构建一个基于“if(a+b)>(c+d),(loga+logb)可能不>(logc+logd)”的反例,但我失败了


好吧,这很容易理解…让我们看看我是否可以为您细分:

c` = log_17(c) // here 17 is base
log
可能不是线性函数……但我们可以说:

log_b(x) > log_b(y) if x > y and b > 1 (and of course x > 0 and y > 0)
我希望你得到我所写的公式……用文字的方式,考虑一个基“B”,这样B>1,那么LogxB(x)将大于Logyb(y),如果x> y.< /p> 因此,如果我们将此规则应用于G的
MST的成本中,那么我们可以看到为
G
选择的边仍然会产生最小可能的边来构造MST G',如果
c'=log_17(c)//这里17是基

更新:正如我看到的,您在理解证据方面有问题,我正在详细说明:

我想,你知道的
MST构造
贪婪的
。我们将使用
kruskal的algo
来证明为什么它是正确的(如果你不知道,kruskal的algo是如何工作的,你可以在某处阅读它,或者用谷歌搜索它,你会发现数百万的资源)。现在,让我为G的MST
kruskal的边选择写一些步骤:

// the following edges are sorted by cost..i.e. c_0 <= c_1 <= c_2 ....

c_0: A, F // here, edge c_0 connects A, F, we've to take the edge in MST
c_1: A, B // it is also taken to construct MST
c_2: B, R // it is also taken to construct MST
c_3: A, R // we won't take it to construct to MST, cause (A, R) already connected through A -> B -> R
c_4: F, X // it is also taken to construct MST
...
...
so on...
所以可以说,

log_17(c_0) <= log_17(c_1), cause c_0 <= c_1
in general, 
log_17(c_i) <= log_17(c_j), where i <= j
这与G的MST相同

这最终证明了这个定理


我希望你能理解…如果你不在评论中问我你不清楚的是什么…

一种描述生成树T是最小生成树的方法是,对于不在T中的每一条边e,由e和T的边(e相对于T的基本循环)形成的循环没有比e更昂贵的边。使用这个特征,我希望您看到如何证明使用任何递增函数变换代价可以保持最小生成树

有一行证据证明这个条件是必要的。如果基本循环包含一个更昂贵的边,我们可以用e替换它,得到一个成本低于T的生成树

不太明显的是,这个条件是充分的,因为乍一看,我们试图从局部最优性条件证明全局最优性。为了证明这一说法,设T是满足条件的生成树,设T'是最小生成树,设G'是其边是T和T的边的并集的图。在G'上运行Kruskal算法,通过使T中的边优于T中的边来打破联系。让T'成为G'中的最小生成树。由于T'是G'中的生成树,T'的代价不大于T',因此T'是G中的最小生成树,也是G'中的最小生成树

假设相反,T“≠ 然后在T中存在一条边,但在T“”中不存在。设e是Kruskal算法考虑的第一条这样的边。在考虑e时,它在从T“”中选择的边上形成了一个循环C。因为T是非循环的,所以C\T是非空的。根据领带断裂准则,我们知道C\T中的每条边的成本都小于e。观察到C\T中的某些边e′在T{e}的两个连通分量中必须各有一个端点,我们推断e′相对于T的基本循环包含e,这违反了局部最优性条件。总之,T=T'',因此是G中的最小生成树


如果你想更深入地研究,这个逻辑会被抽象为逻辑理论。

c` logc是以17为基数的吗?或者它是log17乘以c@ZhouYuPeng,你所说的
log17(c)
…是
c
base,还是你把它乘以
log17
,如果是这样的话,那么你用什么作为基数?@reyad c`是logc加base17@ZhouYuPeng,检查我的新答案,希望它能帮助你理解…@周玉鹏,我刚刚读了更新后的问题…实际上我错过了更新…如果你不想使用算法,它会成为离散数学(特别是拓扑)的问题。所以,你不应该用算法来标记它。而是用离散数学和拓扑来标记它。不管怎么说,我们很久以前就开始用算法来证明数学了……我希望你们听说过。算法最初是用来证明数学的。不要只局限于一些不必要的界限。世界变了,数学也变了又变……但是,从数字上来说,如果(a+b)>(c+d),(loga+logb)可能不是>(logc+logd),我想给出这个结论的反例。如果由G生成的一棵树有两条边a和b,由G生成的另一棵树有c和d,a+blog_17(c_0) <= log_17(c_1), cause c_0 <= c_1 in general, log_17(c_i) <= log_17(c_j), where i <= j
c_0` <= c_1` <= c_2` <= c_3` <= ....
// the following edges are sorted by cost..i.e. c_0` <= c_1` <= c_2` ....

c_0`: A, F // here, edge c_0` connects A, F, we've to take the edge in MST
c_1`: A, B // it is also taken to construct MST
c_2`: B, R // it is also taken to construct MST
c_3`: A, R // we won't take it to construct to MST, cause (A, R) already connected through A -> B -> R
c_4`: F, X // it is also taken to construct MST
...
...
so on...