एक अंतराल में दो संख्याओं का अधिकतम XOR खोजना: क्या हम द्विघात से बेहतर कर सकते हैं?


14

lrmax(ij)li,jr

भोली एल्गोरिथ्म बस सभी संभावित जोड़े की जांच करता है; उदाहरण के लिए रूबी में हमारे पास होगा:

def max_xor(l, r)
  max = 0

  (l..r).each do |i|
    (i..r).each do |j|
      if (i ^ j > max)
        max = i ^ j
      end
    end
  end

  max
end

मुझे लगता है कि हम द्विघात से बेहतर कर सकते हैं। क्या इस समस्या के लिए एक बेहतर एल्गोरिदम है?


आप देना चाहिए jके माध्यम से चलाने i+1..rऔर iके माध्यम से चलाने l...r-1सटीक होना करने के लिए।
अहमत अल्प बाल्कन

जवाबों:


20

हम और के बाइनरी प्रतिनिधित्व की लंबाई में रैखिक रनटाइम प्राप्त कर सकते हैं :nlr

और के द्विआधारी प्रतिनिधित्व में उपसर्ग , जो दोनों मूल्यों के लिए समान है, उनके बीच सभी मूल्यों के लिए भी समान है। तो ये बिट्स हमेशा ।plr0

चूंकि , इस उपसर्ग का अनुसरण करने वाला बिट में और में । इसके अलावा, अंक और दोनों अंतराल में हैं।r>l1r0एलp10n|पी|1पी01n-|पी|-1

इसलिए हम जो अधिकतम खोज रहे हैं वह ।0|पी|1n-|पी|


1
खैर, यह आसान था! मुझे लगता है कि मुझे इस समस्या पर अधिक विचार करना चाहिए था।
जैकोपो नॉटर्स्टेफ़ानो

थ्रेड स्टार्टर ने "संख्याओं में द्विघात से बेहतर" के लिए कहा। यह संख्याओं के आकार में रैखिक है, इसलिए यह संख्याओं में लघुगणकीय है।
gnasher729

18

यह समय में करना संभव है ।हे(लॉगआर)

से एक अंतराल किसी भी दो पूर्णांकों की अधिकतम संभव XOR निर्धारित किया जा सकता से एल आर , यह मानते हुए एल ,[एल,आर]एलआर पूर्णांकों किया जाना है। यह मूल्य के बराबर है 2 पी - 1 , जहां पी छोटा मान ऐसी है कि 2 पी से भी बड़ा है एल आरएल,आर2पी-1पी2पीएलआर

यहाँ C ++ में एक कार्यान्वयन है

int maximumXOR(int l, int r) {
    int q = l ^ r, a = 1;
    while(q){
        q /= 2;
        a <<= 1;
    }
    return --a;
}

क्या आप इस एल्गोरिथ्म के पीछे की व्याख्या कर सकते हैं?
sk1pro99

यह वीडियो आपकी सहायता कर सकता है: youtube.com/watch?v=3j-ok4gMjXU
जैक किन्सेला

0

हमें 'छोटे' और 'उच्च' के बीच एक्सोर को अधिकतम करने की आवश्यकता है। तो आइए इसे समझने के लिए एक उदाहरण लेते हैं।

5 xor 2 = 101 xor 010 पहला मामला: MSB बिट रेंज में दोनों मानों के लिए सेट नहीं है। यदि हम इसे अधिकतम करना चाहते हैं, तो हमें जो करने की आवश्यकता है वह 5 (100) के MSB को रखने के लिए है और इसके बारे में सोचें शेष निचले बिट्स को अधिकतम करना। जैसा कि हम जानते हैं कि निचले बिट्स केस के लिए एक होंगे जब सब कुछ 11 होगा जो कि 3 यानी 2 ^ 2-1 के अलावा कुछ नहीं है। चूंकि समस्या 2 से 5 के बीच की सीमा के बारे में बात कर रही है इसलिए हमारे पास सीमा में 3 हैं। इसलिए हमें बस इतना करना है कि 2 मानों में से सबसे बड़े MSB सेट का पता लगाएं और निचले बिट्स के लिए शेष 1 को जोड़ें।

दूसरा मामला: जब केस के लिए MSB को दोनों रेंज के मानों के लिए सेट किया जाता है, तो xor डिफिंटरली उन बिट्स को 0 के रूप में सेट करेगा और हमें निचले बिट्स पर वापस जाने की आवश्यकता है। निचले बिट्स के लिए हमें पहले मामले के समान तर्क को दोहराने की आवश्यकता है। उदाहरण: (१०, १२) (१०१०, ११००) जैसा कि आप देख सकते हैं कि दोनों ने १ एमएसबी सेट १ के रूप में किया है, फिर हमें निचले बिट्स पर जाना है जो ०१० और १०० है। अब यह समस्या पहले मामले की तरह ही है।

