ক্যাফের উজ্জ্বল উত্তর প্রতিটি নম্বর মুদ্রণ করে যা অ্যারে কে -1 বারে কে বার প্রদর্শিত হয়। এটি কার্যকর আচরণ, তবে প্রশ্নটি যুক্তিযুক্তভাবে প্রতিটি ডুপ্লিকেট কেবল একবার মুদ্রিত হওয়ার জন্য আহ্বান জানিয়েছে এবং তিনি লিনিয়ার সময় / ধ্রুবক স্পেস সীমা ছাড়াই এটি করার সম্ভাবনা সম্পর্কে জোর দেন। নিম্নলিখিত সিউডোকোডের সাহায্যে তার দ্বিতীয় লুপটি প্রতিস্থাপন করে এটি করা যেতে পারে:
for (i = 0; i < N; ++i) {
if (A[i] != i && A[A[i]] == A[i]) {
print A[i];
A[A[i]] = i;
}
}
এটি সেই সম্পত্তিটি শোষণ করে যে প্রথম লুপটি চলার পরে যদি কোনও মান m
একাধিকবার প্রদর্শিত হয় , তবে সেই উপস্থিতিগুলির মধ্যে একটির অবশ্যই সঠিক অবস্থানে থাকার নিশ্চয়তা রয়েছে A[m]
। আমরা যদি সাবধান হন তবে কোনও নকল ছাপানো হয়েছে কি না সে সম্পর্কে তথ্য সংরক্ষণের জন্য আমরা সেই "হোম" অবস্থানটি ব্যবহার করতে পারি।
ক্যাফের সংস্করণে, আমরা অ্যারের মধ্য দিয়ে যাচ্ছিলাম, তা A[i] != i
বোঝা গেল A[i]
এটি একটি সদৃশ। আমার সংস্করণে, আমি কিছুটা পৃথক আক্রমণকারী উপর নির্ভর করি: এর দ্বারা A[i] != i && A[A[i]] == A[i]
বোঝা যায় এটি A[i]
এমন একটি নকল যা আমরা আগে দেখিনি । (যদি আপনি "যা আমরা আগে দেখিনি" অংশটি ফেলে রাখেন তবে বাকীটিকে ক্যাফের আক্রমণকারী সত্যের দ্বারা বোঝানো যেতে পারে, এবং সমস্ত নকলের কোনও ঘরের কোনও কপি রয়েছে বলে গ্যারান্টি দেওয়া হয়)) এই সম্পত্তিটি এখানে রয়েছে শুরু (ক্যাফের 1 ম লুপ শেষ হওয়ার পরে) এবং আমি নীচে দেখাব যে এটি প্রতিটি পদক্ষেপের পরে রক্ষণাবেক্ষণ করা হচ্ছে।
যখন আমরা অ্যারের মধ্য দিয়ে যাব, A[i] != i
পরীক্ষার অংশে সাফল্য বোঝায় যে A[i]
এমন একটি নকল হতে পারে যা আগে দেখা যায় নি। যদি আমরা এটি আগে না দেখে থাকি, তবে আমরা A[i]
নিজের বাড়ির অবস্থানটি নিজের দিকে নির্দেশ করার প্রত্যাশা করি - যা if
শর্তের দ্বিতীয়ার্ধে পরীক্ষা করা হয়েছে । যদি তা কেস হয় তবে আমরা এটি মুদ্রণ করি এবং বাড়ির অবস্থানটিকে এই প্রথম পাওয়া নকলের দিকে ফিরে নির্দেশ দিয়ে একটি 2-পদক্ষেপ "চক্র" তৈরি করি।
এই অপারেশনটি আমাদের আক্রমণকারীকে পরিবর্তন করে না তা দেখতে, ধরুন সন্তোষজনক m = A[i]
কোনও নির্দিষ্ট অবস্থানের জন্য । এটা সুস্পষ্ট যে আমরা যে পরিবর্তনটি করেছি তা অন্য গৃহ-পরিস্থিতিকে নকল হিসাবে আউটপুট হিসাবে আটকানো থেকে তাদের অবস্থার ২ য় অর্ধেক ব্যর্থ হয়ে কাজ করবে, তবে বাড়ির লোকেশনে পৌঁছালে কী তা কার্যকর হবে ,? হ্যাঁ এটি হবে, কারণ এখন, যদিও এই নতুনটিতে আমরা দেখতে পেলাম যে শর্তের প্রথম অর্ধেক , সত্য, দ্বিতীয়ার্ধটি এটি পরীক্ষা করে যে অবস্থানটি কোনও বাড়ির অবস্থান কিনা এবং তা খুঁজে পাওয়া যায় কিনা তা পরীক্ষা করে। এ অবস্থায় আমরা আর কিনা জানি বা ডুপ্লিকেট মান ছিল, কিন্তু আমরা জানি যে উপায় হয়,i
A[i] != i && A[A[i]] == A[i]
A[A[i]] = i
m
if
i
m
i
if
A[i] != i
m
A[m]
এটি ইতিমধ্যে প্রতিবেদন করা হয়েছে , কারণ এই 2-চক্রটি ক্যাফের 1 ম লুপের ফলাফলটিতে উপস্থিত না হওয়ার গ্যারান্টিযুক্ত। (দ্রষ্টব্য যে যদি m != A[m]
ঠিক তখনই একটি হয় m
এবং A[m]
একাধিকবার ঘটে এবং অন্যটি ঘটে না))
a[a[i]]
প্রতিবন্ধকতাগুলি সমাধানটির জন্য কিছুটা ক্লু দেয় - প্রতিটি বৈধ অ্যারে মানটি এটিতে একটি বৈধ অ্যারে সূচক ইঙ্গিতও এবংswap()
অপারেশন- এ ও (1) স্থান সীমাবদ্ধতার ইঙ্গিতগুলি কী হিসাবে গুরুত্বপূর্ণ।