Python算法:我的算法的复杂性是什么?如何优化它?

时间:2017-04-24 18:08:56

标签: python performance optimization big-o

我试图完成一个给你n的任务(一个方形棋盘的大小,皇后(它们占据的方格)和查询(一个坐标列表)。我要返回一个列表布尔值表示每个查询是否可以被任何一个皇后攻击。我知道我的算法有效,但我也知道它不是有效的,而且#34;通过研究,我可以通过研究来实现。我猜测复杂性是O(皇后查询)?这是我的第一个问题,是O(皇后查询),如果不是为什么?第二,有没有人知道我是怎么回事可以优化它甚至可以降到O(皇后+查询)?如果这是一个基本的问题,我很抱歉,但我主要是自学成才,没有任何人可以问这个问题。提前致谢!

def squaresUnderQueenAttack(n, queens, queries):
    output = []
    for i in queries:
        attackable = False
        for j in queens:
            if attackable != True and (i[0]==j[0] or i[1]==j[1] or abs(i[0]-j[0])==abs(i[1]-j[1])):
                attackable = True
                break
        output.append(attackable)
    return output

1 个答案:

答案 0 :(得分:3)

您当前的代码是 O(皇后*查询)。您可以将其改进为 O(皇后+查询)

制作三个数组,每个数组包含8个元素。称他们为 col diagleft diagright

看看每个女王,如果它在第0行,将中的那个位置设置为true。如果它在col 3中,则将该位置设置为 col 为true。标记对角线0-7并在其中做出适当的标记。

现在,数组表示所有具有皇后的行,列和对角线。

现在,查看每个查询并检查与其位置对应的任何数组条目是否标记为true。如果是这样,那么女王就会威胁它。

请注意,在big-O表示法中,我们对哪个因素“支配”运行时感兴趣,因此上述解决方案可能更适合在 O中运行(max(queens,queries)) )时间。也就是说,如果你有很多查询,那么皇后计算只需要一点时间。同样,如果你有很多皇后和很少的查询,那么这个操作将耗费大部分时间。