इसे कोड करने के कई तरीके हैं। मैंने जो किया वह केवल 'छोटे' और 'उच्च' के बीच का एक्सआर करना है और यदि एमएसबी बिट में एमएसबी बिट सेट है तो एमएसबी बिट को हटा देगा। यह सुनिश्चित करें कि ऐसा नहीं है तो यह MSB बिट को संरक्षित करेगा। उसके बाद मैं एक्सोर्ड आउटपुट में 2 की अधिकतम शक्ति का पता लगाकर और 1 से घटाकर सभी निचले बिट्स 1 बनाने की कोशिश कर रहा हूं।

def range_xor_max(small, high):
  if small == high:
    return 0
  xor = small ^ high
  #how many power of 2 is present
  how_many_power_of_2 = math.log(xor, 2)
  #we need to make all one's below the highest set bit
  return 2**int(math.floor(how_many_power_of_2)+1) - 1

0

खैर, आप जवाब खोजने के लिए एल और आर के एक्सओआर का उपयोग कर सकते हैं ।

मान लीजिए, l = 4 और r = 6।

l = 100, r = 110 (इन संख्याओं के द्विआधारी समतुल्य)

lr = 0 10

इसका मतलब यह है कि आप जिस अधिकतम मूल्य की तलाश कर रहे हैं वह निश्चित रूप से शून्य के रूप में इसका पहला बिट (MSB) होगा। (इसके बारे में सोचो, क्या आपके 1 के बजाय 1 बिट में अधिकतम मूल्य होना संभव है ? यदि यह 01010 और 00101 था, तो xor = 01 111 होगा या अधिकतम होगा। 01010 और 00101 के बीच का मान निश्चित रूप से होगा। एक बाएं से उनके दूसरे बिट में , बाएं से दूसरे बिट से पहले 1 प्राप्त करना संभव नहीं है ( बाएं से पहले बिट में)

तो, आपको अधिकतम खोजने के लिए शेष 2 बिट्स के साथ छोड़ दिया जाता है। हम जानते हैं, कि हमारे साथ n बिट्स होने पर अधिकतम संभव मान = 2 n therefore1 है, इसलिए इस मामले में उत्तर 2 होगा 2 -1 = 4-1 = 3 होगा।

उपरोक्त उदाहरण से, हम इसके लिए एक सामान्य एल्गोरिदम बना सकते हैं।

चरण 1. संख्या = अधिकतम ( l , r) को दर्शाने के लिए आवश्यक बिट की संख्या )

चरण 2. रेस = एलआर

चरण 3. पॉस = पहले बिट की स्थिति जो रेस में बाईं ओर से सेट है (0-आधारित अनुक्रमण)

चरण 4. एन = संख्या - पॉज़

चरण 5. ans = 2 n .1

समय जटिलता = O (n)


-1

प्रत्येक बाइनरी अंक के लिए, 4 संभावनाएँ हैं: 1_and_1, 1_and_0, 0_and_1, या 0_and_0। अगले अंकों की पसंद के xor आउटपुट में संभावित निचले अंक कोई या लॉग-वेनिशियस-छोटा अंतर नहीं बनाते हैं। सर्वोत्तम संभव एल्गोरिथ्म सभी निचले अंकों को अनदेखा करना है और केवल अगले 2 avaiable पर विचार करना है, उच्च अंकों के बारे में पहले दिए गए विकल्प। यदि यह 1_and_1 या 0_and_0 है, तो विकल्प स्पष्ट है, लेकिन यदि यह अंक 1_and_0 बनाम 0_and_1 (जिसका समान xor लेकिन असमान मान है) तो पुनरावर्ती रूप से इसे https://en.wikipedia.org/wiki/Edit_distance एल्गोरिथ्म के बराबर होना चाहिए । लॉग स्क्वायर का सबसे खराब मामला।


1
मुझे यकीन नहीं है कि आप "कम अंक", "लॉग-गायब-छोटे" या "यह ... का अर्थ है ... लॉग स्क्वायर का सबसे खराब मामला है।" क्या आप स्पष्ट कर सकते हैं?
डेविड रिचरबी

-1

32-बिट अंतराल के लिए, मैं अभी O(1)हैकर रैंक के संपादकीय पर इस समाधान पर आया हूं । मुझे नहीं पता कि यह कैसे काम करता है, लेकिन यह काम करता है। (शायद कोई समझा सकता है कि यह क्यों काम करता है।)

def max_xor(L,R):
  v = L^R
  v |= v >> 1
  v |= v >> 2
  v |= v >> 4
  v |= v >> 8
  v |= v >> 16
  return b

स्रोत: https://www.hackerrank.com/challenges/maximizing-xor/editorial


2
आपका उत्तर (सुधार के बाद) ysb.4 से कैसे अलग है (इसके अलावा उन्होंने बताया कि क्या चल रहा है)? 'रिटर्न बी ’अघोषित? बी’ के साथ क्या करता है? और क्षमा करें, लेकिन मैं आपके द्वारा प्रदत्त लिंक तक नहीं पहुँच सकता।
ईविल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.