找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

楼主: newer

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

[复制链接]

已领礼包: 40个

财富等级: 招财进宝

 楼主| 发表于 2017-6-9 12:11:15 | 显示全部楼层

  1. (defun c:tt (/ lst)
  2.   (setq i 0)
  3.   (repeat 20000
  4.     (setq lst (cons i lst)
  5.           i   (1+ i)
  6.     )
  7.   )
  8.   (setq lst (reverse lst))
  9.   (setq aa lst)
  10.   (xd::quickbench
  11.     '(
  12.       (sublist1 lst 3000 9000)
  13.       (sublist2 lst 3000 9000)
  14.       (sublist3 lst 3000 9000)
  15.       (sublist4 lst 3000 9000)
  16.       (kaka-list-Sub lst 3000 9000)
  17.       (t11 lst 3000 9000)
  18.       (HK:SubList lst 3000 9000)
  19.      )
  20.   )
  21.   (princ)
  22. )



搜狗截图20170609120323.png
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

发表于 2017-6-9 12:21:48 | 显示全部楼层
没看到递归的,来一个

  1. (defun LB:SubList (lst st len)
  2.   (repeat st
  3.     (setq lst (cdr lst))
  4.   )
  5.   (if
  6.     (or
  7.       (not len)
  8.       (zerop len)
  9.     )
  10.      lst
  11.      (reverse (LB:SubList (reverse lst) (- (length lst) len) 0))
  12.   )
  13. )


评分

参与人数 1D豆 +5 贡献 +1 收起 理由
newer + 5 + 1 很给力!经验;技术要点;资料分享奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

 楼主| 发表于 2017-6-9 12:28:50 | 显示全部楼层

  1. (defun c:tt (/ lst)
  2.   (setq i 0)
  3.   (repeat 20000
  4.     (setq lst (cons i lst)
  5.           i   (1+ i)
  6.     )
  7.   )
  8.   (setq lst (reverse lst))
  9.   (setq aa lst)
  10.   (xd::quickbench
  11.     '(
  12.       (sublist1 lst 3000 9000)
  13.       (sublist2 lst 3000 9000)
  14.       (sublist3 lst 3000 9000)
  15.       (sublist4 lst 3000 9000)
  16.       (kaka-list-Sub lst 3000 9000)
  17.       (t11 lst 3000 9000)
  18.       (HK:SubList lst 3000 9000)
  19.       (LB:SubList lst 3000 9000)
  20.      )
  21.   )
  22.   (princ)
  23. )



搜狗截图20170609122036.png
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 5060个

财富等级: 富甲天下

发表于 2017-6-9 12:34:37 | 显示全部楼层

测试一下1M的文件 。朱正伟506 做过,s1611022速度最快,st788796也行,我的arx sublist反而是最慢的,没办法lisp调用arx可能还是有要把整个list复制过去。


"s1611022用时:"
1.40443
"sublist用时"
2.77907
"sublist2 用时:"
2.06009


论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2017-6-9 12:36:31 | 显示全部楼层
本帖最后由 st788796 于 2017-6-9 12:39 编辑

前面的有个错误,加了注释阐明下算法,修改如下

  1. (defun sublist3        (lst start leng / fs f len end j r)
  2.   ;;去头部
  3.   (defun fs (lst start /)
  4.     (repeat start
  5.       (setq lst (cdr lst))
  6.     )
  7.     lst
  8.   )
  9.   ;;从头部重新构造指定长度表
  10.   (defun f (lst n / r)
  11.     (repeat n
  12.       (setq r        (cons (car lst) r)
  13.             lst        (cdr lst)
  14.       )
  15.     )
  16.     r
  17.   )
  18.   (setq len (length lst))
  19.   (if (or (null leng) (> (setq end (+ start leng)) len))
  20.     (cond
  21.       ((zerop start) lst);_返回整个表
  22.       ((< start (/ len 2)) (setq lst (fs lst start)));_前半部到结尾表
  23.       (t (setq lst (f (reverse lst) (- len start))));_后半部至结尾表
  24.     )
  25.     (if        (< start (/ len 2))
  26.       (if (> end (/ len 2))
  27.         (setq lst (fs lst start);_先去头部
  28.               lst (fs (reverse lst) (- len end));_再去尾部
  29.               lst (reverse lst)
  30.         );_结束点在后半部
  31.         (setq lst (fs lst start);_去头部
  32.               lst (f lst leng);_直接构造
  33.         );_结束点在前半部分
  34.       );_起始位置在前半部分
  35.       (setq lst        (fs (reverse lst) (- len end));_去尾部
  36.             lst        (f lst leng);_直接构造
  37.       );_起始位置在后半部分
  38.     )
  39.   )
  40.   lst
  41. )

总体思想就是 “掐头去尾" + 直接构造
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 214个

财富等级: 日进斗金

