2016-02-06 43 views
2

我是否必須在所有2D操作中使用Array2D,然後將它們轉換爲List2D?任何方便的函數調用或庫來定義和操作2D列表?F#中有List2D像Array2D

+2

你想做什麼? –

+0

有沒有這樣的事情作爲一個2D列表(至少我不能想象一個),但你可以將二維數組轉換爲列表列表(所以類似於鋸齒狀數組)。我不知道你爲什麼想這樣做。 – scrwtp

回答

6

簡答:不,沒有二維列表。

較長的答案:

我認爲這種類型是有問題創造,因爲它簡單的實現要麼未在其等效利弊操作的O(1)複雜性,或破壞結構平等。 F#列表和數組並不完全相同。讓我們回想一下關於F#列表的一些事實,人們會認爲它是2D版本。他們:

  • 是不可改變的
  • 支持結構比較
  • 可以通過預先考慮的要素

的F#名單在二維等效可以被認爲是在一個矩形迭代建晶格狀結構如下:

N: Node   N-N-0 
    0: None   | | 
        N-N-N-0 
        | | | 
       N-N-N-N-N-0 
       | | | | | 
       0 0 0 0 0 

其中- d指出左側的節點持有對右側的引用,並且|表示上面的節點持有對下面節點的引用。就像在一維列表中一樣,每個節點都會包含一個完整的2d列表,即矩形中所有元素從其自身到右下角的最後一個節點。

由於名單應該是一成不變的,但允許從子列表重複建設,通過增加節點建立新名單隻有三種情況有效:

  • 新元素中的節點
  • 的最下面一行
  • 新元素位於最右邊一列節點中
  • 從新節點向下或向右移動所形成的元素(以及2d-lists)非空,並且能夠組合成一致的2d-列表

這就是麻煩來了。你怎麼知道兩個鄰居在結構相比較的世界裏建立在相同的子列表上?您可以通過右下方和右下方的路徑從新節點向下走一步,看看最終是否在同一個元素上。如果結果不同(由於參數無效而失敗)或者參照相同(新的2D列表有效),那麼這很好,如果它們的內容相同但它們的身份不相同會怎麼樣?換句話說:他們是不同的對象,但可能是等價的?現在,我們被迫整個過程並比較一切,否則我們最終可能會創建一些不是二維的瘋狂圖。

這需要比較整個子列表,這些子列表應該是從新插入節點到最右下角節點一個對角線的節點的矩形。這並不實際;除非存在某種形式的優化,例如跟蹤所有節點並給予等效節點一個唯一的身份,否則構建一個像這樣的n個元素的二維列表將具有O(n^2)。

在這一點上,我想我可以看到爲什麼這樣的東西沒有進入F#核心庫。