各位高手,这个问题怎么解决?

ettng 2011-05-24 11:50:41

条件:在区域S1,S2......Sn 上
分散着点A1(x1,y1),A2(x2,y2),A3(x3,y3).....An(xn,yn)

目的:将在同一区域Si上的点Ai(xi,yi)....合并为同一点,合并后同一区域的点的坐标 可以
以这一区域任意一点的坐标代替

例如,图中A1(x1,y1),A2(x2,y2)在同一区域内,将点A1,A2合并,
即(x1=x2,y1=y2)

求一算法

由于点数很多(有十几万个点),合并的效率越高,越好!
...全文
115 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
ljsspace 2011-05-26
  • 打赏
  • 举报
回复
用空间换时间的做法:可以将所有的点以及区域的边界值(做一个标记区分是边界还是点)按x和y轴方向分别排序,复杂度为O((n+m)log(n+m));然后沿x轴扫描所有按x方向排好序的点,扫描过程更新相应区域的x方向边界值,并判断每个点是否位于该区域的x边界范围,如果是,对该点做一个标记=区域号,这一过程复杂度为n+m;同样对y方向也作类似处理, 这一过程复杂度也为n+m。 最后一遍判断所有点,如果该点标记的x方向和y方向都是同一个区域,那么它们是重复点,在同一个等价类中, 这一过程复杂度也为n。 所以总的复杂度为O((n+m)log(n+m))。
cppgp 2011-05-26
  • 打赏
  • 举报
回复
1).如果区域是等分的矩形,实现可以比较简单。假设在x方向上有Nx个区域,y方向上有Ny个区域。
定义结构体
struct s { bool bhave[Nx*Ny]; int x1, x2, y1, y2; float idlex, idley; };
初始化 bhave 全部为 false
初始化 (x1,x2)为x方向起始终止值,(y1,y2)为y方向起始终止值
初始化 idlex为(x2-x1)/Nx,idley为(y2-y1)/Ny
上述操作时间复杂度为O(1) (Nx*Ny为常量)

从头到尾遍历A1(x1,y1)~An(xn,yn)。对于任意Ai,执行:
(A.xi-s.x1)*idlex得出x索引;
(A.yi-s.y1)*idley得出y索引。
设置 s.bhave[x + Nx*y] = true;
上述操作时间复杂度为O(n)

遍历检测s.bhave[Nx*Ny],若s.bhave[i]为true,则获得一个A点坐标。
时间复杂度为O(1)(因为Nx*Ny为常量)

2).如果区域不是等分,或者是复杂的图形,则在判定Ai时,需要做定位处理。比如对于大小不等的矩形,可以采用二分搜索达到lg(n)复杂度。最好的定位方式和Si的分割有关系了。

实现可以比较简单。假设在x方向上有Nx个区域,y方向上有Ny个区域。
方寸之间 2011-05-26
  • 打赏
  • 举报
回复
楼上正解,不过如果区域可以是不规则的就不能这样了。

反正就是根据区域建桶,把点扔进对应的桶了。输出每个非NULL桶的第一个元素即可。

算法时间复杂度O(nm),n为区域个数,m为点个数。如果区域是规则的,可以按楼上优化
pandm 2011-05-25
  • 打赏
  • 举报
回复
有个想法是,按照x坐标建立若干个桶,然后把每个点按照x坐标扔进相应的桶,然后按照y坐标建立若干个桶,将刚才x坐标的那些桶里的坐标拿出来扔进y桶里,扔的过程就可以知道哪些点是一个区域的了
欢迎各位热爱编程的朋友们,我们现在所在的这个课程是C++Unit1语法入门课程。在这个课程中,我们将一起探索C++语言的奥秘,一起开启我们的编程之旅。首先,我要告诉你的是,这个课程并不仅仅是一个普通的编程课程,它更像是一把打开你思维大门的钥匙。在这里,你将有机会开发和锻炼自己的逻辑思维能力,提升你的编程头脑。我们将一起学习C++程序的入门语法,通过实例教学,让你更好地理解和掌握这门语言。我们的目标不仅仅是让你学会编程,更重要的是,我们希望通过这个课程,让你能够将所学的知识应用到实际生活中,解决生活中的实际问题。无论是在学习、工作还是生活中,我们都会遇到各种各样的问题,而编程,就是解决问题的一种有效方式。通过学习C++,你将能够用编程的方式,解决一些实际问题,让自己的生活变得更加便捷。此外,编程不仅可以帮助我们解决问题,还可以让我们的生活变得更加丰富。通过编程,我们可以创造出各种各样的程序,这些程序可以帮助我们完成各种任务,提高我们的工作效率,也可以帮助我们实现一些以前无法实现的想法,让我们的生活变得更加多彩。总的来说,这个C++Unit1语法入门课程,将帮助你开启编程之路,提升你的逻辑思维能力,解决实际问题,让你的生活变得更加丰富。让我们一起,开始这段美妙的编程之旅吧!

33,007

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