算法 - 插入,删除at,get,in O(1)

时间:2017-11-30 16:56:33

标签: java algorithm performance data-structures

简短的问题:

是否有任何数据结构或算法允许在固定时间内按索引进行检索,插入和删除?

详细地说,我想解决以下问题(在Java中):

给定一组正数,创建一个数据结构,允许执行以下操作,授予恒定时间(最多可使用50-70MB):

  • 随时获取最大或最小元素(只有一个元素)。

  • 删除并插入给定索引。

我尝试将元素放在排序数组中,每次删除顶部(最大或最小)元素时,用负数标记它,然后增加指向顶部元素的索引,例如:

# sortedArr[headIndex] = topElement

sortedArr = [30, 20, 9, 5, 3, 2, 1]
headIndex = 0

Delete top element (30)
sortedArr = [-1, 20, 9, 5, 3, 2, 1]
headIndex = 1

Delete top element again (20)
sortedArr = [-1, -1, 9, 5, 3, 2, 1]
headIndex = 2

当删除的元素不是最重要的元素时会出现问题,因为我会忘记顶部元素:

# sortedArr[headIndex] = topElement

sortedArr = [-1, -1, 9, 5, 3, 2, 1]
headIndex = 2

Delete number "3"
sortedArr = [-1, -1, 9, 5, -1, 2, 1]
headIndex = 2  # It is not updated as no top element has been removed.

Delete number "5" and "9"
sortedArr = [-1, -1, -1, -1, -1, 2, 1]
headIndex = ?

HeadIndex应该是5,但问题是更新headIndex,就像每次删除时,headIndex指向新的top元素似乎不可能,因为这就是为什么要求上面的数据结构。

类似double stack structure的东西,允许删除和插入任何地方都适合我。

1 个答案:

答案 0 :(得分:0)

想到<^> BitSet 2 ^ 31位需要2 ^ 28字节,256 MiB。不要求,但迭代它也是有效的。

BitSet bitSet = ...;
int max = bitSet.previousSetBit(bitSet.size() - 1);
int min = bitSet.nextSetBit(0);

上一个和下一个方法是包含

如果没有删除,max将在O(1)中计算,而min遗憾的是不是这样。由于这是稀疏数组的一种形式,两者的一般复杂性是 O(n)