具有唯一编号的数组数量
Amount of arrays with unique numbers
一直在想这个问题有没有更好的解决办法:
假设有 n 个容器(它们的长度可能不同)。在他们每个人中,我们都有一些数字。从每个容器中取出一个元素创建的长度为 n 的数组的数量是多少? 新形成的数组中的那些数字必须是唯一的(例如(2,3,3)不能创建但(2,4,3)可以)。
这是一个例子:
n=3
c1=(1,6,7)
c2=(1,6,7)
c3=(6,7)
正确答案是 4,因为我们可以创建这四个数组:(1,6,7), (1,7,6), (6,1,7), (6,7,1) .
编辑:None 个容器包含重复项,新数组中的所有元素的顺序必须与其所属容器的顺序相同。
所以我的问题是:有没有比生成每一种可能性并检查它是否没有重复更好的方法来计算这些数组的数量?
您不需要生成每种可能性,然后 然后 检查它是否有重复 - 您可以在 before 添加可能是重复的元素,进一步节省了大量无用的工作。但是,是的,鉴于
的要求
all the elements in the new arrays must have the same order as the
order of the containers they belong to
您不能简单地计算 m-over-n 的排列或组合,这样会快得多(因为这些有一个封闭的公式)。
因此,最佳算法可能是在构建部分答案时使用带有集合的回溯方法来避免重复,并计算找到的有效答案的数量。
这个问题看起来有点像计算一维数独的可能答案:从每个区域中各选择一个元素,确保没有重复。对于许多情况,可能有 0 个答案 - 想象 n=4, c=[[1,2],[2,3],[3,1],[2,3]]
。例如,如果 k
个容器子集的唯一元素少于 k
个,则无法回答。
一直在想这个问题有没有更好的解决办法: 假设有 n 个容器(它们的长度可能不同)。在他们每个人中,我们都有一些数字。从每个容器中取出一个元素创建的长度为 n 的数组的数量是多少? 新形成的数组中的那些数字必须是唯一的(例如(2,3,3)不能创建但(2,4,3)可以)。 这是一个例子:
n=3
c1=(1,6,7)
c2=(1,6,7)
c3=(6,7)
正确答案是 4,因为我们可以创建这四个数组:(1,6,7), (1,7,6), (6,1,7), (6,7,1) .
编辑:None 个容器包含重复项,新数组中的所有元素的顺序必须与其所属容器的顺序相同。
所以我的问题是:有没有比生成每一种可能性并检查它是否没有重复更好的方法来计算这些数组的数量?
您不需要生成每种可能性,然后 然后 检查它是否有重复 - 您可以在 before 添加可能是重复的元素,进一步节省了大量无用的工作。但是,是的,鉴于
的要求all the elements in the new arrays must have the same order as the order of the containers they belong to
您不能简单地计算 m-over-n 的排列或组合,这样会快得多(因为这些有一个封闭的公式)。
因此,最佳算法可能是在构建部分答案时使用带有集合的回溯方法来避免重复,并计算找到的有效答案的数量。
这个问题看起来有点像计算一维数独的可能答案:从每个区域中各选择一个元素,确保没有重复。对于许多情况,可能有 0 个答案 - 想象 n=4, c=[[1,2],[2,3],[3,1],[2,3]]
。例如,如果 k
个容器子集的唯一元素少于 k
个,则无法回答。