기수 정렬의 실제 응용


20

기수 정렬은 키가 특정 제한된 범위에 있음을 알 때 이론적으로 매우 빠릅니다 (예 : 범위의 값) . 경우 시간 이 걸리는 기본 값을 변환하면 기본 기수 정렬을 수행 한 다음 전체 알고리즘 을 위해 원래 기본으로 다시 변환하십시오 .[0케이1]케이<lgΘ()Θ(케이)

그러나 실제로 기수 정렬은 일반적으로 무작위 퀵 정렬같은 것보다 훨씬 느리다는 것을 읽었습니다 .

대규모 배열의 경우 기수 정렬은 명령 수가 가장 적지 만 캐시 성능이 상대적으로 좋지 않기 때문에 전체 성능이 메모리 최적화 버전의 mergesort 및 quicksort보다 나쁩니다.

기수 정렬은 훌륭한 이론적 알고리즘입니까, 아니면 일반적인 실용적인 용도입니까?

답변:


15

기수 정렬은 실제로 병렬 시스템에서 가장 빠르고 가장 유용한 정렬입니다.

멀티 프로세서의 각 노드에서 빠른 정렬과 같은 작업을 수행 할 수 있지만 기수 정렬을 사용하면 여러 재귀 정렬보다 여러 노드가 덜 동기화되어 함께 작동 할 수 있습니다.

다른 상황들도 있습니다. 안정적인 정렬 이 필요하면 (두 키가 같을 때마다 재 배열되지 않고 동일한 순서로 정렬되는 정렬) 필요한 경우 사용할 퀵 정렬의 모든 버전을 알지 못합니다. Mergesort도 안정적입니다 (올바르게 구현 된 경우). 귀하의 링크는 내가 처음으로 mergesort가 기수 정렬보다 더 나은 캐시 동작을 갖도록 만들 수 있다고 말하는 것을 들었습니다.


Patterson과 Hennessy는 Lamarca의 저서 인 Computer Organization and Design에서 위의 링크 된 논문과 같은 점을 지적합니다.
Robert S. Barnes

Patterson에 대한 당신의 언급은 Andrea Arpaci-Dusseau가 약 15 년 전에 클러스터에서 분류하는 중요한 작업을 상기시켜주었습니다. (Patterson은 공동 저자였습니다). 1997 년 논문에서 그들은 부분적 기수 정렬이 개별 노드들에 대한 빠른 분류보다 선호된다고 실제로 결정했다. (답변에 참조를 추가했습니다).
방황 논리

그 흥미 롭군요. CompOrg 2009 년 제 4 판에서는 이전 버전의 Radix 정렬에 대한 Lamarca의 작업이 캐시에 우호적이지 않음 (489 페이지)을 참조한 다음 490 페이지의 Quicksort와 Radix 정렬을 비교 한 그래프에서 "이러한 결과로 인해 알고리즘의 이점을 되찾기 위해 메모리 계층 구조를 고려한 기수 정렬이 발명되었습니다. " 이 새로운 버전의 Radix Sort가 어떻게 작동하는지 궁금합니다.
Robert S. Barnes

Lamarca는 바보 같은 기수 종류 (버킷을 연결된 목록으로 유지하는 것)를 사용했다는 의혹이 있습니다. 최적화 된 동적 배열 (예 : C ++ 등 vector)을 사용하여 버킷을 구현합니다 . 그러나 나는 Lamarca의 논문을 읽지 않았기 때문에 모른다.
방황 논리

@WanderingLogic 기수 정렬은 버킷을 어디에 사용합니까? 여기서 버킷 정렬을 의미합니까?
Bar

3

@Robert : 귀하의 링크는 놀랍습니다 (실제로 인용 문장을 찾을 수 없습니다). 내 개인적인 경험은 무작위 입력이며 기수 정렬은 std::sort()퀵 정렬의 변형을 사용하는 STL보다 훨씬 빠릅니다 . std::sort()불안정한 기수 정렬 로 대체하여 알고리즘을 50 % 더 빠르게 만들었습니다 . Quicksort의 "메모리 최적화 버전"이 무엇인지 잘 모르겠지만 STL 버전보다 두 배 빠를 수는 없습니다.

이 블로그 게시물 은 다른 정렬 알고리즘과 함께 기수 정렬을 평가했습니다. 간단히 말해서,이 평가에서는 std::sort()5.1 초가 5 천만 개의 정수를 정렬하는 데 사용되고 제자리 / 불안정한 기수 정렬은 2.0 초가 걸립니다. 안정적인 기수 정렬은 훨씬 빠릅니다.

기수 정렬은 문자열을 안정적으로 정렬하는데도 널리 사용됩니다. 기수 정렬의 변형은 접미어 배열, BWT 등을 구성하기 위해 때때로 볼 수 있습니다.


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