【问题标题】:Algorithm to search and sort cubic area搜索和排序立方区域的算法
【发布时间】:2013-06-07 13:39:35
【问题描述】:

我正在尝试找出一种算法,可以对立方区域(例如由 (0, 0, 0) 定义的区域到 (1, 1, 1) 定义的区域进行排序,并且在给定坐标。

ex:数据结构包含区域:(0, 0, 0) 到 (100, 100, 100), (1000, 1000, 1000) 到 (1010, 1010, 1010) 和 (-50, -50, - 50) 到 (60, -60, 60)

因此搜索 10、10、10 将返回区域 1,(1001、1001、1001)将返回区域 2 等等

排序、添加、删除时间可能很长。我需要一个快速的搜索时间 我们可以假设它的唯一整数将被搜索,并且制作 3d 网格并参考该区域填充该区域内包含的每个单元格的解决方案不是一个可接受的解决方案,我没有 3TB 的 ram 专用于此:P。 我们也可以假设区域不会重叠,如果这对任何人都有帮助的话

如果有人有想法,我很高兴听到它

谢谢大家

-奥利维尔-

编辑:使用包含 minX、minY、minZ、maxX、maxY、maxZ 的结构来表示一个区域,并将所有这些区域放在一个列表中,您可以在其中一一搜索(通过检查坐标是否大于 minX 但比 maxX 更小,并且每个坐标都相同)仍然太慢 O(N)

目前我正在探索使用 n 叉树进行排序的想法,先按 x 排序,然后按 y 排序,然后按 z 排序,但我不知道它是否会是一个好方法

【问题讨论】:

  • 对空间进行分区时要特别小心。如果你不走运,一个子立方体可能属于许多分区。您要么必须对其进行不均等的分区(每个分区的大小不同),要么将子立方体添加到它所属的所有分区中(这是一个更好的解决方案,我认为)。

标签: performance algorithm sorting search


【解决方案1】:

这是一个简单的边界框问题。

线性搜索:

您的每个区域都由最小角 (x_min, y_min, z_min) 和最大角 (x_max, y_max, z_max) 定义。如果您正在搜索特定目标点(target_x, target_y, target_z),您可以循环遍历所有区域。如果你找到一个地区:

x_min <= target_x <= x_max
y_min <= target_y <= y_max
z_min <= target_z <= z_max

那么您要搜索的区域是由{(x_min, y_min, z_min), (x_max, y_max, z_max)} 定义的区域。

如果 N 是您的边界区域数,则此算法将以 O(N) 运行。如果您收集与目标匹配的区域列表,您还可以处理重叠区域。

八叉树空间细分:

如果您有大量区域,您可以创建一个预先计算的层次结构,也称为octree:

八叉树是一种树形数据结构,其中每个内部节点都有 正好八个孩子。八叉树最常用于划分 通过递归将其细分为八个三维空间 八分圆。八叉树是四叉树的三维模拟。这 name 由 oct + tree 组成,但注意通常写成 “八叉树”只有一个“t”。八叉树通常用于 3D 图形和 3D 游戏引擎。

因此,在此层次结构的每一层,您都将空间细分为八个子立方体。

如果其中一个子立方体内部没有任何搜索区域,它将成为一个空的叶节点(即,您可以说“不,这里什么都没有,继续前进”)。

如果子立方体中的搜索区域数量足够少(即,某个数字 M,其中 M

如果一个子立方体内仍有相对较多的搜索区域,则继续对该子立方体进行细分。

如果你愿意花时间计算八叉树,这将产生一个性能约为 O(logN) + O(M) 的搜索算法。

【讨论】:

  • 但是 O(n) 相对较慢,虽然我做了这个,我只是想看看是否有更快,搜索操作将执行大量时间
  • @user2475269 然后将此信息添加到问题中。如果没有书面说明您尝试过这种方法并且速度太慢,那么每个人都会简单地向您指出这个明显的解决方案,因为它适用于一些搜索。告诉我们搜索次数的限制,并告诉我们您尝试了哪些方法以及它是如何失败的。
【解决方案2】:

您不想对立方区域进行“排序”,您需要一个空间索引结构,例如 k-d tree、octree 或 otherwise。 K-d 树是一个特别好的选择,因为您已经在谈论具有不重叠的轴对齐表面的形状(子长方体)。可能值得在计算机游戏中查找broad phases 的方法,因为它们经常使用检测对齐框与现有对齐框的任意交叉点的数据结构非常快。 (例如Bullet 物理引擎。)

上面提到的大部分空间索引技术都是O(log n),用于执行点查询。 K-d 树有很多实现already in existence。

【讨论】:

    【解决方案3】:

    我将从实现一个简单的 Box 碰撞方法开始。然后你只需对你的每个区域运行这个。

    我的问题是如果搜索跨越多个区域会怎样

    【讨论】:

    • 好吧,实际上我将拥有超过 1 个区域
    【解决方案4】:

    您应该从列出的here 中选择一种算法。如果您的数据允许,您可以尝试integer sorting 算法,它的理论迭代次数较低,然后是基于比较的算法。

    【讨论】:

    • 请问这究竟是如何回答这个问题的?应该对什么进行排序,然后如何使用排序后的数据?
    • 他寻求帮助以选择最快的排序算法。
    • 实际上,从问题其余部分的上下文来看,我认为他的意思是写“搜索立方区域的算法”,问题中的“排序”是一个错字。
    • 嗯,从他的 cmets 的上下文来看,很明显他对他当前和提议的排序算法不满意。
    猜你喜欢
    • 2014-09-07
    • 2019-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-26
    • 1970-01-01
    • 2012-04-26
    • 2011-02-05
    相关资源
    最近更新 更多