【发布时间】:2012-03-02 09:18:20
【问题描述】:
问题:我需要为一个容器获取一个随机元素,并从该容器中删除它。容器不需要分类。 我不在乎订单。
- 向量可以在
O(1)中获取随机元素,但只能在O(N)中删除它 - 列表删除
O(1)中的元素但只能获取O(N)中的随机元素
所以我想到了制作一个自定义向量的想法,它允许您按其索引删除任何元素,O(1)+ 复杂度。
这个想法是交换最后一个元素和要删除的元素,然后pop_back()。
如果您需要删除最后一个元素 - 只需 pop_back()。
向量的顺序不会相同,但您会得到一个快速删除方法。
据我所知,双端队列的索引访问速度较慢,删除复杂性比我的解决方案更差,但我不是 100% 确定。
我很好奇O(1) 或O(logN) 中是否存在随机访问和元素删除的数据结构,按索引或按值按mb?
【问题讨论】:
-
为什么需要为此制作自定义向量?只需将元素交换到最后并从那里删除它?这不需要是一个特殊的类。
-
如果你想保持元素的顺序,我给了你一个解决方案,那就是 O(log N) 复杂度。
-
@NicolBolas 他找到了一个解决方案(不知道为什么他想要一个新的集合),但询问是否有 O(1) 或 O(log N) 解决方案。我们知道有一个恒定的时间解决方案(正如他自己发现的那样),因此 O(log N) 只能表示保持秩序的解决方案。
标签: c++ performance data-structures vector big-o