c# - 从更大的二维集合中挑选一个子集?

标签 c# java sorting data-structures set

我有一些具有属性 x 和 y(位置)的对象。我想获取并处理我附近的对象(!),但忽略超出范围的对象(*)。

 __________________________
|   __________             |
|  |     !    | *          |
|* |         !|      *     |  -me = center of subset
|  |    me    |            |  -!  = elements of subset
|  |  !       |            |  -*  = elements of full set, not visible
|  |_______!__|   *       *|
|__________________________|

缓慢的方法是迭代完整的、未排序的、设置的和忽略那些距离太大的元素。但是我将拥有一个大数据集,并且需要相当多的性能。

相反,我正在寻找一种方法来仅选择附近的元素作为开始。也许通过某种方式对 2d 集合进行排序,并且只在一定范围内(从子集的边界到边界)迭代集合。

有什么好的方法吗?

(注意:物体的位置是静态的,可以对集合进行预处理)

最佳答案

构造一个 quadtree包含您的所有积分。

给定查询矩形R和四叉树根节点Q,查询算法的伪代码如下。

query(Rectangle R, QuadTreeNode Q)
    if R and Q.bounds are disjoint
        yield no points
    else if R contains Q.bounds
        yield all points in the subtree of Q
    else (if R intersects Q.bounds)
        yield all points in query(R, Q.child[i]) for i = 0, 1, 2, 3

这假设一个 QuadTreeNodeRectangle boundsQuadTreeNode child[4]

关于c# - 从更大的二维集合中挑选一个子集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23523367/

相关文章:

c# - VS2017 Code Review "These files have different encodings"我该如何解决这个问题?

c# - 我的程序准备好进行 FFT 了吗?

javascript - 在 for 循环中使用 @ref 获取元素引用

java - java中如何创建String对象(通过以下代码)

java - 使用语言启发式检查

c - 不同的语言如何在其标准库中实现排序?

python - Google App Engine NDB 排序丢失实体

C#:返回具体类型在运行时确定的对象的方法?

java - Long Array、Integer Array 和 ArrayList 的内存使用情况

java - 在 Java 中使用比较器对数组进行排序