두 개의 숫자 목록이있는 경우 하나의 정렬 된 목록을 가져올 수 있도록 먼저 개별 목록을 정렬 한 다음 병합 정렬을 수행해야합니까? 아니면 두 목록을 하나의 목록으로 결합한 다음 효율적으로 적용해야합니까? 정렬 알고리즘?두 목록을 정렬하고 결합해야합니까?
답변
당신은 논쟁을 어느 쪽이든 할 수있다. 그것은 여러 가지 요인에 따라 달라집니다리스트 A와 B에 대한
옵션은 다음과 같습니다
- 종류 (A CONCAT의 B)
- 병합 (종류 (A) 종류 (B))
A와 B가 거의 비슷하게 정렬되고 크기가 비슷한 경우 삽입 정렬과 같은 거의 정렬 된 목록에서 빠르게 작동하는 작업을 두 작업 모두에서 수행 할 수 있습니다. 그런 다음 병합을 수행합니다. 선형 시간은 옵션 (2)을 거의 선형으로 만듭니다. 그러나이 경우 각 목록 내의 값의 범위가 비슷하다면 옵션 (1)은 전혀 좋지 않을 것입니다. 값이 기수 나 계산에 적합하지 않다고 가정 할 때 아마도 O (n log n) 종류. 즉, 많은 정렬 알고리즘의 경우 데이터가 더 먼 거리로 이동하기 때문에 긴 목록이 손상됩니다.
이제 옵션 (1)이 더 좋은 경우를 생각해 볼 수 있습니다.
그러나 해당 옵션을 찾을 경우 (2) 그렇게 오버 헤드가 있기 때문에 이것은 하지은 재귀 분할 및 순진 통합 접근 방식을 적용해야한다는 것을 의미하지, 현재 상황에서 항상 낫다. 목록에서 값의
- 목록의 크기
- 범위 (최소, 최대) : "정렬하는 방식이 낫다"에 대한 모든 질문
그러나 같은
당신이 정말보고해야 - 들이 거의 정렬하든 거의 완전히 무작위 정렬이든 등의 외부 메모리가 허용 금지 처리 여부
- ,
- 역방향 W (O (N)의 종류가 특정 상황에서 사용될 수 있기 때문에) hether에서 메모리를 정렬하거나 파일을 정렬하는 중입니다.
- 리스트가 거의 같은 크기인지 또는 하나가 다른 것보다 훨씬 긴지 여부.
요약하면 "목록에 따라 다르지만 정렬 알고리즘이 목록 길이에 민감하면 옵션 (2)에서 몇 가지 이점을 얻을 수 있습니다.
내가 생각할 수있는 유일한 경우는 (1) A의 거의 모든 요소가 B의 거의 모든 요소보다 적 으면 거의 정렬 된 입력에서 잘 수행되는 삽입 정렬과 같은 알고리즘을 사용하는 것입니다. 그러나이 경우 InsertionSortTime (A concat B)은 InsertionSortTime (A) + InsertionSortTime (B)만큼 오래 걸리므로 개선 사항은 일정한 요소가됩니다. 두 목록을 병합하고 두 목록을 연결하는 것의 차이점은 둘 다 있습니다. O (n) 작업이지만 병합에는 O (n) 비교가 필요합니다. –
+1 나는 또한 (2) "거의 항상"더 좋다고 생각합니다. 병합은 요소 순서에 영향을받지 않으므로 소트가 기수와 기수와 같은 O (n)이 아닌 경우 작은 목록의 정렬이 일반적으로 도움이됩니다. –
아직 정렬되지 않았다면, 나는 그것들을 결합하고 단일 정렬을 수행 할 것입니다. 개별적으로 정렬 한 다음 병합 정렬을 수행하는 것이 더 효율적이라면 가장 효율적인 정렬 알고리즘은 임의로 두 가지로 목록을 분할하고 별도로 정렬하고 병합하는 방식으로 작성됩니다. 하지만 그건 사실이 아니야 ....
가장 효율적인 정렬 알고리즘 (mergesort, quicksort) *은 이와 같이 구축되었습니다. 예외는 힙합입니다. 어떤 알고리즘을 생각하고 있습니까? 삽입 정렬? 거의 정렬 된 데이터에서는 빠르지 만 최악의 경우 효율은 나쁘다 (O (n^2)). –
- 1. 거꾸로 상대 경로를 포함하여 두 경로를 결합해야합니까?
- 2. 두 테이블이 매우 비슷한 경우 언제 결합해야합니까?
- 3. "고정"두 벡터를 정렬하고 그들을
- 4. pthread를 분리하거나 결합해야합니까?
- 5. SVN 저장소에 두 개의 Eclipse 프로젝트가 있습니다. 어떻게 하나로 결합해야합니까?
- 6. 배열/목록을 정렬하고 android에서 결과를 반환하는 방법은 무엇입니까?
- 7. 20 개의 변수 목록을 정렬하고 상위 5 개를 선택하십시오.
- 8. 하나의 배열 목록을 정렬하고 자바에서 같은 순서로 다른 목록을 설정하는 방법
- 9. 일반 목록을 정렬하고 두 개의 이름이 항상 맨 위에 있고 나머지는 정렬되도록 허용
- 10. 두 개의 목록을 결합하여 정렬하고 중복을 제거해야합니다. 이 작업을 수행하는 더 좋은 방법이 있습니까?
- 11. "값"으로 목록을 정렬하고 "키"로 중복을 정렬하는 방법?
- 12. 나는 목록을 정렬하고 싶지만 내가 한 제품 클래스가
- 13. 알파벳순으로 정렬하고 그룹별로 표시
- 14. 두 목록을 병합
- 15. 개미 - 두 목록을 비교하십시오
- 16. 두 목록을 CSH에 결합하십시오.
- 17. 두 목록을 병합합니다.
- 18. COBOL 정렬되지 않은 두 파일을 정렬하고 병합하려면 어떻게합니까?
- 19. Python : 텍스트 파일을 두 번 정렬하고 다른 파일로 분할합니까?
- 20. matlab에서 한 열을 정렬하고 두 번째 열에서 해당 값을 유지하십시오.
- 21. Linq를 사용하여 개체를 일부 속성으로 정렬하고 처음 두 개체를 선택하십시오.
- 22. 내 PhoneGap 앱용으로 JS 파일을 축소하고 결합해야합니까?
- 23. Nginx와 비동기 프로그래밍 모델을 지원하는 언어를 결합해야합니까?
- 24. JavaScript minifier는 자동으로 var 선언을 결합해야합니까?
- 25. WCF 웹 서비스 구성 요소를 웹에 결합해야합니까?
- 26. 오라클에서이 3 가지 SQL 쿼리를 어떻게 결합해야합니까?
- 27. 일대 다 관계를 어떻게 (그리고 어디에서) 결합해야합니까?
- 28. Mysql : id DESC로 정렬하고 다른 열로 정렬하고 값을 무시하십시오. 0
- 29. ASP.Net DirectoryInfo 레코드를 정렬하고 필터링해야합니다.
- 30. Groovy는 두 개의 목록을 병합합니까?
왜 태그가 지정된 기계 학습입니까? – irrelephant
두리스트로 나누는 것이 가장 효율적인 정렬 알고리즘이 작동하는 방법입니다. – phs