এমন কি এমন কোনও ঘটনা রয়েছে যেখানে আপনি O(log n)
সময় জটিলতার চেয়ে সময়ের জটিলতা পছন্দ করবেন O(1)
? অথবা O(n)
করার O(log n)
?
আপনার কোন উদাহরণ আছে?
এমন কি এমন কোনও ঘটনা রয়েছে যেখানে আপনি O(log n)
সময় জটিলতার চেয়ে সময়ের জটিলতা পছন্দ করবেন O(1)
? অথবা O(n)
করার O(log n)
?
আপনার কোন উদাহরণ আছে?
উত্তর:
নিম্নের চেয়ে উচ্চতর ও ও টাইম জটিলতার সাথে অ্যালগরিদম পছন্দ করার অনেক কারণ থাকতে পারে:
10^5
বিগ-ও দৃষ্টিকোণ থেকে 1/10^5 * log(n)
( O(1)
বনাম O(log(n)
) তুলনায় অ্যালগরিদম ভাল , তবে সবচেয়ে যুক্তিসঙ্গত n
জন্য প্রথমটি আরও ভাল সঞ্চালন করবে। উদাহরণস্বরূপ ম্যাট্রিক্স গুণনের জন্য সেরা জটিলতা O(n^2.373)
কিন্তু ধ্রুবকটি এত বেশি যে কোনও (আমার জ্ঞানের কাছে) গণনা পাঠাগারগুলি এটি ব্যবহার করে না।O(n*log(n))
বা O(n^2)
অ্যালগরিদম কিনা তা গুরুত্বপূর্ণ ।O(log log N)
একটি আইটেম খুঁজে পেতে সময় জটিলতা, কিন্তু আরো একটি বাইনারি ট্রি যা একই মধ্যে খুঁজে বের করে হয় O(log n)
। এমনকি বিশাল সংখ্যক n = 10^20
পার্থক্যও নগণ্য।O(n^2)
এবং প্রয়োজন O(n^2)
মেমরির। এন O(n^3)
এবং O(1)
প্রকৃতপক্ষে বড় না হলে সময় এবং স্থানের চেয়ে এটি পছন্দনীয় হতে পারে । সমস্যাটি হ'ল আপনি দীর্ঘ সময়ের জন্য অপেক্ষা করতে পারেন, তবে অত্যন্ত সন্দেহ যে আপনি আপনার অ্যালগরিদমের সাথে এটি ব্যবহারের জন্য যথেষ্ট বড় একটি র্যাম খুঁজে পেতে পারেনO(n^2)
বাছাইকরণ, উদাহরণস্বরূপ, এর গড় সময়-জটিলতা , কুইকোর্ট বা মার্জোর্টের চেয়েও খারাপ, তবে একটি অনলাইন অ্যালগরিদম হিসাবে এটি প্রাপ্ত মানের সাথে তালিকার সাথে দক্ষতার সাথে বাছাই করতে পারে (ব্যবহারকারী ইনপুট হিসাবে) যেখানে বেশিরভাগ অন্যান্য অ্যালগোরিদম কেবল দক্ষতার সাথে পরিচালনা করতে পারে মানগুলির একটি সম্পূর্ণ তালিকায়।সর্বদা লুকানো ধ্রুবক থাকে যা ও (লগ এন ) অ্যালগরিদমের নীচে হতে পারে । সুতরাং এটি বাস্তব জীবনের ডেটার জন্য অনুশীলনে দ্রুত কাজ করতে পারে।
এছাড়াও স্থান সংক্রান্ত উদ্বেগ রয়েছে (যেমন টোস্টারে চালানো)।
বিকাশকারী সময় উদ্বেগ এছাড়াও আছে - ও (লগ এন ) বাস্তবায়ন এবং যাচাই করতে 1000 × সহজ হতে পারে।
lg n
তাই তাই, এত k
বড় n
যে এতদূর কাছাকাছি যে বেশিরভাগ অপারেশন পার্থক্য লক্ষ্য করতে পারে না।
আমি অবাক হয়েছি এখনও কেউ মেমরি-সীমাবদ্ধ অ্যাপ্লিকেশনগুলির উল্লেখ করেনি।
একটি অ্যালগরিদম থাকতে পারে এর জটিলতার কারণে (যেমন ও (1) < ও (লগ এন )) বা জটিলতার সামনে ধ্রুবক ছোট হওয়ায় (যেমন 2 এন 2 <6 এন 2 ) কম ভাসমান পয়েন্ট অপারেশন রয়েছে । নির্বিশেষে, আপনি যদি এখনও FLOP অ্যালগরিদম আরও মেমরি-সীমাবদ্ধ থাকে তবে আপনি আরও FLOP সহ অ্যালগরিদম পছন্দ করতে পারেন।
"মেমরি-বাউন্ড" বলতে আমি যা বোঝাতে চাইছি তা হল আপনি প্রায়শই ডেটা অ্যাক্সেস করেন যা ক্রমাগত ক্যাশের বাইরে থাকে। এই ডেটাটি আনতে, আপনার ক্রিয়াকলাপটি চালানোর আগে আপনাকে আপনার প্রকৃত মেমরির স্থান থেকে আপনার ক্যাশে আটকানো হবে। এই আনার পদক্ষেপটি প্রায়শই বেশ ধীর - আপনার অপারেশন নিজে থেকে অনেক ধীর।
সুতরাং, যদি আপনার অ্যালগরিদমের আরও ক্রিয়াকলাপের প্রয়োজন হয় (তবে এই ক্রিয়াকলাপগুলি ইতিমধ্যে ক্যাশে থাকা ডেটাতে সঞ্চালিত হয় [এবং তাই কোনও আনার প্রয়োজন নেই]), এটি আপনার অ্যালগরিদমকে আরও কম অপারেশন দিয়ে প্রকাশ করবে (যা অবশ্যই বাইরে থেকে সঞ্চালিত হবে) প্রকৃত ওয়াল-টাইমের ক্ষেত্রে ক্যাশে ডেটা [এবং সুতরাং একটি আনতে হবে]।
O(logn)
বেশি পছন্দ করব O(1)
। আপনি খুব সহজেই এমন পরিস্থিতিটি কল্পনা করতে পারেন যেখানে আপনার সমস্ত সম্ভাব্যতার n
জন্য কম মেমরি-সীমাবদ্ধ অ্যাপ্লিকেশনটি দ্রুততর প্রাচীর সময়ে চালিত হবে এমনকি উচ্চতর জটিলতায়ও।
ডেটা সুরক্ষা একটি উদ্বেগের প্রসঙ্গে, আরও জটিল অ্যালগরিদমের সময় আক্রমণে আরও ভাল প্রতিরোধ ক্ষমতা থাকলে আরও জটিল অ্যালগরিদম কম জটিল অ্যালগরিদমের চেয়ে বেশি উপযুক্ত ।
(n mod 5) + 1
তবে এটি এখনও রয়েছে O(1)
, তবে তথ্য প্রকাশ করে n
। সুতরাং স্মুথ রানটাইম সহ আরও জটিল অ্যালগরিদম পছন্দনীয় হতে পারে, যদিও এটি অ্যাসিপোটোটিকভাবে (এবং সম্ভবত অনুশীলনেও) ধীর হতে পারে।
আলিস্ট্রা এটিকে পেরেক দিয়েছিল তবে কোনও উদাহরণ দিতে ব্যর্থ হয়েছে তাই আমি করব।
আপনার স্টোর যা বিক্রি করে তার জন্য আপনার 10,000 ইউপিসি কোডের একটি তালিকা রয়েছে। 10 ডিজিটের ইউপিসি, দামের পূর্ণসংখ্যা (পেনিগুলিতে দাম) এবং প্রাপ্তির জন্য বর্ণনার 30 টি অক্ষর।
ও (লগ এন) পদ্ধতির: আপনার একটি বাছাই করা তালিকা রয়েছে। এএসসিআইআই হলে 44 বাইট, ইউনিকোড হলে 84 পর্যায়ক্রমে, ইউপিসিটিকে একটি ইন্টার64 হিসাবে বিবেচনা করুন এবং আপনি 42 এবং 72 বাইট পাবেন। 10,000 রেকর্ডস - সর্বাধিক ক্ষেত্রে আপনি একটি মেগাবাইট স্টোরেজের অধীনে কিছুটা লক্ষ্য করছেন।
ও (1) পদ্ধতির: ইউপিসি সংরক্ষণ করবেন না, পরিবর্তে আপনি এটিকে এন্ট্রি হিসাবে ব্যবহার করবেন। সর্বনিম্ন ক্ষেত্রে আপনি এক টেরাবাইট সঞ্চয়স্থানের প্রায় এক তৃতীয়াংশ সন্ধান করছেন।
আপনি কোন পদ্ধতির ব্যবহার করবেন তা আপনার হার্ডওয়ারের উপর নির্ভর করে। কোনও যুক্তিসঙ্গত আধুনিক কনফিগারেশনে আপনি লগ এন পদ্ধতির ব্যবহার করতে যাচ্ছেন। আমি দ্বিতীয় পদ্ধতির সঠিক উত্তর হিসাবে ছবিটি দেখতে পারি যদি কোনও কারণে আপনি এমন পরিবেশে ছুটে চলেছেন যেখানে র্যাম সংক্ষিপ্ত আকারে ছোট তবে আপনার প্রচুর পরিমাণে স্টোরেজ রয়েছে। ডিস্কে একটি টেরাবাইটের এক তৃতীয়াংশ কোনও বড় বিষয় নয়, ডিস্কের একটি প্রোবে আপনার ডেটা পাওয়া কোনও মূল্যবান। সাধারণ বাইনারি পদ্ধতির গড় 13 লাগে। (দ্রষ্টব্য, তবে, আপনার কীগুলি ক্লাস্টার করে আপনি এটিকে গ্যারান্টিযুক্ত 3 টি পড়তে পারেন এবং অনুশীলনে আপনি প্রথমটিকে ক্যাশে করবেন))
malloc(search_space_size)
এবং এটি যা ফিরে আসে তাতে সাবস্ক্রিপশন পাওয়া যত সহজ।
একটি লাল-কালো গাছ বিবেচনা করুন। এটিতে অ্যাক্সেস, অনুসন্ধান, সন্নিবেশ এবং মুছুন O(log n)
। একটি অ্যারের সাথে তুলনা করুন, যার অ্যাক্সেস রয়েছে O(1)
এবং বাকী অপারেশনগুলি O(n)
।
সুতরাং এমন একটি অ্যাপ্লিকেশন দেওয়া হয়েছে যেখানে আমরা অ্যাক্সেসের চেয়ে প্রায়শই প্রায়শই সন্নিবেশ করি, মুছে ফেলি বা অনুসন্ধান করি এবং কেবলমাত্র এই দুটি কাঠামোর মধ্যে একটি পছন্দ রয়েছে, আমরা লাল-কালো গাছ পছন্দ করব। এই ক্ষেত্রে, আপনি বলতে পারেন যে আমরা লাল-কালো গাছের আরও জটিল O(log n)
অ্যাক্সেসের সময়টিকে পছন্দ করি ।
কেন? কারণ অ্যাক্সেস আমাদের ওভারাইডিং উদ্বেগ নয়। আমরা একটি বাণিজ্য বন্ধ করছি: আমাদের অ্যাপ্লিকেশনটির কার্যকারিতা এই ব্যতীত অন্য কারণগুলির দ্বারা আরও বেশি প্রভাবিত। আমরা এই নির্দিষ্ট অ্যালগরিদমকে কর্মক্ষমতা ভোগ করতে দিয়েছি কারণ আমরা অন্যান্য অ্যালগরিদমকে অনুকূল করে বড় লাভ করি।
সুতরাং আপনার প্রশ্নের উত্তর কেবলমাত্র এটি: যখন অ্যালগরিদমের বৃদ্ধির হার আমরা অপ্টিমাইজ করতে চাই না , যখন আমরা অন্য কিছুকে অনুকূলিত করতে চাই। অন্যান্য উত্তরগুলির সবগুলিই এর বিশেষ মামলা। কখনও কখনও আমরা অন্যান্য ক্রিয়াকলাপের রান সময়কে অনুকূল করি। কখনও কখনও আমরা স্মৃতি জন্য অনুকূলিতকরণ। কখনও কখনও আমরা সুরক্ষার জন্য অনুকূলিত করি। কখনও কখনও আমরা রক্ষণাবেক্ষণকে অনুকূলিত করি। কখনও কখনও আমরা উন্নয়নের সময় জন্য অনুকূলিতকরণ। এমনকি ওভাররাইডিং ধ্রুবকটি পর্যাপ্ত পরিমাণে থাকার কারণে রান টাইমটির জন্য অনুকূল করা যখন আপনি জানেন যে অ্যালগরিদমের বৃদ্ধির হার রান সময়টিতে সবচেয়ে বেশি প্রভাব ফেলবে না। (যদি আপনার ডেটা সেটটি এই সীমার বাইরে থাকে তবে আপনি অ্যালগরিদমের বৃদ্ধির হারের জন্য অনুকূল হয়ে উঠবেন কারণ এটি শেষ পর্যন্ত ধ্রুবককে আধিপত্য করবে)) সমস্ত কিছুর একটি ব্যয় হয় এবং অনেক ক্ষেত্রে আমরা এর জন্য উচ্চতর বৃদ্ধির হারের বাণিজ্য করি অন্য কিছু অনুকূল করতে অ্যালগরিদম।
O(log n)
"লাল-কালো গাছ" হিসাবে ঘোষণা করেছেন? এর ঢোকান 5
অ্যারের অবস্থান 2 [1, 2, 1, 4]
পরিণাম ডেকে আনবে [1, 2, 5, 1 4]
(উপাদান 4
সূচক 4 3 থেকে আপডেট করা হবে)। আপনি O(log n)
"সাজানো তালিকার" হিসাবে উল্লেখ করেছেন এমন "লাল-কালো গাছ" তে আপনি এই আচরণটি কীভাবে পাবেন ?
হ্যাঁ.
প্রকৃত ক্ষেত্রে, আমরা সংক্ষিপ্ত এবং দীর্ঘ উভয় স্ট্রিং কী দিয়ে টেবিল লুকআপ করার জন্য কিছু পরীক্ষা চালিয়েছি।
আমরা একটি std::map
, একটি std::unordered_map
হ্যাশ ব্যবহার করেছি যা স্ট্রিংয়ের দৈর্ঘ্যের উপরে প্রায় 10 বার নমুনা (আমাদের কীগুলি গাইডের মতো থাকে, তাই এটি শালীন), এবং একটি হ্যাশ যা প্রতিটি চরিত্রকে নমুনা দেয় (তাত্ত্বিকভাবে সংঘর্ষের সংঘর্ষে), একটি অমীমাংসিত ভেক্টর যেখানে আমরা ==
তুলনা করি, এবং (যদি আমি সঠিকভাবে মনে করি) একটি অমীমাংসিত ভেক্টর যেখানে আমরা একটি হ্যাশও সঞ্চয় করি, প্রথমে হ্যাশের তুলনা করি, তারপরে অক্ষরগুলি তুলনা করি।
এই অ্যালগরিদমগুলি O(1)
(আনর্ডারড_ম্যাপ) থেকে শুরু করে O(n)
(লিনিয়ার সন্ধান)।
পরিমিত আকারের N এর জন্য, প্রায়শই ও (এন) ও (1) কে পরাজিত করে। আমরা সন্দেহ করি কারণ নোড-ভিত্তিক পাত্রে আমাদের কম্পিউটারের আরও মেমরির চারপাশে ঝাঁপিয়ে পড়া দরকার ছিল, যখন লিনিয়ার-ভিত্তিক পাত্রে এটি ছিল না।
O(lg n)
দুজনের মধ্যে বিদ্যমান কীভাবে হয়েছিল তা আমার মনে নেই।
পারফরম্যান্স পার্থক্যটি এত বড় ছিল না এবং বৃহত্তর ডেটাতে হ্যাশ-ভিত্তিক একটি আরও ভাল পারফর্ম করে। সুতরাং আমরা হ্যাশ-ভিত্তিক আনর্ডার্ড মানচিত্রের সাথে আটকেছি।
অনুশীলনে, যুক্তিসঙ্গত আকারের এন, O(lg n)
হয় O(1)
। যদি আপনার কম্পিউটারে কেবল আপনার টেবিলে 4 বিলিয়ন এন্ট্রি থাকার জায়গা থাকে তবে O(lg n)
উপরের দিকে আবদ্ধ থাকে 32
। (lg (2 ^ 32) = 32) (কম্পিউটার বিজ্ঞানে, লগ ভিত্তিক লগের জন্য স্বল্প হাত))
অনুশীলনে, lg (n) অ্যালগরিদমগুলি ও (1) অ্যালগরিদমের তুলনায় ধীর হয় লগারিদমিক বৃদ্ধির ফ্যাক্টরের কারণে নয়, তবে lg (n) অংশটির অর্থ সাধারণত অ্যালগরিদমের একটি নির্দিষ্ট স্তর রয়েছে, এবং সেই জটিলতা যুক্ত করে lg (n) শব্দটি থেকে যে কোনও "বৃদ্ধি" এর চেয়ে বৃহত ধ্রুবক ফ্যাক্টর।
তবে জটিল ও (1) অ্যালগরিদম (হ্যাশ ম্যাপিংয়ের মতো) সহজেই একই রকম বা বৃহত্তর ধ্রুবক উপাদান থাকতে পারে।
সমান্তরালভাবে একটি অ্যালগরিদম কার্যকর করার সম্ভাবনা।
ক্লাসগুলির জন্য উদাহরণ আছে কিনা তা আমি জানি না O(log n)
এবং O(1)
কিছু সমস্যার জন্য, যখন অ্যালগোরিদম সমান্তরালে চালানো সহজ হয় তখন আপনি একটি উচ্চতর জটিলতা শ্রেণীর সাথে একটি অ্যালগরিদম চয়ন করেন।
কিছু অ্যালগরিদমকে সমান্তরাল করা যায় না তবে এগুলির জটিল জটিলতা থাকে। অন্য একটি অ্যালগরিদম বিবেচনা করুন যা একই ফলাফল অর্জন করে এবং সহজেই সমান্তরালভাবে তৈরি করা যেতে পারে তবে এর উচ্চতর জটিলতা বর্গ রয়েছে। যখন একটি মেশিনে মৃত্যুদন্ড কার্যকর করা হয়, দ্বিতীয় অ্যালগরিদম ধীর হয় তবে একাধিক মেশিনে চালিত হলে আসল মৃত্যুর সময় কম হয় এবং কম হয় যখন প্রথম অ্যালগরিদম গতি করতে পারে না।
ধরা যাক আপনি একটি এম্বেড থাকা সিস্টেমে একটি ব্ল্যাকলিস্ট বাস্তবায়ন করছেন, যেখানে 0 এবং 1,000,000 এর মধ্যে নম্বরগুলি কালো তালিকাভুক্ত করা যেতে পারে। এটি আপনাকে দুটি সম্ভাব্য বিকল্প দেয়:
বিটসেটে অ্যাক্সেসের গ্যারান্টিযুক্ত ধ্রুব অ্যাক্সেস থাকবে। সময়ের জটিলতার ক্ষেত্রে এটি সর্বোত্তম। উভয় তাত্ত্বিক এবং ব্যবহারিক দৃষ্টিভঙ্গি থেকে (এটি ও (1) অত্যন্ত নিম্ন ধ্রুবক ওভারহেড সহ)।
তবুও, আপনি দ্বিতীয় সমাধানটি পছন্দ করতে চাইতে পারেন। বিশেষত যদি আপনি আশা করেন যে কালো তালিকাভুক্ত পূর্ণসংখ্যার সংখ্যা খুব কম হবে, কারণ এটি আরও মেমরির দক্ষ হবে।
এমনকি আপনি যদি এমন এম্বেড থাকা সিস্টেমের জন্য বিকাশ না করেন যেখানে মেমরির ঘাটতি হয় না, আমি কেবল স্বেচ্ছাসেবী সীমাটি 1,000,000 থেকে 1,000,000,000,000 পর্যন্ত বাড়িয়ে তুলতে পারি এবং একই যুক্তি তৈরি করতে পারি। তারপরে বিটসেটটির জন্য প্রায় 125 জি মেমরির প্রয়োজন হবে। O (1) এর গ্যারান্টিযুক্ত সবচেয়ে খারাপ জটিলতা থাকা আপনার মনিবকে আপনাকে এ জাতীয় শক্তিশালী সার্ভার সরবরাহ করতে রাজি করতে পারে না।
এখানে, আমি দৃ strongly়ভাবে ও (1) বিটসেটের উপরে বাইনারি অনুসন্ধান (ও (লগ এন)) বা বাইনারি ট্রি (ও (লগ এন)) পছন্দ করব। এবং সম্ভবত, ও (এন) এর নিকৃষ্টতম জটিলতায় একটি হ্যাশ টেবিল অনুশীলনে তাদের সকলকে পরাজিত করবে।
আমার উত্তর এখানে স্টোকাস্টিক ম্যাট্রিক্সের সমস্ত সারি জুড়ে দ্রুত এলোমেলোভাবে নির্বাচন একটি উদাহরণ যেখানে জটিলতা হে (এম) সহ একটি অ্যালগরিদম জটিলতা ও (লগ (এম)) এর সাথে একের চেয়ে দ্রুত হয়, যখন m
খুব বেশি বড় হয় না।
লোকেরা ইতিমধ্যে আপনার সঠিক প্রশ্নের উত্তর দিয়েছে, তাই আমি এখানে আসার সময় লোকেরা আসলে ভাবতে পারে এমন একটি সামান্য ভিন্ন প্রশ্নটি মোকাবিলা করব।
"O (1) সময়" অ্যালগরিদম এবং ডেটা স্ট্রাকচারগুলি প্রচুর পরিমাণে কেবল প্রত্যাশিত ও (1) সময় নেয়, যার অর্থ তাদের চলমান গড় সময় হ'ল (1), সম্ভবত কেবলমাত্র কিছু অনুমানের অধীনে।
সাধারণ উদাহরণ: হ্যাশ টেবিল, "অ্যারের তালিকাগুলি" বাড়ানো (ওরফে গতিশীল আকারের অ্যারে / ভেক্টর)।
এই জাতীয় পরিস্থিতিতে আপনি ডেটা স্ট্রাকচার বা অ্যালগরিদমগুলি ব্যবহার করতে পছন্দ করতে পারেন যার সময়টি একেবারে সীমিতভাবে লোগারিথ্মিকভাবে আবদ্ধ হওয়ার গ্যারান্টিযুক্ত , যদিও তারা গড় খারাপভাবে সম্পাদন করতে পারে।
উদাহরণস্বরূপ একটি ভারসাম্য বাইনারি অনুসন্ধান গাছ হতে পারে, যার চলমান সময় গড় গড় খারাপ তবে সবচেয়ে খারাপ ক্ষেত্রে।
আরও সাধারণ প্রশ্ন হ'ল যদি এমন পরিস্থিতিগুলি থাকে যেখানে কেউ একটিতে একটি O(f(n))
অ্যালগরিদম পছন্দ করেO(g(n))
যদিও অ্যালগরিদম g(n) << f(n)
যেমন n
অনন্ত থাকে। অন্যরা যেমন ইতিমধ্যে উল্লেখ করেছে, উত্তরটি পরিষ্কারভাবে "হ্যাঁ" যেখানে f(n) = log(n)
এবং কোথায় রয়েছে তার ক্ষেত্রে g(n) = 1
। এটি কখনও কখনও হ্যাঁ এমনকি f(n)
বহু ক্ষেত্রেও হয় তবে g(n)
তা ক্ষণস্থায়ী। লিনিয়ার প্রোগ্রামিং সমস্যাগুলি সমাধান করার জন্য সিম্প্লেক্স অ্যালগরিদমের একটি বিখ্যাত এবং গুরুত্বপূর্ণ উদাহরণ । 1970 এর দশকে এটি প্রদর্শিত হয়েছিল O(2^n)
। সুতরাং, এর খারাপ পরিস্থিতিটি অক্ষম। তবে - এর গড় কেস আচরণটি বেশ ভাল, এমনকি হাজার হাজার ভেরিয়েবল এবং সীমাবদ্ধতার সাথে ব্যবহারিক সমস্যার জন্য। ১৯৮০-এর দশকে, বহু-কালীন অ্যালগরিদম (যেমন একটি করমারকরের ইন্টিরিয়র-পয়েন্ট অ্যালগরিদম) লিনিয়ার প্রোগ্রামিংয়ের জন্য আবিষ্কার করা হয়েছিল, তবে 30 বছর পরে সিমপ্লেক্স অ্যালগরিদম এখনও পছন্দসই অ্যালগরিদম বলে মনে হচ্ছে (কিছু খুব বড় সমস্যা বাদে)। এটি স্পষ্ট কারণেই যে গড়-আচরণের আচরণটি প্রায়শই খারাপ-মামলার আচরণের চেয়ে বেশি গুরুত্বপূর্ণ, তবে আরও সূক্ষ্ম কারণে যে সিম্প্লেক্স অ্যালগরিদম কিছুটা অর্থে আরও তথ্যবহুল হয় (যেমন সংবেদনশীলতার তথ্য উত্তোলন করা সহজ)।
আমার 2 সেন্ট লাগাতে:
কখনও কখনও অ্যালগরিদম একটি নির্দিষ্ট হার্ডওয়্যার পরিবেশে চললে আরও খারাপের জায়গায় আরও খারাপ জটিলতার অ্যালগরিদম নির্বাচন করা হয়। ধরুন আমাদের ও (1) অ্যালগরিদম অ-ক্রমানুসারে আমাদের সমস্যা সমাধানের জন্য একটি খুব বড়, স্থির আকারের অ্যারের প্রতিটি উপাদানকে অ্যাক্সেস করে। তারপরে সেই অ্যারেটিকে যান্ত্রিক হার্ড ড্রাইভে বা চৌম্বকীয় টেপে রাখুন।
সেক্ষেত্রে ও (লগন) অ্যালগরিদম (ধরুন এটি ধারাবাহিকভাবে ডিস্ক অ্যাক্সেস করে) আরও অনুকূল হয়ে যায়।
ও (লগ (এন)) অ্যালগরিদম ও ও (1) অ্যালগরিদমের পরিবর্তে ব্যবহারের জন্য ভাল ব্যবহারের ক্ষেত্রে রয়েছে যা অন্যান্য অসংখ্য উত্তর উপেক্ষা করেছে: অপরিবর্তনীয়তা। হ্যাশ মানচিত্রগুলিতে হ্যাশ মানগুলির ভাল বন্টন ধরে ধরে ও (1) রাখে এবং পায়, তবে এগুলিকে পরিবর্তনীয় স্থিতি প্রয়োজন। অপরিবর্তনীয় গাছের মানচিত্রে O (লগ (এন)) রাখে এবং পায় যা অ্যাসেম্পোটোটিকভাবে ধীর। তবে অপরিবর্তনশীলতা খারাপ কার্য সম্পাদনের জন্য যথেষ্ট মূল্যবান হতে পারে এবং যেখানে মানচিত্রের একাধিক সংস্করণ ধরে রাখা দরকার সেখানে অপরিবর্তনীয়তা আপনাকে মানচিত্রটি অনুলিপি করতে এড়াতে দেয় যা হে (এন), এবং অতএব উন্নতি করতে পারে কর্মক্ষমতা.
সহজভাবে: কারণ সহগ - সেটআপ, স্টোরেজ এবং সেই পদক্ষেপের সম্পাদনের সময়ের সাথে সম্পর্কিত ব্যয়গুলি - বৃহত্তরটির চেয়ে ছোট বিগ-ও সমস্যার সাথে অনেক বেশি হতে পারে। বিগ-ও হ'ল আলগোরিদিমগুলি স্কেলাবিলিটির একমাত্র পরিমাপ ।
কোয়ান্টাম মেকানিক্সের একাধিক ওয়ার্ল্ড ব্যাখ্যার উপর নির্ভর করে বাছাই করা অ্যালগরিদমকে প্রস্তাব করে হ্যাকারের অভিধান থেকে নিম্নলিখিত উদাহরণটি বিবেচনা করুন :
- কোয়ান্টাম প্রক্রিয়া ব্যবহার করে এলোকে এলোমেলোভাবে পারমুট করুন,
- অ্যারে বাছাই না হলে মহাবিশ্বকে ধ্বংস করুন।
- সমস্ত অবশিষ্ট মহাবিশ্ব এখন বাছাই করা হয়েছে [আপনি যে একটিতে রয়েছেন সেগুলি সহ]।
(সূত্র: http://catb.org/~esr/jargon/html/B/bogo-sort.html )
লক্ষ্য করুন যে এই অ্যালগরিদমের বিগ-ও হ'ল O(n)
জেনেরিক আইটেমগুলিতে যে কোনও পরিচিত বাছাই করা অ্যালগরিদমকে মারধর করে। রৈখিক পদক্ষেপের সহগ এছাড়াও খুব কম (যেহেতু এটি কেবল তুলনা হয়, অদলবদল নয়, এটি লিনিয়ারালি সম্পন্ন করা হয়)। একই জাতীয় অ্যালগরিদম, আসলে, এনপি এবং সহ-এনপি উভয় ক্ষেত্রেই যে কোনও সমস্যা সমাধানের জন্য ব্যবহার করা যেতে পারেকোয়ান্টাম প্রক্রিয়াটি ব্যবহার করে প্রতিটি সম্ভাব্য সমাধান (বা কোনও সমাধান নেই যে কোনও প্রমাণ নেই) যেহেতু প্রতিটি সম্ভাব্য সমাধান (বা কোনও সমাধান নেই যে কোনও সমাধান নেই) যেহেতু, বহুপক্ষীয় সময়ে যেতে পারে বহুপক্ষীয় সময়
তবে, বেশিরভাগ ক্ষেত্রেই, আমরা সম্ভবত ঝুঁকি নিতে চাই না যে মাল্টিপল ওয়ার্ল্ডগুলি সঠিক নাও হতে পারে, এটি উল্লেখ করার জন্য নয় যে পদক্ষেপ 2 বাস্তবায়নের কাজটি এখনও "পাঠকের অনুশীলন হিসাবে ছেড়ে গেছে"।
যে কোনও সময়ে যখন n আবদ্ধ হয় এবং O (1) অ্যালগোরিদমের ধ্রুবক গুণকটি লগ (এন) এ সীমাবদ্ধতার চেয়ে বেশি হয়। উদাহরণস্বরূপ, হ্যাশসেটে মানগুলি সংরক্ষণ করার জন্য ও (1) হয় তবে হ্যাশ ফাংশনের ব্যয়বহুল গণনা প্রয়োজন হতে পারে। যদি ডেটা আইটেমগুলি তুচ্ছভাবে তুলনা করা যায় (কিছু ক্রমের সাথে সম্মতি রেখে) এবং এন এর উপর আবদ্ধ হয় যে লগ এন যে কোনও একটি আইটেমের হ্যাশ গণনার তুলনায় উল্লেখযোগ্যভাবে কম, তবে ভারসাম্যযুক্ত বাইনারি গাছের মধ্যে সংরক্ষণের চেয়ে দ্রুততর হতে পারে একটি হ্যাশসেট
একটি রিয়েলটাইম পরিস্থিতিতে যেখানে আপনার দৃ upper় ওপেন বাউন্ডের প্রয়োজন হয় আপনি উদাহরণস্বরূপ একটি কুইকোর্টের বিপরীতে হিপসোর্ট নির্বাচন করবেন, কারণ হিপসোর্টের গড় আচরণও এটি সবচেয়ে খারাপ পরিস্থিতি।
ইতিমধ্যে ভাল উত্তরের সাথে যুক্ত করা হচ্ছে post একটি বাস্তব উদাহরণ হ্যাশ সূচকগুলি পোস্টগ্রিস ডাটাবেসে বনাম-গাছের সূচীগুলি হবে।
হ্যাশ সূচকগুলি ডিস্কের ডেটা অ্যাক্সেস করতে একটি হ্যাশ টেবিল সূচক তৈরি করে যখন বিটি্রি নাম অনুসারে বিট্রি ডেটা স্ট্রাকচার ব্যবহার করে।
বিগ-ও সময়ে এগুলি হ'ল ও (1) বনাম ও (লগএন)।
হ্যাশ সূচকগুলি বর্তমানে পোস্টগ্রিজগুলিতে নিরুৎসাহিত হয়েছে যেহেতু বাস্তব জীবনের পরিস্থিতি বিশেষত ডাটাবেস সিস্টেমে, সংঘর্ষ ছাড়াই হ্যাশ অর্জন করা খুব শক্ত (একটি ও (এন) সবচেয়ে খারাপ ক্ষেত্রে জটিলতা সৃষ্টি করতে পারে) এবং এর কারণে এটি তৈরি করা আরও বেশি কঠিন সেগুলি ক্র্যাশ করে নিরাপদ (পোস্ট লগিং লিখুন বলা হয় - পোস্টগ্রাসে ওয়াল)।
এই ট্রেডঅফটি এই পরিস্থিতিতে তৈরি করা হয়েছে যেহেতু ও (লগএন) সূচকগুলির পক্ষে যথেষ্ট ভাল এবং ও (1) বাস্তবায়ন করা বেশ শক্ত এবং সময়ের পার্থক্যটি সত্যই গুরুত্বপূর্ণ নয়।
অথবা
সুরক্ষা অ্যাপ্লিকেশনগুলির ক্ষেত্রে এটি প্রায়শই ঘটে থাকে যে আমরা সমস্যার ডিজাইন করতে চাই যার অ্যালগরিদম উদ্দেশ্যহেতু ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে নামকরণ
এখানে আমার মাথার উপরের দিকের কয়েকটি উদাহরণ রয়েছে।
O(2^n)
যেখানে n
কীটির বিট-দৈর্ঘ্য (এটি নিষ্ঠুর শক্তি)।সিএসের অন্য কোথাও, কুইক বাছাই O(n^2)
সবচেয়ে খারাপ ক্ষেত্রে তবে সাধারণ ক্ষেত্রে O(n*log(n))
। এই কারণে, অ্যালগরিদম দক্ষতা বিশ্লেষণ করার সময় কখনও কখনও "বিগ ও" বিশ্লেষণ আপনার কেবল যত্নশীল হয় না।
O(log n)
অ্যালগরিদমকে পছন্দ করব তবেO(1)