তিনটি পূর্ণসংখ্যার সন্ধানের জন্য ব্রুট ফোর্স অনুসন্ধান ব্যতীত অন্য কোনও কার্যকর অ্যালগরিদম কি আছে?
হাঁ; আমরা ও (এন 2 ) সময়ে এটি সমাধান করতে পারি ! প্রথমে বিবেচনা করুন যে আপনার সমস্যাটিকে P
কিছুটা আলাদা উপায়ে সমানভাবে চিহ্নিত করা যেতে পারে যা "টার্গেট মান" এর প্রয়োজনীয়তা দূর করে:
মূল সমস্যা P
: একটি অ্যারের দেওয়া A
এর n
ইন্টিজার এবং একটি টার্গেট মান S
সেখান থেকে একটি 3-tuple বিদ্যমান A
যে অঙ্কের S
?
পরিবর্তিত সমস্যা P'
: একটি অ্যারের দেওয়া A
এর n
ইন্টিজার, নেই থেকে একটি 3-tuple বিদ্যমান A
শূন্য যে অঙ্কের?
লক্ষ্য করুন যে সমস্যার প্রতিটি সংস্করণ P'
থেকে P
আপনার এস / 3 বিয়োগ করে সমস্যার এই সংস্করণটি থেকে আপনি যেতে পারেন A
তবে এখন আর আপনার লক্ষ্য মানটির প্রয়োজন নেই।
স্পষ্টতই, আমরা যদি সহজভাবে সমস্ত 3 টি টিপল পরীক্ষা করি তবে আমরা O (n 3 ) এ সমস্যার সমাধান করব - এটি হ'ল ব্রুট ফোর্স বেসলাইন। এটা কি আরও ভাল করা সম্ভব? আমরা যদি কিছুটা স্মার্ট উপায়ে টিপলগুলি বাছাই করি?
প্রথমে আমরা অ্যারে বাছাই করতে কিছুটা সময় ব্যয় করি যা আমাদের ও (n লগ এন) এর প্রাথমিক জরিমানা ব্যয় করে। এখন আমরা এই অ্যালগরিদম কার্যকর করি:
for (i in 1..n-2) {
j = i+1 // Start right after i.
k = n // Start at the end of the array.
while (k >= j) {
// We got a match! All done.
if (A[i] + A[j] + A[k] == 0) return (A[i], A[j], A[k])
// We didn't match. Let's try to get a little closer:
// If the sum was too big, decrement k.
// If the sum was too small, increment j.
(A[i] + A[j] + A[k] > 0) ? k-- : j++
}
// When the while-loop finishes, j and k have passed each other and there's
// no more useful combinations that we can try with this i.
}
এই অ্যালগরিদম স্থাপন তিন পয়েন্টার, করে কাজ করে i
, j
এবং k
অ্যারের মধ্যে বিভিন্ন বিন্দুতে। i
শুরুতে শুরু হয় এবং ধীরে ধীরে শেষের দিকে কাজ করে। k
খুব শেষ উপাদান নির্দেশ করে। j
যেখানে i
শুরু হয়েছে নির্দেশ করে। আমরা পুনরাবৃত্তভাবে তাদের নিজ নিজ সূচকে উপাদানগুলি যোগ করার চেষ্টা করি এবং প্রতিবার নিম্নলিখিতগুলির মধ্যে একটি ঘটে:
- যোগফল ঠিক ঠিক! আমরা উত্তর খুঁজে পেয়েছি।
- যোগফল খুব সামান্য ছিল।
j
পরবর্তী বৃহত্তম নম্বরটি নির্বাচন করতে শেষের কাছাকাছি যান ।
- যোগফলটি খুব বড় ছিল।
k
পরবর্তী ক্ষুদ্রতম সংখ্যাটি নির্বাচন করতে শুরুতে আরও এগিয়ে যান ।
প্রতিটি জন্য i
, এর পয়েন্টার j
এবং k
ধীরে ধীরে একে অপরের কাছাকাছি যেতে হবে। শেষ পর্যন্ত তারা একে অপরকে পাস করবে এবং সেই মুহুর্তে আমাদের এর জন্য আর কিছু করার দরকার নেই i
, যেহেতু আমরা একই উপাদানগুলি সংশ্লেষ করব, কেবল একটি ভিন্ন ক্রমে। এই বিন্দু পরে, আমরা পরবর্তী চেষ্টা i
এবং পুনরাবৃত্তি।
অবশেষে, আমরা হয় দরকারী সম্ভাবনাগুলি নিঃশেষ করবো, বা আমরা সমাধানটি সন্ধান করব। আপনি দেখতে পাচ্ছেন যে এটি ও (এন 2 ) কারণ আমরা বাহ্যিক লুপ হে (এন) বার সম্পাদন করি এবং আমরা অভ্যন্তরীণ লুপ ও (এন) বারটি কার্যকর করি। আপনি যদি প্রতিটি পূর্ণসংখ্যাকে কিছুটা ভেক্টর হিসাবে উপস্থাপন করে এবং দ্রুত ফিউরিয়ার রূপান্তর সম্পাদন করে সত্যই অভিনব হন তবে এই উপ-চতুর্ভুজটি করা সম্ভব, তবে এটি এই উত্তরটির বাইরে নয়।
দ্রষ্টব্য: কারণ এটি একটি সাক্ষাত্কারের প্রশ্ন, আমি এখানে কিছুটা প্রতারণা করেছি: এই অ্যালগরিদম একই উপাদানটিকে একাধিকবার নির্বাচন করার অনুমতি দেয়। এটি হ'ল, (-1, -1, 2) একটি বৈধ সমাধান হবে, যেমন হবে (0, 0, 0)। এটি শিরোনামের উল্লেখ অনুসারে নিকটতম উত্তর নয়, কেবল সঠিক উত্তরগুলি সন্ধান করে । পাঠকের অনুশীলন হিসাবে, আমি কীভাবে এটির জন্য আলাদা আলাদা উপাদান (তবে এটি একটি খুব সাধারণ পরিবর্তন) এবং সঠিক উত্তরগুলি (যা একটি সাধারণ পরিবর্তনও রয়েছে) দিয়ে কীভাবে এটি তৈরি করা যায় তা নির্ধারণ করতে দেব।