|
|
第 1 帖 | ||
|
|
标题: [算法]全排列算法C++递归实现 当做练习C++的小玩艺,高手们就不必浪费时间了:)
---------------------------------------------------------------- 思路:把各个元素逐个插入到已有排列中所有可能的位置,当得到的目标排列长度等于题给要求排列长度时,把该排列保存起来,即为一个成功的排列。 实现:C++, vector, 递归 效率:设每插入一次为一个基本运算,则时间复杂度为 O(n!) ; 加上vector在插入时又有开销,时间效率不高。 若不把结果输出到屏幕,则AMD XP 1600+ / 1G mem 的运行时间如下: 引用:
PHP 代码:
__________________
Athlon Phenom II X4 940 OC 3.6G / Kingston DDR2 4G / DFI 790X-M2RS / Sapphire HD4870 /Audigy2 ZS / 22' LCD / Acbel iPower660 此帖于 06-09-04 10:29 被 soloforce 编辑. |
||
|
|
|
||
|
|
第 2 帖 | |
|
|
iostream不是一般的慢,改成stdio.h,用scanf和printf会快很多吧
__________________
vim + gcc + gdb |
|
|
|
|
|
|
|
第 3 帖 | |
|
|
代码:
此帖于 06-09-04 16:50 被 Iambitious 编辑. |
|
|
|
|
|
|
|
第 4 帖 | |
|
|
字典序数法是按照“字典”顺序给出的全排列,有一个排列p1,p2,...pn生成下一个排列的算法如下:
1。求满足关系式p(j-1) < p(j)的j的最大值,设为i 2。求满足关系式p(i-1) < p(k)的k的最大值,设为j 3。p(i-1)与p(j)互相交换,得到新的数列 4。在把新得到的数列从第i个位置到最后一个位置,全部逆转,所得到的数列就是下一个字典序数的排列。 初始状态为p1<=p2<=p3<=...pn 终止状态为pn>=p(n-1)>=...>=p2>=p1 |
|
|
|
|
|
|
|
第 5 帖 | |
|
|
又掌握了一种方法,谢谢Iambitious了。
不过我看字典法每求一个排列要比较、交换的次数好像很多,对于无重复数据的排列应该也不是效率最高的算法吧; 如果重复数据比较多,那的确很快,而且不会产生重复输出。 |
|
|
|
|
|
|
|
第 6 帖 | |
|
|
在非插入全排列算法里面应该是最快的,其他的方法需要比较的次数更多,插入全排列的生成算法,如果用链表来实现的话,应该是最快的。
|
|
|
|
|
|
|
|
第 7 帖 | |
|
|
以前写过一个非递归的,拿出来献丑一下,因为本人是英语专业,写的不好大家多包涵,主要思想还是和lz一样的,只是把递归改成非递归而已,从算法思想上来讲自然是Iambitious的好。
代码:
|
|
|
|
|
|