找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

楼主: XDSoft

[点表] (XD::Pnts:RemoveDup)点表消除重复点

[复制链接]

已领礼包: 1757个

财富等级: 堆金积玉

发表于 2013-11-14 14:03:16 | 显示全部楼层
st788796 发表于 2013-11-14 12:41
不排序,4W长表可能CAD OVER

原始数据总数:64128  除去重复结果1503
按我发帖的办法处理6万多点,13秒多一点
按照先排序再删除0.5秒
下面为E大函数。0.5秒,效果明显
(defun Pnts:RemoveDups (pts fuzz / ptl)
  (setq pts (vl-sort pts
       '(lambda (p1 p2)
   (if (= (car p1) (car p2))
     (< (cadr p1) (cadr p2))
     (< (car p1) (car p2))
   )
        )
       )
ptl (cons (car pts) ptl)
pts (cdr pts)
)
  (while pts
    (if (equal (car pts) (car ptl) fuzz)
      nil
      (setq ptl (cons (car pts) ptl))
    )
    (setq pts (cdr pts))
  )
  ptl
)

点评

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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2013-11-14 14:22:46 来自手机 | 显示全部楼层
本帖最后由 st788796 于 2013-11-14 14:25 编辑
守仁格竹GM 发表于 2013-11-14 14:03
原始数据总数:64128  除去重复结果1503
按我发帖的办法处理6万多点,13秒多一点
按照先排序再删除0.5 ...


这个排序会有遗漏的
把if = 换成 if equal fuzz

点评

应该不会有遗漏,都是按照默认精度排序的,最后的精度删除 不能过于粗糙,要是粗糙的离谱 肯定会有遗漏,按照正常人的逻辑思维 不应该有问题  详情 回复 发表于 2013-11-14 14:52
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6530个

财富等级: 富甲天下

发表于 2013-11-14 14:31:52 | 显示全部楼层
守仁格竹GM 发表于 2013-11-14 14:03
原始数据总数:64128  除去重复结果1503
按我发帖的办法处理6万多点,13秒多一点
按照先排序再删除0.5 ...

这个函数有两点遗漏,第一是函数中删除只考虑X相同,没有考虑Y相同,会多删;第二是删除后改变了次序,应该像G版那样,先附加一个序号,然后排序删除后再恢复次序。

点评

再看看 刚发的帖 删除完 顺序不改变,效率下降了1倍 不过也能接受  详情 回复 发表于 2013-11-14 15:39
这是排序的一种 并没有遗漏 ,大方向按X,X相同时候按照Y ,这个只是给删除重复点使用,要是纯排序 有多个排序的方案  详情 回复 发表于 2013-11-14 14:47
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6530个

财富等级: 富甲天下

发表于 2013-11-14 14:34:09 | 显示全部楼层
st788796 发表于 2013-11-14 14:22
这个排序会有遗漏的
把if = 换成 if equal fuzz

我的观点是,排序不要误差,删除时再使用误差,否则就像我那个“间苗”的帖子一样。

点评

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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2013-11-14 14:40:34 来自手机 | 显示全部楼层
本帖最后由 st788796 于 2013-11-14 14:42 编辑

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

使用道具 举报

已领礼包: 1757个

财富等级: 堆金积玉

发表于 2013-11-14 14:47:43 | 显示全部楼层
本帖最后由 守仁格竹GM 于 2013-11-14 14:48 编辑
ll_j 发表于 2013-11-14 14:31
这个函数有两点遗漏,第一是函数中删除只考虑X相同,没有考虑Y相同,会多删;第二是删除后改变了次序,应 ...


这是排序的一种 并没有遗漏 ,大方向按X,X相同时候按照Y ,这个只是给删除重复点使用,要是纯排序 有多个排序的方案
改变次序 是一个缺陷
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6530个

财富等级: 富甲天下

发表于 2013-11-14 14:48:17 | 显示全部楼层
st788796 发表于 2013-11-14 14:40
对点而言这个误差就是以基点为圆心,误差为半径,凡圆内及圆上点均认为是equal

这种情况的排序不应该是按XY排序,而是按点之间的相互距离来排序,严格地说,在这种情况下,排序就不是一个好办法,也许回到最基本的“遍历”才可以解决这种问题,不过效率又要让人担忧了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1757个

财富等级: 堆金积玉

发表于 2013-11-14 14:52:57 | 显示全部楼层
st788796 发表于 2013-11-14 14:22
这个排序会有遗漏的
把if = 换成 if equal fuzz

应该不会有遗漏,都是按照默认精度排序的,最后的精度删除 不能过于粗糙,要是粗糙的离谱 肯定会有遗漏,按照正常人的逻辑思维 不应该有问题

点评

同意,给精度完全是一种适应多情况的技巧,可以给0不就完了,有人总纠结在这细节里面出不来,看不到整体上应该怎么写才更好。  详情 回复 发表于 2013-11-14 15:19
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2013-11-14 15:16:33 | 显示全部楼层
本帖最后由 newer 于 2013-11-14 15:24 编辑
守仁格竹GM 发表于 2013-11-14 12:20
vl-sort 排序应该是 1+2+3+...+(n-1) 这个是最差的情况,再加上最后的相邻相同元素删除 次数也是n 所以 ...


