繁体   English   中英

记录帕累托前沿的最佳数据结构

[英]best data structure to record a Pareto front

请问是否有人已经看到或遇到以下问题?

我需要处理满足以下条件的成本/利润值列表:c 1 / p 1 ,c 2 / p 2 ,c 3 / p 3 ...。

  • 的C 1≤C2≤C3≤C4 ...
  • 1≤p2≤p3≤p4 ...

例如: 2/3 4/5 9/15 12/19 4/5 9/15 12/19

如果尝试在上面的列表中插入 10/14 ,则由于现有成本/利润对9/12拒绝了该操作:增加成本( 9->10 )和降低利润( 14->12 )。 例如,这种清单可能出现在背包问题的动态编程算法(的状态)中,其中成本可以表示权重。

如果在上面的列表中插入 7/20 ,则应触发 9/1512/19 的删除

我已经使用C++ std::set (通常用红黑树实现)编写了一个解决方案,但是我需要提供一个比较功能,最终使它变得有点过于复杂。 同样,在这样的集合中插入将花费对数时间,例如在插入触发所有其他元素的删除时,实际上很容易导致线性时间(就未摊销的复杂性而言)。

我想知道是否存在更好的解决方案,因为存在无数实现(有序)集合的解决方案,例如优先级队列,堆,链接列表,哈希表等。

这是一个帕累托阵线(obj1:最小成本,obj2:最大利润) ,但是我仍然找不到最好的结构来记录它。

我不完全了解您描述的规则,因此我不可知地说,尝试插入可能会触发拒绝,如果接受,则需要删除后续项。

您将需要使用一个平衡比较树,以一个数组表示。 在这种情况下,找到所需的节点将花费O(logN)时间,这将是搜索或拒绝插入尝试的复杂性。 当您需要删除项目时,则将其删除并插入新的项目,其复杂性为

O(logN + N + N + logN)(即搜索,删除,重新平衡和插入。如果在重新平衡时我们知道要在哪里插入新项,我们可以摆脱上一个对数)

O(logN + N + N + logN)= O(2logN + 2N)= O(logN ^ 2 + 2N),这在很大程度上是线性复杂度。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM