좋은 특수 정렬 알고리즘은 무엇입니까?


13

2D 그리드에 배열 된 많은 객체 인 데이터 세트가 있습니다. 엄격한 순서로 각 행 내에서 왼쪽에서 오른쪽으로 갈수록 증가하고 각 열 내에서 위쪽에서 아래쪽으로 증가한다는 것을 알고 있습니다. 예를 들어

  • 1 2 3
  • 4 6 7
  • 5 8 9

순진 정렬을 개선하여 전체 데이터 세트를 선형으로 정렬 할 수 있습니까 (비교에서 측정 한 바와 같이)?

nd 데이터 세트는 어떻습니까? 비교의 하위 집합이있는 임의의 유한 데이터 집합?


1
더 정확한 질문을 할 수 있습니까? 데이터가 이미 정렬되어 있음을 나타 내기 위해 첫 번째 단락을 읽을 수 있습니다! 입력 내용이 정확히 무엇이며, 원하는 결과는 무엇입니까?
Jacques Carette

1
예, 언어가 약간 혼란 스럽습니다. 데이터 세트가 정렬 할 n 개의 숫자로 구성되어 있음을 깨닫는 데 약간의 시간이 걸렸지만이 숫자는 sqrt (n) x sqrt (n) 그리드로 정렬되어 각 행과 각 열이 이미 정렬되어 있습니다. 그게 무슨 뜻이야?

그렇습니다. 명확성을 위해 편집하겠습니다.
Zachary Vance

답변:


19

이 문제에 대해 Ω (n 2 log n) 하한을 쉽게 증명할 수 있습니다 (비교 정렬 모델에서) : 위치 (i, j)의 요소가 항상 i + j의 거리 1/2 내에 있으면 그리드 대각선은 서로 독립적이며 각 격자 대각선 내에서 정렬 된 순서는 임의적입니다. 따라서이 제약 조건에서 가능한 총 주문 수는 대각선 길이의 계승의 곱 (그리드의 모든 대각선에 걸쳐)이며 n 2 log n에 지수입니다 .

즉, 표준 비교 정렬 알고리즘은 설명에 따라 정렬 된 그리드에 대해 무조건 최적입니다.


다른 대답은이 복잡성을 가진 명시 적 알고리즘을 제공 하므로이 문제는 2 차원 그리드와 실제로 확인하지 않고 임의의 치수 그리드에 대해 해결 된 것으로 간주합니다.
Zachary Vance

4

문제를 올바르게 이해하고 (아니면 그렇지 않은 경우 언제든지 알려주십시오) 2D 그리드를 정렬 된 1D 배열로 변환하고 싶은 경우 각 행과 열이 이미 2D 그리드에서 정렬되어 있습니까?

이 경우 목록의 첫 번째 요소는 왼쪽 상단 모서리 (문제의 정의에 따라 (0,0)) 여야합니다. 그 후 다른 모든 요소는 정의에 따라이 요소보다 크기 때문에 (1,0) 또는 (0,1) 요소 여야합니다.

그리드에서 다음으로 가장 작은 요소는 항상 이미 사용 된 요소 (또는 그리드의 가장자리) 바로 아래에 있고 이미 사용 된 요소 (또는 그리드의 가장자리) 바로 아래에 있다고 말하면 일반화 할 수 있습니다. 그것보다 작게 정의되었습니다. 따라서 각 반복에서이 요구 사항을 충족하는 가장 작은 값만 고려해야합니다.

가능한 후보를 찾은대로 정렬 된 순서대로 유지할 수 있으며 (한 번의 반복으로 두 개를 사용할 수 없음) 반복 할 때마다 사용 가능한 새 값 (있는 경우)을 확인하십시오. 이전 후보 중 가장 낮은 후보보다 낮 으면 목록에 즉시 추가하고 반복하십시오. 그렇지 않으면 가장 낮은 이전 후보를 추가하고 다음 최저 후보와 비교하십시오.

불행히도 나는 이것의 정확한 복잡성을 제공 할 수 있다고 주장하지 않으며, 그것이 가장 효율적이라고 주장하지 않으며, 순진한 접근법보다 확실히 더 낫다고 생각하며, 당신이 이해할 수 있도록 충분히 설명하기를 바랍니다.

편집 : 이와 같은 두 번째 그리드의 경우 동일한 기본 원칙이 적용된다고 생각하지만 각 반복은 최대 n 개의 새로운 후보를 사용할 수 있으며이 후보는이 시점에서 각 n 차원에서 가장 작은 미사용 요소이어야합니다.


간단히 말해서, mergesort처럼 sqrt (N) -way 병합을 할 수 있습니까? 그것은 내가 실행하는 가장 좋은 방법이지만 O (N log N) 인 것으로 나타났습니다. 정확한 상수는 없지만 log (sqrt (N))에 대해 0.5는 최소한입니다.
재커리 밴스
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.