怎样找到矢量数组里特定的几个值

千分散尽还复来 2012-10-30 01:32:31
我有一个矢量数组D3DXVECTOR3 Pos[50],它表示空间的50个点;
另有一个固定点P,我想找到点P距离Pos数组中的点最近的五个点。
该怎样实现?请过路大侠指点一下。谢谢!
...全文
134 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
ri_aje 2012-11-01
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

引用 3 楼 的回复:
对辅助数组按距离升序 index sort,

就是排序是个大问题,算法太傻。楼上能否明示做法。谢谢!

引用 4 楼 的回复:
另外,如果是常数5,可以展开排序循环(如果用C++可借助模板,见云风的那本书)。也不用完全排序,找本算法书看堆算法。

从50个值里面找5个,完全排序的确有点浪费;我用的就是C++,借助什么模板?什么名字的书上可以查到?谢谢……
[/Quote]
不喜欢排序的话,那你就弄个大小为 5 的数组(a),然后遍历 Pos,每一步更新 a,使得在任何时候,a 存储遍历到目前为止距离 p 最近的 5 个点。
  • 打赏
  • 举报
回复
非常感谢楼上两位热心解惑!结帖。
ri_aje 2012-10-31
  • 打赏
  • 举报
回复
将 p 与数组中每个点的距离存入辅助数组,然后对辅助数组按距离升序 index sort,index sort 结果中前 5 个就是 5 个最近点在原数组中的下标。
  • 打赏
  • 举报
回复
我就傻算吧,只是傻得太厉害了:我想建立许多数组来一个一个排除最小值,最终找到五个值对应的索引号。
这样算心里很不舒服,哪里一定可以俭省点,楼上能否指点一下?
至于k-d树,我看不懂,也不想用,谢谢楼上。
ri_aje 2012-10-31
  • 打赏
  • 举报
回复
你如果就干这一票,傻算就行了。否则建立 kdtree,然后找 k=5 个最近邻。
breakerzy 2012-10-31
  • 打赏
  • 举报
回复
另外,min[5]存指针而非值等优化实现细节不赘述。
breakerzy 2012-10-31
  • 打赏
  • 举报
回复
云风的那本《编程感悟》有个利用C++模板展开冒泡的示例。任何一本算法书都有堆算法。
D3DXVECTOR3 min[5];


// 设 min[0] 最近、min[1] 次近等等
// 初始化 min[] 放一些距离很大的值

for (i = 0; i < 50; ++i) {
if (Distance(Pos[i], P) < min[0])
ShiftAndPush(Pos[i], min, 0);
else if (Distance(Pos[i], P) < min[1])
ShiftAndPush(Pos[i], min, 1);
else if (Distance(Pos[i], P) < min[2])
ShiftAndPush(Pos[i], min, 2);
else if (Distance(Pos[i], P) < min[3])
ShiftAndPush(Pos[i], min, 3);
else if (Distance(Pos[i], P) < min[4])
ShiftAndPush(Pos[i], min, 4);
}


实现 ShiftAndPush 顾名思义。

以上是针对常数5的手工展开。如果5不是常数,可把每次的Distance放入std::priority_queue(堆)中,最后取前5个元素即可。(注意设置谓词,priority_queue是大根堆)

  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
对辅助数组按距离升序 index sort,
[/Quote]
就是排序是个大问题,算法太傻。楼上能否明示做法。谢谢!

[Quote=引用 4 楼 的回复:]
另外,如果是常数5,可以展开排序循环(如果用C++可借助模板,见云风的那本书)。也不用完全排序,找本算法书看堆算法。
[/Quote]
从50个值里面找5个,完全排序的确有点浪费;我用的就是C++,借助什么模板?什么名字的书上可以查到?谢谢!
breakerzy 2012-10-31
  • 打赏
  • 举报
回复
另外,如果是常数5,可以展开排序循环(如果用C++可借助模板,见云风的那本书)。也不用完全排序,找本算法书看堆算法。

8,303

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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