【问题标题】:Data structure with O(1) random removal and adds for shuffling generator order具有 O(1) 随机删除和添加的数据结构,用于改组生成器顺序
【发布时间】:2018-05-12 03:23:19
【问题描述】:

我需要一个数据结构,让您可以在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() isn't random?,似乎set() 实际上并没有以任意顺序删除项目。上面的用法如何实现数据结构?

【问题讨论】:

    标签: python python-3.x algorithm data-structures


    【解决方案1】:

    如果你想随机弹出,为什么不直接使用列表并通过将最后一个元素与一些随机选择的元素交换然后删除新的最后一个元素来实现弹出呢?这不会保留数据结构中剩余元素的顺序,但“随机弹出”和“随机播放”表明您并不关心。

    【讨论】:

      【解决方案2】:

      在使用pop 时,在集合中查找和删除随机元素通常是O(k),但是,您可以修改操作,以便在检查长度时对列表进行打乱,这样,addpop 操作保持不变O(1)

      import random
      
      class RandomStack:
         def __init__(self, _d = None):
            self.stack = _d if _d else []
         def __len__(self):
            random.shuffle(self.stack)
            return len(self.stack)
         def add(self, _val):
            self.stack.append(_val)
         def poprandom(self):
            return self.stack.pop()
      
      
      a = RandomStack()
      for i in range(16):
        a.add(i)
        if len(a) > 10:
           val = a.poprandom()
           print(val)
      

      输出:

      2
      4
      9
      0
      6
      12
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-06
        • 1970-01-01
        • 2012-05-13
        • 1970-01-01
        • 2011-06-17
        相关资源
        最近更新 更多