একটি বিরতিতে দুটি সংখ্যার সর্বাধিক 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

এবং এর বাইনারি উপস্থাপনার দৈর্ঘ্য এ আমরা রৈখিক রানটাইম অর্জন করতে পারি :এল আরএনR

এবং এর বাইনারি উপস্থাপনায় উপসর্গ , যা উভয় মানের জন্য একই, উভয় মানের মধ্যে একই। সুতরাং এই বিট সর্বদা ।l r 0পিR0

যেহেতু , বিট এই উপসর্গ নিম্নলিখিত হতে হবে 1 মধ্যে R এবং 0 মধ্যে । তদ্ব্যতীত, সংখ্যাগুলি পি 10 এন - | পি | - 1 এবংboth উভয় বিরতিতে রয়েছে।R>1R0পি10এন-|পি|-1পি01এন-|পি|-1

সুতরাং আমরা সর্বাধিক সন্ধান করছি ।0|পি|1এন-|পি|


1
ঠিক আছে, এটা সহজ ছিল! আমার ধারণা এই সমস্যাটি আরও চিন্তা করা উচিত ছিল।
জ্যাকো নোটারস্টেফানো

থ্রেড স্টার্টার "সংখ্যায় চতুষ্কোণের চেয়ে ভাল" চেয়েছিলেন। এটি সংখ্যার আকারে লিনিয়ার, সুতরাং এটি সংখ্যায় লোগারিথমিক।
gnasher729

18

সময়ে এটি করা সম্ভব ।হে(লগR)

একটি বিরতি থেকে কোন দুটি পূর্ণসংখ্যার সর্বোচ্চ সম্ভব XOR যাও থেকে নির্ধারণ করা যেতে পারে অভিমানী , পূর্ণসংখ্যার যাবে। এই মানটি 2 পি - 1 এর সমান , যেখানে পি সবচেয়ে ছোট মান যেমন 2 পি l r এর চেয়ে বড় । [,R]R,R2পি-1পি2পিR

এখানে সি ++ তে একটি বাস্তবায়ন রয়েছে

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 প্রথম কেস: এমএসবি বিট উভয় মানের ক্ষেত্রেই সীমার জন্য সেট করা হয়নি f যদি এটি সর্বোচ্চ করতে চান তবে আমাদের যা করতে হবে তা হ'ল এমএসবি 5 (100) এর মতো রাখা এবং তার সম্পর্কে চিন্তা করা অবশিষ্ট নিম্ন বিট সর্বাধিক করা। যেহেতু আমরা জানি যে নিম্ন বিটগুলি সমস্ত ক্ষেত্রে এক হবে যখন সমস্ত কিছু 11 যা 3 বা 2 ^ 2-1 ছাড়া কিছুই নয়। যেহেতু সমস্যাটি 2 থেকে 5 এর মধ্যে পরিসীমা সম্পর্কে কথা বলছে আমরা অবশ্যই পরিসীমাটিতে 3 থাকি। সুতরাং আমাদের যা করতে হবে তা হ'ল 2 টি মানের বৃহত্তর সর্বোচ্চ এমএসবি সেটটি খুঁজে বের করতে হবে এবং নীচের বিটের জন্য বাকি 1 টি যুক্ত করতে হবে।

দ্বিতীয় কেস: এমএসবি ক্ষেত্রে উভয়ের মান নির্ধারণের ক্ষেত্রে নির্ধারিত জোড়র ক্ষেত্রে সেই বিটগুলি 0 হিসাবে নির্ধারিত হবে এবং আমাদের নিম্ন বিটগুলিতে ফিরে যেতে হবে। আবার কম বিটগুলির জন্য আমাদের প্রথম কেসের মতো একই যুক্তি পুনরাবৃত্তি করতে হবে। উদাহরণস্বরূপ: (10, 12) (1010, 1100) আপনি উভয়ই এমএসবি 1 টি হিসাবে দেখতে পাচ্ছেন তাই আমাদের নীচের বিটগুলিতে ফিরে যেতে হবে যা 010 এবং 100. এখন এই সমস্যাটি প্রথম ক্ষেত্রে হিসাবে একই।

