Algorithm 获取节点子集的路径

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的颜色开始,我需要得到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是失败的)

这只会告诉你最小交易数量(也恰好是最大交易数量),而不是是否有可能实现设定的目标


解决这个问题的一个更通用的方法是探索可能性之树

这只是对一棵树的搜索,在搜索过程中,您将在树中生成节点。您的树看起来像(例如):

其中树继续,每个节点都是一组芯片(或列表,如果允许重复)。以下几点有助于解释树的概念:

  • 沿着树向下移动表示向前工作
  • 向下移动一个分支代表一个交易
  • 由于您试图找到最少的交易数量,并且所有交易都会将集合的大小增加1,因此您只需浏览树的
    goalSet.size
    级别
  • 你从节点A开始,循环你所有的筹码,一次一个地进行每一笔可能的交易,每次交易都会更深一层

    是一篇维基百科文章,解释了如何进行树遍历,您可以在探索节点时对其进行调整以创建节点。深度优先搜索将是最简单的,因为您一次只需跟踪一个节点,但广度优先搜索可能会更快,尽管实施起来更麻烦

                A
                |
               B,C
             /     \
        D,E,C       B,F,G
          |           |
       D,E,F,G     D,E,F,G