Python 具有O(1)随机移除和添加的数据结构,用于洗牌生成器顺序
我需要一个数据结构,允许您在Python 具有O(1)随机移除和添加的数据结构,用于洗牌生成器顺序,python,python-3.x,algorithm,data-structures,Python,Python 3.x,Algorithm,Data Structures,我需要一个数据结构,允许您在O(1)时间内随机添加和删除元素 其原因是我需要从生成器中洗牌数据,但由于大小原因,我无法同时将所有数据加载到内存中 这是一个用法示例,它自动洗牌生成器表达式生成的结果的顺序,而无需将所有内容加载到内存中: def generator_shuffler(generator) a = magical_data_structure_described_above for i in generator: a.add(i) if
O(1)
时间内随机添加和删除元素
其原因是我需要从生成器中洗牌数据,但由于大小原因,我无法同时将所有数据加载到内存中
这是一个用法示例,它自动洗牌生成器表达式生成的结果的顺序,而无需将所有内容加载到内存中:
def generator_shuffler(generator)
a = magical_data_structure_described_above
for i in generator:
a.add(i)
if len(a) > 10: yield a.poprandom()
最初我尝试了python
set()
,但是从这里开始:,似乎set()
实际上并没有按任意顺序删除项目。如何使用上述用法实现数据结构?如果您想随机弹出,为什么不使用列表,通过将最后一个元素与随机选择的元素交换,然后删除新的最后一个元素来实现弹出?这不会保留数据结构中其余元素的顺序,但“随机弹出”和“随机移动”表明您并不在意。如果您想随机弹出,为什么不使用列表并通过将最后一个元素与随机选择的元素交换,然后删除新的最后一个元素来实现弹出?这不会保留数据结构中剩余元素的顺序,但“随机弹出”和“随机移动”表明您并不在意。在集合中查找和删除随机元素通常是在使用pop
时进行的,但是,您可以修改操作,以便在检查长度时对列表进行随机移动,这样,add
和pop
操作仍然是O(1)
:
输出:
2
4
9
0
6
12
查找和删除集合中的随机元素通常是在使用
pop
时进行的,但是,您可以修改操作,以便在检查长度时对列表进行无序排列,这样,添加和pop
操作都会保留O(1)
:
输出:
2
4
9
0
6
12