Ruby中的最佳选择

时间:2016-10-04 08:03:52

标签: arrays ruby algorithm

给定一组值,

arr = [8,10,4,5,3,7,6,0,1,9,13,2]

X是一个值数组,可以在X.length != 0X.length < arr.length

的时候选择

然后将所选值输入函数score(),该函数将根据选择值数组返回分数。

Example 1: 
X = [8]
score(X) = 71

Example 2:
X = [4]
score(X) = 36

Example 3:
X = [8,10,7]
score(X) = 51

Example 4:
X = [5,9,0]
score(X) = 4

这里的函数得分()是一个黑盒子,我们无法修改函数的工作方式,我们只提供一个输入,函数将返回得分输出。

我的问题:如何获得每组数字的最低分数?

意思是,如果X是一个只有1个值的数组,并且我在arr中提供所有不同的值,则每个值将返回一个不同的得分值,并且我找到哪个arr值提供最低分数。

如果X是一个包含3个值的数组,我会在arr中提供所有不同可能值的组合,每组不同的3个值返回不同的分数并找到最低分数。

如果我的arr很小,这很简单。但是,如果我有50或甚至100个值的数组,我如何创建一个算法,根据输入值的数量提供最低分数

1 个答案:

答案 0 :(得分:0)

tl; dr :如果您对score一无所知,那么就无法加快速度。

为了优化score本身,你必须知道它是如何工作的。毕竟“优化”只是意味着“做同样的事情更有效率”,但如果你不知道“同一件事”是什么,你怎么知道真的是否“同样的事情” ?另外,加速score无论如何都无法帮助您解决组合爆炸。组合的数量增长如此之快,以至于score的任何加速都会被略微更大的输入快速吞噬。

为了优化您应用score的方式,您需要再次了解它。如果您对score有所了解,例如,您可以仅生成您知道会产生不同值的组合,或者您知道只会产生更大值的组合。换句话说,您可以在score的输出中利用某些结构来减少输入大小。但是,我们不知道score输出的结构,事实上,我们甚至不知道是否有一些结构!所以我们无法利用它。此外,结构中必须有一些极端冗余和规则性,以便显着减少输入大小。

In his comment, @ndn suggested applying some form of machine learning to discover structure in the output.。它的工作原理取决于输出的结构类型。当然,这再次假设甚至 发现了一些我们不知道的结构。而且,即使存在某种结构,也必须非常冗余和规则地弥补输入空间的组合爆炸。

真的,蛮力是唯一的方法。我们的最后一根稻草将是并行化。也许,如果我们在足够的CPU内核中分配问题,我们可以解决它吗?不幸的是,输入空间中的组合爆炸仍然真的会伤害到你:

如果我们假设我们有一个10THz的CPU(即比当前最快的CPU快一千倍),我们假设我们可以在一个时钟周期内计算score我们假设我们拥有一台拥有1000万个核心的计算机(再次,这比最大的超级计算机大一千倍),它仍然需要400多年才能找到输入的最佳选择数组小至100个数字。即使我们的CPU速度提高了十亿倍,而计算机的数量也增加了十亿倍,只需将阵列大小加倍至200个项目,运行时间就会增加到500万亿年。

毕竟,我们称之为组合爆炸“组合爆炸”是有原因的。