我在考虑以下数据结构问题:
按照排序顺序给出1
和n
之间的整数,每个操作查询然后删除(在单个调用中)k
最小的数字。如何进行查询和删除两次常量操作?
它类似于阵列结构但需要不断移除。虽然订单平衡二叉树可以做到这一点,但它的复杂度为O(lg n)
。
可以利用范围属性(仅在1
和n
之间的数字)来使其有效吗?
答案 0 :(得分:1)
LinkedHashSet正是您要找的。如果您希望索引在数组中,请使用此LinkedHashMap。但您需要按照从1
到n
答案 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值(