我正在尝试使用 KD-tree 平衡一组(百万 +)3D 点,我有两种方法可以做到这一点。
方式一:
使用 O(n) 算法找到沿给定轴的数组大小/第 2 大元素并将其存储在当前节点
遍历向量中的所有元素,并将它们与我刚刚找到的元素进行比较,然后将较小的元素放在 newArray1 中,将较大的元素放在 newArray2 中
递归
方式二:
使用快速排序 O(nlogn) 沿给定轴对数组中的所有元素进行排序,获取位置 arraysize/2 处的元素并将其存储在当前节点中。
然后将索引 0 到 arraysize/2-1 的所有元素放入 newArray1 中,将 arraysize/2 到 arraysize-1 中的所有元素放入 newArray2
递归
方式 2 似乎更“优雅”,但方式 1 似乎更快,因为中值搜索和迭代都是 O(n),所以我得到 O(2n),它只是减少到 O(n)。但同时,即使方式 2 是 O(nlogn) 时间进行排序,将数组拆分为 2 可以在恒定时间内完成,但它是否弥补了 O(nlogn) 时间进行排序?
我该怎么办?或者有没有更好的方法来做到这一点,我什至没有看到?