Board logo

标题: [文本处理] [已解决]求助批处理二分计算长度的算法该如何写 [打印本页]

作者: wujunkai    时间: 2020-3-6 07:18     标题: [已解决]求助批处理二分计算长度的算法该如何写

本帖最后由 wujunkai 于 2020-3-6 14:13 编辑

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





欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2