Python或Cpp中不带前导或尾随0的1的排列
我需要一种高效的方法来生成一个列表列表,探索nx1和Kx0s的所有排列。但是,我需要删除所有前导0和尾随0,然后删除重复的0。K-N为100秒,N为2到20之间的任意值 我可以分步骤执行此操作: 1创建排列 2删除每个列表元素的尾随0 3删除每个列表元素的前导0 4删除重复项 然而,前3个步骤需要很长时间,因此我认为我需要找到一种不同的方法。以下是我使用的代码:Python或Cpp中不带前导或尾随0的1的排列,python,math,iteration,permutation,combinatorics,Python,Math,Iteration,Permutation,Combinatorics,我需要一种高效的方法来生成一个列表列表,探索nx1和Kx0s的所有排列。但是,我需要删除所有前导0和尾随0,然后删除重复的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
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]]
由工程师在评论中回答 删除前导0和尾随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);
只是一个想法,但你知道两边都需要一个,所以这是两个。你就不能把你的K个零和N-2个一全部排列,然后用1把它们包起来吗?太棒了!谢谢你,你是个天才。