จำนวนรวมของคู่เรียงลำดับของตัวเลขในชุดของเป็น 2 จำนวนรวมของการเรียงลำดับของคู่ที่แตกต่างกันจำนวนเป็น 2 มันต้องใช้เวลาบิตเพื่อเป็นตัวแทนของคู่ได้รับคำสั่งของตัวเลขและถ้าคุณมีหนึ่งบิตน้อยกว่าคุณสามารถแสดงองค์ประกอบของพื้นที่ขึ้นไป2/2 จำนวนคู่ที่ไม่ได้สั่งแตกต่างกันนั้นมีจำนวนมากกว่าครึ่งของจำนวนคู่ที่สั่งซื้อเล็กน้อยดังนั้นคุณจึงไม่สามารถบันทึกเล็กน้อยในการเป็นตัวแทนได้ จำนวนคู่ที่ไม่ได้เรียงลำดับจะน้อยกว่าครึ่งเล็กน้อยดังนั้นคุณสามารถบันทึกได้เล็กน้อยN ( N + 1 ) / 2 N ( N - 1 ) / 2 2 ล็อก2 ( N ) = เข้าสู่ระบบ2 ( N 2 ) N 2 / 2NN(N+1)/2N(N−1)/22log2(N)=log2(N2)N2/2
สำหรับรูปแบบการปฏิบัติที่ง่ายต่อการคำนวณโดยที่เป็นพลังของ 2 คุณสามารถทำงานกับการแสดงค่าบิต ใช้ที่เป็นแฮคเกอร์ (ที่บิตพิเศษหรือ) ผู้ประกอบการ คู่สามารถกู้คืนจากทั้งหรือy) ตอนนี้เราจะค้นหาเคล็ดลับในการบันทึกหนึ่งบิตในส่วนที่สองและให้บทบาทสมมาตรกับและเพื่อไม่ให้คำสั่งซื้อคืนได้ ได้รับการ cardinality การคำนวณข้างต้นเรารู้ว่าโครงการนี้จะไม่ทำงานในกรณีที่ ya = x ⊕ y ⊕ { x , y } ( a , x ) ( a , y ) x y x = yNa=x⊕y⊕{x,y}(a,x)(a,y)xyx=y
ถ้ามีตำแหน่งบิตที่แตกต่างกันบ้าง ฉันจะเขียนสำหรับบิตของ TH (เช่น ) และเช่นเดียวกันสำหรับปีให้รับตำแหน่งบิตที่เล็กที่สุดที่และแตกต่างกัน:เป็นที่เล็กที่สุดเช่นว่าy_i เป็นเล็กที่สุดที่ : เราสามารถกู้จากได้ ให้เป็นหรือx ix≠yxix x = Σ ฉันx ฉัน2 ฉัน Y k x Y k ฉันx ฉัน ≠ Y ฉัน k ฉันฉัน = 1 k ขx Y k ข= Σ ฉัน< k x ฉัน2 ฉัน + Σ ฉัน> k x ฉัน2 i - 1 b = ∑ i < k yixx=∑ixi2iykxykixi≠yikiai=1kabxyด้วยการลบบิตที่ (เช่นหรือ ) - เพื่อให้ได้ส่วนการก่อสร้างที่รับถ้าและและเลือกถ้าและ 0 ใช้เพื่อใช้แทนของคู่ คู่เดิมสามารถกู้คืนได้โดยคำนวณบิตลำดับต่ำสุดที่กำหนดใน , แทรก 0 บิตที่ตำแหน่งนี้ใน (ให้ผลตอบแทนหนึ่งในหรือ ) และรับ xor ของตัวเลขนั้นด้วยkb=∑i<kxi2i+∑i>kxi2i−1 x x k = 0 y k = 1 y x k = 1 y k = 0 ( a , b ) a b x y ab=∑i<kyi2i+∑i>kyi2i−1xxk=0yk=1yxk=1yk=0(a,b)abxya (ให้ผลองค์ประกอบอื่น ๆ ของคู่)
ในการแทนค่านี้สามารถเป็นจำนวนที่ไม่ใช่ศูนย์ใด ๆ และสามารถเป็นตัวเลขใด ๆ ที่มีครึ่งหนึ่งของช่วง นี่คือการตรวจสุขภาพจิต: เราได้รับจำนวนที่คาดหวังของการเป็นตัวแทนของคู่ที่ไม่มีลำดับขab
ใน pseudocode ด้วย^
, &
, |
, <<
, >>
, ~
เป็น C-เช่นผู้ประกอบการระดับบิต (xor และหรือซ้ายกะขวากะเติมเต็ม):
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)