비트 기반 무작위 셔플: 바이너 셔플 알고리즘
바이너 셔플은 데이터 원소의 비트 표현을 이용해 순서를 재배열하는 O(N) 선형 시간 알고리즘이다. 무작위 수 생성기와 직접 결합하지 않고, 비트 스케줄을 파라미터화해 각 비트를 임의 순서로 적용함으로써 ‘무작위’한 분할을 만든다.
저자: William F. Gilreath
본 논문은 데이터 셔플링을 기존의 난수 생성기(PRNG)와 결합된 방식에서 독립적인 방법으로 전환하고자 한다. 저자는 셔플링을 “정렬의 논리적 역연산”으로 정의하고, 정렬이 데이터 원소 사이에 확정적인 순서 관계를 부여한다면 셔플링은 모든 원소 쌍에 대해 동등한 확률(0.5)로 ‘작다/크다’ 관계가 나타나는 확률적 과정이라고 설명한다. 이를 바탕으로 기존의 Fisher‑Yates, Knuth의 Algorithm M, Bays‑Durham 셔플 등은 난수 생성 단계와 결합돼 있다는 점을 비판한다.
새로운 접근법인 ‘바이너 셔플’은 데이터 원소를 이진 비트 스트림으로 본다. 각 원소는 고정 길이(M비트)로 표현되며, 이때 비트 스케줄이라는 파라미터가 정의된다. 비트 스케줄은 두 배열(비트 인덱스 배열과 기대값 배열)로 구성되며, 각 단계에서 어떤 비트를 검사하고 그 비트가 0인지 1인지에 따라 원소를 하위(sub‑array 0) 혹은 상위(sub‑array 1)로 배치한다. 비트가 스케줄에 정의된 기대값과 일치하면 현재 위치가 올바른 하위 배열에 남아 있고, 불일치하면 상위 배열에 있는 원소와 교환한다.
알고리즘은 재귀적으로 동작한다. 초기 호출은 전체 배열, 비트 인덱스 0, 비트 수 M을 전달한다. 재귀 단계에서는 (1) 종료 조건 검사 – 비트 인덱스가 M에 도달했거나 서브배열 크기가 1이면 반환, (2) 현재 비트 인덱스를 기준으로 전체 배열을 두 파트로 파티션, (3) 파티션이 끝난 뒤 각각의 서브배열에 대해 다음 비트 인덱스로 재귀 호출한다. 파티션 과정은 ‘선택 포인터’를 사용해 현재 하위 배열의 끝을 추적하고, 교환이 필요할 경우 상위 배열의 끝 포인터와 스와핑한다. 이렇게 하면 배열 경계가 서로 수렴할 때까지 모든 원소가 올바른 파티션에 배치된다.
시간 복잡도는 각 비트마다 전체 배열을 한 번씩 스캔하므로 O(M·N)이다. 일반적인 32‑bit 혹은 64‑bit 정수에서는 M이 상수이므로 실질적인 복잡도는 O(N)이다. 공간 복잡도는 제자리(in‑place) 알고리즘이므로 추가 메모리는 O(1)이다.
논문은 32‑bit 정수 배열을 예시로 들어, 비트 마스크 0x00000001을 사용해 8비트를 순차적으로 적용했을 때 최종 배열이
원본 논문
고화질 논문을 불러오는 중입니다...
댓글 및 학술 토론
Loading comments...
의견 남기기