아래의 2 가지 작업을 지원하는 데이터 구조가 있습니까? 가장 작은 k 개의 숫자와 쿼리 합계를 더하는 데이터 구조가 있습니까?
- 컬렉션
쿼리 K가 쿼리를 부여하며 컬렉션의 크기만큼 큰 수 있습니다 컬렉션에서 가장 작은 케이 숫자의 합계에 정수를 추가합니다.
두 연산 모두 O (logn)보다 크지 않은 시간 복잡도가 있어야합니다. 여기서 n은 컬렉션 크기입니다.
아래의 2 가지 작업을 지원하는 데이터 구조가 있습니까? 가장 작은 k 개의 숫자와 쿼리 합계를 더하는 데이터 구조가 있습니까?
쿼리 K가 쿼리를 부여하며 컬렉션의 크기만큼 큰 수 있습니다 컬렉션에서 가장 작은 케이 숫자의 합계에 정수를 추가합니다.
두 연산 모두 O (logn)보다 크지 않은 시간 복잡도가 있어야합니다. 여기서 n은 컬렉션 크기입니다.
증강 된 BST가 트릭을해야한다고 생각합니다. 즐겨 찾는 균형 이진 검색 트리 (빨강/검정, AVL, 희생양 등)를 가져 와서 각 노드에 두 개의 추가 필드를 저장하게하십시오 :
이러한 속성은 O (log n) 시간마다 삽입 및 삭제를 수행 할 때 유지 관리 할 수 있습니다. (이 방법을 알지 못했다면 CLRS에서 자세한 내용을 확인하십시오. 멋진 구성입니다!)
이 작업을 완료하면 정규 시간에 O (log n) 시간 내에 삽입 작업을 수행 할 수 있습니다. 삽입 다음에 모든 O (log n) 시간이 걸린 모든 캐시 된 값을 수정합니다.
k 개의 가장 작은 값의 합을 얻으려면 트리를 반복적으로 볼 수 있습니다. 특히, 루트 노드를보십시오. 그런 다음 : 루트 노드가 정확히 K가있는 경우
는이렇게하면 단일 루트 - 리프 연결이 트리 아래로 내려가 O (log n) 시간이 걸립니다.
당신은 당신은 또한 노드의 합을 저장,이 하위 트리의 노드의 수를 저장하는 것 외에도, 각 노드에서 index statistics tree (AKA ranked tree), 어디의 변화와 함께 할 수 있습니다. 노드 당 계산할 수 있습니다. self.subtree_sum = left.subtree_sum + right.subtree_sum + self.value
.
그러면 k
번째까지의 모든 요소의 합계는 통계 트리에서 k
번째 요소를 찾는 것과 동일하게 수행되지만, 노드 수 이외의 값도 합계 할 수 있습니다.
@amit : 부분을 놓쳤습니다. – coderredoc