fsxm
发表于 2011-11-11 07:14:50
为夺取最后胜利冲刺!
(defun fsxm-RemoveN (lst n / i slst tmp len)
(setq i 0)
(setq len (length lst))
(if (< n (/ len 2))
(progn
(setq slst (vl-member-if-not
(function (lambda (a)
(if (/= i n)
(setq tmp (cons a tmp)
i (1+ i)
)
)
)
)
lst
)
)
(append (reverse tmp) (cdr slst))
)
(progn
(setq lst (reverse lst)
n (- len n 1)
slst (vl-member-if-not
(function (lambda (a)
(if (/= i n)
(setq tmp (cons a tmp)
i (1+ i)
)
)
)
)
lst
)
)
(append (reverse (cdr slst)) tmp)
)
)
)
Gu_xl
发表于 2011-11-11 08:42:16
本帖最后由 Gu_xl 于 2011-11-11 10:47 编辑
我的方法三代码优化一下,快多了!
(defun gxl-removeNth2(index lst / c rtn len)
(if (< -1 index (setq len (length lst)) )
(if (<= index (/ len 2)) ;_ index位于前半截
(progn
(setq c -1)
(while (/= index (setq c (1+ c)))
(setq rtn (cons (car lst) rtn)
lst (cdr lst)
)
)
(append (reverse rtn) (cdr lst))
)
(progn ;_ index位于后半截
(setq index (- len index 1)
lst (reverse lst)
c -1
)
(while (/= index (setq c (1+ c)))
(setq rtn (cons (car lst) rtn)
lst (cdr lst)
)
)
(reverse (append (reverse rtn) (cdr lst)))
)
)
lst ;_ index 越界
)
)
)
几种方法测试结果:
命令: tt
Gu_xl 方法一:
用时0.113281秒
Gu_xl 方法二:
用时0.078125秒
Gu_xl 方法三:
用时0.0117188秒
duotu007 方法:
用时0.03125秒
xshrimp 方法:
用时0.0195313秒
yjr111 test2方法:
用时0.417969秒
fsxm 方法:
用时0.015625秒
全部测试代码:
xshrimp
发表于 2011-11-11 11:00:11
命令: test1
测试程序名.....流逝时间(毫秒) / 相对速度 (重复: 1024 次)
(FSXM-REMOVEN 300 LST1)............1078 / 28.87 <fastest>
(GXL-REMOVENTH2 300 LST1)..........1188 / 26.2
(XSHRIMP-REMOVENTH 300 LST1).......3109 / 10.01
(DUOTU007-REMOVENTH 300 LST1)......4250 / 7.32
(GXL-REMOVENTH1 300 LST1)..........8313 / 3.74
(GXL-REMOVENTH 300 LST1)...........8813 / 3.53
(YJR111-REMOVEN 300 LST1).........31125 / 1 <slowest>
命令: test2
测试程序名.....流逝时间(毫秒) / 相对速度 (重复: 512 次)
(FSXM-REMOVEN 1900 LST1)............1203 / 62.97 <最快>
(GXL-REMOVENTH2 1900 LST1)..........1375 / 55.09
(XSHRIMP-REMOVENTH 1900 LST1).......1765 / 42.92
(DUOTU007-REMOVENTH 1900 LST1)......2172 / 34.88
(GXL-REMOVENTH1 1900 LST1)..........4219 / 17.95
(GXL-REMOVENTH 1900 LST1)...........4547 / 16.66
(YJR111-REMOVEN 1900 LST1).........75750 / 1 <最慢>
命令:
命令: test3
测试程序名.....流逝时间(毫秒) / 相对速度 (重复: 65536 次)
(GXL-REMOVENTH2 6 LST2).........1938 / 5.02 <最快>
(FSXM-REMOVEN 6 LST2)...........1953 / 4.98
(XSHRIMP-REMOVENTH 6 LST2)......4031 / 2.41
(DUOTU007-REMOVENTH 6 LST2).....5016 / 1.94
(GXL-REMOVENTH1 6 LST2).........8469 / 1.15
(GXL-REMOVENTH 6 LST2)..........9031 / 1.08
(YJR111-REMOVEN 6 LST2).........9734 / 1 <最慢>
命令:
命令: test4
测试程序名.....流逝时间(毫秒) / 相对速度 (重复: 32768 次)
(FSXM-REMOVEN 16 LST2)...........1187 / 4.38 <最快>
(GXL-REMOVENTH2 16 LST2).........1250 / 4.16
(XSHRIMP-REMOVENTH 16 LST2)......2031 / 2.56
(DUOTU007-REMOVENTH 16 LST2).....2516 / 2.07
(GXL-REMOVENTH1 16 LST2).........4219 / 1.23
(GXL-REMOVENTH 16 LST2)..........4531 / 1.15
(YJR111-REMOVEN 16 LST2).........5203 / 1 <最慢>
xshrimp
发表于 2011-11-11 11:01:15
本帖最后由 xshrimp 于 2011-11-11 11:10 编辑
Mp的Benchmark.lsp测试程序
这个测试应该相对准确点.测试结果见楼上
根据Gu_xl修改的测试程序
highflybird
发表于 2011-11-11 11:07:40
建议把测试次数放大100倍,这样才能较准确反映其效率.
VBALISPER
发表于 2011-11-11 11:37:40
N大高手齐出手!精彩!
yjr111
发表于 2011-11-11 11:40:07
唉,最慢也要慢得有点面子,又搞一个,又快了一点,应该不会第一名了哈(defun test3(n lst / )
(setq lst_2 '() len (length lst))
(cond ((< n (/ len 2))
(setqi 0)
(setq lst_1(vl-remove-if (function(lambda(x)
(if(= i n) nil (progn(setq i (1+ i)lst_2 (cons x lst_2)) ))))lst))
(append (reverse lst_2) (cdr lst_1))
)
((> n (/ len 2))
(setq lst (reverse lst) n (- len n) i 1)
(setq lst_1(vl-remove-if (function(lambda(x)
(if(= i n) nil (progn(setq i (1+ i)lst_2 (cons x lst_2)) ))))lst))
(reverse(append(reverse lst_2)(cdr lst_1)))
)
)
)按题意放大10倍检测:
命令: tt
第一次。。。。。。。。。。
Gu_xl 方法一:
用时11.3594秒
Gu_xl 方法二:
用时11.1406秒
Gu_xl 方法三:
用时1.67188秒
duotu007 方法:
用时6.9375秒
xshrimp 方法:
用时2.57813秒
yjr111 test3方法:
用时6.15625秒
fsxm 方法:
用时1.54688秒
命令: tt
第二次。。。。。。。。
Gu_xl 方法一:
用时14.5625秒
Gu_xl 方法二:
用时15.6094秒
Gu_xl 方法三:
用时2.04688秒
duotu007 方法:
用时9.59375秒
xshrimp 方法:
用时3.01563秒
yjr111 test3方法:
用时8.375秒
fsxm 方法:
用时1.90625秒
xianaihua
发表于 2011-11-11 12:01:36
;;;递归法
(defun RemoveNth1 (index lst)
(if (and lst (< 0 index))
(cons (car lst) (RemoveNth1 (1- index) (cdr lst)))
(cdr lst)
) ;_ 结束if
) ;_ 结束defun
;;;迭代法
(defun RemoveNth2 (index lst / i)
(setq i -1)
(vl-remove-if '(lambda (x) (= (setq i (1+ i)) index)) lst)
) ;_ 结束defun
xianaihua
发表于 2011-11-11 12:02:10
xianaihua 发表于 2011-11-11 12:01 static/image/common/back.gif
__$
正在进行处理 ..............运行的毫秒数 / 迭代2048次的相对速度:
(REMOVENTH1 300 LST1).........1656 / 2.86 <最快>
(FSXM-REMOVEN LST1 300).......2422 / 1.95
(GXL-REMOVENTH2 300 LST1).....2563 / 1.85
(REMOVENTH2 300 LST1).........4734 / 1 <最慢>
$
正在进行处理 .................运行的毫秒数 / 迭代16384次的相对速度(s):
(GXL-REMOVENTH2 1900 LST1)......1063 / 65.92 <最快>
(REMOVENTH2 1900 LST1).........38078 / 1.84
(FSXM-REMOVEN LST1 1900).......69750 / 1
(REMOVENTH1 1900 LST1).........70078 / 1 <最慢>
;
_$
正在进行处理 .................运行的毫秒数 / 迭代16384次的相对速度:
(REMOVENTH1 16 LST2).........1500 / 1.92 <最快>
(GXL-REMOVENTH2 16 LST2).....1719 / 1.67
(FSXM-REMOVEN LST2 16).......1765 / 1.63
(REMOVENTH2 16 LST2).........2875 / 1 <最慢>
正在进行处理 .................运行的毫秒数 / 迭代16384次的相对速度:
(REMOVENTH1 6 LST2).........1125 / 2.6 <最快>
(GXL-REMOVENTH2 6 LST2).....1219 / 2.4
(FSXM-REMOVEN LST2 6).......1406 / 2.08
(REMOVENTH2 6 LST2).........2922 / 1 <最慢>
3527188
发表于 2011-11-11 12:09:22
最后的结果是,什么方法最快呢?