我经常*发现自己需要一个具有以下属性的数据结构:
- 可以用 O(n) 中的 n 个对象数组初始化。
- 可以在 O(1) 中获得一个随机元素,在此操作之后,将拾取的元素从结构中删除。(无需更换)
- 可以在 O(p) 中撤消 p '不替换的拾取'操作
- 可以从 O(log(n)) 中的结构中删除特定对象(例如通过 id)
- 可以在 O(n) 中获取当前结构中的对象数组。
其他操作(例如插入)的复杂性(甚至可能性)并不重要。除了复杂性之外,它对于少量的 n 也应该是有效的。
谁能给我实施这种结构的指导方针?我目前实现了一个具有上述所有属性的结构,除了元素的选取需要 O(d) 和 d 过去选取的数量(因为我明确检查它是否“尚未选取”)。我可以找出允许在 O(1) 中选择的结构,但这些结构至少在其他操作之一上具有更高的复杂性。
顺便说一句:请注意,上面的 O(1) 意味着复杂性与#earlier 选择的元素无关,也与总的#elements 无关。
*在蒙特卡罗算法中(从 n 个元素的“集合”中迭代选择 p 个随机元素)。