p_ce1052   4년 전

구간 트리에서 query함수를 작성할 때 어떤 노드가 [left,right] 구간의 값을 저장하고 있고, 제가 찾고자 하는 범위가 저 노드의 범위를 포함하면 그냥 저 노드 값을 리턴하고 함수를 끝내버리던데 이 부분이 직관적으로 이해가 가지 않습니다. "예를 들어 구간합을 저장하는 세그트리에서 어떤 노드가 배열의 2번원소부터 5번 원소까지 구간 [2,5]의 값을 가지고 있고 query로 저 노드에 1~6까지의 합을 구해달라고 하면 [2,5]번까지의 합만 받고 함수가 종료되버리지 않나요? 1번과 6번 원소의 값이 빠지게 되는 건 아닌지" 나머지 값은 다른 노드가 가지고 있다, 구간이 쪼개지기 때문에 저렇게 작성한다 등등 답변을 다른 곳에서 듣긴 했는데 그 답변을 들을 때만 해도 그렇구나 하고 넘어갔다가 책을 다시 피면 위에 적은 예시가 해결되지 않아서 답답합니다. 어떤 구간 [left,right]의 정보를 저장한 노드에 이 구간의 왼쪽과 오른쪽 모두 초과하는 구간 (left 미만의 start, right초과의 end) [start,end] 에 대한 쿼리가 떨어질 일은 100% 일어나지 않는 건가요? 이걸 어떻게 증명할 수 있나요?

dyk777   4년 전

당연히 1번, 6번 노드의 값을 각 노드로부터 가져와서 더해서 반환합니다.

2~5번 노드의 합을 구하기 위해 2번노드나 3번노드 등 하위 노드로 직접 진입하지 않고 상위 노드에서 값을 바로 가져간다는 뜻이죠.

djm03178   4년 전

"어떤 구간 [left,right]의 정보를 저장한 노드에 이 구간의 왼쪽과 오른쪽 모두 초과하는 구간 (left 미만의 start, right초과의 end) [start,end] 에 대한 쿼리가 떨어질 일은 100% 일어나지 않는 건가요?"

그런 경우도 있습니다. 그런 경우 자기가 맡는 구간에 대한 정보만 바로 반환합니다. 나머지 부분은 해당 부분을 담당하는 다른 노드가 알아서 처리해줄 것이기 때문입니다. 나는 모르지만, 나를 호출한 부모 노드, 아니면 더 조상쪽 노드에서 다른 쪽으로도 쿼리를 보내봤겠죠.

p_ce1052   4년 전

음 감사합니다

댓글을 작성하려면 로그인해야 합니다.