明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: caoyin

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

  [复制链接]
发表于 2011-11-11 07:14:50 | 显示全部楼层
为夺取最后胜利冲刺!
  1. (defun fsxm-RemoveN (lst n / i slst tmp len)
  2.   (setq i 0)
  3.   (setq len (length lst))
  4.   (if (< n (/ len 2))
  5.     (progn
  6.       (setq slst (vl-member-if-not
  7.                    (function (lambda (a)
  8.                                (if (/= i n)
  9.                                  (setq tmp (cons a tmp)
  10.                                        i   (1+ i)
  11.                                  )
  12.                                )
  13.                              )
  14.                    )
  15.                    lst
  16.                  )
  17.       )
  18.       (append (reverse tmp) (cdr slst))
  19.     )
  20.     (progn
  21.       (setq lst         (reverse lst)
  22.             n         (- len n 1)
  23.             slst (vl-member-if-not
  24.                    (function (lambda (a)
  25.                                (if (/= i n)
  26.                                  (setq tmp (cons a tmp)
  27.                                        i   (1+ i)
  28.                                  )
  29.                                )
  30.                              )
  31.                    )
  32.                    lst
  33.                  )
  34.       )
  35.       (append (reverse (cdr slst)) tmp)
  36.     )
  37.   )
  38. )
发表于 2011-11-11 08:42:16 | 显示全部楼层
本帖最后由 Gu_xl 于 2011-11-11 10:47 编辑

我的方法三代码优化一下,快多了!
  1. (defun gxl-removeNth2  (index lst / c rtn len)
  2.   (if (< -1 index (setq len (length lst)) )
  3.     (if (<= index (/ len 2)) ;_ index位于前半截
  4.       (progn
  5. (setq c -1)
  6. (while (/= index (setq c (1+ c)))
  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.        c     -1
  17.        )
  18. (while (/= index (setq c (1+ c)))
  19.    (setq rtn (cons (car lst) rtn)
  20.   lst (cdr lst)
  21.   )
  22.    )
  23. (reverse (append (reverse rtn) (cdr lst)))
  24. )
  25.       )
  26.         lst ;_ index 越界
  27.     )
  28.   )
  29.   )

几种方法测试结果:
命令: 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  秒

全部测试代码:



本帖子中包含更多资源

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

x

点评

不会吧,我得再整一个,好歹得冲进0.1S吧  发表于 2011-11-11 09:10
发表于 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 <最慢>
发表于 2011-11-11 11:01:15 | 显示全部楼层
本帖最后由 xshrimp 于 2011-11-11 11:10 编辑


Mp的Benchmark.lsp测试程序

这个测试应该相对准确点.测试结果见楼上
根据Gu_xl修改的测试程序

本帖子中包含更多资源

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

x
发表于 2011-11-11 11:07:40 | 显示全部楼层
建议把测试次数放大100倍,这样才能较准确反映其效率.
发表于 2011-11-11 11:37:40 | 显示全部楼层
N大高手齐出手!精彩!
发表于 2011-11-11 11:40:07 | 显示全部楼层
唉,最慢也要慢得有点面子,又搞一个,又快了一点,应该不会第一名了哈
  1. (defun test3(n lst / )
  2.   (setq   lst_2 '() len (length lst))
  3.   (cond ((< n (/ len 2))
  4.          (setq  i 0)
  5.          (setq lst_1(vl-remove-if (function(lambda(x)
  6.           (if(= i n) nil (progn(setq i (1+ i)lst_2 (cons x lst_2)) ))))lst))
  7.          (append (reverse lst_2) (cdr lst_1))
  8.         )
  9.         ((> n (/ len 2))
  10.          (setq lst (reverse lst) n (- len n) i 1)         
  11.          (setq lst_1(vl-remove-if (function(lambda(x)
  12.          (if(= i n) nil (progn(setq i (1+ i)lst_2 (cons x lst_2)) ))))lst))
  13.          (reverse(append  (reverse lst_2)  (cdr lst_1)))
  14.         )
  15.   )       
  16.          
  17.   )
按题意放大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  秒
发表于 2011-11-11 12:01:36 | 显示全部楼层
  1. ;;;递归法
  2. (defun RemoveNth1 (index lst)
  3.   (if (and lst (< 0 index))
  4.     (cons (car lst) (RemoveNth1 (1- index) (cdr lst)))
  5.     (cdr lst)
  6.   ) ;_ 结束if
  7. ) ;_ 结束defun


  8. ;;;迭代法
  9. (defun RemoveNth2 (index lst / i)
  10.   (setq i -1)
  11.   (vl-remove-if '(lambda (x) (= (setq i (1+ i)) index)) lst)
  12. ) ;_ 结束defun

点评

NB  发表于 2012-5-3 12:53
发表于 2011-11-11 12:02:10 | 显示全部楼层
xianaihua 发表于 2011-11-11 12:01

__$
正在进行处理 ..............运行的毫秒数 / 迭代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 <最慢>

点评

汗~~貌似俺那个函数与你电脑相克?  发表于 2011-11-11 12:56
发表于 2011-11-11 12:09:22 | 显示全部楼层
最后的结果是,什么方法最快呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-23 00:45 , Processed in 0.177997 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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