【问题标题】:Permutations of 1s without leading or trailing 0s in Python or Cpp在 Python 或 Cpp 中没有前导或尾随 0 的 1 的排列
【发布时间】:2019-03-05 15:25:54
【问题描述】:

我需要一种有效的方法来生成列表列表,探索 Nx1s 和 Kx0s 的所有排列。但是我需要删除所有前导和尾随 0,然后删除重复项。 K-N 将在 100 内,N 将在 2 到 20 之间。

我可以分步执行此操作: 1) 创建排列 2) 删除每个列表元素的尾随 0 3) 删除每个列表元素的前导 0 4) 删除重复项

但是,前 3 个步骤需要很长时间,所以我认为我需要找到不同的方法。这是我使用的代码:

import itertools

def donewk(k):
  newk = []
  for i in k:
    if i not in newk:
      newk.append(i)
  return newk

n=2;
k=10;
a=(list(itertools.permutations( [1]*n+[0]*(k-2))))
for i,elem in enumerate(a):
    elem = list(elem)
    while not elem[-1]:
        elem.pop()
    while not elem[0]:
        elem.pop(0)
    a[i]=elem;

a=donewk(a)
print(a)

输出

[[1, 1], [1, 0, 1], [1, 0, 0, 1], [1, 0, 0, 0, 1], [1, 0, 0, 0, 0, 1], [1, 0, 0, 0, 0, 0, 1], [1, 0, 0, 0, 0, 0, 0, 1], [1, 0, 0, 0, 0, 0, 0, 0, 1], [1, 0, 0, 0, 0, 0, 0, 0, 0, 1]]

【问题讨论】:

  • 只是一个想法,但你知道你需要两边都有,所以这是两个。难道你不能对你的 K 个零和 N-2 个进行所有排列,然后用 1 包装它们吗?
  • 太棒了!你真是个天才,谢谢。

标签: python math iteration permutation combinatorics


【解决方案1】:

由 Engineero 在 cmets 中回答。

删除开头和结尾的 0 与说它需要以 1 开头和结尾是一回事。因此用 N-2 进行排列,然后将 1 绑在末端。

谢谢!

编辑: 我以为 Engineero 回答了这个问题,但实际上他没有解决,因为它没有解决第一个和最后一个 1 之间的空间何时小于 K 的问题。他确实得出了一个令人满意的答案。

我创建了一个迭代应用程序。我的最终应用程序是 cpp,但我在 python 中做了一个快速原型作为概念证明。请注意,在 cpp 应用程序中,我将调用一个使用排列的单独函数,而不是附加到我的列表中。随意批评以提高效率。

import copy
aList = []

def initA(sz=10):
        return [1]+[0]*(sz-2)+[1];

def iterA(buff,level,ix):
    if (level >0):
        for i in range (level,ix):
            a=copy.deepcopy(buff)
            a[i] = 1;
            if level ==1:
                aList.append(a)
            iterA(a,level-1,i);

N=6;
K=10;
for i in range (N-2,K):
    a=initA(i+1)
    a = iterA(a,N-2,i)
print (aList);

【讨论】:

    猜你喜欢
    • 2011-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多