找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
楼主: terse

【练习-020】批处理根据输入列出组合

[复制链接]
发表于 2011-5-22 11:06:06 | 显示全部楼层
最老老实实的枚举法没人关注。。。
怎样对字符串进行可重复组合?
http://www.bathome.net/viewthrea ... muid=29086#pid78176
从一组数字中取任意个数字之和在一个数值范围内
http://www.bathome.net/viewthrea ... muid=29086#pid77555
发表于 2011-5-22 11:38:05 | 显示全部楼层
本帖最后由 wankoilz 于 2011-5-22 11:42 编辑

6楼并非最快吧...
把6楼代码构造成求8个字符40320个组合,且去掉set/a flag+=1,耗时8秒。
  1. @echo off&setlocal enabledelayedexpansion
  2. set var=a b c d e f g h
  3. echo %time%
  4. (for %%i in (!var!) do (
  5.     set var1=!var:%%i=!
  6.     for %%j in (!var1!) do (
  7.     set var2=!var1:%%j=!
  8.     for %%k in (!var2!) do (
  9.     set var3=!var2:%%k=!
  10.     for %%l in (!var3!) do (
  11.     set var4=!var3:%%l=!
  12.     for %%m in (!var4!) do (
  13.     set var5=!var4:%%m=!
  14.     for %%n in (!var5!) do (
  15.     set var6=!var5:%%n=!
  16.     for %%o in (!var6!) do (
  17.     set var7=!var6:%%o=!
  18.     for %%p in (!var7!) do (
  19.     echo %%i %%j %%k %%l %%m %%n %%o %%p
  20.     )))))))))>c.txt
  21. echo %time%
  22. pause
复制代码
同样的求8个字符40320个组合,下面的耗时不到4秒:
  1. @echo off&setlocal enabledelayedexpansion
  2. set/p s=请输入,用一个空格分开:
  3. echo %time%
  4. set f1=a.txt
  5. set f2=b.txt
  6. >!f1! echo !s:~,1!&set s=!s:~1!
  7. set len=1
  8. for %%a in (%s%) do (
  9.     (for /f %%b in (!f1!) do (
  10.         set tmp=%%b
  11.         for /l %%c in (0,1,!len!) do echo !tmp:~,%%c!%%a!tmp:~%%c!
  12.     ))>!f2!
  13.     set t=!f1!
  14.     set f1=!f2!
  15.     set f2=!t!
  16.     set/a len+=1
  17. )
  18. echo %time%
  19. start %f1%&del/f %f2%
  20. pause
复制代码
我在想for嵌套得太深了是不是会影响效率...

评分

参与人数 1技术 +1 收起 理由
zm900612 + 1 思路好极了!

查看全部评分

发表于 2011-5-22 12:20:33 | 显示全部楼层
32# wankoilz


没测试,
真如你说的话,看来有更快的算法,先收藏。。
发表于 2011-5-22 13:39:35 | 显示全部楼层
32楼用偏移的办法确实更好,如果是8个排列项,那这种方法就避开了!7次的set和for /l,从而弥补了for /f频繁读写对效率的影响,这种用for /f从文件读取的思路真是太妙了
发表于 2011-5-22 15:19:25 | 显示全部楼层
本帖最后由 wankoilz 于 2011-5-22 15:20 编辑

32楼的代码来自20楼...
楼上分析的在理,但就32楼代码而言for/f读取算不上频繁吧,8个字符执行7次for/f
发表于 2011-5-22 15:56:38 | 显示全部楼层
建议把临时文件名改为纯数字,这样每次循环还可以省去两个set
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-16 20:55 , Processed in 0.016894 second(s), 7 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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