组合枚举方法与常见优化

ACM中常见的有两种问题:

 

1.按字典顺序输出全排列

 

如: abc 可产生

 

abc

acb

bac

bca

cab

cba

 

2.m字母选n个字母,按字典顺序输出

 

如: abc 中3选2

ab

ac

bc

ba

ca

cb

 

测试1:

 

首先说全排列的产生方式,中学的思想就是n!(n的阶乘),那么我们就可以用递归的方式来实现.

 

1.排序

2.枚举

   模拟dance_link的思想,使其达到N!

   枚举过程中,要解决字串中有重复字符问题

 

 

 

 

测试2:

 

m字母选n个字母,按字典顺序输出,问题就容易解决了,程序跟上边一样,

 

只是 dfs(inc,len,str) 中的len = n就可以了;

 

 

与网上一段流行程序作个比较:

 

 

 

测试3:

 

STL的写法:

 

 

 

测试环境: CPU AMD X2 4200+ 2.2G

 

测试字串:abcdefghijk

 

测试1 (我优化的程序)测试时间: 4.531s

 

测试2 流行程序测试时间: 7.859s

 

测试3 STL 程序测试时间: 9.375s

 

4.531/7.859 = 0.57....

4.531/9.375 = 0.48....

 

提高将近40%~50多的速度

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值