找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 656|回复: 9

[原创] 再谈点表筛选出重复点并消重函数的效率

[复制链接]

已领礼包: 202个

财富等级: 日进斗金

发表于 2018-12-18 12:00:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
本帖最后由 dyjwyqz5221 于 2018-12-18 16:41 编辑

通过测试7680个点的点表lst,点表中有4个点,每个点重复次数为1920次。
分别用三个不同的函数筛选出重复点并消重,进行测试,结果令人意外。
函数如下:
(defun XD::Pnts:Dup-1 (pts fuzz / pt1 pts-1)
          (while (setq pt1 (car pts))
                (xdrx_document_setprec fuzz 0.01)
                (if (xd::list:members pt1 (cdr pts))
                              (setq pts-1 (cons pt1 pts-1))
                );;;if
                (setq pts (vl-remove-if
                                '(lambda (x)
                                        (equal x pt1 fuzz)
                                )
                                (cdr pts)
                        )
                );;;setq
      );;;while
      (reverse pts-1)
);;;defun


(defun XD::Pnts:Dup (pts fuzz / pt1 pts-1 pts-2)
          (while (setq pt1 (car pts))
                (xdrx_document_setprec fuzz 0.01)
                (if (setq pts-2 (xd::list:members pt1 (setq pts (cdr pts))))
                        (progn
                                      (setq pts-1 (cons pt1 pts-1))
                                (mapcar
                                        '(lambda(x)
                                                (setq pts (vl-remove x pts))
                                        );;;lambda
                                        pts-2
                                );;;mapcar
                        );;;progn
                );;;if
      );;;while
      (reverse pts-1)
)


(defun XD::Pnts:Dup-2 (pts fuzz)
        (mapcar 'car
                (vl-remove-if
                        '(lambda(x)
                                (eq (length x) 1)
                        );;;lmabda
                        (mapcar 'cdr
                                (xd::list:groupbyindex
                                        (mapcar
                                                '(lambda(y)
                                                        (list y y)
                                                )
                                                pts
                                        )
                                        fuzz
                                )
                        );;;mapcar
                );;;vl-emove-if
        );;;mapcar
)


测试函数:
(defun cs (lst fuzz)
        (defun ceshi1 (lst fuzz)
                (xdrx_runtime t)
                (XD::Pnts:Dup-1 lst fuzz)
                (xdrx_runtime)
        );;;defun
        (defun ceshi2 (lst fuzz)
                (xdrx_runtime t)
                (XD::Pnts:Dup lst fuzz)
                (xdrx_runtime)
        );;;defun
        (defun ceshi3 (lst fuzz)
                (xdrx_runtime t)
                (XD::Pnts:Dup-2 lst fuzz)
                (xdrx_runtime)
        );;;defun
        (xdrx_prompt "\n经过“(length lst)”个点表剩余重复测试,结果为:"
                        "\n1、“XD::Pnts:Dup-1”函数用时 "(ceshi1 lst fuzz)"  秒;"
                        "\n2、“XD::Pnts:Dup”函数用时 "(ceshi2 lst fuzz)" 秒;"
                        "\n3、“XD::Pnts:Dup-2”函数用时 "(ceshi3 lst fuzz)" 秒。"
        )
        (princ)
)


测试结果:
(cs lst 150)

经过7680个点表剩余重复测试,结果为:
1、“XD::Pnts:Dup-1”函数用时 0.009  秒;
2、“XD::Pnts:Dup”函数用时 0.911 秒;
3、“XD::Pnts:Dup-2”函数用时 0.016 秒。


结论:
1、函数XD::Pnts:Dup-1运行速度最快,XD::Pnts:Dup-2次之,XD::Pnts:Dup最慢。
2、XD::Pnts:Dup函数与XD::Pnts:Dup-1的区别不大,测试之前预计XD::Pnts:Dup函数最快,结果令人失望,最慢。


评分

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

查看全部评分

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

已领礼包: 202个