এটি কোড করার বিভিন্ন উপায় রয়েছে। আমি যা করেছি তা হল 'ছোট' এবং 'উচ্চ' এর মধ্যে কেবল জোর করা এবং এটি 'ছোট' এবং 'উচ্চ' উভয়ের এমএসবি বিট সেট থাকলে এমএসবি বিটটি সরিয়ে ফেলবে। যদি না হয় তবে এটি এমএসবি বিট সংরক্ষণ করবে। এর পরে আমি এক্সরেড আউটপুটে সর্বাধিক 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 এবং r এর XOR ব্যবহার করতে পারেন ।

ধরুন, l = 4 এবং r = 6।

l = 100, r = 110 (এই সংখ্যার বাইনারি সমতুল্য)

l⊕r = 0 10

এর অর্থ কী, আপনি যে সর্বাধিক মানটির সন্ধান করছেন তা অবশ্যই তার প্রথম বিট (এমএসবি) শূন্য হিসাবে থাকবে। (এটা সম্পর্কে চিন্তা করুন, এটা এমনকি সম্ভব আপনার সর্বোচ্চ মান একটি আছে জন্য 1 পরিবর্তে প্রথম কিছুক্ষনের মধ্যে? যদি 01010 এবং 00101, XOR হতো = ছিল 01 111 অর্থাত সর্বোচ্চ। 01010 এবং 00101 মধ্যে মান স্পষ্টভাবে থাকবে বাম থেকে তাদের দ্বিতীয় বিটের একটি 1 , বাম থেকে দ্বিতীয় বিটের আগে বাম থেকে প্রথম বিটে একটি 1 পাওয়া সম্ভব নয় )

সুতরাং, সর্বাধিক সন্ধান করতে আপনার কাছে বাকি 2 বিট রয়েছে with আমরা জানি যে, যখন আমাদের সাথে এন বিট থাকে তখন সর্বাধিক সম্ভাব্য মান = 2 এন −1, সুতরাং এই ক্ষেত্রে উত্তরটি 2 2 -1 = 4-1 = 3 হবে।

উপরের উদাহরণ থেকে আমরা এর জন্য একটি সাধারণ অ্যালগরিদম তৈরি করতে পারি।

ধাপ 1 NUM = বিট সংখ্যা সর্বোচ্চ প্রতিনিধিত্ব করা প্রয়োজন ( , )

পদক্ষেপ 2. মাঝামাঝি = R

ধাপ 3 পিওএস = প্রথম-বিট অবস্থান থেকে সেট করা হয় যে, বাম মাঝামাঝি (0 ভিত্তিক ইন্ডেক্স)

ধাপ 4 = NUM - পিওএস

পদক্ষেপ 5. উত্তর = 2 এন −1

সময়ের জটিলতা = O (n)


-1

প্রতিটি বাইনারি ডিজিটের জন্য, 4 টি সম্ভাবনা রয়েছে: 1_ এবং_1, 1_ এবং_0, 0_ এবং_1 বা 0_ এবং_0। সম্ভাব্য নিম্ন সংখ্যাগুলি পরবর্তী অঙ্কের পছন্দ অনুযায়ী জোর আউটপুটে কোনও লগ বা অদৃশ্য-স্বল্প পার্থক্য তৈরি করে। সর্বোত্তম সম্ভাব্য অ্যালগরিদম হ'ল সমস্ত সংখ্যাকে উপেক্ষা করে কেবল উচ্চতর অঙ্কগুলি সম্পর্কে পূর্ববর্তী পছন্দগুলি দেওয়া পরবর্তী 2 টি উপলভ্য বিবেচনা করুন। যদি এটি 1_ এবং_1 বা 0_ এবং_0 হয় তবে পছন্দটি স্পষ্ট, তবে যদি এই অঙ্কটি 1_ এবং_0 বনাম 0_and_1 হয় (যার সমান জোর কিন্তু অসম মান থাকে) তবে পুনরাবৃত্তভাবে এটি https://en.wikedia.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 এর থেকে পৃথক হয়েছে (এছাড়াও তিনি কী ঘটছে তা ব্যাখ্যা করেছেন)? 'রিটার্ন বি' অঘোষিত 'বি' দিয়ে কী করবে? এবং দুঃখিত, তবে আপনি সরবরাহিত লিঙ্কটি আমি অ্যাক্সেস করতে পারি না।
এভিল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.