简短的问题:
是否有任何数据结构或算法允许在固定时间内按索引进行检索,插入和删除?
详细地说,我想解决以下问题(在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的东西,允许删除和插入任何地方都适合我。
答案 0 :(得分:0)
BitSet bitSet = ...;
int max = bitSet.previousSetBit(bitSet.size() - 1);
int min = bitSet.nextSetBit(0);
上一个和下一个方法是包含。
如果没有删除,max
将在O(1)中计算,而min
遗憾的是不是这样。由于这是稀疏数组的一种形式,两者的一般复杂性是 O(n)。