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

最后的结果是,什么方法最快呢?
页: 1 [2] 3 4 5 6 7
查看完整版本: [讨论]->征求最佳答案:删除表中第 n 个元素的最快算法