বহুবর্ষীয় সময় এবং সিউডোপলিয়োনমিয়াল সময়ের মধ্যে পার্থক্য বুঝতে, আমাদের "বহুবর্ষের সময়" অর্থ কী তা আনুষ্ঠানিক করে শুরু করা উচিত।
বহুবর্ষের জন্য সাধারণ স্বজ্ঞাততা হ'ল কিছু সময়ের জন্য "সময় ও (এন কে )"। উদাহরণস্বরূপ, সিলেকশন সাজানোর সময় ও (এন 2 ) সময়ে চলবে যা বহুপক্ষীয় সময়, যখন ব্রুট-ফোর্স সলিউশন টিএসপি সময় নেবে O (n · n!), যা বহু-সময় নয় isn't
এই রানটাইমগুলি সমস্ত কিছু পরিবর্তনশীল এনকে বোঝায় যা ইনপুটটির আকার ট্র্যাক করে। উদাহরণস্বরূপ, বাছাই অনুসারে, এন অ্যারের উপাদানের সংখ্যাকে বোঝায়, যখন টিএসপিতে এন গ্রাফের নোডের সংখ্যা বোঝায়। এই প্রসঙ্গে "এন" বলতে আসলে কী বোঝায় তার সংজ্ঞাটি মানীকরণের জন্য, সময়ের জটিলতার আনুষ্ঠানিক সংজ্ঞাটি সমস্যার "আকার" সংজ্ঞায়িত করে:
কোনও সমস্যার ইনপুটটির আকার হ'ল সেই ইনপুটটি লেখার জন্য প্রয়োজনীয় বিটের সংখ্যা।
উদাহরণস্বরূপ, যদি বাছাই করা অ্যালগরিদমের ইনপুটটি 32-বিট পূর্ণসংখ্যার অ্যারে হয় তবে ইনপুটটির আকার 32n হবে, যেখানে এন অ্যারেতে প্রবেশের সংখ্যা ries এন নোড এবং এম প্রান্ত সহ একটি গ্রাফের ইনপুটটি সমস্ত নোডের তালিকা হিসাবে অনুসরণ করা যেতে পারে এবং তারপরে সমস্ত প্রান্তের একটি তালিকা তৈরি করা যেতে পারে, যার জন্য Ω (n + m) বিট লাগবে।
এই সংজ্ঞাটি দেওয়া, বহুপদী সময়ের আনুষ্ঠানিক সংজ্ঞাটি নিম্নলিখিত:
কিছু ধ্রুবক কে-এর জন্য যদি রানটাইম O (x কে ) হয় তবে একটি অ্যালগরিদম বহুতল সময়ে চালিত হয় , যেখানে এক্স অ্যালগরিদমকে প্রদত্ত ইনপুট বিটের সংখ্যাকে বোঝায়।
গ্রাফ, তালিকা, গাছ ইত্যাদি প্রক্রিয়াকরণকারী অ্যালগরিদমগুলির সাথে কাজ করার সময়, এই সংজ্ঞাটি কমবেশি প্রচলিত সংজ্ঞাটির সাথে একমত হয়। উদাহরণস্বরূপ, ধরুন আপনার কাছে একটি বাছাই করা অ্যালগরিদম রয়েছে যা 32-বিট পূর্ণসংখ্যার অ্যারে সাজায়। আপনি যদি এটি করতে বাছাই বাছাইয়ের মতো কিছু ব্যবহার করেন তবে রানটাইম, অ্যারের ইনপুট উপাদানগুলির সংখ্যার ফাংশন হিসাবে ও (এন 2 ) হবে। কিন্তু এন, ইনপুট অ্যারেতে উপাদানের সংখ্যা, ইনপুট বিটের সংখ্যার সাথে কী মিলবে? পূর্বে উল্লিখিত হিসাবে, ইনপুট বিটের সংখ্যা হবে x = 32n। সুতরাং, আমরা যদি এন এর পরিবর্তে অ্যালগরিদমের রানটাইমটি এক্স এর পরিবর্তে প্রকাশ করি তবে আমরা পাই যে রানটাইমটি হে (এক্স 2 ), এবং সুতরাং অ্যালগরিদম বহু-কালীন সময়ে সঞ্চালিত হয়।
একইভাবে, ধরুন আপনি কোনও গ্রাফের উপর গভীরতা-প্রথম অনুসন্ধান করেন যা সময় O (m + n) নেয়, যেখানে গ্রাফের প্রান্তের সংখ্যা এবং n নোডের সংখ্যা। এটি প্রদত্ত ইনপুট বিটের সংখ্যার সাথে কীভাবে সম্পর্কিত? ঠিক আছে, আমরা যদি ধরে নিই যে ইনপুটটি সংলগ্ন তালিকা (সমস্ত নোড এবং প্রান্তের একটি তালিকা) হিসাবে নির্দিষ্ট করা হয়েছে, তবে পূর্বে উল্লিখিত হিসাবে ইনপুট বিটের সংখ্যা হবে x = x (এম + এন)। অতএব, রানটাইমটি ও (এক্স) হবে, সুতরাং অ্যালগরিদম বহুপদী সময়ে চলে।
জিনিসগুলি বিচ্ছিন্ন হয়ে যায়, তবে, যখন আমরা সংখ্যার উপর পরিচালিত অ্যালগরিদমগুলি নিয়ে কথা শুরু করি। আসুন পরীক্ষার সমস্যাটি বিবেচনা করা যাক যে কোনও সংখ্যা প্রধান কিনা। একটি নম্বর দেওয়া, আপনি নীচের আলগোরিদিম ব্যবহার করে এনটি প্রাইম কিনা তা পরীক্ষা করতে পারেন:
function isPrime(n):
for i from 2 to n - 1:
if (n mod i) = 0, return false
return true
সুতরাং এই কোড সময় জটিলতা কি? ভাল, যে অভ্যন্তরীণ লুপটি ও (এন) বার চালায় এবং প্রতিটি সময় এন মোড আই গণনা করার জন্য কিছু পরিমাণ কাজ করে (সত্যই রক্ষণশীল ওপরের আবদ্ধ হিসাবে, এটি অবশ্যই হে (এন 3 )) সময়ে করা যেতে পারে । সুতরাং, এই সামগ্রিক অ্যালগোরিদম সময় হে (এন 4 ) এ চলে এবং সম্ভবত আরও দ্রুত a
2004 সালে, তিন কম্পিউটার বিজ্ঞানী প্রাইমস নামে একটি গবেষণাপত্র প্রকাশ করেছেন পি -তে রয়েছে যে কোনও সংখ্যাটি প্রধান কিনা তা পরীক্ষার জন্য বহু-কালীন অ্যালগরিদম দিচ্ছেন। এটি একটি যুগান্তকারী ফলাফল হিসাবে বিবেচিত হয়েছিল। বড় চুক্তি কি তাই? আমাদের কি এর জন্য ইতিমধ্যে একটি বহুপাক্ষিক-সময়ের অ্যালগোরিদম নেই?
দুর্ভাগ্যক্রমে, আমরা না। মনে রাখবেন, সময় জটিলতার আনুষ্ঠানিক সংজ্ঞা ইনপুট বিটের সংখ্যার ফাংশন হিসাবে অ্যালগরিদমের জটিলতা সম্পর্কে কথা বলে । আমাদের অ্যালগরিদম সময় হে (এন 4 ) এ চলে, তবে ইনপুট বিটের সংখ্যার ফাংশন হিসাবে এটি কী? ভাল, সংখ্যা লিখতে O (লগ এন) বিট লাগে। সুতরাং, আমরা যদি x কে ইনপুট এন লিখতে প্রয়োজনীয় বিটের সংখ্যা হতে পারি, তবে এই অ্যালগরিদমের রানটাইমটি আসলে ও (2 4x ) হয়, যা x এর বহুবর্ষ নয় ।
এটি বহুপদী সময় এবং সিউডোপলিয়োনমিয়াল সময়ের মধ্যে পার্থক্যের হৃদয়। একদিকে, আমাদের অ্যালগরিদম হ'ল ও (এন 4 ), যা দেখতে বহুবর্ষের মতো দেখা যায়, অন্যদিকে বহুবর্ষের আনুষ্ঠানিক সংজ্ঞা অনুসারে, এটি বহু-কাল নয়।
অ্যালগরিদম কেন বহু-কালীন অ্যালগরিদম নয় এর জন্য অন্তর্দৃষ্টি পেতে, নিম্নলিখিতগুলি সম্পর্কে চিন্তা করুন। মনে করুন আমি চাই অ্যালগরিদমকে অনেক কাজ করতে হবে। যদি আমি এই জাতীয় একটি ইনপুট লিখি:
10001010101011
তারপর এটি কিছু সময় খারাপ-কেস পরিমাণ লাগবে, বলে T
, সম্পূর্ণ করার জন্য। আমি যদি এখন এই সংখ্যার শেষে একটি বিট যোগ করি :
100010101010111
রানটাইমটি এখন (সবচেয়ে খারাপ ক্ষেত্রে) 2 টি হবে। আমি আরও একটি বিট যোগ করে অ্যালগোরিদম যে পরিমাণ কাজ করি তার দ্বিগুণ করতে পারি!
একটি আলগোরিদিম সিউডোপলিনোমিয়াল সময়ে সঞ্চালিত হয় যদি রানটাইমটি উপস্থাপনের জন্য প্রয়োজনীয় বিটের সংখ্যার চেয়ে সংখ্যার চেয়ে ইনপুটটির সংখ্যাসূচক মানটিতে কিছু বহুবচন হয় । আমাদের প্রাইম টেস্টিং অ্যালগরিদম হল সিউডোপলিনোমিয়াল টাইম অ্যালগরিদম, যেহেতু এটি সময় হে (এন 4 ) এ চলে, তবে এটি বহু-কালীন অ্যালগরিদম নয় কারণ ইনপুটটি লেখার জন্য বিট x এর সংখ্যার ফাংশন হিসাবে রানটাইমটি ও (2 4x ) "প্রাইমস পি" থাকা কাগজটি যে কারণে গুরুত্বপূর্ণ ছিল তা ছিল তার রানটাইমটি ছিল (মোটামুটিভাবে) হে (লগ 12 এন), যা বিটের সংখ্যার ফাংশন হিসাবে ও (x 12 )।
সুতরাং কেন এই কি ব্যাপার? ঠিক আছে, আমাদের কাছে অনেকগুলি সিউডোপলিয়োনমিয়াল টাইম অ্যালগরিদম রয়েছে পূর্ণসংখ্যা পূর্ণসংখ্যার জন্য। যাইহোক, এই অ্যালগরিদমগুলি, প্রযুক্তিগতভাবে বলতে গেলে, ক্ষতিকারক-সময় অ্যালগরিদম। এটি ক্রিপ্টোগ্রাফির জন্য খুব দরকারী: আপনি যদি আরএসএ এনক্রিপশন ব্যবহার করতে চান তবে আপনার বিশ্বাস করতে হবে যে আমরা সহজেই সংখ্যাগুলি ফ্যাক্টর করতে পারি না। সংখ্যায় বিটের সংখ্যা বিশাল আকারে বাড়িয়ে (বলুন, 1024 বিট), আপনি সিউডোপলিনিমাল-টাইম ফ্যাক্টরিং অ্যালগরিদমকে এত বেশি পরিমাণে গ্রহণ করতে পারেন যে এটি ফ্যাক্টরটি সম্পূর্ণরূপে এবং একেবারে অপরিহার্য হতে পারে নম্বর। অন্যদিকে, আমরা যদি একটি বহু- কালীন ফ্যাক্টরিং অ্যালগরিদম খুঁজে পাই তবে এটি অবশ্যই প্রয়োজন হয় না। আরও বিট যুক্ত করার ফলে কাজটি প্রচুর পরিমাণে বাড়তে পারে, তবে বৃদ্ধিটি কেবল বহুত্বীয় বৃদ্ধি হবে, তাত্পর্যপূর্ণ বৃদ্ধি নয়।
এটি বলেছিল যে অনেক ক্ষেত্রে সিউডোপলিনোমিয়াল টাইম অ্যালগরিদমগুলি পুরোপুরি ঠিক আছে কারণ সংখ্যার আকার খুব বেশি হবে না। উদাহরণস্বরূপ, গণনা সাজানোর রানটাইম ও (এন + ইউ) রয়েছে, যেখানে অ্যারের মধ্যে বৃহত্তম সংখ্যা ইউ। এটি সিউডোপলিনোমিয়াল সময় (কারণ ইউ এর সংখ্যাসূচক মানটির জন্য ও (লগ ইউ) বিটগুলি লিখতে হবে, সুতরাং রানটাইম ইনপুট আকারে সূচকযুক্ত)। আমরা যদি কৃত্রিমভাবে ইউ কে এমনভাবে আবদ্ধ করে রাখি যাতে ইউ খুব বড় না হয় (বলুন, যদি আমরা U কে 2 হতে পারি), তবে রানটাইমটি হ'ল (এন), যা আসলে বহুপক্ষীয় সময়। এভাবেই র্যাডিক্স সাজানো কাজ করে: একসাথে সংখ্যার প্রক্রিয়া করে প্রতিটি রাউন্ডের রানটাইম হ'ল (এন), সুতরাং সামগ্রিক রানটাইম হ'ল (এন লগ ইউ)। এটি আসলে হয় বহুপদী সময়, কারণ n সংখ্যা লিখতে বাছাই করতে numbers (n) বিট ব্যবহার করে এবং লগ ইউ এর মান অ্যারের সর্বাধিক মান লিখতে প্রয়োজনীয় বিটের সংখ্যার সাথে সরাসরি সমানুপাতিক।
আশাকরি এটা সাহায্য করবে!