算法--全组合

给定一个数组,输出其全组合  例如 123   输出  1,2,3,12,13,23,123

解法一:

对于N位数据,考虑每一位对于组合结果的影响,对于每一位可以选择取或者不取。一共有power(2,n)中取法,当全部不取时,对于最后结果没有意义,因此最终取法共有power(2,n)-1.可以利用二进制数字从1变为N,刚好变化过程中的二进制01分别对应每一位的取值情况,输出每一种情况即可。

def combination(num):
    n = len(num)
    nbit = 1 << n
    for i in range(0, nbit):
        for j in range(0, n):
            tmp = 1 << j
            if tmp&i != 0:
                print (num[j],end='')
        print ()

假设输入1234, 首先求出数组长度n=4,  构造power(2,n)-1  例如n=4  则nbit=1111,  注意数组下标从0开始

变量i从0000---1111   若i=1001,说明数组的第0位以及第3位被选择,可以输出   

 j表示数组的左起第几位需要输出,若j=0,说明当前为数组第0位  j=n-1说明当前为数组第n-1位

然后j依次搜寻i个二进制各位如果某一位等于1,则把相应的num[j]给输出即可。

解法二:

给定N位数据,其全组合的选择长度依次为1,2.。。。N.现在考虑长度为k的组合序列,若要产生长度为k的序列,考虑第1位,若选择第一位,则从后面n-1中选择k-1位分别与第一位组合即可,若选择第二位,则从后面n-2位中选择k-1位即可。由于k<=n,临界条件是k==0,此时直接返回空即可。

产生长度为k的序列如下:

def combination_k(num, k):
    r = []
    if k==0:
        return ['']
    for i in range(len(num)):
        for letter in combination_k(num[i+1:], k-1):
            #print ("letter",letter)
            r += [num[i]+letter]
    return r

遍历所有的k的取值,得到全组合:

扫描二维码关注公众号,回复: 4095293 查看本文章
def combination_all(num):
    all = []
    for i in range(1,len(num)+1):
        all += combination_k(num, i)
    return all

猜你喜欢

转载自blog.csdn.net/u014106644/article/details/84026305