2D 그리드에 배열 된 많은 객체 인 데이터 세트가 있습니다. 엄격한 순서로 각 행 내에서 왼쪽에서 오른쪽으로 갈수록 증가하고 각 열 내에서 위쪽에서 아래쪽으로 증가한다는 것을 알고 있습니다. 예를 들어
- 1 2 3
- 4 6 7
- 5 8 9
순진 정렬을 개선하여 전체 데이터 세트를 선형으로 정렬 할 수 있습니까 (비교에서 측정 한 바와 같이)?
nd 데이터 세트는 어떻습니까? 비교의 하위 집합이있는 임의의 유한 데이터 집합?
2D 그리드에 배열 된 많은 객체 인 데이터 세트가 있습니다. 엄격한 순서로 각 행 내에서 왼쪽에서 오른쪽으로 갈수록 증가하고 각 열 내에서 위쪽에서 아래쪽으로 증가한다는 것을 알고 있습니다. 예를 들어
순진 정렬을 개선하여 전체 데이터 세트를 선형으로 정렬 할 수 있습니까 (비교에서 측정 한 바와 같이)?
nd 데이터 세트는 어떻습니까? 비교의 하위 집합이있는 임의의 유한 데이터 집합?
답변:
이 문제에 대해 Ω (n 2 log n) 하한을 쉽게 증명할 수 있습니다 (비교 정렬 모델에서) : 위치 (i, j)의 요소가 항상 i + j의 거리 1/2 내에 있으면 그리드 대각선은 서로 독립적이며 각 격자 대각선 내에서 정렬 된 순서는 임의적입니다. 따라서이 제약 조건에서 가능한 총 주문 수는 대각선 길이의 계승의 곱 (그리드의 모든 대각선에 걸쳐)이며 n 2 log n에 지수입니다 .
즉, 표준 비교 정렬 알고리즘은 설명에 따라 정렬 된 그리드에 대해 무조건 최적입니다.
문제를 올바르게 이해하고 (아니면 그렇지 않은 경우 언제든지 알려주십시오) 2D 그리드를 정렬 된 1D 배열로 변환하고 싶은 경우 각 행과 열이 이미 2D 그리드에서 정렬되어 있습니까?
이 경우 목록의 첫 번째 요소는 왼쪽 상단 모서리 (문제의 정의에 따라 (0,0)) 여야합니다. 그 후 다른 모든 요소는 정의에 따라이 요소보다 크기 때문에 (1,0) 또는 (0,1) 요소 여야합니다.
그리드에서 다음으로 가장 작은 요소는 항상 이미 사용 된 요소 (또는 그리드의 가장자리) 바로 아래에 있고 이미 사용 된 요소 (또는 그리드의 가장자리) 바로 아래에 있다고 말하면 일반화 할 수 있습니다. 그것보다 작게 정의되었습니다. 따라서 각 반복에서이 요구 사항을 충족하는 가장 작은 값만 고려해야합니다.
가능한 후보를 찾은대로 정렬 된 순서대로 유지할 수 있으며 (한 번의 반복으로 두 개를 사용할 수 없음) 반복 할 때마다 사용 가능한 새 값 (있는 경우)을 확인하십시오. 이전 후보 중 가장 낮은 후보보다 낮 으면 목록에 즉시 추가하고 반복하십시오. 그렇지 않으면 가장 낮은 이전 후보를 추가하고 다음 최저 후보와 비교하십시오.
불행히도 나는 이것의 정확한 복잡성을 제공 할 수 있다고 주장하지 않으며, 그것이 가장 효율적이라고 주장하지 않으며, 순진한 접근법보다 확실히 더 낫다고 생각하며, 당신이 이해할 수 있도록 충분히 설명하기를 바랍니다.
편집 : 이와 같은 두 번째 그리드의 경우 동일한 기본 원칙이 적용된다고 생각하지만 각 반복은 최대 n 개의 새로운 후보를 사용할 수 있으며이 후보는이 시점에서 각 n 차원에서 가장 작은 미사용 요소이어야합니다.