发表于 2017-6-9 12:37:50 | 显示全部楼层
单一需求测试总是不对的,函数要的结果是考虑总体最优。。。
例如用(sublist1 lst 30000 nil)
      (sublist2 lst 30000 nil)
      (sublist3 lst 30000 nil)
      (sublist4 lst 30000 nil)
      (kaka-list-Sub lst 30000 nil)
      (t11 lst 30000 nil)
例如用(sublist1 lst 3000 nil)
      (sublist2 lst 3000 nil)
      (sublist3 lst 3000 nil)
      (sublist4 lst 3000 nil)
      (kaka-list-Sub lst 3000 nil)
      (t11 lst 3000 nil)

评分

参与人数 1D豆 +5 收起 理由
newer + 5 热心帮忙奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

 楼主| 发表于 2017-6-9 12:41:15 | 显示全部楼层

NIL的这种情况不用测试,如果不是用CDR直接得到结果的,都是不好的代码。
NIL情况,找到开始位置后,直接CDR,就是之后的所有元素了。

我们做的也不是专业的测试,一个比较通用的能说明问题就行了,代表了绝大部分。

下个截图,听取意见,加上NIL的测试。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

 楼主| 发表于 2017-6-9 12:44:20 | 显示全部楼层
本帖最后由 newer 于 2017-6-9 12:56 编辑

测试结果是相对的, 30000个表的数据测试出代码的差距很大,1M的也一样。这个应用就是遍历表,没什么复杂的,就看怎么遍历。
你看下测试结果,有的代码就很慢,如果不幸用了做生产,那就悲剧

这个挑战的目的是大家共同交流,不体现编程水平,只是体现代码结构如何写,如何考虑才更全面,更有效率,有比较才能进步和提高。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

 楼主| 发表于 2017-6-9 12:50:35 | 显示全部楼层
本帖最后由 newer 于 2017-6-9 12:52 编辑


1、中间测试

搜狗截图20170609122036.png

2、NIL测试

搜狗截图20170609124915.png

后三个在NIL测试表现不太好,和前几个是数量级的差距了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

 楼主| 发表于 2017-6-9 13:02:33 | 显示全部楼层

ARX复制数据不应该是“祸首”,线性表,也就一次的N操作,具体慢,还是遍历表的算法,如果都用NTH那肯定慢,如果你把RESBUF链表变换下数据结构用VECTOR等等,两头读,应该能提高很多。借鉴下上面LISP比较快的代码。

决定代码快慢的不是选择的语言,二进制代码如果算法不好,一样要比解释型语言慢。决定代码快慢的是算法和数据结构。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

发表于 2017-6-9 13:06:13 | 显示全部楼层

会不会大表,还是上次lispboy的方法快?
  1. ;;(SubList5 '(0 1 2 3 4 5) 2 3) => (2 3 4)
  2. (defun sublist5        (lst start leng / L a)
  3.   (repeat start
  4.     (setq lst (cdr lst))
  5.   )
  6.   (if leng
  7.     (repeat leng
  8.       (setq L (cons (car lst) L))
  9.       (setq lst (cdr lst))
  10.     )
  11.     (while (setq a (car lst))
  12.       (setq L (cons a L))
  13.       (setq lst (cdr lst))
  14.     )
  15.   )
  16.   (reverse L)
  17. )

评分

参与人数 1D豆 +5 贡献 +1 收起 理由
newer + 5 + 1 很给力!经验;技术要点;资料分享奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 20个

财富等级: 恭喜发财

发表于 2017-6-9 13:10:34 | 显示全部楼层
再来一个

  1. (defun mt:sublist (l s n)
  2. (repeat (/ s 4)
  3.   (setq l (cddddr l))
  4. )
  5. (repeat (rem s 4)
  6.   (setq l (cdr l))
  7.   )

  8. (setq s nil)
  9. (if (and l n)
  10.   (progn (repeat (/ n 4)
  11.           (setq s (cons (cadddr l) (cons (caddr l) (cons (cadr l) (cons (car l) s))))
  12.                 l (cddddr l)
  13.           )
  14.          )
  15.          (repeat (rem n 4)
  16.                    (setq s (cons (car l) s)
  17.                          l (cdr l)
  18.                    )
  19.                   )
  20.          (reverse s)
  21.   )
  22.   l
  23. )
  24. )

评分

参与人数 2D豆 +10 贡献 +1 收起 理由
ll_j + 5 很给力!经验;技术要点;资料分享奖!
newer + 5 + 1

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

 楼主| 发表于 2017-6-9 13:19:42 | 显示全部楼层



1、中间测试

搜狗截图20170609131753.png

2、NIL测试

搜狗截图20170609131818.png


MT:SUBLIST是不是大杀器?

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 264个

财富等级: 日进斗金

发表于 2017-6-9 13:26:52 来自手机 | 显示全部楼层
一次 cdddr 效率肯定高!了!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2017-6-9 13:31:34 | 显示全部楼层
还是我的 和 楼主的 代码 表现稳定啊!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 06:10 , Processed in 0.461410 second(s), 63 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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