|
plp626
银牌会员
钻石会员
积分 2278
发帖 1020
注册 2007-11-19
状态 离线
|
『第
31 楼』:
其实我就没测试,从算法上分析我就知道不测试时间都一样,只是用的变量不一样,三重循环在理论上可能还稍费时间。
|
山外有山,人外有人;低调做人,努力做事。
进入网盘(各种工具)~~ 空间~~cmd学习 |
|
2008-4-12 23:20 |
|
|
slore
铂金会员
积分 5212
发帖 2478
注册 2007-2-8
状态 离线
|
『第
32 楼』:
Quote: | Originally posted by plp626 at 2008-4-12 23:20:
其实我就没测试,从算法上分析我就知道不测试时间都一样,只是用的变量不一样,三重循环在理论上可能还稍费时间。 |
|
你真的从算法上分析了?时间复杂度都不一样!
还叫不测试时间都一样……
我敢保证测试时间绝对不一样!
只是用的变量不一样……?真的是这样麽?
3重循环,传统编程是1个x1(不变),1个x10,一个x100(那个例子好像是直接abc合并就可以了,这个是P里面set的支持。)加起来得到那个3位数。(算术运算比字符运算快。)
然后和每个的立方和比较。。。
这个是核心运算,看循环的次数确定时间复杂度一个是O(10^(n+1)-10^(n+1)/9)=O(10^n*8/9),一个是O(9^n)
数字越大第2中算法效率越高!
若判断3位数:
第一种:O(999-111+1)=O(889)
第二种:O(9*9*9)=O(729)
若判断10位数:
第一种:O(8888888889)
第二种:O(3486784401)
若判断20位:
第一种:O(88888888888888888889)
第二种:O(12157665459056928801)
20位的时候循环次数已经近8倍!
3位数看来没有必要争什么。。。
如果你的自己够快的话,自己可以玩玩更多位数。。。
|
|
2008-4-13 02:12 |
|
|
26933062
银牌会员
积分 2268
发帖 879
注册 2006-12-19
状态 离线
|
『第
33 楼』:
set 到底哪个算法快,我确实不知道。
请问以下两个代码的效率有区别么?我以为代码一,应该快点吧?
:
@echo off
:: 代码一、
for /l %%a in (10000 1 99999) do echo %%a
::代码二、
for /l %%a in (1 1 9) do (
for /l %%b in (0 1 9) do (
for /l %%c in (0 1 9) do (
for /l %%d in (0 1 9) do (
for /l %%e in (0 1 9) do (
echo %%a%%b%%c%%d%%d
)))))
pause
|
致精致简! |
|
2008-4-13 03:01 |
|
|
plp626
银牌会员
钻石会员
积分 2278
发帖 1020
注册 2007-11-19
状态 离线
|
『第
34 楼』:
大家很无聊,现在我觉得比大家更无聊:
把原来的再贴过来,认真看了,两个代码的循环次数分别为:
15楼的:999-100+1=900次
19楼的:9*9*10= 900次
再分析循环体所用语句:
15楼的:一次set 直接赋值+3次set/a赋值+3次变量截取 +1次set/a算术运算(立方和)+一个判断输出
19楼的:一次set 直接赋值+3次set/a赋值+1次set直接赋值(合并)+1次set/a算术运算(立方和)+一个判断输
|
|
2008-4-13 03:39 |
|
|
plp626
银牌会员
钻石会员
积分 2278
发帖 1020
注册 2007-11-19
状态 离线
|
『第
35 楼』:
大家可真无聊,简直透顶了,
嗯 ,现在
我做出了一个决定,
准备比大家更无聊:
把原来的再贴过来,认真看,两个代码的循环次数分别为:
15楼的:999-100+1=900次(1重循环)
19楼的:9*10*10= 900次(3重循环)
再分析循环体所用语句:
15楼的:一次set 直接赋值(set str=%%i)+3次set/a赋值+3次变量截取+1次set/a算术运算(立方和)+一个判断输出(if !var! equ !str! echo !str!)
19楼的:一次set 直接赋值(set num1=!a!!b!!c!)+3次set/a赋值+(合并)+1次set/a算术运算(立方和)+一个判断输出(if !num1! equ !num2! echo !num1!)
15楼的:
Quote: | @echo off
setlocal enabledelayedexpansion
for /l %%i in (100,1,999) do (
set str=%%i
set/a a=!str:~,1!, b=!str:~1,1!, c=!str:~2,1!
set /a var=!a!*!a!*!a!+!b!*!b!*!b!+!c!*!c!*!c!
if !var! equ !str! echo !str!
)
pause |
|
19楼的:
Quote: | @echo off
setlocal enabledelayedexpansion
for /l %%i in (1,1,9) do for /l %%j in (0,1,9) do for /l %%k in (0,1,9) do (
set/a a=%%i,b=%%j,c=%%k
set num1=!a!!b!!c!
set /a num2=!a!*!a!*!a!+!b!*!b!*!b!+!c!*!c!*!c!
if !num1! equ !num2! echo !num1!
)
pause |
|
以下是我的分析,(我不是计算机出身的,批处理只是业余爱好,说错话内行勿笑)
同样的循环次数,不同循环重数,花费的时间不同的,重数多了,指令就多了,花的时间就长了,这么看来就是15楼的循环花的时间短些。
问题在变量的截取上,截取是花时间的 而那句!a!!b!!c!所谓的”合并“只是3个变量放到一起了,而
a=!str:~,1!, b=!str:~1,1!, c=!str:~2,1!
这句对应地有某些指令告诉解释器,到底是str的那些部分被截取赋给变量a,b,c这是花些时间的.
这么看来,15楼的循环体内语句又稍费点时间,
一短一长,能抵消吗?
我没试过,
|
山外有山,人外有人;低调做人,努力做事。
进入网盘(各种工具)~~ 空间~~cmd学习 |
|
2008-4-13 04:05 |
|
|
plp626
银牌会员
钻石会员
积分 2278
发帖 1020
注册 2007-11-19
状态 离线
|
『第
36 楼』:
34楼第一次点错了,也不知怎的,现在想删除都不行,影响浏览,真不爽
|
山外有山,人外有人;低调做人,努力做事。
进入网盘(各种工具)~~ 空间~~cmd学习 |
|
2008-4-13 04:37 |
|
|
bat-zw
金牌会员
永远的学习者
积分 3105
发帖 1276
注册 2008-3-8
状态 离线
|
『第
37 楼』:
不管怎么说,大家研究问题的态度的确让我钦佩!同时我认为如果批处理的本身时间运行值在0.01秒内的时候(系统根本察觉不到误差值)真的没有什么必要去争论什么效率问题吧,还应该是从处理问题的方法上去多加研究和讨论,如研究代码构造和运算逻辑以及思路和出发点,我个人认为这才是我们最需要去深究的地方,不知大家以为所以然。
|
批处理之家新域名:www.bathome.net |
|
2008-4-13 09:57 |
|
|
slore
铂金会员
积分 5212
发帖 2478
注册 2007-2-8
状态 离线
|
『第
38 楼』:
哎~老了。我错了。。。和写的另一个程序搞晕了。
那个程序没有0。。。所以每层循环是1-9
算成9次了……
水仙花这个第1位是9其他是10...
但是对字符的处理是肯定比数字慢,合并是快点。
还确定了下:
水仙花数只是说3位数。。。所以不会存在太大的数字。。。所以速度差可以忽略。
所以不好意思说了哪么多,误导了。
PS:当你用C的时候你就知道了,取每位按字符操作麻烦,按数字操作也麻烦要取余……但是*10或*100很容易……
|
|
2008-4-13 10:55 |
|
|
slore
铂金会员
积分 5212
发帖 2478
注册 2007-2-8
状态 离线
|
『第
39 楼』:
Quote: | Originally posted by 26933062 at 2008-4-13 03:01:
set 到底哪个算法快,我确实不知道。
请问以下两个代码的效率有区别么?我以为代码一,应该快点吧?
:[code]
@echo off
:: 代码一、
for /l %%a in (10000 ... |
|
代码1还用分离每一位保存起来呢?
P我还是懒得做算术。。。你要是想追根问底就帮测试下好了。
|
|
2008-4-13 10:57 |
|