Tổng số cặp số không có thứ tự trong một tập hợp là . Tổng số cặp số khác nhau không có thứ tự là . Phải mất bit để biểu diễn một cặp số theo thứ tự và nếu bạn có ít hơn một bit, bạn có thể biểu diễn các phần tử của khoảng trắng lên đến . Số lượng các cặp không nhất thiết không có thứ tự khác biệt nhiều hơn một nửa số lượng các cặp được đặt hàng để bạn không thể tiết kiệm một chút trong biểu diễn; số lượng các cặp khác biệt không có thứ tự là ít hơn một nửa, vì vậy bạn có thể tiết kiệm một chút.N ( N + 1 ) / 2 N ( N - 1 ) / 2 2 log 2 ( N ) = log 2 ( N 2 ) N 2 / 2NN(N+1)/2N(N−1)/22log2(N)=log2(N2)N2/2
Đối với sơ đồ thực tế dễ tính toán, với là lũy thừa 2, bạn có thể làm việc trên biểu diễn bitwise. Lấy trong đó là toán tử XOR (độc quyền bitwise hoặc). Cặp có thể được phục hồi từ hoặc . Bây giờ chúng ta sẽ tìm kiếm một mẹo để lưu một bit trong phần thứ hai và đưa ra vai trò đối xứng cho và để thứ tự không thể được phục hồi. Với tính toán cardinality ở trên, chúng ta biết sơ đồ này sẽ không hoạt động trong trường hợp .a = x ⊕ y ⊕ { x , y } ( a , x ) ( a , y ) x y x = yNa=x⊕y⊕{x,y}(a,x)(a,y)xyx=y
Nếu thì có một số vị trí bit mà chúng khác nhau. Tôi sẽ viết cho bit thứ của (tức là ) và tương tự cho . Đặt lấy vị trí bit nhỏ nhất trong đó và khác nhau: là nhỏ nhất sao cho . là nhỏ nhất sao cho : chúng ta có thể phục hồi từ . Đặt là hoặcx i i x x = ∑ i x i 2 ix≠yxiixx=∑ixi2ik x y k i x i ≠ y i k i một i = 1 k một b x y k b = Σ i < k x i 2 i + Σ i > k x i 2 i - 1 b =ykxykixi≠yikiai=1kabxyvới bit thứ bị xóa (tức là hoặc ) - để tạo đối xứng xây dựng, chọn nếu và và chọn nếu và . Sử dụng làm đại diện nhỏ gọn của cặp. Cặp ban đầu có thể được phục hồi bằng cách tính toán bit thứ tự thấp nhất được đặt trong , chèn 0 bit vào vị trí này trong (lấy một trong số hoặc ) và lấy xor của số đó vớikb=∑i<kxi2i+∑i>kxi2i−1b=∑i<kyi2i+∑i>kyi2i−1xxk=0yk=1yxk=1yk=0(a,b)abxya (mang lại yếu tố khác của cặp).
Trong biểu diễn này, có thể là bất kỳ số nào khác và có thể là bất kỳ số nào có một nửa phạm vi. Đây là một kiểm tra về sự tỉnh táo: chúng tôi nhận được chính xác số lượng đại diện dự kiến của các cặp không có thứ tự.ab
Trong giả, với ^
, &
, |
, <<
, >>
, ~
là C giống như toán tử Bitwise (xor, and, or, trái ca, ngay ca, bổ sung):
encode(x, y) =
let a = x ^ y
let k = lowest_set_bit_position(a)
let low_mask = (1 << k) - 1
let z = if x & (1 << k) = 0 then x else y
return (a, (z & low_mask) | (z & ~low_mask) >> 1)
decode(a, b) =
let k = lowest_set_bit_position(a)
let low_mask = (1 << k) - 1
let x = (b & low_mask) | ((b & ~low_mask) << 1)
return (x, a ^ x)