Python 有没有办法提高生成随机x-y坐标的算法的效率?
我正在研究一种算法,它可以在一张大图像上随机绘制物体。这是我目前的工作流程Python 有没有办法提高生成随机x-y坐标的算法的效率?,python,arrays,algorithm,space-complexity,Python,Arrays,Algorithm,Space Complexity,我正在研究一种算法,它可以在一张大图像上随机绘制物体。这是我目前的工作流程 我定义一个表示图像尺寸的空间,并启动一个空数组(restrictList) 使用genLoc函数,我随机选取一个点(x,y)。拾取第一个点时,限制列表为空 然后计算对象将占用的所有点。这些点将添加到阵列(限制列表) 然后我再次调用genLoc,选择另一个随机变量(x,y)。如果(x,y)exists为restrictList,则该函数将再次调用自身 这将继续,直到我们选择了一个不在限制列表中的随机点 问题如下,随着绘制的
[x代表x,如果x不在限制列表中,则代表所有可能的点]
并选择一个随机索引。这需要更长的时间,因为数组AllPossiblePoints非常大。我想我需要一种方法来确保restrictList中的(x,y)坐标不会首先被随机生成
def genLoc(x,y, restrictList):
Valx = randint(0, x)
Valy = randint(0, y)
point = (Valx, Valy)
if point in restrictList:
return genLoc(dimx, dimy, restrictList)
elif point not in restrictList:
return point
修改
此解决方案要求您提前生成所有可能的坐标。它使用集合和集合逻辑来消除使用时的可能性。random.sample用于从可能的点中选择一个点。我的mre是为了说明-(一切都是线性的)
s.difference\u update(t)
的时间复杂度为O(len(t))
这解决了寻找尚未使用的随机坐标的问题
无法评估预先创建所有坐标的成本。如果成本太高,那么可能不得不重新寻找可用的坐标。使用集合保留所有限制点将减少成员资格测试的时间。我看到的一个常见解决方案是随机洗牌
所有可能的点
,然后只从末尾剥离项目。这是否回答了您的问题?否则使用整个点空间的random.sample
points=random.sample(所有可能的点,所放置对象的编号)
-我认为只有当x和y没有显著的大小时,这才是一个好方法。是这样吗?使用集合而不是列表来保存限制点。这应该会有所帮助,感谢您的回答,问题是当选择一个点时,其周围的一定数量的点(x,y)不再有效。这是基于我们正在绘制的最大对象。我这样做是为了在绘图时没有重叠。例如,我们首先选择(10,5)并使用它来绘制对象(y),假设最大的对象是(z)。以下矩形中的所有点都无效(10长度(z)、5高度(z)、10+长度(y)、5+高度(y)。在我的解决方案中,这些点位于restrictList数组中。
import random
# fake function that identifies
# unusable points after placing an object
def calc_objectspace(point,obj=None):
objdims = range(-5,5)
# linear all the same size
objspace = set(point+n for n in range(-5,5))
objspace.add(point) # as needed
return objspace
# make all the points as a set
allthestuff = set(range(10000))
# iterate over the objects getting placed
for obj in range(10):
# random.choice won't work with a set
point = random.sample(allthestuff,1)[0]
# determine occupied points
obj_space = calc_objectspace(point)
# reduce the possible points
allthestuff.difference_update(obj_space)
print(len(allthestuff))