具有随机访问元素删除的类似队列的数据结构

时间:2012-02-28 21:55:55

标签: c++ data-structures

是否有像队列一样的数据结构,它也支持在任意点删除元素?排队和出列最频繁发生,但中间队列元素移除在速度方面必须相似,因为可能存在最常见操作的时段。性能的一致性比绝对速度更重要。时间比记忆更重要。队列长度很小,在绝对峰值负载下不超过1,000个元素。如果不明显,我会明确说明:不需要随机插入。

标记了C ++,因为那是我的实现语言,但我没有使用(也不想使用)任何STL或Boost。仅限纯C或C ++(我将C解决方案转换为C ++类。)

编辑:我认为我想要的是一种字典,它也有一个队列接口(或一个也有字典界面的队列),这样我就可以这样做:

Container.enqueue(myObjPtr1);
MyObj *myObjPtr2 = Container.dequeue();
Container.remove(myObjPtr3);

3 个答案:

答案 0 :(得分:4)

我认为双链接列表正是您想要的(假设您不需要优先级队列):

  1. 轻松快速地向两端添加元素
  2. 从任何地方轻松快速地删除元素
  3. 您可以使用std::list容器,但是(在您的情况下)很难删除元素 如果你只有一个指向元素的指针(或引用)(包含在STL的列表元素中),则从列表中间开始,但是 你没有迭代器。如果使用迭代器(例如存储它们)不是一个选项 - 那么实现双链表(即使使用元素计数器)应该非常简单。如果你实现自己的列表 - 你可以直接操作指向元素的指针(每个元素都包含指向它的两个邻居的指针)。如果您不想使用Boost或STL,这可能是最好的选择(也是最简单的选项),并且您拥有控制所有内容(您甚至可以为列表元素编写自己的块分配器以加快速度事情)。

答案 1 :(得分:3)

一种选择是使用订单统计树,这是一种增强树结构,支持对每个元素的O(log n)随机访问,以及在任意点的O(log n)插入和删除。在内部,订单统计树被实现为平衡二进制搜索树,其具有与之关联的额外信息。因此,查找比标准动态数组慢,但插入速度要快得多。

希望这有帮助!

答案 2 :(得分:2)

您可以使用链表和哈希表的组合。在java中,它被称为LinkedHashSet

这个想法很简单,有一个链接的元素列表,并且还保持hash map (key,nodes),其中node是指向链表中相关节点的指针,并且key是表示此节点的键。

请注意,基本实现是set,并且需要一些额外的工作才能使此数据结构允许欺骗。

此数据结构允许O(1)头/尾访问,以及O(1)访问列表中的任何元素。 [平均所有武装]