找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

楼主: newer

[有奖答题] 【挑战】获取子表

[复制链接]

已领礼包: 40个

财富等级: 招财进宝

 楼主| 发表于 2017-6-10 21:13:14 | 显示全部楼层
本帖最后由 newer 于 2017-6-10 21:25 编辑

修改后提升显著,看图

1、正常数据在中间的表现

tt.png

2、开始接近头

tt3.png

3、开始接近尾部

tt4.png

4、开始接近头NIL表现

tt3-nil.png

5、开始接近尾部NIL表现

tt4-nil.png

mt:sublist 是原来的
mt:sublist1是更新的

上面有自己和自己原来的比较。

原来开始接近开头的表现现在显著提升了(见第二个表),而且还是这些里面的成绩最好的。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 20个

财富等级: 恭喜发财

发表于 2017-6-10 22:02:29 | 显示全部楼层

感谢,这个测试BENCH真不错,能发现问题。

点评

mt:sublist1还可以优化一下i超过表长度的情况。 (defun mt:sublist2 (l i n / m s) (setq m (length l)) (cond ((  详情 回复 发表于 2022-6-8 00:23
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 934个

财富等级: 财运亨通

发表于 2022-6-8 00:23:44 | 显示全部楼层
marting 发表于 2017-6-10 22:02
感谢,这个测试BENCH真不错,能发现问题。

mt:sublist1还可以优化一下i超过表长度的情况。

(defun mt:sublist2 (l i n / m s)
  (setq m (length l))
  (cond
    ((<= m i) nil) ;起点超过表长度
    ((progn
       (repeat (/ i 4) (setq l (cddddr l))) ;掐头
       (repeat (rem i 4) (setq l (cdr l))) ;掐头
       (not n) ;至表尾
     ) ;progn
      l
    )
    ((progn (setq m (- (length l) n)) (< m 0)) l) ;截取长度超过表长度(掐头后),m--尾部长度
    ((< n m);截取长度小于尾部长度
     (repeat (/ n 4)
       (setq s (cons (cadddr l) (cons (caddr l) (cons (cadr l) (cons (car l) s))))
             l (cddddr l)
       )
     )
     (repeat (rem n 4)
       (setq s (cons (car l) s)
             l (cdr l)
       )
     )
     (reverse s)
    )
    (T
     (setq l (reverse l)) ;队尾变队首
     (repeat (/ m 4) (setq l (cddddr l)))
     (repeat (rem m 4) (setq l (cdr l)))
     (reverse l)
    )
  ) ;cond
)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 934个

财富等级: 财运亨通

发表于 2022-6-8 10:15:39 | 显示全部楼层
本帖最后由 tengteb 于 2022-6-8 18:36 编辑

在mt:sublist1的基础上,按LL_j前辈的思路,再次优化:
(defun tb:sublist (l i n / canr cdnr m nn x z)

  (defun canr (l n / s)
    (repeat (/ n 4)
      (setq s (cons (cadddr l) (cons (caddr l) (cons (cadr l) (cons (car l) s))))
            l (cddddr l)
      )
    )
    (repeat (rem n 4)
      (setq s (cons (car l) s)
            l (cdr l)
      )
    )
    (reverse s)
  ) ;defun
  (defun cdnr (l n)
    (repeat (/ n 4) (setq l (cddddr l)))
    (repeat (rem n 4) (setq l (cdr l)))
    l
  ) ;defun
  (setq z (length l))
  (cond
    ((>= i z) nil) ;起点超过表长度或截取长度小于1
    ((progn
       (or n (setq n (- z i)))
       (< n 1)
     ) ;progn
     nil
    )
    ((progn
       (setq m (- z i n))
       (if (< m 0)
         (setq n (+ n m)
               m 0
         )
       ) ;if
       (setq nn (* n 3.1) ;cdnr与canr速度修正系数
             x  (max i nn m)
       )
       (= x nn) ;截取部分修正长度最长
     ) ;progn
     (reverse (cdnr (reverse (cdnr l i)) m))
    )
    ((= x m) ;尾部最长
     (canr (cdnr l i) n)
    )
    (T (reverse (canr (cdnr (reverse l) m) n))) ;首部最长
  ) ;cond
)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-4-20 18:01 , Processed in 0.169998 second(s), 38 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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