2013-03-19 102 views
0

我正在使用持久數組創建聯合查找算法。這裏有一些功能,我可以使用:SML中的數組函數

Array.sub : 'a array * int -> 'a 
Array.update: 'a array * int * 'a -> unit 

我需要從現有的一個區別僅一個槽一定時間內建立一個表

datatype 'a table = Array of 'a Array.array | Change of int * 'a * 'a table ref 

,使用更改構造函數和庫

Array.tabulate : int * (int-> 'a)-> 'a array 

實施函數返回一個大小爲n的表的引用,其中每個元素是它自己的分區。

newTable : int -> int table ref 

這裏是我的嘗試,但任何幫助,將不勝感激,因爲我真的很困惑:

fun newTable n = 
     if 0 = Array.sub(Array.tabulate (n,fn i => i), 0) 
      then() 
     else 
      ref(Change(Array.array(n))); 
+0

函數newTable應該做什麼? – waldrumpus 2013-03-19 12:31:26

+0

我曾經根據Robert Sedgewick的算法書實現了union-find https://github.com/gruenewa/sml-snippets/blob/master/unionfind/union-find.sml – gruenewa 2014-08-07 07:34:34

回答

0

我不知道如果我正確地理解你的問題,但我會盡力回答從我認爲你的問題想要你做的事情。

如果您查看newTable簽名,您會發現輸入時需要輸入int,並返回int table ref。您的解決方案返回unit,這樣不會檢查。

newTable的目標是在互不相同的整數表上返回ref。您已經瞭解可以使用Array.tabulate構建一個不同(增加)整數的數組。但是你必須重新編制table,而不是array。在table數據類型的定義告訴我們如何使用array生產它,所以你需要做的就是包你產生likeso數組:

fun newTable n = 
    ref (Array (Array.tabulate (n,fn i => i))) 

newTable功能是MakeSet操作相當於描述在Union Find WP article中,改進後生成一整套而不是單件。