明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: caoyin

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

  [复制链接]
发表于 2011-11-17 08:55:14 | 显示全部楼层
xiaxiang 发表于 2011-11-13 17:46
纯粹凑个热闹,不懂如何提速。如果能知道是正向提取还是逆向提取,会不会好些。
递归法,从1开始,不能为0 ...

测试表长度,通过判断删除元素在的位置,然后决定倒置表否就可以正向还是逆向了。
发表于 2011-11-17 09:03:43 | 显示全部楼层
我提个建议,大家都写了不少好程序,但是好多达人没有回收函数,这个小技巧大家不会不清楚吧,内存不回收的坏习惯可不好。
举个例子先:
(defun test1(lst n /)
  (setq m 0 lst_1 '() i 0)
  (repeat (length lst)
    (if (/= m n)
      (setq lst_1(cons (nth i lst)lst_1 ))
      )
      (setq m (1+ m)
             i (1+ i))     
      )
    (setq lst_1 (reverse lst_1))
    )

其中m,i,lst_1都没有回收。
还有写程序没有解释
发表于 2011-11-19 15:37:37 | 显示全部楼层
本帖最后由 狂刀lxx 于 2011-11-19 17:44 编辑

;;如果....,提个改进思路,没有具体验证结果是否正确,如果不对大家自己可以调整一下。
谁帮测试一下?
加了一个代码 (setq i (1+ i)) 这回该对了
;; by 狂刀lxx  2011.11


  1. ;; by 狂刀lxx  2011.11
  2. (defun xl-nr  (i lst / n)  
  3.   (setq i (1+ i))
  4.   (defun xxx (i lst / lst2)
  5.     (repeat (/ i 4)
  6.       (setq lst2(cons(cadddr lst)(cons(caddr lst)(cons(cadr lst)(cons (car lst) lst2))))
  7.      lst (cddddr lst))
  8.       )
  9.     (repeat (rem i 4)
  10.       (setq lst2(cons (car lst) lst2)
  11.      lst (cdr lst))
  12.       )
  13.     (append (reverse lst2)(cdr lst))
  14.   )
  15. ;;;  (if (equal (vl-position (nth i lst) lst) i);;未完待续
  16. ;;;   nil;;未完待续
  17. ;;;    (progn;;未完待续
  18.       (setq n (length lst))
  19.       (if (< i (* n 0.5))
  20.           (xxx i lst)
  21.           (reverse (xxx (- n i) (reverse lst)))
  22.       )
  23. ;;;      );;未完待续
  24. ;;;    );;未完待续
  25. )

点评

还有问题:(xl-nr 1 '(0 1 2 3 4 5)) ==》(0 1 3 4 5)  发表于 2011-11-20 01:36
函数运行结果不正确!(xl-nr 3 '(0 1 2 3 4 5))==》(0 1 3 4 5) ,正确的结果为:(0 1 2 4 5),请再修改下!  发表于 2011-11-19 16:28
发表于 2011-11-20 00:04:44 | 显示全部楼层
测试一下,真的还不错啊 谢谢啊
发表于 2011-11-24 16:08:09 | 显示全部楼层
发一个将表转换成字符串
(defun removeItem1 (m mLst / aStr charNum mItem posit rvStr aLst bLst bStr)
  (setq        aStr  (vl-prin1-to-string mLst)
        charNum (strlen aStr)
        aStr  (substr (substr aStr 1 (1- charNum)) 2)
        m     (1- m)
        mItem (nth m mLst)
        posit (vl-position mItem mLst)
        rvStr ""
        aLst  mLst
  )
  (while (> m posit)
    (setq bLst        (cdr (member mItem aLst))
          bStr        (vl-prin1-to-string bLst)
          charNum (strlen bStr)
          bStr  (substr (substr bStr 1 (1- charNum)) 2)
          rvStr        (strcat rvStr (vl-string-subst "" bStr aStr))
          m        (- m posit 1)
          aStr        bStr
          aLst        bLst
          posit        (vl-position mItem aLst)
    )
  )
  (read (strcat "(" rvStr (vl-string-subst "" (vl-prin1-to-string mItem) aStr) ")"))
)
发表于 2012-2-12 21:07:17 | 显示全部楼层
超精采,超精采
发表于 2012-4-12 18:54:55 | 显示全部楼层
高手真多  还没有考虑速度这个因素
发表于 2012-11-27 22:46:30 | 显示全部楼层
这么多高手都喜欢玩这个吖  呵呵
发表于 2013-5-28 15:21:42 | 显示全部楼层
这个是好东东
发表于 2013-6-17 10:18:37 | 显示全部楼层
脑子用不过来了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-6 09:54 , Processed in 0.186936 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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