Algorithm 有效地生成;减法链“;

Algorithm 有效地生成;减法链“;,algorithm,language-agnostic,combinatorics,Algorithm,Language Agnostic,Combinatorics,如果你想了解一些情况,我之前已经发布了。看来我走错了这条路 可以用来最小化一个数的幂运算所需的乘法次数。例如,a7需要四次乘法。两个用于计算a2=a×a和a4=a2×a2,另外两个用于计算a7=a4×a2×a 类似地,我试图为一组数字生成所有可能的“减法链”。例如,给定一组数字{1,2,3},我试图生成以下排列 {1, 2, 3} {1, 2, 3}, {1, 2} {1, 2, 3}, {1, 2}, {1} {1, 2, 3}, {1, 2}, {2} {1, 2, 3}, {1, 2},

如果你想了解一些情况,我之前已经发布了。看来我走错了这条路

可以用来最小化一个数的幂运算所需的乘法次数。例如,a7需要四次乘法。两个用于计算a2=a×a和a4=a2×a2,另外两个用于计算a7=a4×a2×a

类似地,我试图为一组数字生成所有可能的“减法链”。例如,给定一组数字
{1,2,3}
,我试图生成以下排列

{1, 2, 3}

{1, 2, 3}, {1, 2}
{1, 2, 3}, {1, 2}, {1}
{1, 2, 3}, {1, 2}, {2}
{1, 2, 3}, {1, 2}, {1}, {2}

{1, 2, 3}, {1, 3}
{1, 2, 3}, {1, 3}, {1}
{1, 2, 3}, {1, 3}, {3}
{1, 2, 3}, {1, 3}, {1}, {3}

{1, 2, 3}, {2, 3}
{1, 2, 3}, {2, 3}, {2}
{1, 2, 3}, {2, 3}, {3}
{1, 2, 3}, {2, 3}, {2}, {3}

{1, 2, 3}, {1, 2}, {1, 3}
{1, 2, 3}, {1, 2}, {1, 3}, {1}
{1, 2, 3}, {1, 2}, {1, 3}, {2}
{1, 2, 3}, {1, 2}, {1, 3}, {3}
{1, 2, 3}, {1, 2}, {1, 3}, {1}, {2}
{1, 2, 3}, {1, 2}, {1, 3}, {1}, {3}
{1, 2, 3}, {1, 2}, {1, 3}, {2}, {3}
{1, 2, 3}, {1, 2}, {1, 3}, {1}, {2}, {3}

# and so on...
其中置换中的每个元素(除了
{1,2,3}
)可以通过从置换中的另一个集合中移除单个元素来找到

例如,排列
{1,2,3},{1}
无效,因为
{1}
不能通过从
{1,2,3}
中删除单个元素来构造


是否有一个已知的算法来寻找幂集的幂集子集?我的实现将使用Python,但问题是语言不可知。另外,我实际上不想要包含一个单一元素集的排列(例如,
{1,2,3},{1,2},{1}
),因为它们对应于一个不感兴趣的“独裁者”情况,删除一个元素,将其添加到列表中,然后递归调用算法。您还必须确保不生成重复项,这可以通过确保新列表比前一个列表“更小”(通过长度或(排序)元素的成对比较)来实现

这里是一个Python实现,作为一个生成器函数,没有太多优化。这似乎现在工作得很好,生成了所有的子集,没有任何重复项

def生成集合(集合,最小值=2):
产量集
added=set()#我们在这个迭代中已经生成了新的集合
对于集合中的集合:
#仅当当前集合具有正确的长度时

如果min_num{1,2,3},{1,2}
{1,2,3},{1,3}
,和
{1,2,3},{2,3}
都应该考虑吗equivalent@tobias_k你说得对,我想我今天没有时间更新这个问题了。是的,应该是这样的,我的大脑在昨天底就被炸了。我可以把这两个问题的答案结合起来,得到我需要的答案。(虽然,研究一个更有效的解决方案会很有趣。)看起来我一直试图用各种不同的方式解决错误的问题。希望,如果你好奇的话,真正的问题(以及它的解决方案)是。