数据结构类似于数组但支持删除

时间:2013-10-30 16:42:57

标签: algorithm data-structures

我在考虑以下数据结构问题:

按照排序顺序给出1n之间的整数,每个操作查询然后删除(在单个调用中)k最小的数字。如何进行查询和删除两次常量操作?

它类似于阵列结构但需要不断移除。虽然订单平衡二叉树可以做到这一点,但它的复杂度为O(lg n)

可以利用范围属性(仅在1n之间的数字)来使其有效吗?

2 个答案:

答案 0 :(得分:1)

LinkedHashSet正是您要找的。如果您希望索引在数组中,请使用此LinkedHashMap。但您需要按照从1n

的顺序插入它们

答案 1 :(得分:1)

N的最大值是多少?你提到你将使用正数 - Van Emde Boas tree可能是你的最佳选择。

简短说明:

- 允许仅存储来自[0,2 ^ k)的正数,其中k是存储最大数N所需的位数。
- 所有操作(insert,delete,lookup,find_next,find_prev)都在log(K)中工作。不记录(N)。因此,对于整数32位数,复数是log(32)= 5  
- 缺点是内存消耗。需要2^k ~ O(N)内存,所以对于存储整数,你需要~1GB RAM。 请记住,通常O(N)内存意味着O(元素数量),但这里它意味着O(最大存储值)。

注意:我不确定支持第k个元素查询但描述看起来不错:

  

FindNext:找到最小键至少为a的键/值对   给定k

     

FindPrevious:找到最大密钥为a的键/值对   给定k

<强>更新

正如下面提到的Dukeling,不支持第K个元素查询。我看到了实现它的唯一方法。

int x = getMin();
for(int i=0;i<k-1;i++) x = getNext(x);

在此循环之后x将存储第k个元素。但复杂性为O(K*log(bits))。对于大的K值(

)来说太糟糕了