This is a good article. Click here for more information.

정수 정렬

Integer sorting

컴퓨터 과학에서 정수 정렬정수 키로 데이터 값의 컬렉션을 정렬하는 알고리즘적인 문제다.정수 정렬을 위해 설계된 알고리즘은 키가 부동 소수점 번호, 합리적인 숫자 또는 텍스트 문자열인 정렬 문제에도 적용될 수 있다.[1]키에 정수 산술을 수행할 수 있는 능력은 컴퓨팅 모델에서 어떤 연산이 허용되는지, 정렬할 정수의 크기가 어느 정도인지에 따라 많은 경우 정수 정렬 알고리즘이 비교 정렬 알고리즘보다 빠를 수 있다.

비둘기홀 분류, 카운팅 분류, 라딕스 분류 등 정수 구분 알고리즘이 널리 사용되고 실용적이다.최악의 경우 시간 범위가 작은 다른 정수 정렬 알고리즘은 단어당 64비트 이하의 컴퓨터 아키텍처에 실용적이지 않다고 여겨진다.정렬할 항목의 수, 키당 비트 수, 정렬 알고리즘을 수행하는 컴퓨터의 워드당 비트 수 등의 조합에 따라 성능을 갖는 그러한 알고리즘이 많이 알려져 있다.

일반 고려사항

연산 모델

정수 정렬 알고리즘의 시간 범위는 일반적으로 정렬할 데이터 값의 n개, 정렬할 수 있는 가장 큰 키의 크기 K, 알고리즘이 수행될 컴퓨터의 단일 기계 워드로 나타낼 수 있는 비트 수 w의 세 가지 파라미터에 따라 달라진다.일반적으로 w log2(max(n, K)); 즉, 기계어는 입력 데이터 순서의 지수를 나타낼 만큼 충분히 크고, 또한 하나의 키를 나타낼 만큼 충분히 크다고 가정한다.[2]

정수 정렬 알고리즘은 보통 포인터 머신이나 컴퓨팅의 랜덤 액세스 머신 모델에서 작동하도록 설계된다.이 두 모델 사이의 주요 차이점은 메모리가 어떻게 다뤄질 수 있는지에 있다.랜덤 액세스 머신은 레지스터에 저장된 값을 메모리 읽기 및 쓰기 작업의 주소로 사용할 수 있도록 하며, 작동당 단가를 산출한다.이 기능은 테이블 조회를 사용하여 데이터에 대한 특정 복잡한 작업을 신속하게 구현할 수 있도록 한다.이와는 대조적으로 포인터 머신 모델에서는 읽기 및 쓰기 연산은 포인터에 저장된 주소를 사용하며, 이러한 포인터에는 산술 연산을 수행할 수 없다.두 모델 모두 데이터 값이 추가될 수 있으며, 비트 부울 연산과 이진 이동 연산을 연산당 단위 시간으로 수행할 수 있다.그러나 정수 구분 알고리즘은 정수 곱셈이 단위 시간 연산으로도 허용되는지 여부에 대해 서로 다른 가정을 한다.[3]병렬 랜덤 액세스 기계와 같은 다른 보다 전문화된 연산 모델도 코멘트에서 첫 번째 무작위화,[4] 두 번째 저지를 고려했다.[5] 이후의 작업에는 다음이 포함된다.

Andersson, Miltersen & Thorup(1999)은 어떤 경우에는 일부 정수 정렬 알고리즘이 요구하는 곱셈 또는 테이블 룩업이 하드웨어에서는 더 쉽게 구현되지만 범용 컴퓨터에서는 일반적으로 사용할 수 없는 사용자 지정 작업으로 대체될 수 있다는 것을 보여주었다.Thorup(2003)은 이러한 특수 작업을 펜티엄 프로세서에서 이미 사용할 수 있는 비트 필드 조작 지침으로 대체하는 방법을 보여줌으로써 이를 개선했다.

