저는 최근에 kd 나무로 놀아 왔습니다. 여기에 테스트되지 않은 코드가 있습니다. kd-tree 건설은 2 단계로 이루어집니다. 점 목록 O (n)을 탐색하고 각 차원 O (nlogn)을 따라 정렬합니다. 그래서, 네, O (nlogn) 시간에 kd-trees를 만들 수 있습니다.
트리를 통해 검색하면 (가장 가까운 이웃을 찾고 있다고 말하면서) 더 까다로워집니다. 나는 그것을 쉽게 이해할 수있는 문서를 찾지 못했습니다.
struct Node
{
int[2] point;
Node* left;
Node* right;
}
Node* createtreeRecursive (int** values /* int[2][len] */, int len, int dim = 2, int depth = 0)
{
// If empty, return
if (value <= 1) return null;
// Get axis to split along
int axis = depth % dim;
int** sorted = sortAlongDim (values, axis);
int mid = len/2;
Node* curr = new Node();
curr.point[0] = sorted [0][mid];
curr.point[1] = sorted [1][mid];
int** leftHalf = values;
int** rightHalf = &(values [mid]);
curr.left = createtreeRecursive (leftHalf, mid, dim, depth + 1);
curr.right = createtreeRecursive (rightHalf, len - mid, dim, depth + 1);
return curr;
}
int** sortAlongDim (int** values, int axis)