[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
最老老实实的枚举法没人关注。。。
怎样对字符串进行可重复组合?
http://www.bathome.net/viewthrea ... muid=29086#pid78176
从一组数字中取任意个数字之和在一个数值范围内
http://www.bathome.net/viewthrea ... muid=29086#pid77555

TOP

本帖最后由 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

评分人数

TOP

32# wankoilz


没测试,
真如你说的话,看来有更快的算法,先收藏。。

TOP

32楼用偏移的办法确实更好,如果是8个排列项,那这种方法就避开了!7次的set和for /l,从而弥补了for /f频繁读写对效率的影响,这种用for /f从文件读取的思路真是太妙了

TOP

本帖最后由 wankoilz 于 2011-5-22 15:20 编辑

32楼的代码来自20楼...
楼上分析的在理,但就32楼代码而言for/f读取算不上频繁吧,8个字符执行7次for/f

TOP

建议把临时文件名改为纯数字,这样每次循环还可以省去两个set

TOP

返回列表