从矩阵中过滤出条件数组

2024-09-30 18:23:36 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我想到的第一个明显的想法是,将13个for循环嵌套起来,同时比较一个数组。然而,我将这个问题作为一个培训课程来学习Python编程。Python不是这类任务的最佳工具,我可以使用C来获得更快的程序,但我对最好的算法本身很感兴趣。你知道吗

在Python中,我尝试了最多10个匹配项的嵌套for循环方法,但是执行时间太长,在我使用的上网本上是5秒。每增加一个匹配,执行时间就增加10倍。你知道吗

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


Tags: 方法答案游戏for时间情况数组奖金
1条回答
网友
1楼 · 发布于 2024-09-30 18:23:36

下面是一个递归解决方案,在我的机器上,当给定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))

相关问题 更多 >