Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 列表查找比集合查找慢_Python_Set_Time Complexity - Fatal编程技术网

Python 列表查找比集合查找慢

Python 列表查找比集合查找慢,python,set,time-complexity,Python,Set,Time Complexity,我目前正在做一个项目,在这个项目中,我必须多次检查给定的2D点是否“合法”,也就是说它是否在网格的边界内,以及它是否以前从未被访问过。网格有一个固定的hxw大小,所以我想我可以不将它们存储在一个集合中,而是存储在一个二维查找表中。令我惊讶的是,它比检查它是否出现在集合中要慢得多,尽管(理论上)它是一个O(logn)操作,而不是使用简单的数组查找O(1) 第一次尝试: class PointSet: def __init__(self, h, w): if h <=

我目前正在做一个项目,在这个项目中,我必须多次检查给定的2D点是否“合法”,也就是说它是否在网格的边界内,以及它是否以前从未被访问过。网格有一个固定的
hxw
大小,所以我想我可以不将它们存储在一个集合中,而是存储在一个二维查找表中。令我惊讶的是,它比检查它是否出现在集合中要慢得多,尽管(理论上)它是一个
O(logn)
操作,而不是使用简单的数组查找
O(1)

第一次尝试:

class PointSet:
    def __init__(self, h, w):
        if h <= 0 or w <= 0:
            raise ValueError("Invalid size")
        self.h = h
        self.w = w
        self.lookup = [[False for _ in range(w)] for _ in range(h)]
        self.size = 0

    def add(self, point):
        r, c = point
        self.lookup[r][c] = True
        self.size += 1

    def remove(self, point):
        r, c = point
        self.lookup[r][c] = False
        self.size -= 1

    def __contains__(self, point):
        r, c = point
        return 0 <= r < self.h and 0 <= c < self.w and self.lookup[r][c]

    def __bool__(self):
        return self.size != 0

    def __len__(self):
        return self.size

# H, W = ...
# pointset = PointSet(H, W)
# if (3, 5) in pointset:
#   ...

第二个代码执行得更快。首先,你必须考虑到你的代码的实现,即<代码>包含了代码> > GyTyTimeTys< /Cord><强>两次< /强>(因为你有一个列表列表),每一个都有0(1)的复杂度,并且将评估两个链式比较(<代码> 0,两个集合和列表都有一个<代码> o(1)< /代码>“获取项”。复杂性,所以我认为这里的区别在于集合是内置的(很可能是用C实现的)而您的自定义
点集
是用python编写的,因此速度较慢。@Rawing:我也是这么想的,我想我可能没有注意到一些明显的事情会增加复杂性。ThanksI注意到我每次调用
add()时都会增加我的点集的大小
method,即使已经访问了该点。它在我的代码中仍然有效;但根本没有改变执行时间。请显示得出结论的完整代码。
#  pointset = set()
#  if (3, 5) in pointset:
#    ...