점 집합을 검색하기 위해 kd 트리를 작성하려하지만 위키 백과 문서에서 '중앙값'을 사용하는 것에 대해 혼란스러워하고 있습니다. 나는 확실히 아니에요 단순히 때문에 "중간을 선택 ..."라인에 대해 혼란스러워지고있어kd-tree를 구성 할 때 '중간 값'에 대한 정의가 혼동 스럽습니다
function kdtree (list of points pointList, int depth)
{
if pointList is empty
return nil;
else
{
// Select axis based on depth so that axis cycles through all valid values
var int axis := depth mod k;
// Sort point list and choose median as pivot element
select median by axis from pointList;
// Create node and construct subtrees
var tree_node node;
node.location := median;
node.leftChild := kdtree(points in pointList before median, depth+1);
node.rightChild := kdtree(points in pointList after median, depth+1);
return node;
}
}
사용의 편의성을 위해, 위키 피 디아 문서로 KD 트리 구조의 의사 코드를 말한다 여기에 중간 값을 적용하는 '올바른'방법은 무엇입니까?
내가 아는 한, 홀수 크기의 (정렬 된) 숫자 목록의 중간 값은 중간 요소입니다 (일명 5 가지 목록, 요소 번호 3 또는 인덱스 2 기준). 배열), 짝수 크기 배열의 중앙값은 2 개의 중간 요소를 2로 나눈 값의 합계입니다 (일명 6 개 목록의 경우 중앙값은 요소 3과 4의 합계입니다. 또는 2와 3 , 인덱스가 0 인 경우 - 2로 나눈 값).
그러나 명확한 점 집합으로 작업 할 때 분명히 정의가 작동하지 않습니다. 그렇다면 길이가 짝수 인 숫자 목록, 특히 길이가 2 인 목록에 대해 올바른 중간 값을 선택하는 방법은 무엇입니까?
감사합니다. 감사합니다.
-Stephen
내 의미가 명확하지 않은 경우 사과드립니다. '뚜렷한'의미는 점 (1,1), (2,2), (3,3), (4,4), (5,5)가있는 kd 트리를 형성하려고하면)와 (6,6)의 중간 값은 보통 3.5, 3.5이다. 그러나 kd-tree를 만들 때 (3.5,3.5)는 존재하지 않으므로 어떻게됩니까? 위의 예에서, 당신은 실제로 중간 노드 인 트리에 대한 새로운 노드를 생성한다고 가정합니다. – Stephen
두 가지 방법으로 혼란스러워합니다. 첫째, 중간 값을 찾을 때 하나의 차원을 선택해야합니다! 당신의 예에서 중간 값은 (3.5, 3.5)이 될 수 없습니다. 왜냐하면 그것이 2 차원적인 포인트이기 때문입니다. 대신 첫 번째 단계는 치수를 선택하는 것입니다 (첫 번째를 선택하십시오). 그런 다음 모든 점의 첫 번째 차원을보고 중간 값을 계산합니다. 최고의 차원을 선택하는 방법은 또 다른 것입니다. 두 번째 일 : 아니, 당신은 새로운 노드를 만들지 않는다. 중앙값은 원래 값의 일부가 아니라 단지 값입니다. 이것을 트리의 분할 노드의 속성으로보십시오. – PeterK
아, 맞아요, 알았어요. 그렇다면 나는 아직도 혼란 스럽다. 미안하다. 첫 번째 단계 인 루트 노드에서 중간 값을 5.5로 선언합니다. 그러나 어떤 노드가 루트 노드가됩니까? 왼쪽 및 오른쪽 하위 트리에는 * all * 점이 포함되어 있으므로이 하위 트리의 루트로 선택 되었습니까? – Stephen