财富等级: 日进斗金

 楼主| 发表于 2018-12-18 12:06:00 | 显示全部楼层
附件:lst表

附件lst点表.txt

249.4 KB, 下载次数: 2, 下载积分: D豆 -1 , 活跃度 1

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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2018-12-18 12:23:11 | 显示全部楼层
写的函数有点问题

命令: !lst
((1.2 3.0 3) (2.3 2 3.0) (1.2 3.0 3))

命令: (xd::pnts:dup lst 1e-3)
((1.2 3.0 3))

命令: (xd::pnts:dup-1 lst 1e-3)
((1.2 3.0 3))

命令: (xd::pnts:dup-2 lst 1e-3)
((1.2 3.0 3))

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

使用道具 举报

已领礼包: 202个

财富等级: 日进斗金

 楼主| 发表于 2018-12-18 12:37:02 | 显示全部楼层
本帖最后由 dyjwyqz5221 于 2018-12-18 13:25 编辑

函数没问题,函数的目的就是找出表中的重复点并去重,去掉非重复点。

点评

你看这个结果对吗 命令: !lst ((1.2 3.0 3) (2.3 2 3.0) (1.2 3.0 3)) 命令: (xd::pnts:dup lst 1e-3) ((1.2 3.0 3))  详情 回复 发表于 2018-12-18 14:22
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2018-12-18 14:22:28 | 显示全部楼层
dyjwyqz5221 发表于 2018-12-18 12:37
函数没问题,函数的目的就是找出表中的重复点并去重,去掉非重复点。

你看这个结果对吗

命令: !lst
((1.2 3.0 3) (2.3 2 3.0) (1.2 3.0 3))

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

使用道具 举报

已领礼包: 202个

财富等级: 日进斗金

 楼主| 发表于 2018-12-18 14:44:37 | 显示全部楼层
对呀,你给定的点位置误差范围为0.003,那么这个点表中,有重复的点就是(1.2 3.0 3)

点评

误差是 0.001 (1.2 3.0 3) (2.3 2 3.0) 这两个点距离是多少  详情 回复 发表于 2018-12-18 15:15
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2018-12-18 15:15:16 | 显示全部楼层
本帖最后由 newer 于 2018-12-18 15:18 编辑
dyjwyqz5221 发表于 2018-12-18 14:44
对呀,你给定的点位置误差范围为0.003,那么这个点表中,有重复的点就是(1.2 3.0 3)

误差是 0.001

(1.2 3.0 3) (2.3 2 3.0)

这两个点距离是多少
下面这个呢


命令: !lst
((1.2 3.0 3) (1000.0 200.0 3000.0) (1.2 3.0 3))

命令: (xd::pnts:dup lst fuzz)
((1.2 3.0 3))

点评

点坐标的距离误差是命令: (distance '(1.2 3.0 3) '(2.3 2 3.0)) 1.48661>0.001 从点表中只筛选出重复点,并去重。 ((1.2 3.0 3) (1000.0 200.0 3000.0) (1.2 3.0 3))里面的重复点当然是: (1.2 3.0 3)了。  详情 回复 发表于 2018-12-18 16:32
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 202个

财富等级: 日进斗金

 楼主| 发表于 2018-12-18 16:12:02 | 显示全部楼层
本帖最后由 dyjwyqz5221 于 2018-12-18 17:13 编辑

这是7680个点的点表,运行的结果
命令: (repeat 5 (c:test))Elapsed milliseconds / relative speed for 128 iteration(s):
    (XD::PNTS:DUP-1 LST 150).......1375 / 92.80 <fastest>
    (XD::PNTS:DUP-2 LST 150).......2469 / 51.68
    (XD::PNTS:DUP LST 150).......127594 / 1.00 <slowest>
Elapsed milliseconds / relative speed for 128 iteration(s):
    (XD::PNTS:DUP-1 LST 150).......1015 / 109.38 <fastest>
    (XD::PNTS:DUP-2 LST 150).......2187 / 50.76
    (XD::PNTS:DUP LST 150).......111016 / 1.00 <slowest>
