我正在尋找一個帶有log(N)插入/刪除索引i的「List」。我把「List」這個單詞放在引號中,因爲我並不是指它是一個真正的Haskell List,而是任何有序的容器都有一堆對象(實際上,它可能需要某種內部的樹)。我很驚訝,我還沒有找到一個很好的解決方案呢......帶有效插入/刪除的「列表」
這是我迄今爲止最好的解決方案 - 使用Data.Sequence這兩個函數。
doInsert position value seq = before >< (value <| after)
where
(before, after) = splitAt position seq
doDelete position seq = before >< (drop 1 after)
where
(before, after) = splitAt position seq
雖然這些在技術上是所有日誌(N)的功能,那感覺就像我做了一堆額外的東西每個插入/刪除....換句話說,這種秤像K *日誌(N )對於比它應該大的K。另外,由於我必須自己定義這些東西,所以我覺得我正在使用Sequence來處理它沒有設計的東西。
有沒有更好的方法?
這是一個相關的問題(儘管它僅使用序列的交易,我會愉快地使用別的):Why doesn't Data.Sequence have `insert' or `insertBy', and how do I efficiently implement them?
是的,這個問題是與此相關的另一個我發佈前幾天:Massive number of XML edits
爲什麼不是[:: Data.Map.Map Int a](http://www.haskell.org/ghc/docs/latest/html/libraries/containers/Data-Map-Lazy.html)? –
@ WillNess-插入將不得不更新所有'我'的值大於插入點,所以我不認爲這個工程。 – jamshidh
這個IIRC的標準數據結構解決方案是一個樹,其中節點還在其左側包含元素數量。看看http://en.wikipedia.org/wiki/T-tree是否相關。 –