从矩阵中过滤掉条件阵列

时间:2014-11-13 07:09:21

标签: python arrays algorithm

在瑞典有一个足球(足球)投注游戏,你试图找到13场比赛的结果。由于每场比赛都有主场胜利,平局或客场球队获胜,这将导致3 ** 13 = 1594323可能的结果。如果你有10到13个匹配正确,你就赢了。你不希望这种情况发生在许多其他人也有很高的分数,因为奖金总额在所有获奖者之间分配。这是我正在寻找答案的更通用问题的背景:如何找到矩阵中给定数组中至少x个元素相差的所有数组(在本例中为1594323 * 13)。

我想到的第一个明显的想法是有13个嵌套for循环并且当时比较一个数组。但是,我正在使用这个问题作为培训课程来学习自己的Python编程。 Python不是这类任务的最佳工具,我可以转向C来获得更快的程序,但我对最好的算法感兴趣。

在Python中,我尝试了嵌套for循环方法,最多10个匹配,然后执行时间太长,我正在使用的上网本上5秒。对于每个添加的匹配,执行时间增加了十倍。

另一种方法是使用数据库,这可能是解决方案,但我很好奇解决这类问题的最快方法是什么。我没有成功搜索这个问题,也许是因为在短搜索中很难使用正确的问题描述。

1 个答案:

答案 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))