Elapsed milliseconds / relative speed for 128 iteration(s):
    (XD::PNTS:DUP-1 LST 150).......1016 / 109.36 <fastest>
    (XD::PNTS:DUP-2 LST 150).......2250 / 49.38
    (XD::PNTS:DUP LST 150).......111109 / 1.00 <slowest>
Elapsed milliseconds / relative speed for 128 iteration(s):
    (XD::PNTS:DUP-1 LST 150).......1031 / 108.01 <fastest>
    (XD::PNTS:DUP-2 LST 150).......2203 / 50.55
    (XD::PNTS:DUP LST 150).......111360 / 1.00 <slowest>
Elapsed milliseconds / relative speed for 128 iteration(s):
    (XD::PNTS:DUP-1 LST 150).......1015 / 110.02 <fastest>
    (XD::PNTS:DUP-2 LST 150).......2234 / 49.99
    (XD::PNTS:DUP LST 150).......111672 / 1.00 <slowest>


选取前8个点组成的点表,其运行结果不太一样:
命令: (repeat 5 (c:test))
Elapsed milliseconds / relative speed for 8192 iteration(s):
    (XD::PNTS:DUP LST 150).......1578 / 5.29 <fastest>
    (XD::PNTS:DUP-1 LST 150).....4110 / 2.03
    (XD::PNTS:DUP-2 LST 150).....8344 / 1.00 <slowest>
Elapsed milliseconds / relative speed for 8192 iteration(s):
    (XD::PNTS:DUP LST 150).......1562 / 5.34 <fastest>
    (XD::PNTS:DUP-1 LST 150).....4094 / 2.04
    (XD::PNTS:DUP-2 LST 150).....8344 / 1.00 <slowest>
Elapsed milliseconds / relative speed for 8192 iteration(s):
    (XD::PNTS:DUP LST 150).......1719 / 4.79 <fastest>
    (XD::PNTS:DUP-1 LST 150).....4312 / 1.91
    (XD::PNTS:DUP-2 LST 150).....8235 / 1.00 <slowest>
Elapsed milliseconds / relative speed for 8192 iteration(s):
    (XD::PNTS:DUP LST 150).......1578 / 5.28 <fastest>
    (XD::PNTS:DUP-1 LST 150).....4110 / 2.03
    (XD::PNTS:DUP-2 LST 150).....8328 / 1.00 <slowest>
Elapsed milliseconds / relative speed for 8192 iteration(s):
    (XD::PNTS:DUP LST 150).......1578 / 5.26 <fastest>
    (XD::PNTS:DUP-1 LST 150).....4156 / 2.00
    (XD::PNTS:DUP-2 LST 150).....8297 / 1.00 <slowest>

后经过大量的测试分析,结果与点表里面点的重复次数有关系。

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

使用道具 举报

已领礼包: 202个

财富等级: 日进斗金

 楼主| 发表于 2018-12-18 16:14:05 | 显示全部楼层
本帖最后由 dyjwyqz5221 于 2018-12-18 16:38 编辑

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

使用道具 举报

已领礼包: 202个

财富等级: 日进斗金

 楼主| 发表于 2018-12-18 16:32:27 | 显示全部楼层
本帖最后由 dyjwyqz5221 于 2018-12-18 16:48 编辑
newer 发表于 2018-12-18 15:15
误差是 0.001

(1.2 3.0 3) (2.3 2 3.0)
起的题目名称有点问题,引起了你的误解吧。应该叫:提取点表重复点并消重

点坐标的距离误差是:
(distance '(1.2 3.0 3)  '(2.3 2 3.0))
1.48661>0.001

从点表中只筛选出重复点,并去重。
((1.2 3.0 3) (1000.0 200.0 3000.0) (1.2 3.0 3))里面的重复点当然是: (1.2 3.0 3)了。


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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-14 20:11 , Processed in 0.329274 second(s), 57 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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