[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

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

本帖最后由 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
复制代码

非常感谢大家的帮助,已解决,快了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
复制代码

TOP

TOP

回复 4# Batcher 这个速度比我原来的还慢啊

TOP

回复 1# wujunkai


这样可以吗:
http://bbs.bathome.net/thread-6677-1-1.html
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 2# Gin_Q 二分的优点很多啊,比如快(此处应有滑稽)

TOP

为什么用二分法求长度!有什么优点?

TOP

返回列表