2012-08-04 3 views
0

두 개의 숫자 목록이있는 경우 하나의 정렬 된 목록을 가져올 수 있도록 먼저 개별 목록을 정렬 한 다음 병합 정렬을 수행해야합니까? 아니면 두 목록을 하나의 목록으로 결합한 다음 효율적으로 적용해야합니까? 정렬 알고리즘?두 목록을 정렬하고 결합해야합니까?

+0

왜 태그가 지정된 기계 학습입니까? – irrelephant

+0

두리스트로 나누는 것이 가장 효율적인 정렬 알고리즘이 작동하는 방법입니다. – phs

답변

3

당신은 논쟁을 어느 쪽이든 할 수있다. 그것은 여러 가지 요인에 따라 달라집니다리스트 A와 B에 대한

옵션은 다음과 같습니다

  1. 종류 (A CONCAT의 B)
  2. 병합 (종류 (A) 종류 (B))

A와 B가 거의 비슷하게 정렬되고 크기가 비슷한 경우 삽입 정렬과 같은 거의 정렬 된 목록에서 빠르게 작동하는 작업을 두 작업 모두에서 수행 할 수 있습니다. 그런 다음 병합을 수행합니다. 선형 시간은 옵션 (2)을 거의 선형으로 만듭니다. 그러나이 경우 각 목록 내의 값의 범위가 비슷하다면 옵션 (1)은 전혀 좋지 않을 것입니다. 값이 기수 나 계산에 적합하지 않다고 가정 할 때 아마도 O (n log n) 종류. 즉, 많은 정렬 알고리즘의 경우 데이터가 더 먼 거리로 이동하기 때문에 긴 목록이 손상됩니다.

이제 옵션 (1)이 더 좋은 경우를 생각해 볼 수 있습니다.

그러나 해당 옵션을 찾을 경우 (2) 그렇게 오버 헤드가 있기 때문에 이것은 하지은 재귀 분할 및 순진 통합 접근 방식을 적용해야한다는 것을 의미하지, 현재 상황에서 항상 낫다. 목록에서 값의

  • 목록의 크기
  • 범위 (최소, 최대) : "정렬하는 방식이 낫다"에 대한 모든 질문

    그러나 같은

    당신이 정말보고해야
  • 들이 거의 정렬하든 거의 완전히 무작위 정렬이든 등의 외부 메모리가 허용 금지 처리 여부
  • ,
  • 역방향 W (O (N)의 종류가 특정 상황에서 사용될 수 있기 때문에) hether에서 메모리를 정렬하거나 파일을 정렬하는 중입니다.
  • 리스트가 거의 같은 크기인지 또는 하나가 다른 것보다 훨씬 긴지 여부.

요약하면 "목록에 따라 다르지만 정렬 알고리즘이 목록 길이에 민감하면 옵션 (2)에서 몇 가지 이점을 얻을 수 있습니다.

+1

내가 생각할 수있는 유일한 경우는 (1) A의 거의 모든 요소가 B의 거의 모든 요소보다 적 으면 거의 정렬 된 입력에서 잘 수행되는 삽입 정렬과 같은 알고리즘을 사용하는 것입니다. 그러나이 경우 InsertionSortTime (A concat B)은 InsertionSortTime (A) + InsertionSortTime (B)만큼 오래 걸리므로 개선 사항은 일정한 요소가됩니다. 두 목록을 병합하고 두 목록을 연결하는 것의 차이점은 둘 다 있습니다. O (n) 작업이지만 병합에는 O (n) 비교가 필요합니다. –

+0

+1 나는 또한 (2) "거의 항상"더 좋다고 생각합니다. 병합은 요소 순서에 영향을받지 않으므로 소트가 기수와 기수와 같은 O (n)이 아닌 경우 작은 목록의 정렬이 일반적으로 도움이됩니다. –

0

아직 정렬되지 않았다면, 나는 그것들을 결합하고 단일 정렬을 수행 할 것입니다. 개별적으로 정렬 한 다음 병합 정렬을 수행하는 것이 더 효율적이라면 가장 효율적인 정렬 알고리즘은 임의로 두 가지로 목록을 분할하고 별도로 정렬하고 병합하는 방식으로 작성됩니다. 하지만 그건 사실이 아니야 ....

+0

가장 효율적인 정렬 알고리즘 (mergesort, quicksort) *은 이와 같이 구축되었습니다. 예외는 힙합입니다. 어떤 알고리즘을 생각하고 있습니까? 삽입 정렬? 거의 정렬 된 데이터에서는 빠르지 만 최악의 경우 효율은 나쁘다 (O (n^2)). –

관련 문제