모든 작업을 가능한 가장 효율적으로 구현하면서 숙제를 통해 은행 시스템을 구축했습니다.최대 힙 유지 새 항목을 삽입하는 동안 정렬
프로그램 할 수 있습니다 내가 처음 3 것들에 대한 레드 - 블랙 트리 가기로 결정
1.add a new customer
2.delete an existing customer
3.find a customer
4.print the customer with the highest balance.
5.print all customers with a negative balance.
6.deposit/withdraw money
(O (로그 N)). 나는 4th와 5th에 관해서 확실하지 않다.
4 : 최대 힙을 유지하는 것에 대해 생각 했으므로 가장 부유 한 고객을 불러 오면 루트 노드 인 O (1) 만들 수 있습니다. 내 최대 힙 코드가 시도한 랜덤 배열 (목록)에서 작동합니다. 그러나이 특정 경우에, 나는 분명히 나중에 채워 져야하는 빈 배열로 시작합니다. insert
메서드를 최대 힙에 사용하면 정렬되지 않은 배열이됩니다 (). (기본적으로 나는 힙 빌딩을 건너 뜁니다.). 최대 힙 삽입 방법 :
dataArray.add(newCustomer);
heapSize = dataArray.size();
int i = dataArray.size()-1;
while(i > 1 && dataArray.get(getParentIndex(i)).getAccountBalance() < newCustomer.getAccountBalance())
{
swap(dataArray, getParentIndex(i) , i);
i = getParentIndex(i);
}
5 : 나는 음의 균형을 가진 사람들의 연결리스트를하는 것에 대한 생각했다. 이렇게하면 인쇄 할 때 복잡성이 선형이됩니다. (RBTree는 마이너스 잔액이없는 고객이 있더라도 logN 비용이들 것입니다.) 그러나 고객을 삭제할 경우 해당 목록에서 고객을 찾아서 제거해야합니다 (RBTree 삭제 lgn + n 목록 삭제 = n * lgn)
나는 균형은 시간이 지남에 따라 변경 될 수 있다고 생각. 포인트 5에 대한 귀하의 목록은 이에 따라 유지 관리되어야합니다. BTW O (lgn + n)은 O (n)가 아니라 O (n * lgn)입니다. 또한 이러한 목록을 일관되게 유지할 수 있다고 보장 할 수 있다면 포인트 4에 대한 단일 객체 (최대 값)를 유지할 수 있으므로 추가 작업 없이도 일정 시간 작업이 가능합니다. 최대 힙. –
예, 죄송합니다. 예금/인출 옵션도 있습니다. 목록에 관해서는, 삽입, 삭제 및 보관 후에도이를 유지해야하며 최대 힙에 대해서도 마찬가지입니다. RBTree를 순회하는 것보다 효과적이지 않습니다. 권리? 그래서 어쩌면 나는 RBTree를 모든 것에 사용해야 만한다. 빈리스트를 가져 오는 것이 가능한가? 새로운 삽입이있을 때마다 힙을 정렬 된 상태로 유지 하는가? – BVtp
힙을 잊어 버리십시오. RB 트리보다 더 많은 데이터 구조를 가질 필요가 없습니다. 올바르게 사용하십시오. 트리에서 가장 오른쪽 노드에있을 때까지 루트에서 오른쪽 하위 포인터를 내림으로써 가장 높은 균형을 찾을 수 있습니다. 그것은 가장 큰 항목입니다. 순서없는 검색을 시작하고 첫 번째 음수가 아닌 잔액을 찾을 때 중지하면 모든 음수 값을 인쇄 할 수 있습니다. – Gene