Python内存 - python代码的内存限制超过

时间:2016-03-05 09:51:20

标签: python memory

当我解决自我交叉的问题时,我遇到了this问题。这就像蛇游戏。

给定x = [2,1,1,2],我们从0开始,然后我们上升2,左转1,右转1,然后下2。目标是计算是否它会自我交叉还是不交叉。由于给定的步骤总是整数,我考虑使用矩阵,每当它通过一个点时,我将点设置为1.像这样我可以检查点是否已被访问过。

我认为通过这种方式,python所做的所有内存只是矩阵的赋值。这就是为什么我不理解输入x何时是巨大的,为什么它说:内存超出限制。对我来说,我认为记忆与之前启动的矩阵相同。

如果有人可以提供帮助,我会很高兴。

class Solution(object):
def isSelfCrossing(self, x):
    """
    :type x: List[int]
    :rtype: bool
    """
    m = [[0 for j in xrange(1000)] for j in xrange(1000)] 
    m[0][0] = 1
    a,b = 0,0
    flag = 0
    for i in x:
        flag = (flag + 1) % 4
        if flag == 1:
            for temp in xrange(1,i+1):
                b += 1
                if m[a][b] != 0:
                    return True
                else: m[a][b] = 1
        elif flag == 2:
            for temp in xrange(1,i+1):
                a -= 1
                if m[a][b] != 0:
                    return True
                else: m[a][b] = 1
        elif flag == 3:
            for temp in xrange(1,i+1):
                b -= 1
                if m[a][b] != 0:
                    return True
                else: m[a][b] = 1
        else:
            for temp in xrange(1,i+1):
                a += 1
                if m[a][b] != 0:
                    return True
                else: m[a][b] = 1


    return False

2 个答案:

答案 0 :(得分:0)

多么巨大" x"可能?如果" x"是不是很大,您的代码是否成功运行?

假设" x"真的很大,它可能与你的" m"初始化是打破骆驼背部的稻草。换句话说,你的" x" (以及其他一些内存分配)可能会消耗几乎所有允许的进程内存分配,并且" m"初始化超过限制。

答案 1 :(得分:0)

在Python中使用列表作为布尔矩阵很少有意义。尝试在set中存储整数对并替换

m = ...       # with m = set()
m[a][b] != 0  # with (a, b) in m
m[a][b] = 1   # with m.add((a, b))

或者,您可以使用与bytearrayindex it相同数量的元素m创建展平a * 1000 + b。但是,这可能会导致细微的索引错误,所以我强烈建议先尝试set