我有一個場景,我正在將更改列表推送到另一個系統。每個列表包含零個或多個插入,更新或刪除的通知。查找鏈接列表中的條目優於O(n)時間的索引
插入很容易;該通知包含目標索引和一個指向該項目的指針。更新很簡單;我傳遞一個指向該項目的指針。
刪除似乎很直接;我需要傳遞要刪除的項目的索引,但是如何知道索引?索引從零開始並且必須是連續的,但是我在插入時進行設置。所以我需要跟蹤每件商品的指數。
我可以做到這一點,例如,地圖:std::map<item*, int>
,但是當我刪除一個項目時,我必須重新編號過去它的所有內容,這是O(N)。
這些項目列表將會大到O(N)迭代不可接受的程度。我確信這個問題已經解決,我只是不知道該解決方案將被稱爲什麼。搜索與「鏈表」相關的任何內容都會產生大量噪音。
一個可能的解決方案是跳過列表,其中子列表中的每個節點都知道它跳過的主列表中有多少個節點,並且由於搜索跳過列表是O(log N),所以我們可以繼續跟蹤找到O(log N)中的索引並刪除O(log N)中的項目。
然而,實施跳過列表似乎有點矯枉過正......有沒有更簡單的解決方案?
編輯:
感謝所有爲您的建議,但我想我已經說服自己跳躍列表是在這裏解決這個問題的正確方法。
在地圖例子,你爲什麼要重用以前使用的索引/鍵?爲什麼不能拖延清理以前使用過的索引,直到達到std :: numeric_limits :: max()? –
2009-11-25 06:10:09
@Mads:因爲他們需要爲將來的更改通知連續。如果我在我的最後刪除了某些內容,那麼更改通知系統另一端的人員也會刪除他對該項目的表示,並且我們希望在未來的更新和插入中進行同步。 – 2009-11-25 06:14:14
爲什麼不能簡單地使用唯一的ID來完成?您刪除ID爲17的項目,他會做同樣的事情,無論實際列表中的項目是什麼,它可能是列表中的項目#5。 – 2009-11-25 12:14:55