기수 정렬


23

기수 정렬에서는 먼저 최하위 자릿수를 기준으로 정렬 한 다음 두 번째 최하위 자릿수를 기준으로 정렬하고 정렬 된 목록으로 끝납니다.

이제 숫자 리스트가 있다면, 그 숫자를 구별하기 위해 log n 비트 가 필요합니다 . 따라서 우리가 만드는 기수 정렬 패스의 수는 log n 입니다. 각 패스 얻어 O ( N ) 시간 때문에 기수 정렬의 시간을 실행하는 것이다 O ( N 로그 N )nlognlognO(n)O(nlogn)

그러나 그것이 선형 시간 알고리즘이라는 것은 잘 알려져 있습니다. 왜?


그렇기 때문에 선형 시간 정렬에서는 일반적으로 입력이 고정 된 범위의 정수 여야합니다. 기수 정렬에는 숫자의 고정 범위가 필요합니다. 귀하의 예에서는 범위가 이라고 가정 했지만 숫자에 대해서는 모든 정수 범위가 가능합니다. 예를 들어 [ 0 , [0,1][0,n]
Joe

답변:


19

만약 우리가 숫자 리스트를 가지고 있다면 우리는 log n 비트 가 필요하다nlogn

아니요 : 2 k - 1 사이의 숫자 목록이 있으면 k 비트 가 필요합니다 . klog n 사이 에는 일반적으로 관계가 없습니다 .02k1kklogn

숫자가 모두 고유 한 경우 이고 고유 한 숫자의 기수 정렬은 시간 복잡도가 Ω ( n log n ) 입니다. 일반적으로 기수 정렬의 복잡성은 Θ ( nlognkΩ(nlogn) 여기서 N 정렬에 요소의 개수 (K)는 각 요소의 비트 수이다.Θ(nk)nk

기수 정렬의 복잡성이 말하면 숫자에 대해 고정 비트 크기를 취하는 것을 의미합니다. 이것은 충분히 큰 n 에 대해 많은 중복 값 이 있음을 의미 합니다.O(n)n


최악의 경우 한 번에 두 요소를 비교하여 작동하는 배열 또는 목록 정렬 방법이 보다 더 빠르게 실행될 수 없다는 일반적인 정리가 있습니다 . 기수 정렬은 요소를 비교하여 작동하지 않지만 동일한 증명 방법이 작동합니다. 기수 정렬은 배열에 적용 할 순열을 결정하는 결정 프로세스입니다. 가 N ! 배열의 순열 및 기수 정렬은 이진 결정을 취합니다. 즉, 각 단계에서 두 요소를 교체할지 여부를 결정합니다. m 이진 결정 후 기수 정렬은 2 m 순열 중에서 결정할 수 있습니다 . n에 도달하려면 ! 가능한 순열은 다음과 같습니다.Θ(nlogn)n!m2mn! .mlog(n!)=Θ(nlogn)

위에서 언급하지 않은 증거의 가정은 요소가 다른 경우 알고리즘이 작동해야한다는 것입니다. 원소들이 모두 구별되지 않는다는 것이 선험적으로 알려진 경우, 잠재적 순열의 수는 전체 보다 작습니다 ! . k 비트 숫자를 정렬 할 때 n 2 k 일n 개의 개별 요소 를 가질 수 있습니다 . 이 경우 기수 정렬의 복잡성은 실제로 Ω ( n log n ) 입니다. 더 큰 n 값의 경우 기수 정렬이 Θ 보다 작은 복잡도를 갖는 방법을 설명하는 충돌이 있어야합니다 (n!knn2kΩ(nlogn)nN > 2 케이 .Θ(nlogn)n>2k


1
다른 관점은 워드-램 비용 모델의 관점입니다. 우리 기계는 일정한 시간 에 비트의 정수로 작업 할 수 있습니다 . ( w = 64 를 갖는 현재 기계들 ) 그러한 방식으로, 2 개의 w 버킷을 갖는 분배 분류의 한 단계 는 대응하는 어레이 요소에 직접 액세스함으로써 O ( 1 ) 시간 내에 수행 될 수있다 . 이런 식으로 기수 정렬은 각각 w = O ( log n ) 비트 의 n 정수에 대해 선형입니다 . ww=642wO(1)nw=O(logn)
Sebastian Sebastian

9

분석에주의하십시오 : 시간 에 정렬을 수행한다고 가정 하십니까? 이는 각 자릿수가 0 에서 k - 1 사이의 범위에 있기 때문에 숫자가 k 개의 가능한 값을 취할 수 있음을 의미합니다 . 안정적인 정렬 알고리즘이 필요하므로 계산 정렬을 선택할 수 있습니다. 카운팅 정렬은 Θ ( n + k ) 시간으로 실행됩니다 . 만약 K = O ( N ) 의 선형 시간 카운팅 정렬 실행.O(n)0k1kΘ(n+k)k=O(n)

각 문자열 또는 숫자에는 자리가 있습니다. 당신이 말했듯이, 당신은 그들에게 d 패스를합니다. 따라서 기수 정렬은 Θ ( d ( n + k ) ) 시간에 명확하게 실행됩니다 . 그러나 d 를 일정하고 k = O ( n )로 간주 하면 기수 정렬이 선형 시간으로 실행되는 것을 볼 수 있습니다.ddΘ(d(n+k))dk=O(n)


1
예를 들어, 범위의 정수를 정렬되어 있다고 가정 일부 N = O ( N D ) 상수 D . 그런 다음 범위 O ( n )의 O ( d ) 숫자를 각각 가질 수 있습니다 . [0,N1]N=O(nd)dO(d)O(n)
Joe

-2

가정 이 잘못되었다고 생각합니다. 16 진수와 같은 숫자로 기수 정렬을 수행 할 수 있습니다. 따라서 각 단계에서 숫자 배열을 16 개의 버킷 으로 분할합니다 .k=log2(n)16


6
big-O에 관한 한 log 16 n 사이에는 차이가 없습니다 . log2nlog16n
Rick Decker
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.