का एक सेट में संख्याओं का अव्यवस्थित जोड़े की कुल संख्या है । अलग-अलग संख्याओं के अनियोजित जोड़े की कुल संख्या । संख्याओं की एक जोड़ी का प्रतिनिधित्व करने के लिए बिट्स लेता है , और यदि आपके पास एक कम बिट है, तो आप तक के स्थान के तत्वों का प्रतिनिधित्व कर सकते हैं । अव्यवस्थित नहीं-आवश्यक-विशिष्ट जोड़े की संख्या आदेशित जोड़े की संख्या से आधे से थोड़ा अधिक है ताकि आप प्रतिनिधित्व में थोड़ा बचा न सकें; अनियोजित अलग-अलग जोड़े की संख्या आधे से थोड़ी कम है, इसलिए आप थोड़ा बचा सकते हैं।NN(N+1)/2N(N−1)/22log2(N)=log2(N2)N2/2
एक व्यावहारिक योजना के लिए गणना करना आसान है, जिसमें 2 की शक्ति है, आप बिटवाइज़ प्रतिनिधित्व पर काम कर सकते हैं। लो जहां XOR (बिटवाइज़ अनन्य या) ऑपरेटर है। जोड़ी को या से पुनर्प्राप्त किया जा सकता है । अब हम दूसरे भाग में एक बिट को बचाने के लिए एक ट्रिक की तलाश करेंगे, और और को एक सममित भूमिका देंगे ताकि ऑर्डर वापस न मिले। उपरोक्त कार्डिनिटी गणना को देखते हुए, हम जानते हैं कि यह योजना उस मामले में काम नहीं करेगी जहांNa=x⊕y⊕{x,y}(a,x)(a,y)xyx=y
x≠yxiixx=∑ixi2iykxykixi≠yikiai=1kabxykb=∑i<kxi2i+∑i>kxi2i−1b=∑i<kyi2i+∑i>kyi2i−1xxk=0yk=1yxk=1और । जोड़ी के कॉम्पैक्ट प्रतिनिधित्व के रूप में उपयोग करें । मूल जोड़ी को सबसे कम-क्रम बिट की गणना करके पुनर्प्राप्त किया जा सकता , जो कि इस स्थिति में ( या किसी एक को उत्पन्न करते हुए) में 0 बिट सम्मिलित करता है , और साथ उस संख्या के xor को ले रहा (दूसरे को उत्पन्न करता है) जोड़ी का तत्व)।yk=0(a,b)abxya
इस प्रतिनिधित्व में, भी गैर-संख्या संख्या हो सकती है, और आधी सीमा के साथ कोई भी संख्या हो सकती है। यह एक पवित्रता जांच है: हमें अनियोजित जोड़े के प्रतिनिधित्व की अपेक्षित संख्या प्राप्त होती है।ab
स्यूडोकोड में, के साथ ^
, &
, |
, <<
, >>
, ~
किया जा रहा है सी-तरह बिटवाइज़ ऑपरेटर्स (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)