
批處理求字符串長度的表驅動算法
求字符串長度在許多代碼中是很關鍵的子過程現在綜合起來比較好的算是[折半法點擊查看代碼] 【不用自行管理變量,且效率較高】判斷1000以內長度的字符串 耗費時間單位25,而其他的使用goto命令的耗費時間都和他不在一個數量級上!對于非常頻繁的求字符串長度的代碼,還有更好的算法,為大家隆重推薦ifexist的一個小代碼,我只是對他的思想做了延伸算法思想為ifexist的如下代碼----------------------------------------------------------- 更新一下 --------------------------------------------------------關于生成“list表”有快速方法,下面代碼生成表耗時用18~25個時間單位【一個時間單位為一次set 賦值所耗費的時間,點此查看詳情】查閱相關資料,此種思想算法屬于 表驅動算法 范疇 只要你理解預處理的機制,代碼是支持所有特殊字符的nclick="copycode($('code0'));">復制代碼
- set s=%19876543210&echo the length of %1 is %s:~9,1%
:: strlen256 // 最大字符串長度256setlocal enabledelayedexpansion::::::::::::如果你覺得下面兩句比較耗時間,可以直接把list的值【512字節】求出然后用set命令賦值::::::::::::::::set zz=0 1 2 3 4 5 6 7 8 9 a b c d e f&set list=for %%a in (%zz%)do for %%b in (%zz%)do set list=!list!%%a%%b::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::rem 使用范例 // 【耗費的時間單位僅為 2.3】set s=your stringsset s=!list!!s!!s!&set/a len=0X!s:~-512,2!echo %len%下面代碼支持字符串的最大長度為1024:: strlen1024setlocal enabledelayedexpansion::::::::::::如果你覺得下面三句比較耗時間,可以直接把list的值【2048字節】求出然后用set命令賦值::::::::::::::::set zz=0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u vset z=10&(for %%a in (%zz:~20%)do set/a %%a=z,z+=1)&set list=for %%a in (%zz%)do for %%b in (%zz%)do set list=!list!%%a%%b:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::rem 使用范例 // 【耗費的時間單位僅為 2.3】set s=your stringsset s=!list!!s!!s!&set/a len=!s:~-2048,1!*10+!s:~-2047,1!rem 老帖為“set s=!list!!s!!s!&set l=!s:~-2048,2!&set/a len=!l:~,1!*10+!l:~-1!”echo %len%對于更長的字符串,用類似的方法可以擴充到任意長度[cmd支持最大命令行8K],根據實際情況需要選定list字符串作為“表”,表的字節數隨待求字符串的最大長度 基本上是線性遞增的
rem 生成strlen256的那個表:@setlocal enabledelayedexpansion@set zz= 0 1 2 3 4 5 6 7 8 9 a b c d e f&set list=&for %%a in (!zz!)do set list=!list!!zz: =%%a!@echo %list%>list.txt
::strlen1024setlocal enabledelayedexpansionrem 此表字節數3072,如果嫌太大可以使用原帖那個strlen1024的表,字節數2048set zz= 0 1 2 3 4 5 6 7 8 9 a b c d e f&set lt=&set list=for %%a in (%zz%)do set lt=!lt!!zz: = %%a!for %%b in (%zz:~0,8%)do set list=!list!!lt: =%%b!rem 使用范例 set s=your stringsset s=!list!!s!!s!!s!&set/a len=0X!s:~-3072,3!echo %len%[ 最后由 plp626 于 2009-10-13 11:22]

