পূর্ববর্তী 65 বাইট সমাধান:
r->{for(int a,b=0,z,i=0;;b=a)if((a=b|1<<(z=r[i++]))==b)return z;}
নতুন সমাধান। 19 বাইট জন্য অন্তর্ভুক্ত করা হয়import java.math.*;
-8 বাইটস @ নেভায়েকে ধন্যবাদ
r->{int z,i=0;for(BigInteger c=BigInteger.ZERO;c.min(c=c.setBit(z=r[i++]))!=c;);return z;}
এটি অনলাইন চেষ্টা করুন!
সম্পাদন করা
আমার আসল প্রোগ্রামে অ্যালগরিদম ভাল ছিল, তবে ব্যবহৃত ডেটাটাইপের স্থির আকারের অর্থ দাঁড়ায় যে আকারটি একটি নির্দিষ্ট প্রান্তিকের উপরে গেলে এটি মোটামুটি দ্রুত ভেঙে যায়।
এটিকে সামঞ্জস্য করার জন্য প্রোগ্রামটির মেমরি সীমা বাড়ানোর জন্য আমি গণনায় ব্যবহৃত ডেটাটাইপ পরিবর্তন করেছি ( বা এর BigInteger
পরিবর্তে স্বেচ্ছাসেবী জন্য ব্যবহার করে )। যাইহোক, এটি এটিকে স্থান জটিলতা হিসাবে গণ্য করে কিনা তা বিতর্কযোগ্য করে তোলে ।int
long
O(1)
আমি আমার ব্যাখ্যাটি অক্ষত নীচে রেখে দেব, তবে আমি যুক্ত করতে চাই যে আমি এখন বিশ্বাস করি যে O(1)
কিছু অনুমান না করেই স্থান জটিলতা অর্জন করা অসম্ভব ।
প্রমাণ
N
যেমন একটি পূর্ণসংখ্যা হিসাবে সংজ্ঞায়িত করুন 2 <= N
।
আসুন S
একটি তালিকা এলোমেলো পূর্ণসংখ্যার প্রতিনিধিত্ব করে এমন একটি তালিকা [x{1}, ..., x{N}]
, যেখানে x{i}
সীমাবদ্ধতা রয়েছে 1 <= x{i} <= N
।
উপাদান তালিকাতে একবারে এই তালিকাটি পুনরাবৃত্তি করার জন্য প্রয়োজনীয় সময় জটিলতা (বিগ-ও স্বরলিপিতে) O(n)
প্রদত্ত চ্যালেঞ্জটি হ'ল তালিকার প্রথম নকল মান খুঁজে পাওয়া। আরও সুনির্দিষ্টভাবে, আমরা এটির মধ্যে প্রথম মানটির সন্ধান করছি S
তালিকার পূর্ববর্তী আইটেমটির সদৃশ।
আসুন p
এবং q
তালিকার দুটি উপাদানের অবস্থান যেমন p < q
এবং এটি x{p} == x{q}
। আমাদের চ্যালেঞ্জ q
এই শর্তগুলিকে সন্তুষ্টকারী সবচেয়ে ক্ষুদ্রতম সন্ধানে পরিণত হয় ।
এই সমস্যার স্পষ্ট দৃষ্টিভঙ্গি হ'ল এস এর মাধ্যমে পুনরাবৃত্তি হওয়া x{i}
এবং অন্য তালিকায় আমাদের উপস্থিত রয়েছে কিনা তা যাচাই করা T
: যদি x{i}
এটি উপস্থিত না থাকে তবে T
আমরা এটি সংরক্ষণ করি T
। যদি এর x{i}
মধ্যে বিদ্যমান থাকে T
তবে এটি প্রথম সদৃশ মান এবং তাই সবচেয়ে ছোট q
এবং এর মতো আমরা এটি ফিরিয়ে আনি। এই স্থান দক্ষতা হয় O(n)
।
সময়ের জটিলতা O(1)
বজায় রেখে স্পেস জটিলতা অর্জনের জন্য O(n)
, আমাদের প্রতিটি বস্তুর সম্পর্কে স্বতন্ত্র পরিমাণের একটি সীমিত পরিমাণে তালিকায় রাখতে হবে। এই কারণে, কোনও অ্যালগরিদম কেবলমাত্র সঞ্চালন করতে পারেO(1)
স্পেস জটিলতা হ'ল: 1. নির্দিষ্ট সীমাবদ্ধ ডেটাটাইপের জন্য সম্ভাব্য মানগুলির সর্বাধিক সংখ্যক সঞ্চয় করার জন্য প্রয়োজনীয় মেমরির সাথে সংশ্লিষ্ট একটি উচ্চতর বাউন্ড দেওয়া হয়। ২.এক একক অপরিবর্তনীয় ভেরিয়েবলের পুনরায় বরাদ্দকরণ জটিলতার সাথে গণনা করা হয় না, কেবলমাত্র ভেরিয়েবলের সংখ্যা (একাধিক ভেরিয়েবলের একটি তালিকা)। ৩. (অন্যান্য উত্তরের উপর ভিত্তি করে) তালিকাটি (বা কমপক্ষে, তালিকার উপাদানগুলি হ'ল) পরিবর্তনযোগ্য এবং তালিকার ডাটাবেটকে স্বাক্ষরিত পূর্ণসংখ্যা হিসাবে পূর্বনির্ধারিত হয়, তালিকায় আরও উপাদানগুলিতে পরিবর্তন আনতে দেওয়া হয় অতিরিক্ত মেমরি ব্যবহার না করে।
1 এবং 3 উভয়ই ডেটাটাইপ সম্পর্কে অনুমান এবং বিশদ প্রয়োজন, অন্যদিকে 2 এর প্রয়োজন কেবলমাত্র সেই ভেরিয়েবলের আকারের পরিবর্তে স্থানের জটিলতার গণনার জন্য ভেরিয়েবলের সংখ্যা বিবেচনা করা উচিত। যদি এই অনুমানগুলির কোনও গ্রহণ না করা হয় তবে O(n)
সময় জটিলতা এবং O(1)
স্থান জটিলতা উভয়ই অর্জন করা অসম্ভব ।
ব্যাখ্যা
হু ছেলে, এই একজন কিছুটা মস্তিষ্কের শক্তি চিন্তা করতে একটি বিব্রতকরভাবে দীর্ঘ সময় নিয়েছিল ।
সুতরাং, বোনাসের জন্য যাওয়া কঠিন। আমাদের দু'জনেরই পুরো তালিকাটি ঠিক একবারে পরিচালনা করতে হবে এবং অতিরিক্ত স্থানের জটিলতা ছাড়াই আমরা ইতিমধ্যে কোন মানগুলি পুনরুক্ত করেছি তা ট্র্যাক করতে হবে।
বিট ম্যানিপুলেশন সেই সমস্যাগুলি সমাধান করে। আমরা আমাদের O(1)
'স্টোরেজ', এক জোড়া পূর্ণসংখ্যার শুরু করি, তারপরে তালিকার মধ্য দিয়ে পুনরাবৃত্তি করি, বা আমাদের প্রথম পূর্ণসংখ্যার মধ্যে ith বিটটি আইএন-ইন করি এবং ফলাফলটি দ্বিতীয়টিতে সংরক্ষণ করি।
উদাহরণস্বরূপ, যদি আমাদের থাকে 1101
এবং আমরা এর সাথে একটি ওআর অপারেশন 10
করি তবে আমরা পাই 1111
। আমরা যদি অন্য একটি দিয়ে বা 10
করি তবে আমাদের এখনও আছে 1101
।
তবে, একবার আমরা OR ক্রিয়াকলাপটি সম্পাদন করে একই সংখ্যার সাথে সমাপ্ত হলে আমরা আমাদের সদৃশটি খুঁজে পেয়েছি। অ্যারেতে কোনও সদৃশ হওয়ার কারণে প্রোগ্রামটি চালু হয়ে যায় এবং একটি ব্যতিক্রম ছুঁড়ে দেয়।