2013-03-19 116 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中,改进后生成一整套而不是单件。