找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1294|回复: 5

[讨论]:求一个好的算法

[复制链接]

已领礼包: 9个

财富等级: 恭喜发财

发表于 2007-5-13 11:18:24 | 显示全部楼层 |阅读模式

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

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

×
用什么办法把图中每组数中中间那个数挑出来,比如:
1        2        3      4     5   6
1        2        3      4     5   6
6        6        6      6     6   6
1        2        3      4     5   6
1        2        3      4     5   6

论坛帖不上图片,就将就这么比划了,每一列的5个数是一个组数,很多组类似的数分布在图中的不确定位置,问题是用什么算法把中间那个数挑出来,在这个例子里面就是6这个数了,当然实际上中间这个数是不相同的,但是相同的是在5个数中位于中间
借用一下mj的空间,图片在这里:
http://www.mjtd.com/BBS/dispbbs. ... ID=60158&page=1
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 10417个

财富等级: 富甲天下

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

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

发表于 2007-5-13 15:03:12 | 显示全部楼层
因为每一个数都有可能影响结果,所以遍历比较法。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-5-14 10:28:53 | 显示全部楼层
分别提取每组数,计算它的CRC,CRC不同的就是你要找的
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 9个

财富等级: 恭喜发财

 楼主| 发表于 2007-5-14 22:02:48 | 显示全部楼层
问题是,那些看起来是5个一组的数,实际上在cad里面是很多个独立的数,只是每5个挨得近些
当然如果能解决分组的问题,这个问题也就解决了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-5-19 10:56:26 | 显示全部楼层
我这有个笨办法:
按数据位置编组,你可以根据图形设置每组数据在X方向的偏差(ax) 和 每组数据间的Y方向间距(ay),Y方向的间距值不要小于组数据内文字的行距。

(defun mid5( / ss ax ay lst lstx lst5 t1 t2 tmp lst5 mid)
  (setq ss (ssget '((0 . "*text"))))
  (setq        ax 10
        ay 100
  )
  (setq lst (ss->list ss))
  (setq lst (vl-sort lst
                      '(lambda (t1 t2)
                         (<= (car (cdr t1)) (car (cdr t2)))
                       )
             )
        ) ;;;按X方向从左至右排序
  (setq lstx(findFor lst ax car));;;将X方向距离小于设定值的文字编组
  (foreach tmp lstx
    (setq tmp (vl-sort tmp
                       '(lambda (t1 t2)
                          (<= (cadr (cdr t1)) (cadr (cdr t2)))
                          )
                       )
          );;;在编组后对Y方向排序
    (setq lsty(findFor tmp ay cadr));;;将Y方向距离小于设定值的文字再编组
    (setq lst5(append lst5 lsty))   
    )
  (setq lst5(getLen5 lst5 5))       ;;;对编组进行过滤,组内数文字数少于5个的排除,大于5个按顺序5个一组
)

;;;获得中间文字
(defun getMidNum(lst cnt / tmp rel)
  (foreach tmp lst
    (setq rel(cons (car (nth cnt tmp)) rel))
    )
  (REVERSE rel)
  )

;;;从表中截取一段生成新的列表
(defun getListAt(lst begin num / n rel len)
  (setq n begin
        len (length lst))
  (if (>= len (+ begin num))
  (repeat num
    (setq rel(cons (nth n lst) rel))
    (setq n (1+ n))
    )
    )
  rel
  )

;;;获得5个一组的数据
(defun getLen5 (lst cnt / n tmp rel tmp0)
  (foreach tmp lst
    (cond
      ((= (length tmp) cnt)
       (setq rel (cons tmp rel))
      )
      ((> (length tmp) cnt)
       (progn
         (setq n 0)
         (while        (setq tmp0 (getListAt tmp (* n cnt) cnt))
           (setq rel (cons tmp0 rel)
                 n   (1+ n)
           )
         )
       )
      )
    )
  )
  (REVERSE rel)
)



;;;按给定条件分组数据
(defun findFor(lst minx hs / tmp n rel fst xl xx)
  (setq tmp(nth 0 lst)
        fst tmp
        xl (cons fst xl)
        n 1)
  (repeat (- (length lst) 1)
    (if (setq xx (< (abs (- (hs (cdr (nth (1- n) lst))) (hs (cdr (nth n lst))))) minx))
      (setq xl(cons (nth n lst) xl))
      (setq fst        (nth n lst)
            rel        (cons (REVERSE xl) rel)
            xl        (cons fst nil)
      )
      )
    (setq n (1+ n))
    )
    (setq rel (cons xl rel))
  (REVERSE rel)
  )


      
;;;将选择集转换成列表,在这只截取了文字内容和位置
(defun ss->list        (ss / rel tmp na ent e1 e10 n)
  (setq n 0)
  (repeat (sslength ss)
    (setq na (ssname ss n)
          ent (entget na)
          e1  (cdr (assoc 1 ent))
          e10 (cdr (assoc 10 ent))
    )
    (setq rel (cons (cons e1 e10) rel))
    (setq n (1+ n))
  )
  rel
)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-22 12:41 , Processed in 0.204893 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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