Erlang 生成仅包含特定大小子集的集合的功率集
我想生成一组Erlang 生成仅包含特定大小子集的集合的功率集,erlang,set,subset,powerset,Erlang,Set,Subset,Powerset,我想生成一组S的powersetp(S)。我希望P(S)只包含等于某个大小的子集 例如,如果我们有S=[1,2,3,4],那么limited_powerset(S,3)将是[[1,2,3],[2,3,4],[1,3,4],[1,2,4]。 提供了在Erlang中生成通用电源集的一个很好的示例(谢谢!): 如何将其修改为只有特定大小的子集?引入限制变量并将最后一行更改为 case length([X|H]) < Limit of true ->
S
的powersetp(S)
。我希望P(S)
只包含等于某个大小的子集
例如,如果我们有S=[1,2,3,4]
,那么limited_powerset(S,3)
将是[[1,2,3],[2,3,4],[1,3,4],[1,2,4]。
提供了在Erlang中生成通用电源集的一个很好的示例(谢谢!):
如何将其修改为只有特定大小的子集?引入限制变量并将最后一行更改为
case length([X|H]) < Limit of
true ->
ps(X, T, Acc, Limit);
false ->
ps(X, T, [[X|H]|Acc],Limit)
end.
外壳长度([X | H])<限制
正确->
ps(X,T,Acc,Limit);
错误->
ps(X,T,[[X | H]| Acc],极限)
结束。
没用
另外,我猜子集的数量将少于N!,但是我怎样才能准确地计算呢?这将满足您的要求:
limited_powerset(L, N) ->
{_, Acc} = generate(L, N),
Acc.
generate([], _) ->
{[[]], []};
generate([H|T], N) ->
{PT, Acc} = generate(T, N),
generate(H, PT, PT, Acc, N).
generate(_, [], PT, Acc, _) ->
{PT, Acc};
generate(X, [H|T], PT, Acc, N) when length(H)=/=N-1 ->
generate(X, T, [[X|H]|PT], Acc, N);
generate(X, [H|T], PT, Acc, N) ->
generate(X, T, [[X|H]|PT], [[X|H]|Acc], N).
这不是小事。这件事让我难堪了一段时间。诀窍是,您需要在整个算法中保持完整的功率集累加器,并为有限的集创建第二个累加器。如果它只包括给定集的某些子集,它就不是功率集。@Alexey我相信某个地方的数学家对功率集的此类子集有一个名称。dsmith,谢谢!这是可行的,但是我必须在问题中提到,我需要限制有两个原因:(a)不需要所有长度不是N的子集,(b)我认为我可以克服内存效率问题(动力集占用2^N的空间)在你写这篇文章这么多年之后,我希望你能够重新审视这些解决方案,并回答一个愚蠢的问题——“PT”这个名字代表什么?希望这能让我理解解决方案。因为在这一点上,我不明白generate/2应该完成什么,因为没有代码“组装”前面调用的结果。。。generate/5至少对ACC=)做了一些事情,但是,代码非常有效,所以我必须继续努力并解决它!=)alexakarpov,我使用OP中的变量名,但在我看来,它的意思是“T的动力集”,或“尾巴的动力集”。
limited_powerset(L, N) ->
{_, Acc} = generate(L, N),
Acc.
generate([], _) ->
{[[]], []};
generate([H|T], N) ->
{PT, Acc} = generate(T, N),
generate(H, PT, PT, Acc, N).
generate(_, [], PT, Acc, _) ->
{PT, Acc};
generate(X, [H|T], PT, Acc, N) when length(H)=/=N-1 ->
generate(X, T, [[X|H]|PT], Acc, N);
generate(X, [H|T], PT, Acc, N) ->
generate(X, T, [[X|H]|PT], [[X|H]|Acc], N).