请教一个算法

xiongzm 2002-05-11 04:26:08
一系列空间点(x,y,z),怎么查找给定的点(x0,y0,z0)在这个系列中?怎样做,效率才高,谢谢!可能是很简单。但我还是不会,做出来效率很低。例如:每次要从5000个点中查找一个点,现在要产生1000000组这样的数据,计算一组的可忍耐时间能有多少?我才能在几天内做出来。(这些点是随机产生的)
...全文
27 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
crazy_lazy_pig 2002-05-16
  • 打赏
  • 举报
回复
这样的模型用MATLAB来做的话,应该很简单。不是说位置是有最大范围的吗,
你可以建立一个三维矩阵,记为“T”,矩阵元素T(x,y,z)表示点(x,y,z)是否已经走过,T可以这样初始化:T=zeros(maxX,maxY,maxZ),其中maxX、maxY、maxZ表示位置的最大范围(当然若位置可能出现负坐标的,你还要自己做一下转化),这就表示一开始所有的点都没走过。每随机走过一步,先判断此坐标位的T矩阵元素是否为“1”,不为“1”就可以走到这里,同时标记T的此坐标位为“1”,若是“1”,则另寻他路。
此方法我没有试验过,你自己试一下吧,有两个地方可能会出问题:第一,走每一步都要用到循环,这无疑会降低运算速度;第二,矩阵T不能做的很大,有内存和MATLAB自身系统的限制。再研究吧,此问题值得讨论。
xiongzm 2002-05-14
  • 打赏
  • 举报
回复
感谢大家。小弟很菜,数据结构这个学期正自学着,看了一些书,但实践很少,很多算法没做过;小弟没什么分,只能从内心感谢大家,所有帮助过我的人,我都会表示的。

谢谢 crazy_lazy_pig(疯狂懒猪):我原来做的效率比你的低,也是用的find(),但没有你的这两行好:x=ones(5000,1)*b; %将这个向量扩展成5000行 xx=find(abs(x-a)*ones(3,1)==0);%寻找这个随机点
虽然变量空间增大了些。(真的,matlab 中尽可能不要用循环)。

谢谢 melice(melice): 我正在考虑你的方法。

谢谢 alexanderyu(alex) ( ) 你的程序在我机器上(c533)用了28s,(TC2编译),我的机器怎么这么慢?


我是学化学的(现在大三),有个模型:自避行走。想模拟一下,自避行走不是无规行走,在空间中从一点(如(0,0,0))出发走N(例如N=2000)步(每步长不妨设为1),这N步每步的落点不可重复。即在晶格模型中,每步不可交叉,当然就不回退了,每步最多可向5个随机方向行走(当然,随机方向是6个),产生这样的行走路径,(画出路径)。这样,我先前问的问题就或许简单了一些。(不是每步都要在N-1个点中查找,点的位置变量也是整型的,位置也是有最大范围的。)弄了几天,我都做出来了,满足模型,在改进中效率也有提高。加上其他相关变量,状态函数,能量等等,做出来运行,时间消耗还是不乐观(在我的机器上,用matlab模拟N=2000计算一次要5~6s)。我认为在产生行走路径上效率还可以通过更好的算法提高。


欢迎大家帮我讨论讨论。如果有对该问题的算法感兴趣的,请做一做,告诉我一声您的结果如何,谢谢。

(PS:sorry,I posted this question on C/C++ & Data Algorithm two board.one may communicate with each other)
xiongzm 2002-05-14
  • 打赏
  • 举报
回复
感谢大家。小弟很菜,数据结构这个学期正自学着,看了一些书,但实践很少,很多算法没做过;小弟没什么分,只能从内心感谢大家,所有帮助过我的人,我都会表示的。

谢谢 crazy_lazy_pig(疯狂懒猪):我原来做的效率比你的低,也是用的find(),但没有你的这两行好:x=ones(5000,1)*b; %将这个向量扩展成5000行 xx=find(abs(x-a)*ones(3,1)==0);%寻找这个随机点
虽然变量空间增大了些。(真的,matlab 中尽可能不要用循环)。

谢谢 melice(melice): 我正在考虑你的方法。

谢谢 alexanderyu(alex) ( ) 你的程序在我机器上(c533)用了28s,(TC2编译),我的机器怎么这么慢?


我是学化学的(现在大三),有个模型:自避行走。想模拟一下,自避行走不是无规行走,在空间中从一点(如(0,0,0))出发走N(例如N=2000)步(每步长不妨设为1),这N步每步的落点不可重复。即在晶格模型中,每步不可交叉,当然就不回退了,每步最多可向5个随机方向行走(当然,随机方向是6个),产生这样的行走路径,(画出路径)。这样,我先前问的问题就或许简单了一些。(不是每步都要在N-1个点中查找,点的位置变量也是整型的,位置也是有最大范围的。)弄了几天,我都做出来了,满足模型,在改进中效率也有提高。加上其他相关变量,状态函数,能量等等,做出来运行,时间消耗还是不乐观(在我的机器上,用matlab模拟N=2000计算一次要5~6s)。我认为在产生行走路径上效率还可以通过更好的算法提高。


