Algorithm 满足给定约束的模式组合
给出了由1和0组成的模式。它总是7位,3位是1,4位是0 示例-1100010Algorithm 满足给定约束的模式组合,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的所有组合。你得到零指数的想
约束是一次考虑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我也理解你的代码。非常感谢你。