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