Algorithm 满足给定约束的模式组合

Algorithm 满足给定约束的模式组合,algorithm,sorting,combinations,Algorithm,Sorting,Combinations,给出了由1和0组成的模式。它总是7位,3位是1,4位是0 示例-1100010 约束是一次考虑2个0,用1s代替它们。我需要找到所有这些可能的组合 到目前为止,我的想法是,找到0的索引并运行for循环,在每次运行时选择2个索引并获得输出 示例- 给定模式-1100010 所需输出-1111010、1110110、1110011、1101110、1101011、1100111 我可以详尽地做这件事。任何以更优化的方式执行此操作的建议都将非常有用。您的问题归结为找到4和2的所有组合。你得到零指数的想

给出了由1和0组成的模式。它总是7位,3位是1,4位是0

示例-1100010

约束是一次考虑2个0,用1s代替它们。我需要找到所有这些可能的组合

到目前为止,我的想法是,找到0的索引并运行for循环,在每次运行时选择2个索引并获得输出

示例-

给定模式-1100010

所需输出-1111010、1110110、1110011、1101110、1101011、1100111


我可以详尽地做这件事。任何以更优化的方式执行此操作的建议都将非常有用。

您的问题归结为找到4和2的所有组合。你得到零指数的想法是一个很好的起点

对于给定的示例1100010,我们有以下内容:

1 1 0 0 0 1 0
| | | | | | |
V V V V V V V 
0 1 2 3 4 5 6   // indices here assuming base 0
     [,0] [,1]
[0,]    2    3
[1,]    2    4
[2,]    2    6
[3,]    3    4
[4,]    3    6
[5,]    4    6
因此我们的零指数向量是{2,3,4,6}

现在,我们可以生成我们的零索引向量的所有组合。选择2。SO或web上有几种很好的算法,可以随时使用,并进行适当的替换以生成我们的输出

伪代码:

inputVec = {1,1,0,0,0,1,0}
zeroIndex = {}

for i in 0 to (length(inputVec) - 1)
    if (inputVec[i] == 0)
        zeroIndex.push_back(i)     // zeroIndex = {2, 3, 4, 6} for the given example

// initialize output vector to the input vector
newOutput = inputVec
myCombos = generateCombos(zeroIndex, 2) // matrix of combinations with 2 columns

for i in 0 to (length(myCombos) - 1) {
    newOutput[myCombos[i, 0]] = 1
    newOutput[myCombos[i, 1]] = 1
    print(newOutput)

    // reset output vector
    newOutput = inputVec
}
在上述算法中,generateCombos将输出以下内容:

1 1 0 0 0 1 0
| | | | | | |
V V V V V V V 
0 1 2 3 4 5 6   // indices here assuming base 0
     [,0] [,1]
[0,]    2    3
[1,]    2    4
[2,]    2    6
[3,]    3    4
[4,]    3    6
[5,]    4    6
所述算法扩展到一般情况,其中输入向量为任意长度且具有任意数量的0和1

找出输入中四个零的位置,并对它们的位位置进行编号。 暂时忽略输入中零的位置,有四个零将变成两个零和两个一。 按顺序查找“0011”的唯一置换集。 对于每个perm:保留顺序,将1和0替换到原始数字中仅0的原始位置,以生成一个输出。 比如:

从itertools导入置换 从pprint导入pprint作为pp unique_perms=setpermutations'0011' num=输入'number:'。条带保留为文本 对于独特的烫发: out=[] p=listperm 对于num中的位: 如果位='1'否则p.pop,则out.appendbit 打印“->”,.joinout 样本运行:

number: 1100010
-> 1111010
-> 1101110
-> 1110110
-> 1100111
-> 1110011
-> 1101011

这不会增加不必要的开销吗?我知道对于特定的例子,这并不重要,但作为一般最佳编程实践的问题,该算法的伸缩性很差。例如,假设我们只有20个零,我们必须用5个1来替换。该算法必须筛选因子20排列,而组合方法只需处理更易于管理的20选5结果。否。解决你的问题。有4个零的7位的哪个部分没有被寻址?如果你正在寻找一个可爱的格言,试试看你不会需要它。。。或者“足够好就是完美”我明白你的意思,别误会我,我不是故意不尊重你。只是我不能告诉你有多少次像“足够好就是完美”这样的短语不仅伤害了我个人,也伤害了我整个部门。我们花了几个月的时间来清理当时足够好的代码,而这本可以通过在代码质量方面的少量投资来避免。我也能理解你的观点,如果你所实施的方法比最好的方法简单得多,但实际上你的方法需要通过集合知识来增加复杂性的层次。@JosephWood Hi,对任何感觉到的语气刺耳表示抱歉。因为在被排列的项目中有重复,所以会得到重复排列。对set的调用用于删除这些重复。集合是一种原生Python数据结构,其接口应该比dicts更容易学习。至于分配哪个是最好的,这取决于有原始问题的人。这将计算出所需的答案,并显示出来,所有这些答案都在可忽略不计的时间和内存中完成。它的性能似乎足以在短时间内处理所有可能的7位输入。非常感谢@JosephWood@Paddy3118我也理解你的代码。非常感谢你。