簡體   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