定义一个项具有:查找最大群集的最小值?
- 一个唯一的ID
- 值
- 创建时间
- 删除时间
我有两个输入流 - 一个告诉我当物品被创建时,会在物品被删除时通知我。调用已创建但尚未销毁的项目“生活”。
我可以跟踪使用堆的所有生活用品的最大值:
whenCreated(item):
i = heap.size
heap-up(item, heap.size)
heap.size = heap.size + 1
max-value = heap[0]
whenDeleted(item):
ktem = heap[heap.size - 1]
heap.size = heap.size - 1
heap-up(ktem, index[item.id])
heap-down(ktem, index[ktem.id])
max-value = heap[0]
heap-up(item, i):
while (i > 0):
j = floor((i-1)/2)
jtem = heap[j]
if (jtem.value > item.value):
break while
index[jtem.id] = i
heap[i] = heap[i]
i = j
index[item.id] = i
heap[i] = item
heap-down(item, i):
while (2*i + 1 < heap.size):
if (2*i + 1 == heap.size or heap[2*i+1].value > heap[2*i+2].value):
j = 2*i + 1
else
j = 2*i + 2
jtem = heap[j]
if (jtem.value < item.value):
break while
index[jtem.id] = i
heap[i] = heap[i]
i = j
index[item.id] = i
heap[i] = item
如果我有n
项,然后添加或删除一个需要O(log n)
时间。
现在假设项目聚集,从而给出了两个项目,a
和b
,|a.value - b.value| < delta
⇒ a
和b
是相同的群集。
举例来说,如果我们已经得到了价值(1, 2, 3, 4, 7, 8, 11, 13, 14, 15, 16)
和delta = 2
,那么集群(1, 2, 3, 4)
,(7, 8)
,(11)
和(13, 14, 15, 16)
。
我想跟踪包含最大生命值的群集的最小值。我可以通过从堆中读取值来完成此操作,直到找到大小大于delta
的值之间的间隔为止。但是,这需要O(n)
时间,这看起来相当麻烦。
是否有O(log n)
算法来跟踪该群集的最小值?
集群是传递的吗?例如,如果增量为2,那么1,2,3,4,5和6都在同一个群集中? – templatetypedef 2012-02-03 18:53:39
我怀疑你只能使用当前堆做到这一点。看起来你需要一个单独的数据结构来有效地完成这项工作。虽然你的集群可以合并然后取消合并,但是不相交的集合会很好,所以你需要一些允许分离的东西(这种联合发现不会),也就是分区细化。 – davin 2012-02-03 18:57:28
templatetypedef的答案有效,尽管它似乎很难实现。如果你没有预料到许多临界情况,那么也许简单的'O(n)'解决方案是值得的。意思是,如果集群的末端经常变化,那么它不会是世界末日。你可以通过移动到BST并保持单个指针来稍微改进它,然后你的'O(n)'工作不会在删除时发生,只有在插入时才会发生,如果你期望小簇相对于'n'它不应该引人注目。 – davin 2012-02-03 19:45:02