সিউডোপলিনমিয়াল সময় কী? এটি বহুবর্ষের সময় থেকে কীভাবে আলাদা?


100

সিউডোপলিনমিয়াল সময় কী ? এটি বহুবর্ষের সময় থেকে কীভাবে আলাদা? সিউডোপলিনোমিয়াল টাইমে চালিত কিছু অ্যালগরিদমগুলিতে ও (এনডাব্লু) ( 0/1 ন্যাপস্যাক সমস্যার জন্য ) বা ও ()n) ( ট্রায়াল বিভাগের জন্য) এর মতো রানটাইম রয়েছে ; কেন সেই বহুবর্ষ হিসাবে গণনা হয় না?


উত্তর:


253

বহুবর্ষীয় সময় এবং সিউডোপলিয়োনমিয়াল সময়ের মধ্যে পার্থক্য বুঝতে, আমাদের "বহুবর্ষের সময়" অর্থ কী তা আনুষ্ঠানিক করে শুরু করা উচিত।

বহুবর্ষের জন্য সাধারণ স্বজ্ঞাততা হ'ল কিছু সময়ের জন্য "সময় ও (এন কে )"। উদাহরণস্বরূপ, সিলেকশন সাজানোর সময় ও (এন 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) বিট ব্যবহার করে এবং লগ ইউ এর মান অ্যারের সর্বাধিক মান লিখতে প্রয়োজনীয় বিটের সংখ্যার সাথে সরাসরি সমানুপাতিক।

আশাকরি এটা সাহায্য করবে!



4
কেন isPrimeএর জটিলতা O (n ^ 4) হিসাবে অনুমান করা হয় এবং কেবল ও (এন) নয়? আমি পাই না। এর জটিলতা না থাকলে n mod iও (এন ^ 3) .... যা অবশ্যই তা নয়।
Fons

4
@ নোবডি সাধারণত আমরা ও (1) হিসাবে দুটি সংখ্যার পরিবর্তনের ব্যয়টি ভাবি, কিন্তু আপনি যখন স্বেচ্ছায়-সংখ্যক সংখ্যার সাথে কাজ করছেন তখন সংখ্যাটির আকারের ক্রিয়া হিসাবে গুণনের ব্যয় বেড়ে যায়। অত্যন্ত রক্ষণশীল হতে, আমি দাবি করেছিলাম যে আপনি এমন একটি সংখ্যার দ্বারা মোডিংকে গণনা করতে পারেন যা ও (এন ^ 3) এর চেয়ে কম নয়, যা একটি স্থূল ওভারকাউন্টিং তবে এখনও খুব খারাপ নয়।
টেম্পলেটটিফাইফ

1
@ অ্যান্ড্রুফ্লেমিং এটি মেমরিতে সংখ্যাটি কীভাবে উপস্থাপন করা হয় তার উপর নির্ভর করে। আমি ধরে নিচ্ছিলাম যে আমরা একটি মানক বাইনারি উপস্থাপনা ব্যবহার করছি, যেখানে আমাদের সংখ্যাটি উপস্থাপন করার জন্য লগ_2 এন বিট লাগবে। আপনি ঠিক বলেছেন যে অন্তর্নিহিত প্রতিনিধিত্ব পরিবর্তন করা ইনপুটটির আকারের ফাংশন হিসাবে রানটাইমকে পরিবর্তন করবে।
টেম্পলেটটিফাইফ

1
ও (এন ^ 3) বাছাই n mod iকরা অত্যধিক রক্ষণশীল। সময়সীমাকে modবিট সংখ্যা একটি ফাংশন n, না nনিজেই, তাই এটি হওয়া উচিত হে ((লগ ঢ) ^ 3)।
dasblinkenlight

2

সিউডো-বহু-কালীন জটিলতা মানে ইনপুটটির মান / মাত্রায় বহুভুজ তবে ইনপুট আকারে সূচকীয়।

আকার অনুসারে আমরা ইনপুটটি লেখার জন্য প্রয়োজনীয় বিটের সংখ্যা বোঝাতে চাইছি।

ন্যাপস্যাকের সিউডো কোড থেকে আমরা সময় জটিলতা ও (এনডাব্লু) হতে পারি।

// Input:
// Values (stored in array v) 
// Weights (stored in array w)
// Number of distinct items (n) //
Knapsack capacity (W) 
for w from 0 to W 
    do   m[0, w] := 0 
end for  
for i from 1 to n do  
        for j from 0 to W do
               if j >= w[i] then 
                      m[i, j] := max(m[i-1, j], m[i-1, j-w[i]] + v[i]) 
              else 
                      m[i, j] := m[i-1, j]
              end if
       end for 
end for

এখানে, ডব্লু যদিও ইনপুটটির দৈর্ঘ্যে বহুবর্ষীয় নয়, এটিই এটি সিউডো-বহুবচন তৈরি করে।

ডাব্লু উপস্থাপনের জন্য প্রয়োজনীয় বিটের সংখ্যা হওয়া যাক

i.e. size of input= s =log(W) (log= log base 2)
-> 2^(s)=2^(log(W))
-> 2^(s)=W  (because  2^(log(x)) = x)

এখন, running time of knapsack= ও (এনডাব্লু) = ও (এন * 2 ^ গুলি) যা বহুপদী নয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.