簡體   English   中英

數組的不可變數據結構替換

[英]Immutable data structure replacement for arrays

當您需要具有最快訪問/更新的不可變列表時,您會使用什么? 如果你必須從中間訪問一個元素,LinkedList可能會很慢,而且創建和重新填充它是不可能的。 二叉樹? 四叉樹?

如果更新非常罕見(或者集合很小),那么在初始化之后不寫入的數組是值得的。 在這些情況下,低得多的常數因子(時間和空間)都超過線性時間更新。

除此之外,還有許多純功能數據結構,為這些情況提供了更好的界限。 2-3個手指樹(Haskell的Data.Sequence背后的數據結構)就是一個例子。 另一種選擇是Clojure的向量和相關的數據結構(例如,輕松的Radix-Balanced Trees),它使用具有高扇出(32或更多)的樹來保持讀取便宜和結構共享以避免太多副本。

所有這些都是手動實現的中等技巧,特別是如果性能很重要,我不知道現有的實現(我不認為Clojure的向量是簡單或方便從Java使用)。

我不確定我理解你在尋找什么,但我會嘗試根據我在標准課程中看到的一些內容給出一些指示:

  • CopyOnWriteArrayList是一個可變但線程安全的列表,因為它在更新時復制了內部數組。 也許你可以從中調整一些想法,盡管對於大型列表來說顯然效率不高。

  • ConcurrentHashMap在更復雜的結構上實現了類似的想法。 它將內部哈希表划分為單獨的分區,因此更改只需要鎖定對相關分區的訪問權限。

    對於不可變列表,您可以執行類似的操作:將列表的內部數組划分為多個分區,並將它們全部視為不可變。 當您需要更改列表時,您只需要克隆一個分區和分區的索引,這比復制整個列表要便宜。

  • AWTEventMulticaster實現了類似的目標,但重復了絕對最小值。 這是一個聰明的二叉樹。 查看來源

使用較小的內部分區或塊,您可以獲得更快的更新,但通常訪問速度較慢。 使用更大的塊(例如,整個陣列),您可以獲得更慢的更新,但訪問速度更快。

如果您確實需要最快的訪問和更新,則必須使用可變數組。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM