定義一個項具有:查找最大羣集的最小值?
- 一個唯一的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