请问是否有人已经看到或面临以下问题?
我需要处理满足以下条件的成本/利润值列表 c 1 /p 1、 c 2 /p 2、 c 3 /p 3 ……
- c 1 ≤c 2 ≤c 3 ≤c 4 ...
- p 1 ≤p 2 ≤p 3 ≤p 4 ...
这是一个例子:2/3
, 4/5
, 9/15
,12/19
如果尝试插入 10/14
上述列表,则由于现有的成本/利润对而拒绝9/12
该操作:增加成本(9->10
)和减少利润(14->12
)是没有用的。例如,此类列表可能出现在背包问题的(状态)动态规划算法中,其中成本可以代表权重。
如果在上面的列表中插入 7/20
,这应该会触发9/15
and12/19
的删除。
我已经使用C++
std::set
(通常用红黑树实现)编写了一个解决方案,但我需要提供一个比较函数,最终变得有点过于复杂。此外,在此类集合中的插入需要对数时间,并且实际上很容易导致线性时间(就非摊销复杂性而言),例如当插入触发所有其他元素的删除时。
我想知道是否存在更好的解决方案,因为有无数的解决方案可以实现(有序)集合,例如优先级队列、堆、链表、哈希表等。
这是一个帕累托前沿 (obj1: min cost, obj2: max profit),但我仍然找不到记录它的最佳结构。