标题: [文本处理] [已解决]求助批处理二分计算长度的算法该如何写 [打印本页]
作者: wujunkai 时间: 2020-3-6 07:18 标题: [已解决]求助批处理二分计算长度的算法该如何写
本帖最后由 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
复制代码
作者: Gin_Q 时间: 2020-3-6 08:16
为什么用二分法求长度!有什么优点?
作者: wujunkai 时间: 2020-3-6 08:28
回复 2# Gin_Q 二分的优点很多啊,比如快(此处应有滑稽)
作者: Batcher 时间: 2020-3-6 10:23
回复 1# wujunkai
这样可以吗:
http://bbs.bathome.net/thread-6677-1-1.html
作者: wujunkai 时间: 2020-3-6 10:31
回复 4# Batcher 这个速度比我原来的还慢啊
作者: CrLf 时间: 2020-3-6 13:45
http://www.bathome.net/viewthread.php?tid=11799
作者: wujunkai 时间: 2020-3-6 14:13
非常感谢大家的帮助,已解决,快了5倍左右吧- :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
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |