Algorithm 获取节点子集的路径
今天我有一个很有趣的面试问题 我有一个芯片(比如黄色)和一系列从一个芯片到两个芯片(一个黄色->一个绿色,一个蓝色)的优惠。为了达到一个结果集,我必须做的最少交易数是多少 假设我从a的颜色开始,我需要得到D,E,F,G的颜色Algorithm 获取节点子集的路径,algorithm,Algorithm,今天我有一个很有趣的面试问题 我有一个芯片(比如黄色)和一系列从一个芯片到两个芯片(一个黄色->一个绿色,一个蓝色)的优惠。为了达到一个结果集,我必须做的最少交易数是多少 假设我从a的颜色开始,我需要得到D,E,F,G的颜色 A A -> B, C B -> D, E C -> F, G 我可以把A换成B,C,然后把这两个换成D,E,F,G 我需要什么算法来解决这个问题?从结果集倒转是一件事,但这相当棘手,因为交易可以循环(一个一个筹码换两个一个筹码)。这似乎是一个图形问题。
A
A -> B, C
B -> D, E
C -> F, G
我可以把A换成B,C,然后把这两个换成D,E,F,G
我需要什么算法来解决这个问题?从结果集倒转是一件事,但这相当棘手,因为交易可以循环(一个一个筹码换两个一个筹码)。这似乎是一个图形问题。MST看起来非常相似,但它是无方向的,在我的例子中,我可以重复交易(非唯一路径)。简单的逻辑就足够了,不需要程序/算法 由于每笔交易都会以相同的数量(即1)改变您拥有的筹码数量,因此您可以将您的筹码集与目标集之间的筹码差异除以集合大小的变化:
chipsIn = 1
chipsOut = 2
changePerTrade = chipsOut - chipsIn
numTrades = (goalSet.size - startSet.size) / changePerTrade
有几点需要注意:
请注意,这只适用于所有交易都具有相同输入和输出大小的限制,并且适用于假设您拥有的每个芯片都朝着目标集计数的情况(例如,如果您试图获得AB,则拥有ABC是失败的)
这只会告诉你最小交易数量(也恰好是最大交易数量),而不是是否有可能实现设定的目标
解决这个问题的一个更通用的方法是探索可能性之树 这只是对一棵树的搜索,在搜索过程中,您将在树中生成节点。您的树看起来像(例如): 其中树继续,每个节点都是一组芯片(或列表,如果允许重复)。以下几点有助于解释树的概念:
goalSet.size
级别 A
|
B,C
/ \
D,E,C B,F,G
| |
D,E,F,G D,E,F,G