设为首页 收藏本站
查看: 1703|回复: 0

[经验分享] 高效率的排列组合算法--《编程珠矶》--python实现

[复制链接]

尚未签到

发表于 2015-4-21 10:24:13 | 显示全部楼层 |阅读模式
  组合算法   
  本程序的思路是开一个数组,其下标表示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] = 1
group[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] = 1
group[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
print group
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) for i in indexes]
    tmp.append(charters[indexes[0]])
tmp.append(charters[indexes[1]])
tmp.append(charters[indexes[2]])
print tmp
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] = 1
indexes[0] = 0
#如果 indexes 的三个元素值都是连续的,那么说明 group 的第一个10在最右边
elif indexes[0] + 1 == indexes[1] and indexes[1] + 1 == indexes[2]:
location = indexes[2]
indexes[2] = location + 1
group[indexes[0]] = 0
group[indexes[1]] = 0
group[0] = 1
group[1] = 1
indexes[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进   
  一。每加一次一就判断一下各位数组单元有无重复,有则再转回去做加一操作,没   
  有则说明得到了一个排列方案。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-59152-1-1.html 上篇帖子: python实现扫描论坛回帖,自动发附件(应对求种之类的) 下篇帖子: python原生结束线程的方法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表