在瑞典有一个足球(足球)投注游戏,你试图找到13场比赛的结果。由于每场比赛都有主场胜利,平局或客场球队获胜,这将导致3 ** 13 = 1594323可能的结果。如果你有10到13个匹配正确,你就赢了。你不希望这种情况发生在许多其他人也有很高的分数,因为奖金总额在所有获奖者之间分配。这是我正在寻找答案的更通用问题的背景:如何找到矩阵中给定数组中至少x个元素相差的所有数组(在本例中为1594323 * 13)。
我想到的第一个明显的想法是有13个嵌套for循环并且当时比较一个数组。但是,我正在使用这个问题作为培训课程来学习自己的Python编程。 Python不是这类任务的最佳工具,我可以转向C来获得更快的程序,但我对最好的算法感兴趣。
在Python中,我尝试了嵌套for循环方法,最多10个匹配,然后执行时间太长,我正在使用的上网本上5秒。对于每个添加的匹配,执行时间增加了十倍。
另一种方法是使用数据库,这可能是解决方案,但我很好奇解决这类问题的最快方法是什么。我没有成功搜索这个问题,也许是因为在短搜索中很难使用正确的问题描述。
答案 0 :(得分:0)
这是一个递归的解决方案,当我的机器上的x
值为0(最坏的情况)时,它会在我的机器上大约5秒钟终止。对于10 {及以上的x
值,它几乎是即时的。
def arrays_with_differences(arr, x):
if x > len(arr):
return []
if len(arr) == 0:
return [[]]
smallColl1 = arrays_with_differences(arr[:len(arr)-1], x)
smallColl2 = arrays_with_differences(arr[:len(arr)-1], x-1)
last = arr[len(arr)-1]
altLast1 = (last + 1) % 3
altLast2 = (last + 2) % 3
result = [smallArr + [last] for smallArr in smallColl1]
result.extend([smallArr + [altLast1] for smallArr in smallColl2])
result.extend([smallArr + [altLast2] for smallArr in smallColl2])
return result
result = arrays_with_differences([1,0,1,0,1,1,1,1,1,1,1,1,1], 4)
print(len(result))