연구 및 개발

이 웹 사이트는 귀하가 웹 사이트를 탐색하는 동안 귀하의 경험을 향상시키기 위해 쿠키를 사용합니다. 이 쿠키들 중에서 필요에 따라 분류 된 쿠키는 웹 사이트의 기본적인 기능을 수행하는 데 필수적이므로 브라우저에 저장됩니다. 또한이 웹 사이트의 사용 방식을 분석하고 이해하는 데 도움이되는 제 3 자 쿠키를 사용합니다. 이 쿠키는 귀하의 동의하에 만 브라우저에 저장됩니다. 이러한 쿠키를 거부 할 수도 있습니다. 이러한 쿠키 중 일부를 선택 해제하면 검색 환경에 영향을 미칠 수 있습니다.

H. Seward는 1954년 Harold H. Seward에 의해 처음 설명되었으며 컴퓨터 과학의 기초 기술로 남아 있습니다. 단순성 및 효율성은 학생 연령, 학년 또는 모의 스프레드로 인하여 인테거 데이터를 분류하는 것과 같은 작업을 위해 이상적입니다. 값 범위에 보조 저장 비율을 레버리지함으로써, 카운트는 O(n log n)를 낮춘 O(n + k) 시간을 달성하는 O(n + k)의 값 범위에 따라 계산합니다.

분류 작업

Counting Sort의 핵심 메커니즘은 straightforward입니다. 입력 배열에서 몇 번씩 값이 나타나는 것을 계산하고 각 요소의 최종 위치를 계산하는 것을 사용합니다. 이 과정은 세 가지 단계로 구성됩니다.

  1. Counting:] 의 크기 k (입력 값의 범위)의 계산 배열을 생성, 0으로 초기화. 입력 배열을 통해 이더레이트 및 각 값에 대한 계산을 증가.
  2. 컴퓨팅 접두사:] 인덱스의 각 원소가 있는 접두사 합 배열에 카운트 배열을 변환하여, 요소의 누적 수를 i와 동일하게 유지합니다. 이 단계는 정렬된 출력의 각 구분 값에 대한 시작 위치를 결정합니다.
  3. Placing 엘리먼트: 왼쪽에서 입력 배열을 가로지르며, 출력 배열에서 정확한 인덱스를 찾아 계산 배열을 사용하며, 그 자리에 자리 잡고 있습니다. 최종 출력은 입력의 정렬된 복사입니다.

알고리즘은 새로운 정렬 배열을 반환, 원래 변경되지 않은 떠나. ]in-place Counting Sort은 존재하지만 거의 사용 때문에 안정성 또는 공간 효율.

Step‐by‐Step 예제

배열을 정렬 고려 [4, 2, 2, 8, 3, 3, 1 값은 0에서 8.로 나타낸다.

  1. Count: 카운트 어레이 크기 9 (0–8) → [0,1,2,2,1,0,0,0,1]. (Index 1은 한번에, 인덱스 2 두 번, 인덱스 3 번, 인덱스 4 번, 인덱스 8 번.)
  2. 프리픽스 합계: 누적에 대한 변환 → [0,1,3,5,6,6,6,6,6]. 이제 각 값은 정렬 출력의 그 숫자에 대한 시작 위치를 알려줍니다.
  3. 출력: 끝에서 가로 원본 배열: 첫번째 요소 읽기는 1 → 위치 = count[1] - 1 = 0 → 출력[0]=1, decrement count[1]에서 0입니다. 다음은 3 → 위치 = count[3] - 1 = 4 → 출력[4]=3, count[3]=4입니다. 모든 요소가 배치될 때까지 계속. 최종 출력: [1,2,2,3,3,3,4]].

이 예제는 계산 분류가 완전히 비교를 피하는 방법을 설명하고, arithmetic 작업에 단독으로 의존.

협력기관

시간 복잡성

  • Best, Average, Worst Case:] O(n + k), n은 요소와 k의 수이며 입력 값의 범위입니다. k가 n에 작은 상대를 때 알고리즘은 선형 시간에 실행됩니다.
  • 비교 정렬에 비교: Quicksort와 Mergesort는 O(n log n) 평균 복잡성을 가지고 있다. n = 106 및 k = 1000, 계산 정렬 (≈ 1,001,000 작업)은 일반적인 O(n log n) 종류보다 약 13배 빠릅니다.

공간 복잡성

  • Primary: O(k)는 count array, O(n)을 출력 배열에 대한 배열을 위한 배열을 제공합니다. 이 메모리 오버헤드는 k가 크면 prohibitive(예: 1), k = 232)를 분류하는 32비트 정수를 할 수 있습니다.
  • 테이블 변형: 크기 n의 보조 출력 배열을 요구; 에서-place 변형은 안정성 희생 또는 복잡한 인덱스 조작을 사용.

사용시 카운트 정렬

Counting Sort은 다음과 같은 조건에서 가장 효과적입니다.

  • 입력은 정수 (또는 문자 또는 분리 범주와 같은 작은 정수 범위로 매핑 할 수있는 데이터)로 구성됩니다.
  • 범위 k는 n보다 크게 크지 않습니다. 엄지의 일반적인 규칙은 k ≤ O (n)입니다.
  • 메모리는 심각하게 변형되지 않습니다, 카운트 배열 및 출력 버퍼가 여분의 공간을 필요로하기 때문에.
  • 안정성은 요구됩니다 (예를들면, 다수 열쇠에 의해 분류). 표준 실시는 성분이 좌측에서 둘 때 안정되어 있습니다.

우수한 사용 사례는 분류 등급 (0–100), 연령 (0–120), 제품 카테고리 (최대 100 SKUs), 또는 ]Radix Sort]에 있는 하위 라틴으로 포함합니다.

