elitefish 发表于 2011-11-12 16:03:47

再来个 Mermber 方法的测试结果
和上面不同的是 LST 为 字符串表 '("1" "2" "3"...) 其余条件相同排除误差的话可以看出两种计算时间基本相同   所以 Member 方法 与数据类型无关
测试对象 lst 元素 共1000个
测试函数(EF:LIST-INDEXDEL-MEMBER 500 LST) 1000次,共耗时:0.569969秒

测试对象 lst 元素 共2000个
测试函数(EF:LIST-INDEXDEL-MEMBER 1000 LST) 1000次,共耗时:1.58697秒

测试对象 lst 元素 共3000个
测试函数(EF:LIST-INDEXDEL-MEMBER 1500 LST) 1000次,共耗时:3.03239秒

测试对象 lst 元素 共4000个
测试函数(EF:LIST-INDEXDEL-MEMBER 2000 LST) 1000次,共耗时:4.96209秒

测试对象 lst 元素 共5000个
测试函数(EF:LIST-INDEXDEL-MEMBER 2500 LST) 1000次,共耗时:7.4096秒

测试对象 lst 元素 共6000个
测试函数(EF:LIST-INDEXDEL-MEMBER 3000 LST) 1000次,共耗时:10.1834秒

测试对象 lst 元素 共7000个
测试函数(EF:LIST-INDEXDEL-MEMBER 3500 LST) 1000次,共耗时:13.5005秒

测试对象 lst 元素 共8000个
测试函数(EF:LIST-INDEXDEL-MEMBER 4000 LST) 1000次,共耗时:17.561秒

测试对象 lst 元素 共9000个
测试函数(EF:LIST-INDEXDEL-MEMBER 4500 LST) 1000次,共耗时:21.5455秒

测试对象 lst 元素 共10000个
测试函数(EF:LIST-INDEXDEL-MEMBER 5000 LST) 1000次,共耗时:26.1292秒

测试对象 lst 元素 共11000个
测试函数(EF:LIST-INDEXDEL-MEMBER 5500 LST) 1000次,共耗时:31.2813秒

测试对象 lst 元素 共12000个
测试函数(EF:LIST-INDEXDEL-MEMBER 6000 LST) 1000次,共耗时:36.7112秒

测试对象 lst 元素 共13000个
测试函数(EF:LIST-INDEXDEL-MEMBER 6500 LST) 1000次,共耗时:42.884秒

测试对象 lst 元素 共14000个
测试函数(EF:LIST-INDEXDEL-MEMBER 7000 LST) 1000次,共耗时:49.746秒

测试对象 lst 元素 共15000个
测试函数(EF:LIST-INDEXDEL-MEMBER 7500 LST) 1000次,共耗时:56.444秒

测试对象 lst 元素 共16000个
测试函数(EF:LIST-INDEXDEL-MEMBER 8000 LST) 1000次,共耗时:63.9989秒

测试对象 lst 元素 共17000个
测试函数(EF:LIST-INDEXDEL-MEMBER 8500 LST) 1000次,共耗时:73.4016秒

测试对象 lst 元素 共18000个
测试函数(EF:LIST-INDEXDEL-MEMBER 9000 LST) 1000次,共耗时:79.9767秒

测试对象 lst 元素 共19000个
测试函数(EF:LIST-INDEXDEL-MEMBER 9500 LST) 1000次,共耗时:91.6278秒

测试对象 lst 元素 共20000个
测试函数(EF:LIST-INDEXDEL-MEMBER 10000 LST) 1000次,共耗时:107.608秒

Gu_xl 发表于 2011-11-12 17:12:07

本帖最后由 Gu_xl 于 2011-11-12 17:25 编辑

重新对三种表类型(纯数字表、字符串表、点表)做了测试!测试结果如下:



对于数字表和字符串表来说,各种方法相对本身来说区别不大,如果是点表的话,member方法影响会大一点,Gu_xl方法4和xianaihua递归改进方法对表类型敏感度不大!几种表速度相差不太大!
发现一个很有意思的现象,Caoyin和xshrimp 的Member方法再编译以后的运算速度居然比没编译的运算速度慢!特别是纯数字表,前后居然差了3秒!(5.34766秒 对 8.48047秒)!


cabinsummer 发表于 2011-11-12 17:39:14

试过嵌套表吗?

shalei021647 发表于 2011-11-13 11:18:54

问题太高深了

xiaxiang 发表于 2011-11-13 17:46:39

纯粹凑个热闹,不懂如何提速。如果能知道是正向提取还是逆向提取,会不会好些。
递归法,从1开始,不能为0,为负数则逆向提取

(defun ntht ( n l)
(cond ((= n 0) nil)
          ((> n 0)
       (repeat (1- n) (setq l(cdr l)))
       (car l)
          ) ;返回第n个元素
          (T(ntht(1+ (+ (length l) n)) l)) ;返回倒数第n个元素
)
)

byghbcx 发表于 2011-11-14 00:29:31

本帖最后由 byghbcx 于 2011-11-14 21:12 编辑

(defun tt (n lst)
(setq lst_r (reverse lst) lt lst)
(repeat n (setq lt (cdr lt)))
(repeat (- (length lst_r) (- n 1)) (setq lst_r (cdr lst_r)))
(setq lst_r (reverse lst_r))
(append lst_r lt)
)
(defun tt( n lst / t1 t2 m temp)
(setq m 0 temp '())
(mapcar '(lambda(x) (setq m (1+ m)) (if (= n m) t (setq temp (cons x temp )))) lst)
(reverse temp)
)
(defun tt (n lst)
(setq lst_r (reverse lst) lt lst nn (nth (1- n) lst))
(while (/= (length lt) (- (length lst) n))
    (setq lt (cdr (member nn lt))))
(while (/= (length lst_r) (1- n))
    (setq lst_r (cdr (member nn lst_r))))
(append (reverse lst_r) lt)
)我用了几种方法,用MEMBER还是较快

NetBee 发表于 2011-11-16 17:23:23

本帖最后由 NetBee 于 2011-11-16 17:26 编辑

我也来凑热闹,我的函数库中的:(defun NBTF_LST_Delnth1      (Num# OldList@)
(setq Num# (1+ Num#))
(vl-remove-if
    '(lambda (x) (zerop (setq Num# (1- Num#))))
    OldList@
)
)从没有考虑过这个问题,哪位测试一下看看,怕是最慢的。

vormittag 发表于 2011-11-16 19:20:18

cnks 发表于 2011-11-11 15:21 static/image/common/back.gif
不好意思,g版,你的没错,查了查cons也是内部函数

请教cnks一下,哪些函数属于内部函数?autocad的帮助里好像没有找到信息,您能给点资料么?

cnks 发表于 2011-11-16 23:37:34

本帖最后由 cnks 于 2011-11-17 09:58 编辑

vormittag 发表于 2011-11-16 19:20 http://bbs.mjtd.com/static/image/common/back.gif
请教cnks一下,哪些函数属于内部函数?autocad的帮助里好像没有找到信息,您能给点资料么?

byghbcx 发表于 2011-11-17 08:21:22

byghbcx 发表于 2011-11-14 00:29 static/image/common/back.gif
我用了几种方法,用MEMBER还是较快

我测的是第三个最快
页: 1 2 3 4 [5] 6 7
查看完整版本: [讨论]->征求最佳答案:删除表中第 n 个元素的最快算法