आदेश की अवहेलना करने वाले दो पूर्णांकों का अनुपालन


20

एक अनियोजित जोड़ी {x, y} (सेट) के लिए एक ऑर्डर की गई जोड़ी (x, y) की तुलना करें, तो सैद्धांतिक रूप से जानकारी, अंतर केवल एक बिट है, जैसे कि x पहले आता है या y को प्रतिनिधित्व करने के लिए बिल्कुल एक बिट की आवश्यकता होती है।

इसलिए, यदि हमें एक सेट {x, y} दिया जाए, जहां x, y दो भिन्न 32-बिट पूर्णांक हैं, तो क्या हम उन्हें 63 बिट्स (बल्कि 64) में पैक कर सकते हैं? 63 बिट परिणाम से मूल 32 बिट पूर्णांक को पुनर्प्राप्त करना संभव होना चाहिए, लेकिन उनके आदेश को पुनर्प्राप्त करने में सक्षम होने के बिना।

जवाबों:


27

हाँ, एक कर सकते हैं। यदि x<y , सेट के नक्शे {x,y} नंबर करने के लिए

f(x,y)=y(y1)/2+x.

यह दिखाना आसान है कि विशेषण है, और इसलिए यह विशिष्ट रूप से डिकोड किया जा सकता है। इसके अलावा, जब 0 एक्स < y < 2 32 , हमारे पास 0 ( एक्स , वाई ) < 2 63 - 2 31 तो इस सेट के नक्शे, { x , y } एक 63-बिट संख्या के लिए ( एक्स , वाई ) का है । डीकोड करने के लिए, आप y पर द्विआधारी खोज का उपयोग कर सकते हैं , या एक वर्गमूल ले सकते हैं: y लगभग can होना चाहिएf0x<y<2320f(x,y)<263231{x,y}f(x,y)yy2f(x,y)


1
जैसे 1 + 2 + 3 + ... + y + x अच्छा!
ट्रॉय मैकक्लेर

1
n अनियंत्रित ints को कोई सामान्यीकरण? :) दूसरे विचार पर, बड़े आंशिक आंशिक डेरिवेटिव के साथ कई चौपाइयां काम करेंगी
ट्रॉय मैकक्लेयर

4
एक और जवाब यह है कि इसकी कम अभिकलन लागत के लिए आकर्षक हो सकता है: यदि xऔर yया तो अलग हैं, तो x-y-1या y-x-1(दोनों आधुनिक , निश्चित रूप से) 31 बिट में फिट। यदि छोटा है, तो समवर्ती और पिछले 31 बिट्स ; अन्यथा समवर्ती और पिछले 31 बिट्स । पहले 32 बिट्स को एक संख्या के रूप में और पहले 32 बिट्स, पिछले 31 बिट्स, और निरंतर 1 (मॉड 2 32 ) को दूसरे के रूप में जोड़कर दो संख्याओं को पुनर्प्राप्त करें । 232x-y-1yx-y-1xy-x-1232
डैनियल वैग्नर

1
आपकी विधि भी अधिक संख्याओं को जोड़ने के लिए अच्छी तरह से सामान्यीकृत करती है, क्योंकि पहली संख्या "बस वहाँ" है इसलिए चेन
ट्रॉय मैकक्लेर

4
@ डब्लू: क्या आप यह भी जोड़ सकते हैं कि आप इस प्रतिनिधित्व के साथ कैसे आए? अन्यथा ऐसा लगता है जैसे आपने इसे पतली हवा से बाहर निकाला।
मेहरदाद

9

DW के जवाब देने के लिए एक अतिरिक्त के रूप में, ध्यान दें कि यह एक विशेष मामले है मिश्रित संख्या प्रणाली है, जो दृढ़तापूर्वक की सख्ती से कम हो रही अनुक्रम नक्शे गैर नकारात्मक पूर्णांक कश्मीर > > 1 करने के लिए एन = k Σ मैं = 1 (मैंkck>>c1

N=i=1k(cii).

इस संख्या की एक सरल व्याख्या है। यदि हम इन अनुक्रमों को शाब्दिक रूप से आदेश देते हैं, तो छोटे अनुक्रमों की संख्या को गिनता है।N

डीकोड करने के लिए, बस को सबसे बड़ा मान निर्दिष्ट करें जैसे कि और decode को -बताए।ck(ckk)NN(ckk)(k1)


4

का एक सेट में संख्याओं का अव्यवस्थित जोड़े की कुल संख्या है । अलग-अलग संख्याओं के अनियोजित जोड़े की कुल संख्या । संख्याओं की एक जोड़ी का प्रतिनिधित्व करने के लिए बिट्स लेता है , और यदि आपके पास एक कम बिट है, तो आप तक के स्थान के तत्वों का प्रतिनिधित्व कर सकते हैं । अव्यवस्थित नहीं-आवश्यक-विशिष्ट जोड़े की संख्या आदेशित जोड़े की संख्या से आधे से थोड़ा अधिक है ताकि आप प्रतिनिधित्व में थोड़ा बचा न सकें; अनियोजित अलग-अलग जोड़े की संख्या आधे से थोड़ी कम है, इसलिए आप थोड़ा बचा सकते हैं।NN(N+1)/2N(N1)/22log2(N)=log2(N2)N2/2

एक व्यावहारिक योजना के लिए गणना करना आसान है, जिसमें 2 की शक्ति है, आप बिटवाइज़ प्रतिनिधित्व पर काम कर सकते हैं। लो जहां XOR (बिटवाइज़ अनन्य या) ऑपरेटर है। जोड़ी को या से पुनर्प्राप्त किया जा सकता है । अब हम दूसरे भाग में एक बिट को बचाने के लिए एक ट्रिक की तलाश करेंगे, और और को एक सममित भूमिका देंगे ताकि ऑर्डर वापस न मिले। उपरोक्त कार्डिनिटी गणना को देखते हुए, हम जानते हैं कि यह योजना उस मामले में काम नहीं करेगी जहांNa=xy{x,y}(a,x)(a,y)xyx=y

xyxiixx=ixi2iykxykixiyikiai=1kabxykb=i<kxi2i+i>kxi2i1b=i<kyi2i+i>kyi2i1xxk=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)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.