11

나는 처리 할 항목 (큰 rationalals)의 컬렉션을 가지고. 각각의 경우 처리는 컬렉션에서 가장 작은 항목을 제거하고 작업을 수행 한 다음 0-2 개의 새 항목을 추가하는 것으로 구성됩니다 (항상 제거 된 항목보다 큽니다). 컬렉션은 하나의 항목으로 초기화되며 비어있을 때까지 작업이 계속됩니다. 나는 어떤 크기의 콜렉션이 도달 할 지 확신하지 못하지만, 1M-100M 항목에서 기대할 수 있습니다. 가장 작은 것 이외의 항목을 찾을 필요가 없습니다.레드 - 블랙 트리가 이상적인 데이터 구조입니까?

현재 가장 작은 항목에 대한 포인터를 유지하기 위해 조정될 수있는 빨강 - 검정 트리를 사용할 계획입니다. 그러나 전에 사용했던 적이 없으며 사용 패턴이 그 특성에 잘 맞는지 확실하지 않습니다.

1) 왼쪽 + 무작위 삽입에서 삭제 패턴이 성능에 영향을 미칠 수 있습니까? 예 : 무작위 삭제보다 훨씬 더 많은 회전 수가 필요합니다. 아니면이 패턴을 사용하여 O (log n) 작업을 삭제하고 삽입 할 수 있습니까?

2) 다른 데이터 구조가 삭제 패턴으로 인해 또는 더 작은 항목을 찾을 필요가 있다는 사실을 이용하여 더 나은 성능을 제공합니까?

업데이트 : 기꺼이 내가 물었습니다. 바이너리 힙은 분명히이 경우를위한 더 나은 해결책이며, 약속 된대로 구현하기가 쉽습니다.

우고

+0

논리적으로 삭제해야하는 노드가 새로 계산 된 값에 의해 필요하지 않다는 것을 확실하게 알지 못하는 경우 삭제를 무시하거나 지연 할 수 있습니다. Halt & Sweep 접근법은 후자의 경우에 효과적입니다. 너무 지저분해진 하위 나무의 뿌리는 재조정 코드에 의해 방문되어 재조정됩니다. 이로 인해 심각한 성능 저하를 방지하면서도 성능 저하 가능성이 거의 없습니다. – RocketRoy

답변

12

binary heap은 원하는대로 더 좋습니다. 가장 작은 요소와 삽입 위치를 찾는 것만으로도 구현하기 쉽고 빠릅니다. 가장 작은 요소를 찾는 것은 O (1)이고, 그것을 제거하는 것은 O (log N)이며, 삽입 또한 O (log N)입니다.

+0

실제로 그가 제거 된 것보다 큰 항목을 삽입하는 것을 알고 있다면 바이너리 힙 (treap)이 한 지점에서 매우 불균형하게됩니다. 100M 레코드가 많기 때문에 더 이상 O (log (n))가 아닌 O (n) - 예를 들어, n = 100M 일 때 트랩의 높이가 160k가되면, O (n/((lgn)^2)) – Etai

+0

@Etai - 내가 언급 한 연산에 대해 바이너리 힙은 항상 'O (log N)'입니다. 왜 내가 트릭을 언급했는지 모르겠다. 나의 대답은 트랩이 아닌 바이너리 힙을 가리킨다. 힙은 참으로 트랩의 구조에서 역할을하지만 두 가지 데이터 구조는 서로 다릅니다. – IVlad

+0

바이너리 힙 삽입은 'O (1)'평균 (Brodal의 최악의 경우)이며, 이는 BST에서 사용하는 주된 이유입니다. http://stackoverflow.com/a/29548834/895245 –

5

힙 당신에게 O (1) O (로그 n) 제거를 줄 것이다 O 삽입 (로그 n), 및 쉽게 정도가 레드 - 블랙 트리보다 구현하는 것입니다

+3

사실, 제거는 O (로그 N)입니다. ** 찾기 (값 찾기) ** 최소/최대는 O (1)입니다. – IVlad

+0

1M-100M 항목이 포함 된 힙을 본 적이 없으며, 속도에 어떤 영향을 미치는지에 대한 정보가있는 사람이 있습니까? –

+3

@NickLarsen : 바로 Big-O 표기법입니다. –

1

필요한 경우 더 복잡한 데이터 구조를 만드는 방법을 알고있는 것이 좋습니다. 그러나 일반적으로 최선의 방법은 가능한 한 간단하게 시작하는 것입니다. 필요한 경우 더 복잡한 것을 사용해야합니다.

자기 균형 나무를 구현 한 유일한 시간은 내 나무가 실제로는 (10,000 개가 넘는) 커질 것이라는 것을 알게되었을 때였고 그 데이터는 분출 된 분출물로 나올 것입니다. 즉, 일반 이진 트리를 사용했다면 거의 연결된 목록으로 끝났을 것입니다.

데이터가 임의 순서로 입력되는 경우 실제로는 분산 알고리즘을 신경 쓰지 않아야합니다.

+0

KISS에 대해 일반적으로 동의합니다 첫째, 복잡한 경우에만 필요합니다. 임의 순서로 데이터를 읽는 색인 작성과 같은 자체 균형 조정 요구 사항을 해결할 수있는 여러 가지 방법이 있지만 요구 사항을 알고있는 경우에만주의해야합니다. IE : 도서관을 만드는 것과 같이 범용으로 사용하지 않습니다. 나중에 코드를 유지해야하는 불쌍한 자식을 위해이 일을 남겨 두는 매우 나쁜 예절. 즉, 나는 일반적으로 당신의 철학에 동의합니다. – RocketRoy

관련 문제