부울 행렬의 섬 계산


9

주어진 매트릭스 부울 ,하자 항목이 바다를 표현하고 항목이 땅을 나타냅니다. 개의 항목에 인접한 섬을 세로 또는 가로 (대각선 아님)로 정의하십시오 .n×mX011

원래 질문 은 주어진 행렬에서 섬의 ​​수를 세는 것이 었습니다. 저자는 재귀 솔루션 ( 메모리)을 설명했습니다.O(nm)

그러나 또는 또는 섬을 동적으로 계산하는 스트리밍 (왼쪽에서 오른쪽으로, 다음 행으로) 솔루션을 찾지 못했습니다. 메모리 (시간 복잡도에 대한 제한은 없습니다). 가능합니까? 그렇지 않다면 어떻게 증명할 수 있습니까?O(m)O(n)O(n+m)


count함수의 특정 입력에 대한 예상 출력의 몇 가지 예 :

count(010111010)=1;count(101010101)=5;count(111101111)=1;

count(1111100100010110100011011111)=2

count(101111)=1


1
1. "직교"란 무엇을 의미합니까? 연결된 구성 요소를 의미합니까? 2. 행렬이 어떻게 저장되는지에 대해 무엇을 가정 할 수 있습니까? 외부 저장 장치 (예 : 느린 하드 디스크)에 저장되어 있다고 가정 할 수 있으므로 원하는 부분을 읽을 수 있지만 한 번에 한 블록 씩 읽는 것이 더 빠를까요? 또는 스트리밍 방식으로 매트릭스를 수신합니까? 일단 입력 매트릭스를 수신하면 해당 비트를 다시 볼 수 없습니다.
DW

1
감사합니다. 그 요점을 명확히하기 위해 질문을 편집하는 것이 좋습니다. 스트리밍하는 경우 매트릭스의 비트는 어떤 순서로 도착합니까? 행 사이에서 왼쪽에서 오른쪽으로 스캔 한 후 다음 행으로 스캔 하시겠습니까?
DW

1
모든 세부 사항을 포함하도록 질문을 편집하십시오. 댓글은 일시적입니다.
Yuval Filmus

2
의견에 제공된 모든 정보가 게시물 자체에서 찾을 수있는 것은 아닙니다. 이 정보 중 일부는 스트리밍 모델과 같이 매우 중요합니다. 의견은 사라질 수 있으며 (따라서 커뮤니티 표준으로 인해) 모든 필수 세부 사항이 기본 게시물의 일부를 구성해야합니다.
Yuval Filmus

1
필요한 시간 복잡도는 얼마입니까?
hengxin

답변:


4

다음은 한 번에 두 행만 메모리에 유지하는 알고리즘의 스케치입니다. O(m)기억. 그러나 문제없이 매트릭스의 전치 에서이 알고리즘을 실행할 수 있기 때문에 실제 복잡성은O(min(m,n))기억. 처리 시간은 입니다.O(mn)

  1. 초기화. 첫 번째 행을 스캔하고 해당 행의 모든 ​​연결된 하위 문자열을 찾으십시오. 각 분리 된 하위 문자열에 고유 한 양수 ID를 지정하고 가 0 인 벡터, 그렇지 않으면 고유 한 양수 ID 인 벡터로 저장합니다 .X

  2. 나머지 각 행에 대해 해당 행의 하위 문자열에 고유 ID를 지정하십시오 (이전 고유 ID를 다시 할당하지 말고 ID가 엄격하게 증가하는지 확인하십시오). 이전 행과 현재 행을 x 행렬로보고 연결된 영역은 최소값으로 지정해야합니다. 예로서:2m

    010402220333300506607080009990010402220333300504402020003330

    이 알고리즘의 정확성을 위해 이전 행을 업데이트 할 필요는 없으며, 현재 행만 업데이트하십시오.

    완료되면 이전 행에서 다음 행에 연결되지 않은 모든 ID 세트를 찾아 중복을 삭제하십시오 . 이 세트의 크기를 실행중인 섬 카운터에 추가하십시오.

    이제 이전 행을 버리고 현재 행을 이전 행에 할당하고 계속 진행할 수 있습니다.

  3. 마지막 행을 올바르게 처리하려면 맨 아래에 또 다른 0의 행이 있고 2 단계를 다시 실행하십시오.X


6

Orlp는 다음을 사용하여 솔루션을 제공합니다. O(n) 공간의 단어 O(nlogn) 공간의 비트 (간단 성을 가정하여 n=m). 반대로, 보여주기 쉽다Ω(n) 문제의 불일치를 줄이기 위해 약간의 공간이 필요합니다.

Alice가 이진 벡터를 가지고 있다고 가정 x1,,xn 밥은 이진 벡터를 가지고 있습니다 y1,,yn그들은 색인이 있는지 알고 싶어합니다. i 그런 xi=yi=1. 그들은 당신의 알고리즘을2×(2n1) 행이있는 행렬 x1,0,x2,0,,0,xny1,0,y2,0,,0,yn. 첫 번째 행을 읽은 후 Alice는 Bob을 보냅니다.ixi Bob이 알고리즘을 완성하고 비교할 수 있도록 메모리 내용뿐만 아니라 i(xi+yi)연결된 구성 요소의 수. 두 숫자가 일치하면 두 벡터가 분리됩니다 (인덱스 없음)i), 그 반대. 세트 분리에 대한 프로토콜이 필요하기 때문에Ω(n) 비트 (작은 상수 확률로 오류가 발생할 수 있더라도) Ω(n) 하한은 임의의 일정한 확률로 약간의 오차가 허용되는 무작위 프로토콜에도 적용됩니다.

비교 차 파티션 을 사용하여 Orlp 솔루션을 개선 할 수 있습니다 . 행렬을 한 줄씩 읽습니다. 각 행마다 앞의 행을 통과하는 경로를 통해 연결된 1을 기억합니다. 해당 파티션은 비 크로싱이므로 다음을 사용하여 인코딩 할 수 있습니다.O(n)비트 (비교 차 파티션은 카탈로니아 어 숫자로 계산되므로 성장률이 계승이 아닌 지수 임). 다음 행을 읽을 때 우리는 이것을 나타내며 일부 부분의 모든 끝이 현재 행에 연결되어 있지 않을 때마다 카운터를 증가시킵니다 (카운터는 추가O(logn)비트). Orlp의 솔루션에서와 같이 행렬 처리를 마치기 위해 마지막 더미 행 0을 추가합니다. 이 솔루션은O(n) 우리의 하한을 감안할 때 무조건 최적입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.