欢迎大家帮我讨论讨论。如果有对该问题的算法感兴趣的,请做一做,告诉我一声您的结果如何,谢谢。

(PS:sorry,I posted this question on C/C++ & Data Algorithm two board.one may communicate with each other)
xiongzm 2002-05-14
  • 打赏
  • 举报
回复
感谢大家。小弟很菜,数据结构这个学期正自学着,看了一些书,但实践很少,很多算法没做过;小弟没什么分,只能从内心感谢大家,所有帮助过我的人,我都会表示的。

谢谢 crazy_lazy_pig(疯狂懒猪):我原来做的效率比你的低,也是用的find(),但没有你的这两行好:x=ones(5000,1)*b; %将这个向量扩展成5000行 xx=find(abs(x-a)*ones(3,1)==0);%寻找这个随机点
虽然变量空间增大了些。(真的,matlab 中尽可能不要用循环)。

谢谢 melice(melice): 我正在考虑你的方法。

谢谢 alexanderyu(alex) ( ) 你的程序在我机器上(c533)用了28s,(TC2编译),我的机器怎么这么慢?


我是学化学的(现在大三),有个模型:自避行走。想模拟一下,自避行走不是无规行走,在空间中从一点(如(0,0,0))出发走N(例如N=2000)步(每步长不妨设为1),这N步每步的落点不可重复。即在晶格模型中,每步不可交叉,当然就不回退了,每步最多可向5个随机方向行走(当然,随机方向是6个),产生这样的行走路径,(画出路径)。这样,我先前问的问题就或许简单了一些。(不是每步都要在N-1个点中查找,点的位置变量也是整型的,位置也是有最大范围的。)弄了几天,我都做出来了,满足模型,在改进中效率也有提高。加上其他相关变量,状态函数,能量等等,做出来运行,时间消耗还是不乐观(在我的机器上,用matlab模拟N=2000计算一次要5~6s)。我认为在产生行走路径上效率还可以通过更好的算法提高。


欢迎大家帮我讨论讨论。如果有对该问题的算法感兴趣的,请做一做,告诉我一声您的结果如何,谢谢。

(PS:sorry,I posted this question on C/C++ & Data Algorithm two board.one may communicate with each other)
zzwu 2002-05-13
  • 打赏
  • 举报
回复
1天有24*60*60=86400秒,
如果每秒解决一组问题,1000,000组大约要化12天的时间,
如果半秒解决一组问题,1000,000组大约要化6天的时间,
...
如果希望1天解决1000,000组问题,则必须12问题/sec.,近似0.1sec/问题

melice 2002-05-13
  • 打赏
  • 举报
回复
方法1:先根据你的(x,y,z)的分布规律,使用hash table大概划分数据区域。然后每个区域的点的数据使用8quadr-tree记录。这样查找的时候,消耗的时间是极小的。

2:或者,用一个简单的函数f来表征p(x,y,z),(例如,设f=x+y+z),用f的值作为权来排序所有的点,这样,查找相同的权值,再在里面来找点,速度也是不慢的。
xiongzm 2002-05-12
  • 打赏
  • 举报
回复
我用了matlab和C.但是效率很差,我作出来1次好象时间是 半秒,太慢了,可能是我程序中其他方面所牵连的。谢谢crazy_lazy_pig(疯狂懒猪) ,能否列出你的matlab 程序。
crazy_lazy_pig 2002-05-12
  • 打赏
  • 举报
回复
设a是已知的5000个点(也可以:a=rand(5000,3);)
b=rand(1,3); %随机产生一个三维向量
x=ones(5000,1)*b; %将这个向量扩展成5000行
xx=find(abs(x-a)*ones(3,1)==0);%寻找这个随机点
if(xx==[])
%your code
end

将上面的程序用for循环做你需要的次数就可以了
crazy_lazy_pig 2002-05-11
  • 打赏
  • 举报
回复
我也愿意抽两三个小时帮你算一下(用MATLAB),当然若是用C自己编程做,我就不会了,至少保证不了这么短的时间里能做出来。要么你就借一下MATLAB的数学函数库吧
crazy_lazy_pig 2002-05-11
  • 打赏
  • 举报
回复
你是要做什么事情,如果仅需要结果的话,不妨用MATLAB做一下。我用MATLAB
试了1000次判断的情形(其中5000个点和每次判断用的点都是随机的),只需10秒。
one_add_one 2002-05-11
  • 打赏
  • 举报
回复
用hash试试

33,008

社区成员

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

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