bsort: A theoretically efficient non-comparison-based sorting algorithm for integer and floating-point numbers

이 논문은 정수와 부동소수점 숫자를 위한 이진 퀵소트에서 유래한 비비교 기반 정렬 알고리즘 'bsort'를 제안하며, 이는 작은 단어 크기의 데이터 유형에서 O(wn)O(wn) 시간 복잡도와 O(w)O(w) 보조 공간으로 실행되어 최적화된 하이브리드 알고리즘과 경쟁력 있는 성능을 보입니다.

Benjamín Guzmán

게시일 Wed, 11 Ma
📖 4 분 읽기☕ 가벼운 읽기

Each language version is independently generated for its own context, not a direct translation.

1. 기존 방식 vs 새로운 방식: "비교"의 함정

기존의 정렬 (비교 기반):
기존의 정렬 알고리즘들은 숫자들을 하나씩 서로 비교합니다. "A 가 B 보다 큰가? 아니야? 그럼 C 와 비교해 봐." 하는 식입니다. 이는 마치 사람들이 줄을 설 때 서로의 키를 비교하며 자리를 바꾸는 상황과 같습니다.

  • 단점: 숫자가 너무 많으면 (예: 1 억 개), 비교 횟수가 기하급수적으로 늘어납니다. 이론상으로는 "최소 NlogNN \log N 번"의 비교가 필요하다고 알려져 있습니다.

bsort 의 방식 (비교가 아닌 비트 조작):
bsort 는 숫자들을 서로 비교하지 않습니다. 대신, 숫자를 구성하는 **이진수 (0 과 1 의 나열)**를 한 자릿수씩 살펴봅니다.

  • 비유: 이는 우편물을 분류하는 자동화 기계와 같습니다.
    • 1 단계: 우편물의 '우편번호 첫 자리'가 0 이면 왼쪽 창구, 1 이면 오른쪽 창구로 보냅니다. (비교하지 않고 바로 분류)
    • 2 단계: 왼쪽 창구로 간 우편물 중 '두 번째 자리'가 0 이면 다시 왼쪽, 1 이면 오른쪽으로 보냅니다.
    • 이 과정을 모든 자릿수만큼 반복하면, 우편물은 자연스럽게 오름차순으로 정렬됩니다.

2. bsort 의 핵심 특징: "한 번에 다 해결"

이 알고리즘은 **정수 (숫자)**뿐만 아니라 **부동 소수점 (소수점 포함 숫자)**도 모두 다룰 수 있습니다.

  • 부호 있는 숫자 (음수와 양수):
    • 기존 방식은 음수와 양수를 섞어두면 헷갈려 합니다. bsort 는 **가장 중요한 비트 (부호 비트)**를 먼저 확인합니다.
    • 비유: 우편물을 분류할 때, 먼저 "한국으로 가는 편지 (양수)"와 "미국으로 가는 편지 (음수)"를 완전히 분리합니다. 그 다음에 각 나라 안에서만 세부 주소를 분류하는 식입니다.
  • 소수점 (부동 소수점):
    • 소수점 숫자는 '부호', '지수 (크기)', '가수 (정밀도)'로 나뉩니다. bsort 는 이 세 가지를 순서대로 분류합니다.
    • 비유: 먼저 "음수/양수"를 나누고, 그다음 "크기 (지수)"를 보고, 마지막으로 "정밀한 값 (가수)"을 봅니다. 이렇게 하면 소수점 숫자도 완벽하게 정렬됩니다.

3. 성능 분석: 이론은 완벽하지만, 현실은 조금 다름

이 논문은 bsort 가 이론적으로 얼마나 빠른지 증명했지만, 실제 컴퓨터에서 실행했을 때의 결과도 솔직하게 공개했습니다.

✅ 이론적 장점 (마법의 상자)

  • 속도: 숫자의 자릿수 (w) 가 작을 때, 데이터 양 (n) 이 아무리 많아도 속도가 선형적으로만 느려집니다. 즉, 숫자가 10 배 늘어나도 정렬 시간도 10 배만 늘어난다는 뜻입니다.
  • 메모리: 별도의 큰 저장 공간을 필요로 하지 않고, 원본 데이터 안에서 바로 정렬합니다. (공간 효율성 100 점)

⚠️ 현실적 한계 (컴퓨터의 미세한 구조)

하지만 실제 컴퓨터 (CPU) 에서 실행해 보니, 이론만큼 완벽하지 않았습니다. 왜일까요?

  1. 예측 불가능한 분기 (Branch Misprediction):

    • 비유: 분류 기계가 "0 이면 왼쪽, 1 이면 오른쪽"이라고 할 때, 데이터가 무작위라면 기계는 매번 "어느 쪽으로 갈지" 예측을 잘못합니다. 기계가 멈추고 다시 생각해야 하므로 시간이 걸립니다.
    • 기존 알고리즘들은 이런 예측 실패를 줄이도록 설계되어 있습니다.
  2. 재귀 호출의 비용 (Stack Pollution):

    • bsort 는 문제를 해결할 때마다 스스로를 반복해서 부릅니다 (재귀).
    • 비유: 우편물을 분류할 때, 분류할 때마다 **새로운 작업 공간 (스택)**을 만들어서 사용하는 것입니다. 데이터가 많으면 이 작업 공간이 너무 많아져서, 실제 우편물을 다루는 시간보다 공간을 정리하는 시간에 에너지를 더 쏟게 됩니다.
  3. 캐시 불일치 (Cache Miss):

    • CPU 는 자주 쓰는 데이터를 작은 메모리 (캐시) 에 저장해 둡니다. bsort 는 데이터를 너무 자주 뒤섞어서, CPU 가 자주 쓰는 데이터를 캐시에서 잃어버리고 다시 찾아야 하는 경우가 많습니다.

4. 결론: 언제 쓸까?

  • 8 비트 같은 작은 숫자 (char 등): bsort 가 기존 방식보다 압도적으로 빠릅니다. 자릿수가 적어 재귀 호출이 적기 때문입니다.
  • 64 비트 같은 큰 숫자 (double 등): 이론적으로는 빠를 수 있지만, 위와 같은 컴퓨터 구조적 문제 때문에 기존의 잘 다듬어진 알고리즘 (Introsort 등) 과 비슷하거나 조금 느립니다.

🌟 요약

이 논문은 **"숫자를 비교하지 않고, 비트 (0 과 1) 를 하나씩 훑어내며 정렬하는 새로운 방법 (bsort)"**을 제안했습니다.

  • 장점: 메모리를 거의 쓰지 않고, 작은 숫자 정렬에 매우 빠릅니다.
  • 단점: 큰 숫자나 복잡한 데이터에서는 컴퓨터 하드웨어의 특성상 기존 방식보다 효율이 떨어질 수 있습니다.
  • 미래: 이 알고리즘의 핵심 아이디어는 훌륭하므로, 나중에 하드웨어에 맞춰 최적화 (예: SIMD 명령어 사용) 하면 더 강력한 무기가 될 것입니다.

결국 bsort 는 **"작은 데이터 정렬에는 최고의 마법 상자"**이지만, **"거대한 데이터 정렬에는 아직 다듬어야 할 부분"**이 있는 혁신적인 시도입니다.