제한 및 고려

그 속도에도 불구하고, 분류는 그 적용을 제한하는 단점을 가지고 있습니다.

  • Integer만: 은 직접 컨티셔널 정수로 변환되는 경우 부동점번호나 문자열을 정렬할 수 없습니다.
  • 대용량: k dwarfs n-for 예제, 1과 107 사이의 값으로 100개의 숫자를 정렬하면 몇 가지 요소만 분류하면서 엄청난 메모리를 소비합니다.
  • Non-adaptive: 카운트 정렬은 항상 전체 입력을 스캔하고 계산 배열을 구축해야, 심지어 데이터가 이미 분류 또는 거의 분류.
  • Negative 값: Standard Counting Sort은 비 부정적 인 정수를 가정합니다. 음을 처리하려면 최소한의 값을 빼기(범위 0에서 최대 분)으로 변경할 수 있습니다.

이러한 제한은 카운트링 분류는 범용 알고리즘에 대한 범용 교체가 아닌 전문 도구입니다.

관련 분류 알고리즘 비교

대 검색 Radix Sort

Radix Sort은 각 자리에서 안정된 정렬(수수수 정렬)을 사용하여 가장 중요한 점에서 숫자를 정렬하여 아이디어를 확장합니다. 계산하는 동안 전체 범위 k를 통과하는 한 패스에서 작동하면서 Radix Sort은 작은 자리수 범위 (예:베이스 256)를 통해 여러 패스를 수행하며, 큰 k에 대한 메모리 사용을 줄입니다. 예를 들어, 계산 정렬을 가진 32 비트 정수를 정렬하면 232 항목의 수 배열이 요구되며, Radas Sort은 8 비트를 통과해야하며, 4 비트를 통과해야 합니다.

검색어를 입력합니다. Bucket Sort

버킷 정렬은 버킷의 수와 각각 버킷을 개별적으로 정렬합니다 (문자 정렬으로 유지). 각 버킷 정렬의 특별한 경우로 볼 수 있습니다. 각 버킷 정렬은 단일 값에 해당합니다. 버킷 정렬은 균일하게 분산 된 부동점 데이터뿐만 아니라, 카운트 정렬은 정수 도메인에 제한됩니다.

안정된 계산 정렬 구현

안정성은 다른 키에서 동일한 요소의 상대적 순서를 보존하는 동안 한 키로 분류 할 때 중요합니다. 표준 계산 정렬 알고리즘은 출력 배치 루프가 왼쪽으로 입력 할 때 inherently 안정됩니다. 다음은 안정된 변종의 텍스트 개요입니다.

  1. Compute count array를 설명합니다.
  2. 접두사 합계로 변환 (각각 출력의 값의 위치).
  3. 역순으로 입력 배열을 결정합니다. 각 요소의 경우, 그 카운트에 의해 표시된 위치에 배치 한 다음 계산을 결정합니다.

우리는 끝에서 요소를 처리하기 때문에 주어진 값의 마지막 발생은 가장 높은 가능한 인덱스로 이동, 상대적인 순서 보존. 이 안정 버전은 각 손가락에 제대로 기능하기 위해 Radix Sort에 필수적입니다.

Practical 신청

  • 교육 등급 시스템: O(n) 시간에 시험 점수의 수백을 정렬합니다.
  • Bioinformatics: 알파벳 크기가 작을 때 정수 또는 DNA k-mer 주파수를 읽는 정수를 읽습니다 (A, C, G, T).
  • Database index maintenance: 메모리에 맞게 범위에 있는 고유한 정수 식별자를 정렬합니다.
  • Image processing: 를 분류하는 histogram bins 또는 색상의 intensities (0–255) 를 구축 할 때 테이블.
  • ]차이키로 분류: .NET 런타임은 작은 범위에 대한 정렬 정렬을 포함하여 알고리즘의 적응 혼합을 사용합니다.).

이론과 변형에 대한 자세한 내용은 와 같은 저자 참조를 참조:]과 ]GeeksforGeeks: Counting Sort. 다른 알고리즘과의 실제 비교는 Brilliant’s Counting Sort article에서 찾을 수 있습니다.

큰 범위에 대한 최적화 계산 정렬

k가 크지만 n도 크면, 순수 카운트 정렬은 메모리가 집중됩니다. 몇몇 최적화는 다음과 같습니다.

  • 압축된 비소: 사용값이 크지만, 특정 값의 숫자가 작을 때 연속적인 배열 대신 해시 맵을 사용합니다. 이 거래는 해시 오버 헤드에 대한 일정한 지수이지만 메모리 소비를 줄일 수 있습니다.
  • Hybrid 접근 방식: 다른 알고리즘과의 결합 분류. 예를 들어, 범위를 초과하는 경우 106, 숫자 범위를 작은 유지 기본으로 Radix Sort을 사용합니다.
  • ]In-place 변형: 일부 최적화는 출력 배열 없이 O(k)에 여분의 공간을 감소하지만, 일반적으로 안정성 희생하거나 위치를 찾아주기 위해 주기를 요구합니다.

관련 기사

Sorting Sorting Sorting Sorting integers는 값 범위가 소수점으로 소수점으로 나타날 때의 효율적인 알고리즘을 나타냅니다. O(n + k) 시간 복잡성 및 선형 성능은 등급 분류, Radix Sort subroutines 및 경계 정수 키와 같은 시나리오에서 확립 할 수 있습니다. 그러나 알고리즘의 의존은 정수 입력과 큰 범위에 대한 메모리 오버 헤드에 대한 의존도가 더 빠르지 않습니다. [LTC]Flowing Sorting Sorting [Flowing]:Flowing Counting Sorting Sorting [Flowing]:Flowing]:Flowing [Flowing]