컴퓨팅의 외부 메모리 모델에서는 알려진 정수 정렬 알고리즘이 비교 정렬보다 빠르다.연구자들은 이러한 모델에서 키를 조작하는 방법이 제한된 알고리즘의 제한된 클래스는 비교 정렬보다 빠를 수 없으며,[7] 비교 정렬보다 빠른 정수 정렬 알고리즘은 네트워크 코딩에서 표준 추측의 거짓을 암시한다는 것을 보여주었다.[8]

정렬 대 정수 우선 순위 대기열

우선순위 대기열은 우선순위가 숫자인 항목의 컬렉션을 유지하기 위한 데이터 구조로, 우선순위 값이 최소인 항목을 찾고 제거하는 작업을 한다.이진 힙과 같은 비교 기반 우선 순위 대기열은 업데이트당 로그 시간이 걸리지만, 우선 순위가 작은 입력의 경우 van Emde Boas 트리 또는 버킷 대기열과 같은 다른 구조가 더 빠를 수 있다.이러한 데이터 구조는 선택 정렬 알고리즘에서 사용할 수 있으며, 이 알고리즘은 수집에서 가장 작은 원소를 반복적으로 찾아내어 제거하고, 원소를 발견된 순서대로 반환하여 원소 집합을 정렬한다.우선 순위 대기열은 이 알고리즘의 요소 컬렉션을 유지하기 위해 사용될 수 있으며, n 요소 컬렉션에서 이 알고리즘에 대한 시간은 우선 순위 대기열을 초기화한 다음 n개의 찾기 및 제거 작업을 수행하는 시간으로 제한될 수 있다.예를 들어 선택 정렬에서 이진 힙을 우선 순위 대기열로 사용하면 O(n log n) 시간이 걸리는 비교 정렬 알고리즘인 힙 정렬 알고리즘이 생성된다.대신 버킷 대기열과 함께 선택 정렬을 사용하면 비둘기구멍 정렬의 형태가 되고, 밴 엠드 보아스 트리나 다른 정수 우선 순위 큐를 사용하면 다른 빠른 정수 정렬 알고리즘이 나온다.[9]

정렬 알고리즘에서 정수 우선 순위 대기열을 사용하는 대신 다른 방향으로 이동할 수 있으며 정수 우선 순위 대기열 데이터 구조 내에서 정수 정렬 알고리즘을 서브루틴으로 사용할 수 있다.Thorup(2007)은 이 아이디어를 사용하여 키당 시간 T(n)로 정수 정렬을 수행할 수 있는 경우 우선순위 대기열 데이터 구조에서 삽입 또는 삭제 작업당 시간에 동일한 시간 바운드가 적용됨을 보여주었다.Thorup의 감소는 복잡하며 빠른 곱셈 작업이나 테이블 룩업의 가용성을 가정하지만, 시간 T(n) + T(log n) + T(log n) + T(log n) + ...을 가진 추가 및 부울 연산만을 사용하는 대체 우선 순위 대기열을 제공하기도 한다.최대 시간에 반복 로그가 곱한 작업당.[9]

사용성

비둘기구멍 분류, 계수 분류, 라딕스 분류의 고전적인 정수 분류 알고리즘이 널리 사용되고 실용적이다.[10]이후의 정수 구분 알고리즘에 대한 많은 연구는 실용성이 떨어지고 최악의 경우 분석의 이론적 향상에 더 초점을 맞추고 있으며, 실험 결과 이러한 필로폰의 일부가 나타났다고는 하지만, 이 연구 계열에서 나온 알고리즘은 현재의 64비트 컴퓨터 아키텍처에 실용적이지 않다고 생각된다.ods는 키당 128비트 이상의 데이터를 위한 radix 정렬의 개선일 수 있다.[11]또한, 대용량 데이터 세트의 경우, 메모리 계층구조를 염두에 두고 설계한 비교 정렬 알고리즘에 비해 많은 정수 정렬 알고리즘의 거의 무작위 메모리 액세스 패턴이 이를 손상시킬 수 있다.[12]

정수 정렬은 DARPA High Productivity Computing Systems 이산 수학 벤치마크 제품군의 6개 벤치마크 중 하나와 NAS 병렬 벤치마크 제품군의 11개 벤치마크 중 하나를 제공한다.[13]

