미국 국기 종류
American flag sort미국 국기 분류는 품목을 버킷으로 분배하는 효율적이고 내부적인 라딕스 분류의 변형이다. radix sort와 American flag sort와 같은 비교 정렬 알고리즘은 일반적으로 문자열과 같은 큰 객체를 정렬하기 위해 사용되며, 비교는 단위 시간 연산이 아니다.[1] 미국 국기는 한 번에 각 물체의 여러 비트를 고려하여 물체의 비트를 통해 반복한다. 각 비트 집합에 대해 미국 국기 정렬은 두 개의 개체 배열을 통과한다. 첫째, 각 빈에 포함될 개체 수를 세는 방법, 둘째, 각 개체를 버킷에 배치하는 방법. 이것은 특히 256개의 버킷을 사용하여 한 번에 바이트를 정렬할 때 잘 작동한다. 일부 최적화에서는 큰 문자열 집합의 퀵소트보다 2배 빠르다.[1]
미국 국기 분류라는 명칭은 마지막 단계에서 네덜란드 국기 문제와 유사하게 나온 것이다: 배열을 많은 "스트라이프"로 효율적으로 분할하는 것이다.
알고리즘.
![]() | 이 글은 독자들에게 혼란스럽거나 불명확할 수 있다. 특히, (1) 미국 국기 분류는 일반적으로 문자열과 같은 큰 물체를 분류하는 데 사용되며, (2) 미국 국기 분류는 큰 문자열 집합의 퀵소트보다 두 배 빠르지만, 이 절에서는 미국 국기 분류는 정수만 분류할 수 있다고 기술하고 있다. 컴퓨터 메모리에 있는 모든 구체화 가능한 물체는 정수로 해석될 수 있기 때문에 "또는 정수로 해석될 수 있는 물체"라는 추가적인 설명은 상당히 의미가 없다. 에서 이에 대한 수 2020년 10월) (이 과 시기 |
일반적으로 알고리즘을 정렬하면 어떤 순서 체계에 따라 개체 목록이 정렬된다. 퀵소트와 같은 비교 기반 정렬 알고리즘과는 대조적으로, 미국 국기 정렬은 정수(또는 정수로 해석될 수 있는 개체)만 정렬할 수 있다. 미국 국기 정렬을 포함한 인플레이스 정렬 알고리즘은 원래 어레이에서 사용하는 메모리보다 훨씬 많은 메모리를 할당하지 않고 실행된다. 이는 메모리 절약과 어레이 복사를 절약할 수 있는 시간 절약 모두에서 중요한 이점이다.
미국 국기는 기본-N 표시의 첫 번째 자리(사용되는 기본을 라딕스라고 함)에 따라 연속적으로 물체 목록을 버킷으로 나누는 방식으로 작동한다. N이 3이면 네덜란드 국기 알고리즘을 사용하여 각 물체를 올바른 버킷으로 바꿀 수 있다. 그러나 N이 크면 각 버킷의 시작과 끝을 알 수 없기 때문에 물체를 즉시 제자리에 바꿀 수 없다. 미국 국기는 배열을 두 번 통과함으로써 이 문제를 해결한다. 첫 번째 패스는 각 N 버킷에 속하는 개체 수를 카운트한다. 각 버킷의 시작은 앞의 버킷의 크기의 합으로 계산된다. 두 번째 패스는 각 물체를 올바른 버킷에 넣는다.
미국 국기 분류는 값비싼 지수 대신 비트 변환 연산을 사용하여 각 자릿수의 값을 계산할 수 있기 때문에 2의 검정력인 라디스를 사용하는 것이 가장 효율적이다. ASCII와 같은 8비트 또는 7비트 인코딩을 사용하여 문자열을 정렬할 때는 문자순 정렬에 해당하는 256이나 128의 라디스를 사용하는 것이 일반적이다.[1]
성과 고려사항
순수한 영어 알파벳 텍스트의 경우 카운트 히스토그램이 항상 희박하다는 점에 주목할 필요가 있다. 하드웨어에 따라, (원문서와 같이) 버킷을 완성하는 것과 일치하여 계수를 삭제할 가치가 있을 수 있다. 또는 최대 및 최소 활성 버킷, 또는 희소성 어레이에 적합한 더 복잡한 데이터 구조를 유지할 가치가 있을 수 있다. 키가 매우 긴 접두사를 공유할 수 있는 병리학적 경우를 제외하고 매우 작은 데이터 집합에 대해 보다 기본적인 정렬 방법을 사용하는 것도 중요하다.
가장 중요한 것은, 이 알고리즘은 무작위 순열을 따르기 때문에, 대규모 데이터셋의 경우 특히 캐시 친화적이지 않다는 것이다.[2] k-way 병합 알고리즘과 연계하여 적합한 알고리즘이다.[citation needed] (원래 종이는 캐시 메모리가 공통적으로 사용되기 전에 작성되었다.)
가성음
각 자릿수 D: # 첫 번째 통과: 계산 카운트 <-- 개체 X의 계산 <- 0(Radix)>: 카운트[기본 Radix의 개체 X의 숫자 D] += 1 # 계산 버킷 오프셋 <-(카운트[0..i])>.Radix] # 객체를 어레이의 X 객체에 맞게 스왑: 각 버킷에 대해 오프셋[기본 Radix의 X 자리 D]에서 시작하는 버킷으로 X를 스왑한다: American_flag_sort(Bucket, Radix)
Python의 샘플 구현
Python 프로그래밍 언어로 작성된 이 예제는 2 이상의 모든 라디스에 대해 미국 국기를 분류한다. 설명의 단순성은 영리한 프로그래밍보다 선택되므로, 비트 이동 기술 대신 로그 기능을 사용한다.
반항하다 get_radix_val(x, 숫자를 매기다, 라딕스) -> 인트로: 돌아오다 인트로(마루를 깔다(x / 라딕스 ** 숫자를 매기다)) % 라딕스 반항하다 compute_offsets(a_list, 출발하다: 인트로, 종지부를 찍다: 인트로, 숫자를 매기다, 라딕스): 세다 = [0 을 위해 _ 에 범위(라딕스)] 을 위해 i 에 범위(출발하다, 종지부를 찍다): 발랄하게 하다 = get_radix_val(a_list[i], 숫자를 매기다, 라딕스) 세다[발랄하게 하다] += 1 상쇄하다 = [0 을 위해 _ 에 범위(라딕스)] 합계를 내다 = 0 을 위해 i 에 범위(라딕스): 상쇄하다[i] = 합계를 내다 합계를 내다 += 세다[i] 돌아오다 상쇄하다 반항하다 바꾸다(a_list, 상쇄하다, 출발하다: 인트로, 종지부를 찍다: 인트로, 숫자를 매기다, 라딕스) -> 없음: i = 출발하다 next_free = 베끼다(상쇄하다) cur_block = 0 하는 동안에 cur_block < 라딕스 - 1: 만일 i >= 출발하다 + 상쇄하다[cur_block + 1]: cur_block += 1 계속하다 radix_val = get_radix_val(a_list[i], 숫자를 매기다, 라딕스) 만일 radix_val == cur_block: i += 1 계속하다 스왑_토 = 출발하다 + next_free[radix_val] a_list[i], a_list[스왑_토] = a_list[스왑_토], a_list[i] next_free[radix_val] += 1 반항하다 american_buffer_buffer_buffer(a_list, 출발하다: 인트로, 종지부를 찍다: 인트로, 숫자를 매기다, 라딕스) -> 없음: 상쇄하다 = compute_offsets(a_list, 출발하다, 종지부를 찍다, 숫자를 매기다, 라딕스) 바꾸다(a_list, 상쇄하다, 출발하다, 종지부를 찍다, 숫자를 매기다, 라딕스) 만일 숫자를 매기다 == 0: 돌아오다 을 위해 i 에 범위(렌(상쇄하다) - 1): american_buffer_buffer_buffer(a_list, 상쇄하다[i], 상쇄하다[i + 1], 숫자를 매기다 - 1, 라딕스) 반항하다 american_buffer_buffer.(a_list, 라딕스) -> 없음: 을 위해 x 에 a_list: 주장하다 타자를 치다(x) == 인트로 max_val = 맥스.(a_list) max_숫자 = 인트로(마루를 깔다(통나무를 하다(max_val, 라딕스))) american_buffer_buffer_buffer(a_list, 0, 렌(a_list), max_숫자, 라딕스)
참고 항목
참조
- ^ a b c McIlroy, Peter M.; Bostic, Keith; McIlroy, M. Douglas (1993). "Engineering radix sort" (PDF). Computing Systems. 6 (1): 5–27.
- ^ "algorithm - In-Place Radix Sort". Stack Overflow. Retrieved 2020-10-18.