- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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)
您可能关注的文档
最近下载
- 《旅游景区服务与管理》教案.pdf VIP
- 技术核定单-范本.doc VIP
- 第六章旅游环境管理.ppt VIP
- 《汉语语法研究》课程教学大纲.docx VIP
- 精品解析:天津市双菱中学2024-2025学年七年级上学期期末考试英语试题(解析版).docx VIP
- 北师大版(2024)七年级上册数学第六章数据的收集与整理6.2数据的收集第1课时数据的收集与整理课件PPT.pptx VIP
- 新人教版小学一年级上册语文五六单元试卷.docx VIP
- 《科技交流英语》网课题库及答案.docx VIP
- 一元二次方程48道压轴题型专项训练(8大题型)原卷版—2024-2025学年北师大版九年级数学上册.pdf VIP
- 湖北省武汉市2025届高考物理一模试卷含解析.doc VIP
原创力文档


文档评论(0)