今天我有一个非常有趣的采访问题。
我有一个芯片芯片(比方说是黄色)和从一个芯片到两个芯片的一系列报价(一个黄色 - >一个绿色,一个蓝色)。为实现结果集,我必须做的最小交易次数是多少。
所以,让我说我开始使用颜色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看起来非常相似,但它没有定向,在我的情况下,我可以重复交易(非独特路径)。
答案 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
其中树继续并且每个节点是芯片的集合(或允许重复的列表)。一些有助于解释树概念的想法:
goalSet.size
级别。您从节点A开始,遍历所有筹码并逐一执行每笔交易,每次执行时都会更深入。
Here是一篇维基百科文章,解释了如何进行树遍历,您可以在探索时调整它们以创建节点。深度优先搜索将是最简单的,因为您一次只需要跟踪一个节点,但广度优先搜索可能会更快,尽管更多的实现很痛苦。