我不确定这是否可能,但对我来说似乎有点合理,我正在寻找一种数据结构,它允许我执行以下操作:
当然,编辑不会导致元素顺序的任何更改。使之成为可能的是,我将一个接一个地依次插入元素。例如,如果我第五次尝试插入,我确定在这个之前的四个元素都比它小,之后的所有元素都会更大。
发布于 2012-05-08 22:59:23
首先,我想指出,如果k真的是一个随机数,那么可能值得考虑的是,这个问题可能是完全不同的:要求k-最小元素,在可用元素的范围内,k是随机的,基本上是……随机挑选一个元素。而且可以做很多不同的事情。
这里我假设您实际上需要选择一些特定的,如果是任意的,k。
考虑到强的前提条件是按顺序插入元素,有一个简单的解决方案:
当然,问题是在删除元素时,会在表中创建空白,这样Tk元素可能不是k最小的,而是j-最小的j <= k,因为k之前的一些单元格是空的。
这样就足以跟踪您删除的元素,知道删除了多少小于k的,您如何在最多的时间内做到这一点?通过使用范围树或类似类型的数据结构。范围树是一种结构,允许您为X到Y之间的所有整数添加整数,然后对所有整数进行查询。因此,每当您删除一个项目时,只需将它添加到范围树中;当您查找k-最小元素时,对删除的所有整数进行查询;假设增量已被删除,那么第k个元素将位于Tk+delta中。
有两个小渔获量,需要进行一些修正:
KthSmallest(T,k) := {
a = 1; b = k; delta
do {
delta = deletedInRange(a, b)
a = b + 1
b = b + delta
while( delta > 0 )
return T[b]
}
此操作的确切复杂性取决于您如何准确地进行删除,但是如果您的元素被随机地一致删除,那么迭代的次数应该相当少。
发布于 2015-08-30 12:19:45
发布于 2012-05-07 07:33:26
调查堆。插入和删除应该是O(log ),最小元素的窥视是O(1)。然而,对K‘’th元素的窥视或检索将再次是O(log )。
编辑:正如amit所说,检索比偷看要昂贵得多。
https://stackoverflow.com/questions/10478260
复制相似问题