Algorithm 如何找到给定列表的分区?

Algorithm 如何找到给定列表的分区?,algorithm,recursion,sml,ml,partition-problem,Algorithm,Recursion,Sml,Ml,Partition Problem,如何找到整数列表的所有分区?我主要需要使用递归的算法,因为我要在SML中实现它。我只需要算法,我会自己做编码部分。由于错误,我编写了查找子集的代码,我没有太多的时间用于此 SML有点类似于pascal,所以你会得到我将用阶乘编写的格式的窍门,例如,这个fun fuc x=如果x是一个已知的问题(因此没有已知的多项式解),可以使用递归编写的穷举搜索来解决 伪代码(尝试像伪代码一样执行ML操作,希望有帮助并清晰): partition([],A,B):#基本子句 如果(和(A)=和(B)): 打印(

如何找到整数列表的所有分区?我主要需要使用递归的算法,因为我要在SML中实现它。我只需要算法,我会自己做编码部分。由于错误,我编写了查找子集的代码,我没有太多的时间用于此

SML有点类似于pascal,所以你会得到我将用阶乘编写的格式的窍门,例如,这个fun fuc x=如果x是一个已知的问题(因此没有已知的多项式解),可以使用递归编写的穷举搜索来解决

伪代码(尝试像伪代码一样执行ML操作,希望有帮助并清晰):

partition([],A,B):#基本子句
如果(和(A)=和(B)):
打印(A,B)#这是一个分区
分区(列表A、B):
e是一个已知的问题(因此没有已知的多项式解),可以使用递归编写的穷举搜索来解决

伪代码(尝试像伪代码一样执行ML操作,希望有帮助并清晰):

partition([],A,B):#基本子句
如果(和(A)=和(B)):
打印(A,B)#这是一个分区
分区(列表A、B):

e看看这个。基本上,在每个置换迭代中,您可以通过从当前子集的并集中减去整个集合来获得分区的另一部分。

请检查此项。基本上,在每个置换迭代中,你可以通过从当前子集的并集中减去整个集合来得到划分的另一部分。

如果你有一个集合
S的k-划分
{S1,…,Sn}
,比如
{P1,…,Pk}
,你可以生成
S&union的
k-划分;{Sn+1}

{P1,…,Pi-1,Pi⋃{n+1},Pi+1,…,Pk}
for
i
in{1…k}

加上(k+1)-分区
p⋃{k+1}

将这些分区称为从
p
生成的分区。很容易证明由
{1,…,n}
的两个不同分区生成的所有分区集是不相交的,并且
{1,…,n+1}
的每个分区都是由
{1,…,n}
的某个分区生成的

我认为这足以使问题的递归解决方案变得显而易见


为了验证,{1,…,n}的分区数的计数是
B(n)
,其中
B
是贝尔数,(斯隆)

如果你有一个集合
S
{S1,…,Sn}
,比如
{P1,…,Pk}
,你可以生成
k
S&Union的k分区;{Sn+1}

{P1,…,Pi-1,Pi⋃{n+1},Pi+1,…,Pk}
for
i
in{1…k}

加上(k+1)-分区
p⋃{k+1}

将这些分区称为从
p
生成的分区。很容易证明由
{1,…,n}
的两个不同分区生成的所有分区集是不相交的,并且
{1,…,n+1}
的每个分区都是由
{1,…,n}
的某个分区生成的

我认为这足以使问题的递归解决方案变得显而易见


为了验证,{1,…,n}的分区数是
B(n)
,其中
B
是钟号,(斯隆)

从您对amit的回复来看,您似乎在寻找:

fun partitions [] = []
  | partitions [x] = [[[x]]]
  | partitions (x::xs) =
    let
       val zsss = partitions xs
    in
       map (fn zss => [x]::zss) zsss @
       map (fn zs::zss => (x::zs)::zss) zsss
    end
编辑:对不起,我误读了您前面的示例,将其理解为
分区[1,2,3]=[[1,2,3]]、[[1,2]、[3]]、[[1]、[2]、[3]]
,即有序分区

以下是您实际问题的解决方案(我认为):


从您对amit的回复来看,您似乎在寻找:

fun partitions [] = []
  | partitions [x] = [[[x]]]
  | partitions (x::xs) =
    let
       val zsss = partitions xs
    in
       map (fn zss => [x]::zss) zsss @
       map (fn zs::zss => (x::zs)::zss) zsss
    end
编辑:对不起,我误读了您前面的示例,将其理解为
分区[1,2,3]=[[1,2,3]]、[[1,2]、[3]]、[[1]、[2]、[3]]
,即有序分区

以下是您实际问题的解决方案(我认为):


对不起,我听不懂你的代码,只有一半。如果你用文字写下如何写会更好。如果A是列表,则e::A正在添加,它是这样的e::[A],其中e是元素,A是元素列表。在ML中也没有打印。请评论每一行,这将使事情更容易为我。提前感谢这个例子,它应该如何工作分区[1,2,3];val it=[[1,2,3]、[[1]、[2,3]、[[1,2]、[3]、[[2]、[1,3]、[[1]、[2]、[3]]]我不认为“@unknown”要求的是你提到的一个划分问题:)这个问题没有相等和的限制。我写了代码来查找所有子集,如果它有任何帮助的话。对不起,但我不能理解你的代码,只有一半。如果你用文字写下如何写会更好。如果A是列表,则e::A正在添加,它是这样的e::[A],其中e是元素,A是元素列表。在ML中也没有打印。请评论每一行,这将使事情更容易为我。提前感谢这个例子,它应该如何工作分区[1,2,3];val it=[[1,2,3]、[[1]、[2,3]、[[1,2]、[3]、[[2]、[1,3]、[[1]、[2]、[3]]]我不认为“@unknown”要求的是你提到的一个划分问题:)这个问题没有相等求和的约束我写了查找所有子集的代码,如果它对任何事情都有帮助的话我已经有了查找子集的代码,好的,我会尝试这样做我已经有了寻找子集的代码,好的,我会尝试这样做
fun extensions x [] = []
  | extensions x (xs::xss) =
    ((x::xs)::xss) :: map (fn zss => xs::zss) (extensions x xss)

fun partitions [] = [[]]
  | partitions (x::xs) =
    List.concat (map (fn zss => ([x]::zss) :: extensions x zss) (partitions xs))