优先级队列,其中值是两种货币的总和,popMin采用汇率

时间:2016-06-06 05:33:21

标签: algorithm data-structures priority-queue kdtree

我想定义一个优先级队列,其中优先级具有两种不同货币的组件。例如,项目A的费用为1美元+ 20日元。此队列有两种方法insert(priceInUsd, priceInYen)popMin(exchangeRate),它以美元的价格计算日元,并且根据此汇率弹出美元和日元总成本最低的项目。我该如何实现呢?

到目前为止,我的想法是:

  • 使用k-d树。插入需要log(n)。我认为你可以通过对普通k-d树最近邻算法的微小修改来实现findMin,因此据称这需要log(n)时间。维基百科是关于k-d树最近邻居是否真的是log(n)最坏情况如果你有可怕的数据的一种对冲,所以我不确定这一点。此外,我从未见过一个特别可靠的来源声称kd-tree允许log(n)插入。
  • 保持点的凸包,并在想要获取时调整其中的所有内容。最糟糕的情况是,但如果你的凸壳中只有正常n**(1/3)个东西,平均来说这是正常的。

2 个答案:

答案 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插入)。这项行动的有趣部分是这一发现。要查找凸包上给定汇率的最小总值,请使用二分搜索以角度顺序查找船体上的前任和后继,然后返回这两者的最小值。