允许通过索引访问元素并在O(1)中删除它们的数据结构

时间:2013-08-05 07:42:35

标签: algorithm

我有以下任务(作为更大任务的一部分):

我需要从数组结构中获取k元素并删除它(k是任何可能的索引)。数组有O(n)用于删除元素,List有O(n)用于搜索元素。我想在O(1)时间内完成这两项操作。

我应该使用哪种数据结构来满足此要求?

澄清:

删除索引(5)上的元素会将元素从索引(6)移动到索引(5)。

这个特殊任务是topcoder srm 300 div2 500点问题。它不需要如此复杂的数据结构(简单的java方法可以完成工作,因为最大数据非常小),但我很好奇如何使用类似c的数据思维处理更大的问题。

所以也许我对这个问题坚持不懈?但是我会在下班后分析它并编辑问题(如果你真的很好奇,你可以在顶级编码器上看到任务)。

4 个答案:

答案 0 :(得分:8)

我相信你所要求的是不可能的。

但是,如果您可以放宽索引到O(log n)的要求,那么ropes可能能够满足它,尽管我不确定它们是否具有概率或确定性保证(我认为)这是概率性的。)

答案 1 :(得分:1)

有一种解决方案,在某些情况下可能令人满意。您必须使用数组和向量来保存删除。每次删除元素时,都将其索引放在向量中。每次读取某个索引的元素时,都会根据以前的删除重新计算其索引。

说,你有一个数组:

A = [3, 7, 6, 4, 3]

删除第三个元素:

A = [3, 7, 6, 4, 3] (no actual deletion)
d = [3]

然后阅读第4章:

i = 4
3 < 4 => i += 1
A[i] = 3

这不完全是O(1),但它不依赖于数组长度。仅限于一些已删除的元素。

答案 2 :(得分:0)

添加和删除元素的开销很小的唯一数据结构是哈希表。唯一的开销是散列函数的成本(如果你采用纯粹的理论方法,它被认为是O(1))。

但是,如果你想要它非常有效,你需要:

  • 大致了解您需要进入数据结构的元素数量(并在开头为所有数据分配一次)。
  • 选择一个哈希函数,以避免因密钥分发方式发生冲突(冲突只会破坏哈希表的效率)。

如果你设法使一切正确,那么你应该是最佳的。

答案 3 :(得分:0)

鉴于&#34;约会的性质&#34;如果给出的问题,它涉及不断选择和删除&#34; best&#34;集合的成员 - 经典优先级队列。事实上,你需要建立其中两个(男性和女性)。您必须在O(NlogN)时间(排序列表)中构建它们以进行常量O(1)删除,或者在线性时间(堆)中构建它们以便删除O(logN)。总的来说,无论哪种方式都可以获得O(NlogN),因为您将删除所有队列和大部分队列。

那么问题是什么结构支持任务的其他部分,选择&#34;选择器&#34;从圈子里移除他和他的选择。由于这也必须进行N次,因此任何在O(logN)时间内完成删除的方法都不会增加算法的整体复杂性。在给定重新索引要求的情况下,您无法通过快速删除获得O(1)索引访问。但事实上,您可以使用树(如提到的绳子)获取索引访问和删除的O(logN)。这将给你O(NlogN)整体,这是你能做的最好的。