全排列算法讨论.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
全排列算法讨论 2 ? 你非常自豪.但这也许是适当的时候提醒自己谦虚的妤处.既然都到了这个地步了,何不再走多一步,翻一下书看看,也许你找到的方法已经早有别人发现了.果真是这样的话,你,一个无知的白痴,到处大吹大擂自己的发明是会被笑话的. 于是你找出了封尘的电脑和数学教科书.找到了排列组合一章,开始细读.终于你找到了这样的一幅图画: [4321][3421][321][3241][21][231].[3214][213].[1][321].[21][231].[213]. 书中写到,要产生一个排列其实可以用这样一个方法:先选一个数1,然后第二个数2可以放在1的前面或是后面.而每一个放法都会产生一个2位数,对于每一个这样的两位数,第三个数3,都可以放在它的前面,中间,或是最后;如此产生一个3位数;而每一个3位数,第4位数都可以插入到这3个数的任何一个空位中,如此类推.书中还列出了一个程式范例呢!并声这个方法要和已知的最快的算排列的方法速度相若. 你急不可待地开始把书中的描述实现.用Python,你很快又得到了一个全新的程式: 1#permute6.py2def permute(seq):3 seqn=[seq.pop()4 while seq:5 newseq=6 new=seq.pop()7#printseq:,seq,seqn,seqn,new,new8 for iin range(len(seqn)):9 item=seqn[i]10 for jin range(len(item)+1):11 newseq.append(.join([item[:j],new,item[j:]]))12 seqn=newseq13#printnewseq,newseq14 return seqn1516import sys,calc17seq=list(sys.argv[1])18where=int(sys.argv[2])19thelist=permute(seq)20printGot,len(thelist),items.21calc.calc(thelist,where) 测试结果如下: $time cpython permute6.py 1234567 4Got 5040 items.Maximum at 6531742,product 4846002 real 0m0.167s user 0m0.150s sys 0m0.020s 哇塞!书中自有黄金屋咧!想不到这个才是最快的算法.你开始感到要击败这次的对手不是不件容易的事,而且现在已经很晚了,你身心也都被疲倦所包围著.你绝望地看著这个新的程式码和它那美妙的结构,作出最后的尝试: 待续. 守夜人: Got 24 items.[1234,2134,2314,2341,1324,3124,3214,3241,1342,3142,3412,3421,1243,2143,2413,2431,1423,4123,4213,4231,1432,4132,4312,4321] 上面就是permute7.py产生的四位数字排列结果,你细心地反覆观看,终于看出了一些端倪:其实所产生的排列是有一种对称性的,第一个和最后一个是完全次序相反的,而第二个又和倒数第二个完全相反.利用这些对称性,也许你可以把计算时间打个对折哟.而你研究了一下程式的实现方法后你发现只要改一行!就可以实现这样的功能:就是第一行seqn=[seq.pop()]改成seqn=[seq.pop()+seq.pop()].这样你就实现了只产生其中一半的排列,尔后你只要把这个列表中的元素都掉个就完成了整个排列.程式如下 1#permute7.py2def permute(seq):3 seqn=[seq.pop()+seq.pop()]4 while seq:5 newseq=6 new=seq.pop()7#printseq:,seq,seqn,seqn,new,new8 for iin range(len(seqn)):9 item=seqn[i]10 for jin range(len(item)+1):11 newseq.append(.join([item[:j],new,item[j:]]))12 seqn=newseq13#printnewseq,newseq14 return seqn1516import sys,calc17seq=list(sys.argv[1])18where=int(sys.argv[2])19thelist=permute(seq)20printGot,len(thelist),items.21print thelist22#这个等一下再探讨23#calc.calc2(thelist,where)

文档评论(0)

lxm + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档