明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: caoyin

[讨论]->征求最佳答案:删除表中第 n 个元素的最快算法

  [复制链接]
发表于 2011-11-11 12:31 | 显示全部楼层
本帖最后由 Ea 于 2011-11-11 12:33 编辑
  1. (defun getutime        ()
  2.   (* 86400 (getvar "tdusrtimer"))
  3. )
  4. (defun numb (n / m l)
  5.   (setq m 0)
  6.   (repeat n
  7.     (setq l (cons m l)
  8.           m (1+ m)
  9.     )
  10.   )
  11.   l
  12. )
  13. (defun cut (n lst / l)
  14.   (repeat (1- n)
  15.     (setq l (cons(car lst) l ))
  16.   )
  17.   (append (reverse l) (cdr lst))
  18. )
  19. (defun c:tt (/ t1 l)
  20.   (setq t1 (getutime))
  21.   (setq l (numb 15000))
  22.   (princ "\nTimes = ")
  23.   (princ (- (getutime) t1))
  24.   (setq t1 (getutime))
  25.   (cut 9999 l)
  26.   (princ "\nTimes = ")
  27.   (princ (- (getutime) t1))
  28.   (princ)
  29. )
运行速度和机器配置、是否打开 vlisp 编辑器,CAD运行情况等等都有关系

发表于 2011-11-11 13:06 | 显示全部楼层
牛人都冒出来,最后应当有个结论,表明哪些lisp函数组成的算法速度占优
发表于 2011-11-11 13:15 | 显示全部楼层
红花还需绿叶衬,重在参与哈
发表于 2011-11-11 14:35 | 显示全部楼层
本帖最后由 Gu_xl 于 2011-11-11 14:43 编辑

对我的方法3代码再进行优化一下,又快了不少!目前测试是最快的!
  1. ;;;方法四
  2. (defun gxl-removeNth3  (index lst /  rtn len)
  3.   (if (< -1 index (setq len (length lst)))
  4.     (if (<= index (/ len 2)) ;_ index位于前半截
  5.       (progn
  6. (repeat index
  7.    (setq rtn (cons (car lst) rtn)
  8.   lst (cdr lst)
  9.   )
  10.    )
  11. (append (reverse rtn) (cdr lst))
  12. )
  13.       (progn ;_ index位于后半截
  14. (setq index (- len index 1)
  15.        lst   (reverse lst)
  16.        )
  17. (repeat index
  18.    (setq rtn (cons (car lst) rtn)
  19.   lst (cdr lst)
  20.   )
  21.    )
  22. (reverse (append (reverse rtn) (cdr lst)))
  23. )
  24.       )
  25.         lst ;_ index 越界
  26.     )
  27.   )

全部测试代码:

测试结果:
命令: tt
Gu_xl 方法一:
  用时  0.53125  秒
Gu_xl 方法二:
  用时  0.441406  秒
Gu_xl 方法三:
  用时  0.09375  秒
Gu_xl 方法四repeat:
  用时  0.078125  秒
duotu007 方法:
  用时  0.265625  秒
xshrimp 方法:
  用时  0.171875  秒
fsxm 方法:
  用时  0.09375  秒
yjr111 test3方法:
  用时  0.296875  秒
xianaihua  递归方法:
  用时  0.21875  秒
xianaihua  迭代方法:
  用时  0.234375  秒

提高运算速度的方法小结:
1、尽量减少程序运算次数
2、尽量直接使用lisp基本函数,如:car、cdr、cons等,近量少用append、length等函数
3、使用递归等方法,速度相对较慢!比直接使用基本函数计算逊色不少!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2011-11-11 14:36 来自手机 | 显示全部楼层
xianaihua 发的那个递归方法很nb,
如果再分下首尾,完美!
发表于 2011-11-11 15:06 | 显示全部楼层
Gu_xl 发表于 2011-11-11 14:35
对我的方法3代码再进行优化一下,又快了不少!目前测试是最快的!

全部测试代码:

多用car和cdr是正确的,避免使用cons
这是因为编译的原因,car和cdr之类的都是内部函数,而cons是arx定义的函数,这当然比内部函数运行效率低

点评

一般要重新组表cons函数是必不可少的,它可要比append快的多!  发表于 2011-11-11 15:16
发表于 2011-11-11 15:21 | 显示全部楼层
不好意思,g版,你的没错,查了查cons也是内部函数
发表于 2011-11-11 15:39 | 显示全部楼层
  1. ;;;递归法+
  2. (defun RemoveNth3 (n l)
  3.   (defun
  4.       RemoveNth
  5.          (index lst)
  6.     (if  (and lst (< 0 index))
  7.       (cons (car lst) (RemoveNth (1- index) (cdr lst)))
  8.       (cdr lst)
  9.     ) ;_ 结束if
  10.   ) ;_ 结束defun
  11.   (if (> n
  12.    (/ (setq len (length l)) 2)
  13.       ) ;_ 结束>
  14.     (reverse (RemoveNth (- len n 1) (reverse l)))
  15.     (RemoveNth n l)
  16.   ) ;_ 结束defun
  17. ) ;_ 结束defun
递归改进版,用Gl的测速方法:
Gu_xl 方法一:
  用时  1.64063  秒
Gu_xl 方法二:
  用时  2.03125  秒
Gu_xl 方法三:
  用时  0.277344  秒
Gu_xl 方法四repeat:
  用时  0.300781  秒
duotu007 方法:
  用时  1.28125  秒
xshrimp 方法:
  用时  0.34375  秒
fsxm 方法:
  用时  0.261719  秒
yjr111 test3方法:
  用时  1.10938  秒
xianaihua  递归方法:
  用时  0.191406  秒

点评

确实很快!但是当n小于0或大于表长时,函数结果是错误的!还需修正!  发表于 2011-11-11 16:15
那这个测速方法是不是有很大影响?有没有公认最好的?  发表于 2011-11-11 15:52

评分

参与人数 1明经币 +1 收起 理由
Gu_xl + 1 赞一个!目前为止,测试速度是最快的!

查看全部评分

发表于 2011-11-11 16:07 | 显示全部楼层
Benchmark显然是有问题的,单个测和几个程序在一起测,差别很大
发表于 2011-11-11 16:20 | 显示全部楼层
测速的方法对各种算法的速度是有影响的!比如表的长度不同、删除项的位置不同,各种算法的速度都有影响,测试的结果谁快谁慢也不尽相同!你们可修改24楼测试代码的参数测试下!编译以后再运行结果比较准确!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-5-17 16:56 , Processed in 0.176887 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表