【发布时间】:2018-06-28 19:09:25
【问题描述】:
我需要随机将列表中的位置分配给输入。我需要先检查它是否没有被占用,然后再使用它。我能想到的最佳算法如下:
def get_random_addr(input_arr):
while True:
addr = random.randrange(1, len(input_arr))
if input_arr[addr] is None:
break
return addr
这显然效率不高,因为当我们占用更多的槽时,循环需要更长的时间才能找到一个空槽,甚至可能需要很长时间(假设只剩下一个空槽)。你有更好的解决方案吗?
我是怎么做到的
根据选择的答案,这就是我最终这样做的方式。与搜索整个列表并找到None 元素并从检索到的集合中随机选择的解决方案相比,它非常快速和高效。我认为瓶颈是random.choice 方法,它似乎很慢。
# Create a list of indexes at the beginning when all the values are None
available_index = list(range(1, len(input_arr)))
random.shuffle(available_index)
# To get a random index simply pop from shuffled available index
random_index = available_index.pop()
虽然这种方法有额外的 O(n) 内存复杂度,但在实践中它非常高效且快速。
【问题讨论】:
-
如果您真的想高效地执行此操作,请使用
numpy。否则,通过循环一次,保留所有None索引的列表,然后从该列表中弹出并分配您的值 -
在引擎盖下 numpy 仍然是
O(N)它只是一个更快的O(N)
标签: python python-3.x algorithm python-2.7