生成固定长度整数分区的所有唯一置换的算法?

如何解决生成固定长度整数分区的所有唯一置换的算法?

好的。首先,忽略排列,仅生成长度为L的分区(如@Svein Bringsli所建议)。请注意,对于每个分区,可以对元素强加一个顺序,例如>。现在只需“计数”即可保持您的订购。对于n = 4,k = 3:

(4, 0, 0)
(3, 1, 0)
(2, 2, 0)
(2, 1, 1)

那么,如何实现呢?它看起来像:在从位置i减去1并将其添加到下一个位置的同时保持我们的顺序,从位置i减去1,在位置i + 1处加1并移动到下一个位置。如果我们处于最后位置,请退后一步。

这是一个小蟒蛇,它就是这样做的:

def partition_helper(l, i, result):
    if i == len(l) - 1:
        return 
    while l[i] - 1 >= l[i + 1] + 1:
        l[i]        -= 1
        l[i + 1]    += 1
        result.append(list(l))
        partition_helper(l, i + 1, result)

def partition(n, k):
    l = [n] + [0] * (k - 1)
    result = [list(l)]
    partition_helper(l, 0, result)
    return result

现在,您有了一个列表列表(实际上是一个多集列表),并且生成列表中每个多集的所有排列都会为您提供解决方案。我将不去赘述,这里有一个递归算法,该算法基本上说,对于每个位置,选择多重集中的每个唯一元素,并追加从多重集中删除该元素所产生的多重集合的置换。

解决方法

我正在寻找一种算法,该算法可生成整数的固定长度分区的所有排列。顺序无所谓。

例如,对于n = 4和长度L = 3:

[(0,2,2),(2,0),1,1),(1,(0,3),3,(3,4),(4,4,0)]

我对整数分区+长度小于L的分区的排列感到困惑;但那是太慢了,因为我在同一个分区中多次得到了(因为[0,1]可能的排列[0,1];-)

任何帮助表示赞赏,不,这不是功课-个人利益:-)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?