我是否必須在所有2D操作中使用Array2D,然後將它們轉換爲List2D?任何方便的函數調用或庫來定義和操作2D列表?F#中有List2D像Array2D
2
A
回答
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#核心庫。
相關問題
- 1. F#如何在F#中追加/連接array2D並組合一維數組到array2D
- 2. Array2D到陣列
- 3. 將Array2d填充到ListView中
- 4. 爲什麼Array2D沒有摺疊操作?
- 5. array2D中的交換元素java
- 6. 有沒有像F#Haskell通用編程?
- 7. 如何將Array2D轉換與選擇INT元素與詮釋元素Array2D
- 8. 如何將墊圖像轉換爲字符串(array2d <rgb_pixel>)?
- 9. grep與-f像在PHP中
- 10. F#中有ifdefs嗎?
- 11. Dir.entries(directory).reject {| f | [「。」,「..」,「圖像」,「.zip」]。 F}
- 12. 使用Array2D時可以返回seq嗎?
- 13. 添加圖像F#
- 14. 有點像F#(或C#)中的python三重引號?
- 15. F#中的圖像銳化變異#
- 16. 在F#中實現幻像類型#
- 17. F#:像Clojure中的分區函數
- 18. 在F中像cond那樣的clojure#
- 19. F#懶惰像素讀取
- 20. `f()`和`new f()`有什麼區別?
- 21. 有沒有像Seq.cast類型推斷的F#轉換函數?
- 22. F#中有沒有C#的@關鍵字?
- 23. 有沒有在F#中使用Matlab圖像處理工具箱的方法?
- 24. F#有多路嗎?
- 25. 是否有像f#一樣的通用unbox函數?
- 26. F#中是否有默認參數?
- 27. F中沒有構造函數的類#
- 28. 在F#中沒有變量的SUMPRODUCT
- 29. 有什麼要點<|在F#中?
- 30. 在Javascript中,爲什麼我不能用f(f)代替x => f(f)(x)?
你想做什麼? –
有沒有這樣的事情作爲一個2D列表(至少我不能想象一個),但你可以將二維數組轉換爲列表列表(所以類似於鋸齒狀數組)。我不知道你爲什麼想這樣做。 – scrwtp