>
할당을 위해 내장 클래스를 사용하지 않고 이진 힙을 통해 구현 된 우선 순위 대기열을 생성하라는 지시를 받았으며 배열을 사용하여 대기열에있는 객체를 저장함으로써 성공적으로 수행했습니다. 그러나 실제 트리 구조를 사용하여 다른 큐를 구현하는 방법을 배우고 싶지만 약간의 문제가 있습니다.

삽입 및 삭제를 수행 할 노드를 추적하려면 어떻게해야합니까?링크 된 목록을 사용하여 각 노드가 삽입 될 때 추가됩니다. 첫 번째 목록 노드이며 반대쪽 끝에서 삭제되었습니다. 그러나 하위 요소가 잘못된 위치에 추가되어 트리에서 요소를 재정렬하면 차이가 발생합니다.

편집 :아마도 명확히해야 할 것입니다. 마지막 점령 된 첫 번째 점령 된 잎을 어떻게 찾을 수 있는지 잘 모르겠습니다. 예를 들어, 항상 마지막으로 삽입 된 잎을 말할 수는 있지만 삭제하려는 경우 다음에 항목을 제거 할 때 어떤 잎을 삭제할지 어떻게 알 수 있습니까? 삽입도 마찬가지입니다. 현재 리프가 두 자식을 모두 처리 한 후 다음 리프로 넘어갈지를 어떻게 알 수 있습니까?


  • 답변 # 1

    이진 힙의 트리 구현은 완전한 트리를 사용합니다 (또는 거의 전체 트리 : 모든 레벨이 꽉 찼습니다).
    마지막으로 점유 된 리프 인 '알아보기'-[변경 한 후 O (로그온)이므로 수정하지 않아도됩니다]에서 항상 삭제합니다. -사용 된 리프. 여기에 요소를 추가하고 [수정 한 후에도 요소를 수정하면 O (로그온) 임]

    알고리즘 아이디어는 간단합니다.
    삽입 : 비어있는 첫 번째 리프에 요소를 삽입하고 heapify [sift up]를 사용하여이 요소를 힙의 올바른 위치로 가져옵니다.

    delete_min : 첫 번째 요소를 마지막 점유 된 리프로 바꾸고 마지막 점유 된 리프를 제거하십시오. 그런 다음 힙을 힙화하십시오 [하프 다운].

    수정 : delete() 참고  그러나 머리뿐만 아니라 모든 요소에 수행 할 수 있습니다. 마지막 잎으로 바꾸려는 요소를 찾는 것은 O (n)이 될 것이므로이 op가 비쌉니다. 이런 이유로, delete()  방법은 (머리 외에) 힙 데이터 구조의 일부가 아닙니다.

  • 이전 concurrency - JasperReports의 javautilConcurrentModificationException
  • 다음 sorting - XSLT를 사용하여 XML을 XML로 정렬