高效率的排列组合算法《编程珠矶》python实现

摘要:
组合算法本程序的思路是开一个数组,其下标表示1到m个数,数组元素的值为1表示其下标代表的数被选中,为0则没选中。然后从左到右扫描数组元素值的“10”组合,找到第一个“10”组合后将其变为“01”组合,同时将其左边的所有“1”全部移动到数组的最左端。全排列算法从1到N,输出全排列,共N!

组合算法
本程序的思路是开一个数组,其下标表示1到m个数,数组元素的值为1表示其下标
代表的数被选中,为0则没选中。
首先初始化,将数组前n个元素置1,表示第一个组合为前n个数。
然后从左到右扫描数组元素值的“10”组合,找到第一个“10”组合后将其变为
“01”组合,同时将其左边的所有“1”全部移动到数组的最左端。
当第一个“1”移动到数组的m-n的位置,即n个“1”全部移动到最右端时,就得
到了最后一个组合。
例如求5中选3的组合:
1 1 1 0 0 //1,2,3
1 1 0 1 0 //1,2,4
1 0 1 1 0 //1,3,4
0 1 1 1 0 //2,3,4
1 1 0 0 1 //1,2,5
1 0 1 0 1 //1,3,5
0 1 1 0 1 //2,3,5
1 0 0 1 1 //1,4,5
0 1 0 1 1 //2,4,5
0 0 1 1 1 //3,4,5

使用python实现:

方法一:


group = [1, 1, 1, 0, 0, 0] group_len =len(group) #计算次数 ret =[group] ret_num = (group_len * (group_len - 1) * (group_len - 2)) / 6 for i in xrange(ret_num - 1): '第一步:先把10换成01' number1_loc = group.index(1) number0_loc =group.index(0)
#替换位置从第一个0的位置开始 location
=number0_loc

#判断第一个0和第一个1的位置哪个在前,
#如果第一个0的位置小于第一个1的位置,
#那么替换位置从第一个1位置后面找起

if number0_loc <number1_loc:
        location = group[number1_loc:].index(0) +number1_loc

    group[location] = 1group[location - 1] =0

    '第二步:把第一个10前面的所有1放在数组的最左边'
    if location - 3 >=0:
        if group[location - 3] == 1 and group[location - 2] == 1:
            group[location - 3] =0
            group[location - 2] =0
            group[0] = 1group[1] = 1
        elif group[location - 3] == 1:
            group[location - 3] =0
            group[0] = 1
        elif group[location - 2] == 1:
            group[location - 2] =0
            group[0] = 1

    printgroup
    ret.append(group)

方法二:

charters = ['A', 'B', 'C', 'D', 'E', 'F']
s4 =time.time()
group = [1, 1, 1, 0, 0, 0]
group_len =len(group)
ret_num = (group_len * (group_len - 1) * (group_len - 2)) / 6
#记录 group 的1位置的容器
indexes = [0, 1, 2]
for i in xrange(ret_num - 1):

    '''
    第一步:先把10换成01
    第二步:把第一个10前面的所有1放在数组的最左边

    '''tmp =[]
    #location:第一个10的起始位置
    #如果 indexes 的第一个元素与第二个元素值不连续,那么说明 group 的第一个10在最左边
    #[tmp.append(charters[i]) for i in indexes]
tmp.append(charters[indexes[0]])
    tmp.append(charters[indexes[1]])
    tmp.append(charters[indexes[2]])
    printtmp
    
    if indexes[0] + 1 < indexes[1]:
        location =indexes[0]
        indexes[0] = location + 1

    #如果 indexes 的第二个元素与第三个元素值不连续,那么说明 group 的第一个10在中间
    elif indexes[1] + 1 < indexes[2]:
        location = indexes[1]
        indexes[1] = location + 1
        #indexes 中间的1进位之后,把左边的1的位置记录为0,同时修改 group 相应位置的值
        group[indexes[1] - 1] =0
        group[0] = 1indexes[0] =0

    #如果 indexes 的三个元素值都是连续的,那么说明 group 的第一个10在最右边
    elif indexes[0] + 1 == indexes[1] and indexes[1] + 1 == indexes[2]:
        location = indexes[2]
        indexes[2] = location + 1group[indexes[0]] =0
        group[indexes[1]] =0
        group[0] = 1group[1] = 1indexes[0] =0
        indexes[1] = 1

    if location < 5:
        group[location] =0
        group[location + 1] = 1
    else:
        group[location] = 1


print time.time() - s4,'*************'
#print ret,'**********'

第二种方法经过优化,效率相当高。测试了1600多亿的循环计算,方法一要22分钟,而方法二只需要1分钟。

全排列算法
从1到N,输出全排列,共N!条。
分析:用N进制的方法吧。设一个N个单元的数组,对第一个单元做加一操作,满N进
一。每加一次一就判断一下各位数组单元有无重复,有则再转回去做加一操作,没
有则说明得到了一个排列方案。

免责声明:文章转载自《高效率的排列组合算法《编程珠矶》python实现》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇浏览器的缓存机制对UserDict的研究下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

解决 No module named 'airtest.core'

当前环境mac os 1、已pip install airtest 2、可以通过命令行运行 airtest的demo,但是使用pycharm 运行会提示No module named 'airtest.core' 3、当前pycharm 解释器已设置为 自己安装的python版本 4、在sitepackage 中可见 airtest的包,在pychram中...

Python(16)_爬去百度图片(urlopen和urlretrieve)

import urllib.request image_url = 'http://img18.3lian.com/d/file/201709/21/f498e01633b5b704ebfe0385f52bad20.jpg' response = urllib.request.urlopen(url=image_url) # 二进制的形式保存,方法一 w...

远程获取--snmp模块(python)/snmp-cmds,easysnmp

一、简介 snmp-cmds模块通过SNMP与目标设备进行通信,此模块适用于windows,此模块是基于系统已安装了net-snmp环境easysnmp模块通过SNMP与谬表设备进行通信,此模块用于linux,此模块基于系统已安装了net-snmp环境 二、snmp-cmds模块安装 2.1 在Windows平台 #1.系统环境安装net-snmp软件...

Python图像处理 PIL中convert('L')函数原理

1. img = img.convert()   PIL有九种不同模式: 1,L,P,RGB,RGBA,CMYK,YCbCr,I,F。 1.1 img.convert('1')   为二值图像,非黑即白。每个像素用8个bit表示,0表示黑,255表示白。 1.1.1 Code 1 from PIL import Image 2 3 4 def conv...

《Spark Python API 官方文档中文版》 之 pyspark.sql (三)

摘要:在Spark开发中,由于需要用Python实现,发现API与Scala的略有不同,而Python API的中文资料相对很少。每次去查英文版API的说明相对比较慢,还是中文版比较容易get到所需,所以利用闲暇之余将官方文档翻译为中文版,并亲测Demo的代码。在此记录一下,希望对那些对Spark感兴趣和从事大数据开发的人员提供有价值的中文资料,对PyS...

Python os.system执行多条语句,os.system()的返回值以及与os.popen的区别(转)

以下内容转自  https://blog.csdn.net/fengqingting2/article/details/41940149  https://blog.csdn.net/windone0109/article/details/8895875 https://blog.csdn.net/zgl07/article/details/431968...