支持按索引和密钥随机访问的数据结构,在对数时间内插入,删除并保持订单

时间:2017-03-01 08:31:43

标签: algorithm data-structures random-access

我正在寻找存储E =(K,V)元素的有序列表的数据结构,并且在最多O(log(N))时间支持以下操作,其中N是元素的数量。内存使用不是问题。

  • E get(index)//按索引获取元素
  • int find(K)//找到K匹配的元素的索引
  • 删除(索引)//删除索引处的元素,以下元素的索引减少1
  • insert(index,E)//在index处插入元素,以下元素的索引增加1

我考虑过以下不正确的解决方案:

  • 使用数组:finddeleteinsert仍然是O(N)
  • 使用K的索引的数组+地图:deleteinsert仍会花费O(N)来转移元素并更新地图
  • 使用链接列表+ K地图到元素地址:getfind仍需花费O(N)

在我的想象中,最后一个解决方案是最接近但不是链接列表的自平衡树,其中每个节点存储左侧元素的数量,这将使我们能够{{1}在O(log(N))中。

但是我不确定我是否正确,所以我想问一下我的想象力是否正确以及是否有这种数据结构的名称所以我可以寻找 - 货架解决方案。

1 个答案:

答案 0 :(得分:0)

我能想到的最接近的数据结构是treaps

  

隐式treap是对常规treap的简单修改,这是一种非常强大的数据结构。实际上,隐式treap可以被视为一个实现了以下过程的数组(在线模式下都是O(logN)O(log⁡N)):

     
      
  1. 在任意位置的数组中插入元素
  2.   
  3. 删除任意元素
  4.   
  5. 在任意时间间隔内查找总和,最小/最大元素等
  6.   
  7. 添加,以任意间隔绘画
  8.   
  9. 以任意间隔反转元素
  10.   

使用隐式键修改允许您执行除第二个操作之外的所有操作(找到K匹配的元素的索引)。如果我想出一个更好的主意,我会编辑这个答案:)