【问题标题】:Filtering out conditioned arrays from a matrix从矩阵中过滤出条件数组
【发布时间】:2014-11-13 07:09:20
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: python arrays algorithm


    【解决方案1】:

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

    【讨论】:

    • 除了运行速度更快之外,它也是一个非常优雅的解决方案,谢谢!
    猜你喜欢
    • 2013-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-22
    • 2015-04-26
    • 2014-03-31
    • 1970-01-01
    相关资源
    最近更新 更多