것으로 항목을 정의최대 클러스터의 최소값 찾기?
- 고유 ID
- 값
- 삭제가
나는 두 개의 입력 스트림을 한 시간 창조 시간 - 나로 알린다 항목이 만들어지면 항목이 삭제 될 때 알려줍니다. 창조되었지만 파괴되지 않은 "살아있는"물건을 부르십시오. 그때 하나가 O(log n)
시간이 소요 추가 또는 삭제, n
항목을 가지고있는 경우에
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
:
나는 힙을 사용하여 모든 살아있는 항목의 최대 값을 추적 할 수 있습니다.
지금 항목이 두 항목, 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
현재 힙에만 사용할 수 있을지는 의문입니다. 이 작업을 효율적으로 수행하려면 별도의 데이터 구조가 필요합니다. 클러스터가 병합 한 다음 병합 할 수 있지만 분리 된 세트는 좋을 것이므로 별도의 파티션 분리가 가능한 항목이 필요합니다 (union-find는 그렇지 않습니다). 일명 파티션 세분화입니다. – davin
templatetypedef의 대답은 작동하지만 어려운 구현으로 보입니다. 많은 경계선 사례를 예상하지 않는다면 간단한 'O (n)'해법이 유용 할 것입니다. 클러스터의 끝이 자주 바뀌는 것이 드문 경우를 의미합니다. 그러면 세상 끝이 아닙니다. BST로 이동하고 하나의 포인터를 유지함으로써 약간 향상시킬 수 있습니다. 그러면 'O (n)'작업은 삭제시에만 발생하며 삽입시에만 적용됩니다. 눈에 띄지 않아야합니다. – davin