本帖最后由 wujunkai 于 2020-3-6 14:13 编辑
我之前写了一个文件用来干各种奇奇怪怪的东西,最近在慢慢优化。里面有一个字符串长度计算的算法,经常被调用,但效率很低 o(127) 。 我想用二分重写,但貌似效率更低了(尽管表面是o(9),但12000组数据对比结果表示它更慢)。
早上想了想,可能是goto的问题,想用for改一下,然而在一个细节方面卡住了o(╥﹏╥)o
真心求帮助。
不说了,上代码。
假设字符串长度永远不会超过255,返回数为字符串最后一个字符的下标。- :len
- rem 原来的代码
- rem <--获取长度-->
- rem 答案储存于 len 中
- set len=-1
- for /L %%i in (0,1,255) do if not "!%~1:~%%i,1!"=="" set /A len+=1
- goto:eof
复制代码
- :llen
- rem <--二分获取长度-->
- rem 留着备用,貌似比 len 还慢,12000组数据对比
- set name=%~1
- set len_lef=0
- set len_rig=255
- :len_loop
- set /A len=(%len_lef%+%len_rig%)/2
- if "!%name%:~%len%,1!"=="" (
- set /A len_rig=%len%
- ) else (
- set /A len_lef=%len%
- )
- set /A len_add=%len_lef%+1
- if not %len_add% EQU %len_rig% goto:len_loop
- if "!%name%:~%len%,1!"=="" set /A len-=1
- goto:eof
复制代码
- :lllen
- rem <--二分获取长度-->
- rem 早上刚改的
- set name=%~1
- set len_lef=0
- set len_rig=255
- for /L %%i in (1,1,8) do (
- echo len:!len! , left:!len_lef! , right:!len_rig! , %%i
- set %%i=3
- echo %%i
- set /A len=^(!len_lef!+!len_rig!^)/2
- rem 注意,下面那行就是我搞不定的地方
- if "!%name%:~!len!,1!"=="" (
- set /A len_rig=!len!
- ) else (
- set /A len_lef=!len!
- )
- )
- if "!%name%:~%len%,1!"=="" set /A len-=1
- goto:eof
复制代码 另外,我在贴吧也找到一份二分搜索长度的算法,试了一下,速度约是len的两倍o(╥﹏╥)o
--------------------------------------
已解决- :len
- set len_cpy=!%~1!
- set len=0
- for %%i in (128,64,32,16,8,4,2,1) do if not "!len_cpy:~%%i,1!"=="" (
- set /A len+=%%i
- set len_cpy=!len_cpy:~%%i!
- )
- goto:eof
复制代码
|