我有建立银行系统的功课,同时以最有效的方式实施所有任务。
该计划可以:
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
我决定为前3个(O(log-n))选择Red-Black树。 我不确定第4和第5个。
4:我考虑过维持一个最大堆,以便获得最富有的'客户只需花费O(1) - 根节点。
我的最大堆代码适用于我试过的randoms数组(列表)。但是,在这个特定情况下,我显然从一个空数组开始,必须在以后填充。 当我在最大堆中使用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)。 但是,如果我删除了一个客户,我将不得不搜索(O(n))该列表中的客户以删除他,然后删除功能将是( RBTree delete lgn + n 列表删除 = n * lgn)
答案 0 :(得分:0)
我会维护两个二元搜索树(密钥将是唯一的客户ID),一个用于负余额的客户和一个用于正余额的客户。并且指针richest
始终指向具有最高余额的客户。
在每次余额变更中,您应检查余额的符号是否发生变化。如果是这样,请从一棵树中删除客户并将其添加到另一棵树。
并根据余额richest
检查当前余额,如果余额较高,则指定当前客户。
复杂性将是:
1. insert to tree: O(log(n))
2. delete from tree: O(log(n))
3. binary search in two trees: O(log(n))
4. print the customer pointed by `richest`: O(1)
5. in-order run on a binary search tree (the negative one): O(n)
6. find costumer: O(log(n)) + possible deletions and insertions: still O(log(n))
答案 1 :(得分:0)
只需添加@Nimrod Morag的解决方案,为了更好地average
和amortized
时间复杂,您可以使用Fibonacci-heap
数据结构(参考{{3} }和https://en.wikipedia.org/wiki/Fibonacci_heap)并为客户(具有fib-max-heap
指针)保留一个max
,您可以执行所有操作:
1. insert (lazily) a customer to the heap: O(1)
2. delete any customer (or the customer with maximum balance)
from heap: O(log(n)) amortized
3. search a customer in heap: O(log(n))
4. print the customer pointed by `max` pointer: O(1)
5. in-order run on the heap and print only the -ve balances: O(n)
6. deposit/withdraw money: O(1) amortized