এখানে একটি সহজ O(N)সমাধান যা O(N)স্থান ব্যবহার করে। আমি ধরে নিচ্ছি যে আমরা ইনপুট তালিকাটি অ-নেতিবাচক সংখ্যাগুলিতে সীমাবদ্ধ করছি এবং আমরা প্রথম অ-নেতিবাচক সংখ্যাটি খুঁজতে চাই যা তালিকায় নেই।
- তালিকার দৈর্ঘ্য সন্ধান করুন; যাক এটি হয়
N।
Nসকলের কাছে আরম্ভ করে বুলিয়ানগুলির একটি অ্যারে বরাদ্দ করুন false।
Xতালিকার প্রতিটি সংখ্যার জন্য , যদি এর Xচেয়ে কম হয় তবে অ্যারের উপাদানটি Nসেট করুন ।X'thtrue
- সূচক থেকে শুরু করে অ্যারের স্ক্যান করুন
0, এটি প্রথম উপাদানটির সন্ধান করুন false। আপনি যদি falseসূচকে প্রথমটি খুঁজে পান Iতবে Iতার উত্তর। অন্যথায় (অর্থাত্ যখন সমস্ত উপাদান থাকে true) উত্তরটি N।
বাস্তবে, "অ্যারে NBooleans" সম্ভবত একটি "বিটম্যাপ" বা "bitset" একটি হিসাবে প্রতিনিধিত্ব হিসাবে এনকোডেড হবে byteবা intঅ্যারে। এটি সাধারণত কম স্থান ব্যবহার করে (প্রোগ্রামিং ভাষার উপর নির্ভর করে) এবং প্রথমটির জন্য স্ক্যানটি falseআরও দ্রুত সম্পন্ন করার অনুমতি দেয় ।
এইভাবে / কেন অ্যালগোরিদম কাজ করে।
ধরুন যে তালিকার Nসংখ্যাগুলি পৃথক নয় বা তাদের এক বা একাধিকের চেয়ে বেশি N। এর অর্থ হল যে তালিকাতে নেই এমন ব্যাপ্তিতে কমপক্ষে একটি সংখ্যা থাকতে হবে 0 .. N - 1। সমস্যা ক্ষুদ্রতম অনুপস্থিত সংখ্যা অতএব ক্ষুদ্রতম অনুপস্থিত সংখ্যা খুঁজে বের করার সমস্যা কমাতে হবে এটি তাই কমN । এর অর্থ হ'ল আমাদের বৃহত্তর বা সমান সংখ্যার ট্র্যাক রাখতে Nহবে না ... কারণ সেগুলির উত্তর হবে না।
পূর্ববর্তী অনুচ্ছেদের বিকল্পটি হ'ল তালিকাগুলিটি সংখ্যার একটি ক্রমশক্তি 0 .. N - 1। এই ক্ষেত্রে, পদক্ষেপ 3 অ্যারের সমস্ত উপাদানকে সেট করে trueএবং চতুর্থ ধাপ আমাদের জানায় যে প্রথম "অনুপস্থিত" নম্বরটি রয়েছে N।
অ্যালগরিদমের গণ্য জটিলতা O(N)তুলনামূলক তুলনামূলকভাবে ছোট ধ্রুবক সহ। এটি তালিকার মধ্য দিয়ে দুটি লিনিয়ার পাস করে বা তালিকার দৈর্ঘ্য শুরু হওয়ার সাথে পরিচিত হলে কেবল একটি পাস করে। স্মৃতিতে পুরো তালিকাটি ধরে রাখার দরকার নেই, সুতরাং অ্যালগরিদমের অ্যাসিম্পটোটিক মেমরির ব্যবহার বুলিয়ানগুলির অ্যারের প্রতিনিধিত্ব করার জন্য যা প্রয়োজন; অর্থাত্ O(N)বিটস
(বিপরীতে, অ্যালগরিদমগুলি যা মেমোরি অনুসারে বাছাই বা বিভাজনের উপর নির্ভর করে আপনি ধরে রাখেন যে আপনি মেমরির মধ্যে পুরো তালিকাটি উপস্থাপন করতে পারেন the ফর্মটিতে প্রশ্নটি জিজ্ঞাসা করা হয়েছিল, এর জন্য প্রয়োজন O(N)64৪-বিট শব্দ require
@ জর্ন মন্তব্য করেছেন যে 1 থেকে 3 ধাপে ধাপগুলি গণনা বাছাইয়ের ক্ষেত্রে ভিন্নতা। এক অর্থে তিনি সঠিক, তবে পার্থক্যগুলি উল্লেখযোগ্য:
- একটি গণনা বাছাইয়ের জন্য (কমপক্ষে)
Xmax - Xminকাউন্টারগুলির একটি অ্যারে প্রয়োজন যেখানে Xmaxতালিকার বৃহত্তম সংখ্যা এবং তালিকার Xminসবচেয়ে ছোট সংখ্যা। প্রতিটি কাউন্টারে এন রাজ্যগুলির প্রতিনিধিত্ব করতে সক্ষম হতে হবে; অর্থাত্ বাইনারি উপস্থাপনা ধরে নিয়ে এটিতে একটি পূর্ণসংখ্যা টাইপ (কমপক্ষে) ceiling(log2(N))বিট থাকতে হবে।
- অ্যারের আকার নির্ধারণ করতে, একটি গণনা বাছাইয়ের জন্য নির্ধারণের জন্য তালিকার মধ্য দিয়ে একটি প্রাথমিক পাস করা প্রয়োজন
Xmaxএবং Xmin।
- সর্বনিম্ন সবচেয়ে খারাপ ক্ষেত্রে স্থান প্রয়োজন তাই
ceiling(log2(N)) * (Xmax - Xmin)বিট।
বিপরীতে, উপরে উপস্থাপিত অ্যালগরিদমের জন্য Nসবচেয়ে খারাপ এবং সেরা ক্ষেত্রে বিটগুলির প্রয়োজন ।
যাইহোক, এই বিশ্লেষণটি স্বজ্ঞাততার দিকে নিয়ে যায় যে অ্যালগরিদম যদি শূন্যের সন্ধানের জন্য তালিকার মধ্য দিয়ে প্রাথমিক পাস করে (এবং প্রয়োজনে তালিকার উপাদানগুলি গণনা করছে) তবে শূন্যটি পাওয়া গেলে এটি কোনও স্থান ব্যবহার না করে একটি দ্রুত উত্তর দেবে। তালিকায় কমপক্ষে একটি শূন্য খুঁজে পাওয়ার উচ্চ সম্ভাবনা থাকলে এটি অবশ্যই করা উচিত worth এবং এই অতিরিক্ত পাস সামগ্রিক জটিলতা পরিবর্তন করে না।
সম্পাদনা: আমি "বুলিয়ান্সের অ্যারে" ব্যবহার করার জন্য অ্যালগরিদমের বিবরণ পরিবর্তন করেছি যেহেতু লোকেরা বিট এবং বিটম্যাপগুলি বিভ্রান্ত হওয়ার জন্য দৃশ্যত আমার মূল বিবরণটি পেয়েছে।