获取节点子集的路径

时间:2016-08-01 02:37:42

标签: 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芯片)。这似乎是一个Graph问题。 MST看起来非常相似,但它没有定向,在我的情况下,我可以重复交易(非独特路径)。

1 个答案:

答案 0 :(得分:0)

简单的逻辑就足够了,不需要程序/算法。

由于每次交易都会改变你拥有的筹码数量(即一个),你可以将筹码与你设定的目标设定的筹码之间的差异除以:

chipsIn = 1
chipsOut = 2
changePerTrade = chipsOut - chipsIn
numTrades = (goalSet.size - startSet.size) / changePerTrade

一些警告:

请注意,这只能起作用,因为所有交易具有相同的输入和输出大小,并且假设您拥有的每个芯片都计入目标集(例如,如果您是ABC,那么试图获得AB)。

这只会告诉您最低交易次数(也恰好是最大交易次数),而不是是否有可能实现目标设定。

<小时/> 解决问题的更通用的方法是探索可能性树。

这只是一个树的搜索,您将在树中探索它时生成节点。你的树看起来像(对你的例子):

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

其中树继续并且每个节点是芯片的集合(或允许重复的列表)。一些有助于解释树概念的想法:

  1. 向下移动树代表向前工作。
  2. 向下移动一个分支代表一笔交易。
  3. 由于您尝试查找的交易次数最少,并且所有交易都会将您的设置大小增加1,因此您只需要浏览树的goalSet.size级别。
  4. 您从节点A开始,遍历所有筹码并逐一执行每笔交易,每次执行时都会更深入。

    Here是一篇维基百科文章,解释了如何进行树遍历,您可以在探索时调整它们以创建节点。深度优先搜索将是最简单的,因为您一次只需要跟踪一个节点,但广度优先搜索可能会更快,尽管更多的实现很痛苦。