你的测试结果,证明了我说的算法的效率判断。

你的代码,不管是怎么递减,也是两个表在循环,一个表里面哪怕多增加一个元素,整个就多耗费表1整个长度的次数。所以整体上是你N方等级的。何况增加的要很多。

而先排序不同,VL-SORT 整体是N级的,你多加两个类似VL-SORT这样的MAPCAR,也就顶多增加了2次的N而已。在样本数很大的情况下,这个是忽略不计的。

好的代码,应该个大的循环调用,函数调用都控制在N级。这样整体效率才保证。

(while (cdr lst)
    (vl-remove-if '.......)
)

这样的结构是N方的结构。VL-REMOVE-IF本身也是一个循环。

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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2013-11-14 15:19:22 | 显示全部楼层
守仁格竹GM 发表于 2013-11-14 14:52
应该不会有遗漏,都是按照默认精度排序的,最后的精度删除 不能过于粗糙,要是粗糙的离谱 肯定会有遗漏, ...

同意,给精度完全是一种适应多情况的技巧,可以给0不就完了,有人总纠结在这细节里面出不来,看不到整体上应该怎么写才更好。

点评

顺序不打乱的情况 同样上面数据 1.3730秒 (defun Pnts:RemoveDups (pts fuzz / ptsi ptsi_con_lst ptl) (setq ptsi (vl-sort-i pts '(lambda (p1 p2) (if (= (car p1) (car p2)) (< (cadr p  详情 回复 发表于 2013-11-14 15:36
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1757个

财富等级: 堆金积玉

发表于 2013-11-14 15:36:58 | 显示全部楼层
newer 发表于 2013-11-14 15:19
同意,给精度完全是一种适应多情况的技巧,可以给0不就完了,有人总纠结在这细节里面出不来,看不到整体 ...

顺序不打乱的情况 同样上面数据  1.3730秒
(defun Pnts:RemoveDups (pts fuzz / ptsi ptsi_con_lst ptl)
  (setq ptsi (vl-sort-i pts
       '(lambda (p1 p2)
   (if (= (car p1) (car p2))
     (< (cadr p1) (cadr p2))
     (< (car p1) (car p2))
   )
        )
     )
pts (vl-sort pts
       '(lambda (p1 p2)
   (if (= (car p1) (car p2))
     (< (cadr p1) (cadr p2))
     (< (car p1) (car p2))
   )
        )
       )
  )
  (setq ptsi_con_lst (mapcar '(lambda (x y) (cons x y)) ptsi pts)
ptl (cons (car ptsi_con_lst) ptl)
ptsi_con_lst (cdr ptsi_con_lst)
)
  (while ptsi_con_lst
    (if (equal (cdar ptsi_con_lst) (cdar ptl) fuzz)
      nil
      (setq ptl (cons (car ptsi_con_lst) ptl))
    )
    (setq ptsi_con_lst (cdr ptsi_con_lst))
  )
  (mapcar 'cdr (vl-sort ptl '(lambda (p1 p2) (< (car p1) (car p2)))))
)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1757个

财富等级: 堆金积玉

发表于 2013-11-14 15:39:28 | 显示全部楼层
ll_j 发表于 2013-11-14 14:31
这个函数有两点遗漏,第一是函数中删除只考虑X相同,没有考虑Y相同,会多删;第二是删除后改变了次序,应 ...

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

使用道具 举报

已领礼包: 1757个

财富等级: 堆金积玉

发表于 2013-11-14 15:51:56 | 显示全部楼层
实际上 上面的操作 只是单方面的,实际操作中还是得按照每个程序具体操作。
很多时候 都是提前排序处理完毕了, 这样再排序我觉得意义不大了。
E大的分段处理理念 效率其实挺高的
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1757个

财富等级: 堆金积玉

发表于 2013-11-14 17:17:16 | 显示全部楼层
我那个有点啰嗦了 刚发现 G版的意思一样,效率更高 0.9200秒
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1757个

财富等级: 堆金积玉

发表于 2013-11-14 17:31:25 | 显示全部楼层
:lol 不过我又改进了一下0.8740秒
(defun Pnts:RemoveDups (pts fuzz / i ptl)
  (setq i -1
        pts (mapcar '(lambda (X) (cons (setq i (1+ i)) x)) pts)
        pts (vl-sort pts
                     '(lambda (p1 p2)
                        (if (= (cadr p1) (cadr p2))
                          (< (caddr p1) (caddr p2))
                          (< (cadr p1) (cadr p2))
                        )
                      )
            )
        ptl (cons (car pts) ptl)
        pts (cdr pts)
  )
  (while pts
    (if (equal (cdar pts) (cdar ptl) fuzz)
      nil
      (setq ptl (cons (car pts) ptl))
    )
    (setq pts (cdr pts))
  )
  (mapcar 'cdr (vl-sort ptl '(lambda (p1 p2) (< (car p1) (car p2)))))
)

点评

就像 ll_j 长老说的,只扫描了一个方向,少另外一个方向  详情 回复 发表于 2013-12-14 22:48
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-15 11:48 , Processed in 0.202680 second(s), 57 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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