한 가지 문제에 대해 생각하는 동안 다음 작업을 해결하는 효율적인 알고리즘을 만들어야한다는 것을 깨달았습니다.
문제 : 우리는 측면이 축과 평행 한 측면 의 2 차원 사각형 상자가 제공 됩니다. 상단을 통해 살펴볼 수 있습니다. 그러나 수평 세그먼트 도 있습니다. 각 세그먼트에는 정수 좌표 ( )와 좌표 ( )가 있으며 점 와 를 연결합니다 ( 아래 그림).m y 0 ≤ y ≤ n x 0 ≤ x 1 < x 2 ≤ n ( x 1 , y ) ( x 2 , y )
상자 상단의 각 단위 세그먼트에 대해이 세그먼트를 살펴보면 상자 내부를 세로로 볼 수있는 깊이를 알고 싶습니다.
공식적으로 경우 입니다.
예 : 아래 그림과 같이 및 세그먼트가 주어지면 결과는 입니다. 상자에 빛이 얼마나 깊이 들어갈 수 있는지보십시오.
다행스럽게도 과 은 매우 작으며 계산을 오프라인으로 수행 할 수 있습니다.
이 문제를 해결하는 가장 쉬운 알고리즘은 무차별입니다. 각 세그먼트마다 전체 배열을 통과하고 필요한 경우 업데이트합니다. 그러나 그것은 우리에게 매우 인상적인 O (mn)을 제공하지 않습니다 .
쿼리 중에 세그먼트의 값을 최대화하고 최종 값을 읽을 수있는 세그먼트 트리를 사용하면 크게 개선됩니다. 더 자세히 설명하지는 않지만 시간 복잡도는 입니다.
그러나 더 빠른 알고리즘을 생각해 냈습니다.
개요:
좌표 (카운팅 정렬의 변형을 사용하여 선형 시간) 의 내림차순으로 세그먼트를 정렬하십시오. unit 세그먼트가 이전에 어떤 세그먼트로 덮여 있었다면 더 이상 이 unit 세그먼트를 통과하는 광선을 추적 할 수있는 세그먼트는 없습니다. 그런 다음 상자의 상단에서 하단으로 라인 스윕을 수행합니다.x x
지금하자 약간의 정의를 도입 : -unit 세그먼트 스윕에 가상의 수평 세그먼트 -coordinates 정수이며, 길이가 1 인 주사 과정 동안 각 세그먼트 이어도 표시 해제 이다 (즉, 광 빔으로부터가는 상자 상단이이 세그먼트에 도달하거나 표시 (반대 ) 할 수 있습니다 . 고려 와 -unit 세그먼트 , 항상 표시 해제한다. 집합도 소개하겠습니다 . 각 세트에는 다음과 같이 표시되지 않은 연속 된 마크 된 단위 세그먼트 (있는 경우) 의 전체 시퀀스가 포함됩니다.x x x 1 = n x 2 = n + 1 S 0 = { 0 } , S 1 = { 1 } , … , S n = { n } x 분절.
이러한 세그먼트에서 작동하고 효과적으로 설정할 수있는 데이터 구조가 필요합니다. 최대 단위 세그먼트 인덱스 ( 표시되지 않은 세그먼트의 인덱스)를 보유하는 필드로 확장 된 찾기 연합 구조 를 사용 합니다 .
이제 세그먼트를 효율적으로 처리 할 수 있습니다. 에서 시작 하여 끝나는 번째 세그먼트를 순서대로 고려하고 있다고 가정 해 봅시다 ( "query"라고 함) . 번째 세그먼트 안에 포함 된 모든 표시되지 않은 단위 세그먼트 를 찾아야합니다 (이것은 광선이 끝나는 세그먼트입니다). 먼저 다음을 수행 할 것입니다. 첫째, 쿼리 에서 첫 번째 표시되지 않은 세그먼트를 찾습니다 ( 이 포함 된 세트의 대표자를 찾고 정의에 의해 표시되지 않은 세그먼트 인이 세트의 최대 색인을 가져옵니다 ). 그런 다음이 색인x 1 x 2 x i x 1 x y x x + 1 x ≥ x 2 는 쿼리 안에 있고 결과에 추가하고 (이 세그먼트의 결과는 )이 인덱스를 표시합니다 ( 및 포함하는 Union 세트 ). 그런 다음 표시되지 않은 모든 세그먼트를 찾을 때까지이 절차를 반복하십시오 . 즉, 다음 찾기 쿼리는 인덱스 합니다.
각 찾기 연합 작업은 두 가지 경우에만 수행됩니다. 세그먼트를 고려하기 시작하거나 ( 번 발생할 수 있음 ) 단위 세그먼트를 표시했습니다 ( 번 발생할 수 있음 ). 따라서 전체 복잡도는 ( 는 역행렬 (Ackermann) 함수입니다 ). 무언가가 명확하지 않으면 더 자세히 설명 할 수 있습니다. 시간이 있으면 사진을 추가 할 수있을 것입니다.
이제 나는 "벽"에 도달했습니다. 선형 알고리즘을 생각해 낼 수는 없지만 하나는 있어야합니다. 그래서 두 가지 질문이 있습니다.
- 수평 세그먼트 가시성 문제를 해결 하는 선형 시간 알고리즘 (즉, )이 있습니까?
- 그렇지 않은 경우 가시성 문제가 이라는 증거는 무엇 입니까?