我想定义一个优先级队列,其中优先级具有两种不同货币的组件。例如,项目A的费用为1美元+ 20日元。此队列有两种方法insert(priceInUsd, priceInYen)
和popMin(exchangeRate)
,它以美元的价格计算日元,并且根据此汇率弹出美元和日元总成本最低的项目。我该如何实现呢?
到目前为止,我的想法是:
n**(1/3)
个东西,平均来说这是正常的。答案 0 :(得分:1)
在dynamic planar convex hull问题上,你没有提及一些现有技术。 Brodal and Jacob(FOCS '02)给出一个数据结构,允许您插入一个点,删除一个点,并在摊位的对数时间内找到方向上的极值点,这足以实现您的数据结构(尽管实现看起来很像)复杂)。
答案 1 :(得分:0)
这是一个简单的答案,提供O(√n)时间插入和O(√nlogn)时间弹出时间。
积分保存在O(√n)箱中的一个。每个bin都有一个为它计算的凸包,按atan2(yen, usd)
的顺序存储(尽管你不需要trig来比较两个点)。插入的填充顺序如下:
Bin 0: 0 2 5 9 14
Bin 1: 1 4 8 13
Bin 2: 3 7 12
Bin 3: 6 11
Bin 4: 10
...
要插入一个点,请为其分配一个bin并重新计算该bin的凸包。如果您按照数组中角度的排序顺序保留点并重新运行Graham扫描,则为O(√n) - 时间。
要弹出 - 分钟,我们找到要删除的点,删除它,并用另一个bin中的一个点替换它,以便保持正确的bin大小集(插入后,这就是bin插入)。这项行动的有趣部分是这一发现。要查找凸包上给定汇率的最小总值,请使用二分搜索以角度顺序查找船体上的前任和后继,然后返回这两者的最小值。