실용 알고리즘

비둘기 구멍 정렬 또는 카운팅 정렬 모두 시간 O(n + K)에서 키가 0 ~ K - 1인 데이터 항목을 정렬할 수 있다.비둘기 구멍 정렬(흔히 버킷 정렬이라고 함)에서 데이터 항목에 대한 포인터가 연결된 목록과 같은 수집 데이터 유형으로 표현되는 버킷 테이블로 배포되며 키를 테이블의 인덱스로 사용한다.그런 다음 모든 버킷이 함께 연결되어 출력 목록을 형성한다.[14]카운트 정렬은 버킷 테이블 대신 카운터 테이블을 사용하여 각 키의 항목 수를 결정한다.그런 다음, 각 키를 가진 이 배치되어야 하는 정렬된 출력의 위치 범위를 결정하기 위해 접두사 합계 계산을 사용한다.마지막으로, 입력에 대한 두 번째 통과에서, 각 항목은 출력 배열에서 키의 위치로 이동된다.[15]두 알고리즘 모두 입력 데이터(타입 시간 O(n) 및 가능한 키 집합(타입 시간 O(K))에 대한 단순한 루프만 포함하며, O(n + K) 전체 시간 바인딩을 제공한다.

Radix sort는 데이터를 여러 번 통과함으로써 polyhole sort 또는 count sort보다 큰 키에 대해 작동하는 정렬 알고리즘이다.각 패스는 작은 키에만 적합한 다른 정렬 알고리즘(예: 비둘기 구멍 정렬 또는 카운팅 정렬)을 사용하여 키의 일부만 사용하여 입력을 정렬한다.키를 부분으로 나누기 위해, radix 정렬 알고리즘은 선택된 일부 라디스에 따라 각 키에 대한 위치 표기법을 계산한다. 그런 다음, 알고리즘의 ith 패스에 사용되는 키 부분은 전체 키의 위치 표기법에서 가장 유의하지 않은 숫자에서 시작하여 가장 유의한 숫자로 진척되는 ih 자릿수가 된다.이 알고리즘이 제대로 작동하려면 데이터를 통과하는 각 경로에 사용되는 정렬 알고리즘이 안정적이어야 하며, 숫자가 같은 항목이 서로 위치를 변경해서는 안 된다.효율성을 극대화하기 위해 데이터 항목 수 n에 근접하도록 라디스를 선택해야 한다.또한 radix로서 n에 가까운 두 개의 전력을 사용하여 각 패스의 키를 빠른 바이너리 이동과 마스크 작동만으로 빠르게 계산할 수 있다.이러한 선택사항과 함께, 그리고 비둘기구멍 정렬 또는 카운팅 정렬을 기본 알고리즘으로 하여, 라딕스 정렬 알고리즘은 시간 O(n logn K)에서 0 ~ K - 1 범위의 키를 가진 n개의 데이터 항목을 정렬할 수 있다.[16]

이론 알고리즘

많은 정수 정렬 알고리즘이 개발되었으며, 이론적 분석 결과 정렬할 항목의 수, 키의 범위 및 기계 단어 크기를 정의하는 매개변수의 충분히 큰 조합에 대해 비교 정렬, 비둘기 구멍 정렬 또는 라딕스 정렬보다 더 잘 동작하는 것으로 나타났다.어떤 알고리즘의 성능이 가장 좋은지는 이러한 파라미터의 값에 따라 달라진다.그러나 이러한 알고리즘은 이론적 이점에도 불구하고 실제 정렬 문제에서 발생하는 이러한 파라미터의 일반적인 범위에 대해서는 개선되지 않는다.[11]

작은 키에 대한 알고리즘

Van Emde Boas 트리는 각각 시간 O(n 로그 K)에서 0 ~ K - 1 범위의 n 키 집합을 정렬하기 위한 우선 순위 대기열로 사용할 수 있다.는 K가 충분히 클 때 라딕스 정렬에 비해 이론적으로 개선된 것이다.그러나 Van Emde Boas 트리를 사용하기 위해서는 K 단어의 직접 어드레싱 가능한 메모리가 필요하거나 해시 테이블을 사용하여 시뮬레이션이 필요하여 공간을 선형화하되 알고리즘을 랜덤화한다.유사한 성능(해시 테이블 형태의 무작위화 필요성 포함)을 가진 또 다른 우선 순위 대기열은 윌라드Y-fast trie(1983)이다.

비슷한 맛과 더 나은 이론적 성능을 가진 보다 정교한 기술은 커크패트릭&레이쉬(1984)에 의해 개발되었다.그들은 각 라딕스 정렬 패스는 선형 시간 내에 최대 키 크기를 n의 인수로 감소시키는 범위 감소 기법으로 해석될 수 있다고 보았다. 대신, 그들의 기술은 키 크기를 이전 값의 제곱근(키를 나타내기 위해 필요한 비트 수)으로 감소시킨다.라딕스 정렬에서와 같이, 그들은 키를 대략 K인 베이스 b의 두 자리 베이스-b 숫자로 해석한다.그런 다음, 대형이지만 초기화되지 않은 직접 주소 메모리 또는 해시 테이블을 사용하여 높은 숫자의 선형 시간에 따라 버킷으로 정렬할 항목을 그룹화한다.각 버킷에는 대표자, 가장 큰 키를 가진 항목이 있다. 그런 다음 대표자의 높은 자리와 비대표자의 낮은 자리 수를 키로 사용하여 항목 목록을 정렬한다.이 목록의 항목을 다시 버킷으로 그룹화하여 각 버킷을 정렬된 순서로 정렬할 수 있으며, 정렬된 목록에서 대표자를 추출하여 정렬된 순서로 버킷을 연결시킬 수 있다.따라서 선형 시간에는 정렬 문제가 이전 크기의 제곱근인 키가 훨씬 작은 또 다른 반복적 정렬 문제로 축소된다.키가 버킷 정렬을 할 수 있을 정도로 작을 때까지 이 범위 축소를 반복하면 실행 시간 O(nn 로그 K)가 있는 알고리즘으로 이어진다.

연산 RAM 모델에서 Han & Thorup(2002)의 복잡한 무작위화 알고리즘을 사용하면 이러한 시간 범위를 O(nlog log K)까지 더 줄일 수 있다.

큰 단어에 대한 알고리즘

정수 정렬 알고리즘은 로그 max(n, K)보다 유의하게 큰 단어 크기 w가 필요한 경우 비보수적이라고 한다.[17]극단적인 예로서 w k K와 모든 키가 구별되는 경우, 입력 키 중 하나일 때 1비트를 위치 i로 표시한 다음 반복적으로 최소 중요 비트를 제거하여 키 집합을 선형 시간으로 정렬할 수 있다.[18]

앨버스&헤거업(1997)의 비보수 포장 정렬 알고리즘은 켄 배쳐바이토닉 정렬 네트워크를 기반으로 하는 서브루틴을 사용하여 각각 하나의 기계 워드로 포장할 수 있을 정도로 짧은 두 개의 정렬된 키 시퀀스를 병합한다.한 단어당 한 개씩 저장된 항목의 순서인 포장 정렬 알고리즘에 대한 입력은 이 서브루틴을 반복적으로 사용하여 각 단어에 포장된 항목의 수를 두 배로 늘림으로써 각각 정렬된 여러 항목을 포함하는 일련의 단어인 포장된 형식으로 변환된다.일단 시퀀스가 포장된 형태로 되면 앨버스와 헤이거업에서는 병합된 형태의 정렬을 사용한다; 두 시퀀스가 하나의 긴 시퀀스를 형성하기 위해 병합될 때, 동일한 비토닉 정렬 서브루틴을 사용하여 두 시퀀스 중 가장 작은 나머지 요소로 구성된 포장된 단어를 반복적으로 추출할 수 있다.이 알고리즘은 하나의 단어가 Ω(log n log log n) 키를 포함할 수 있을 때마다, 즉, 로그 K log n log log n w cw를 어떤 상수 c > 0에 대해 포함할 수 있을 때, 그 입력을 선형 시간 내에 정렬할 수 있는 충분한 속도를 그것의 압축된 표현으로부터 얻는다.

소수의 항목에 대한 알고리즘

키 크기가 작을 때 모든 키를 구분하는 비둘기홀 정렬, 카운팅 정렬, 라딕스 정렬, Van Emde Boas 트리 정렬은 키 크기가 작을 때 가장 잘 작동한다.그러나 키 크기나 단어 크기가 항목 수에 비해 매우 클 때(또는 항목 수가 적을 때 동등하게) 큰 단어에 산술 연산을 수행할 수 있는 능력에 내재된 병렬성을 이용하는 다른 알고리즘을 사용하여 다시 빠르게 정렬할 수 있게 될 수 있다.

이러한 방향의 초기 결과는 아제타이, 프레드만, 콤플로스(1984)가 연산(알고리즘의 복잡성을 그것이 수행하는 메모리 액세스 수에 의해서만 측정되는 인공 모델)을 사용하여 제공했다.프레드만&윌러드(1994)는 랜덤 액세스 머신에서 구현 가능한 두 가지 데이터 구조인 Q-heap과 원자 힙을 설명했다.Q-heap은 바이너리 트라이의 비트 병렬 버전이며, O(log N)1/4 항목 집합에 대해 우선순위 대기열 작업과 후계자 및 선행 쿼리를 일정 시간 동안 수행할 수 있으며, 여기서 N 2w 데이터 구조를 구현하는 데 필요한 사전 계산된 테이블의 크기이다.원자성 힙은 각 트리 노드가 Q-heap으로 표시되는 B-tree로, (log N)O(1) 항목 집합에 대해 일정한 시간 우선 순위 대기열 작업(따라서 정렬)을 허용한다.

안데르손(알.(1998년)은 선형적인 시간에 2O((통나무 w)1/2− ε)항목의 세트의 시기에, 어떤 상수 ε 을을 구분;0허용하는 임의적인 알고리즘이라 불리는 서명 정렬을 제공한다.커크패트릭과 Reisch의 알고리즘처럼 기본 b에서 숫자로 b의 신중한 선택의 열쇠들의 표현을 사용하여 범위 감축을 수행하는그들의 범위 감소 알고리즘은 각각의 숫자를 시그니처로 대체하는데, 이것은 해시 값을 O(log n) 비트로 하여 서로 다른 디지트 값을 가진다.n이 충분히 작을 경우, 이 교체 과정에 의해 형성된 숫자는 원래 키보다 현저히 작아져 앨버스&헤거업(1997)의 비보수 포장 정렬 알고리즘이 교체된 숫자를 선형 시간으로 정렬할 수 있게 된다.교체된 숫자의 정렬된 리스트에서, 선형 시간 내에 의 압축된 삼위일체를 형성할 수 있으며, 트라이에 있는 각 노드의 자식은 b 크기의 키만을 사용하여 재귀적으로 정렬할 수 있으며, 그 후에 트리 횡단이 항목의 정렬 순서를 산출한다.

트랜스 다이코토머스 알고리즘

Fredman & Willard(1993)는 정수 키의 범위에 대해 아무것도 가정되지 않고 데이터 값 수의 함수만으로 알고리즘의 성능을 바인딩해야 하는 정수 정렬 알고리즘에 대한 트랜스 디코토머스 분석 모델을 도입했다.또는 이 모델에서, n개의 항목 집합에 대한 알고리즘의 실행 시간은 Kw의 가능한 값의 조합에 대한 최악의 실행 시간으로 가정한다.이러한 유형의 첫 번째 알고리즘은 Fredman과 Willard의 퓨전 트리 정렬 알고리즘으로, 시간 O(n log n / log n)로 실행되며, K와 w의 모든 선택에 대한 비교 정렬보다 개선된 것이다.무작위 번호와 정수 분할 연산의 사용을 포함하는 알고리즘의 대체 버전은 이를 O(nlog n)로 개선한다.

그들의 작업 이후, 훨씬 더 나은 알고리즘이 개발되었다.예를 들어 키들이 Albers-Hagerup 포장 정렬 알고리즘을 적용할 수 있을 정도로 작을 때까지 Kirkpatrick-Reisch 범위 감소 기법을 반복적으로 적용하면 시간 O(n log log n)로 정렬할 수 있지만, 이 알고리즘의 범위 감소 부분에는 큰 메모리(√K에 비례)나 적에 임의화가 필요하다.rm의 [19]해시 테이블

Han & Thorup(2002)은 무작위 시간 O(nlog log n)로 정렬하는 방법을 보여줬다.그들의 기술은 서명 정렬과 관련된 아이디어를 사용하여 데이터를 많은 작은 하위 목록으로 분할하는 것을 포함하는데, 서명 정렬이 각각의 하위 목록을 효율적으로 분류할 수 있을 만큼 충분히 작다.시간 O(n log log n)와 선형 공간에서 정수를 결정적으로 정렬하기 위해 유사한 아이디어를 사용하는 것도 가능하다.[20]단순한 산술 연산(승수 또는 테이블 룩업 없음)만 사용하면 임의의 예상 시간 O(n log log n)[21]로 정렬하거나 상수 for > 0에 대한 시간 O(n(log log n)1 + ε로 결정적으로 정렬할 수 있다.[1]

참조

각주
  1. ^ a b 한앤소럽(2002년).
  2. ^ 프레드만&윌러드(1993년).
  3. ^ 정수 곱셈 또는 테이블 조회 연산을 허용해야 하는지의 문제는 Fredman & Willard(1993)로 거슬러 올라간다. Andersson, Miltersen & Thorup(1999)도 참조한다.
  4. ^ 레이프(1985)
  5. ^ 콜 앤 비슈킨 (1986)
  6. ^ 하거업(1987년), 바트 외 연구진(1991년), 앨버스와 하거업(1997년).
  7. ^ Aggarwal & Vitter (1988년).
  8. ^ 파르하디 외(2020년).
  9. ^ a b 차우두리(2008년).
  10. ^ 매킬로이, 불가지론 & 매킬로이 (1993년), 앤더슨 & 닐슨 (1998년)
  11. ^ a b 라만&라만(1998년).
  12. ^ 페더슨(1999년).
  13. ^ DARPA HPCS 이산 수학 벤치마크, Duncan A.사우스캐롤라이나 대학의 부엘은 2011-04-20을 되찾았다.
  14. ^ Goodrich & Tamassia(2002년).비록 코멘 외는. (2001) 또한 이 정렬 알고리즘의 버전을 설명하며, 이들이 설명하는 버전은 정수 정렬이 아니라 키가 알려진 분포의 실제 숫자인 입력에 맞게 조정된다.
  15. ^ 코멘 외 (2001), 8.2 카운팅 정렬, 페이지 168–169.
  16. ^ 컴리(19291930), 코멘 (2001), 8.3 Radix Sort, 페이지 170–173.
  17. ^ Kirkpatrick & Reisch (1984); Albers & Hagerup (1997년).
  18. ^ 커크패트릭 & 레이쉬(1984년).
  19. ^ 앤더슨 연구진(1998)
  20. ^ 한모 씨(2004년).
  21. ^ 토럽(2002)
이차 출처
  • Chowdhury, Rezaul A. (2008), "Equivalence between priority queues and sorting", in Kao, Ming-Yang (ed.), Encyclopedia of Algorithms, Springer, pp. 278–281, ISBN 9780387307701.
  • Cormen, Thomas H.; Leiserson, Charles E.; Rivest, Ronald L.; Stein, Clifford (2001), Introduction to Algorithms (2nd ed.), MIT Press and McGraw-Hill, ISBN 0-262-03293-7.
  • Goodrich, Michael T.; Tamassia, Roberto (2002), "4.5 Bucket-Sort and Radix-Sort", Algorithm Design: Foundations, Analysis, and Internet Examples, John Wiley & Sons, pp. 241–243.
일차 출처