এমন কোনও ঘটনা আছে যেখানে আপনি নিম্নের চেয়ে উচ্চতর ও-টাইম জটিলতার অ্যালগরিদম পছন্দ করবেন?


242

এমন কি এমন কোনও ঘটনা রয়েছে যেখানে আপনি O(log n)সময় জটিলতার চেয়ে সময়ের জটিলতা পছন্দ করবেন O(1)? অথবা O(n)করার O(log n)?

আপনার কোন উদাহরণ আছে?


67
পূর্বেরটি যদি বুঝতে হয় তবে আমি একটি O(log n)অ্যালগরিদমকে পছন্দ করব তবে O(1)
তারপরেরটি

14
তাত্ত্বিক কম্পিউটার বিজ্ঞান থেকে ও (1) ক্রিয়াকলাপ সহ প্রচুর অবৈধ তথ্য কাঠামো রয়েছে। একটি উদাহরণ বিটভেক্টরগুলিতে নির্বাচন করুন () হবে, যা ওয়ান (এন) অতিরিক্ত স্পেস এবং অপারেশন প্রতি ও (1) এ সমর্থন করতে পারে, 5 টি ইন্ডিরিয়ারেশন ব্যবহার করে। ও (1) র‌্যাঙ্কের সাথে একত্রে সরল বাইনারি অনুসন্ধান () নির্ধারণ করা হয়েছে সুচিনাক্ট ডেটা স্ট্রাকচার লাইব্রেরির
নিক্লাস বি

17
লোয়ার অ্যাসিম্পটিক জটিলতা দ্রুত রানটাইমের গ্যারান্টি দেয় না। একটি মজাদার উদাহরণের জন্য ম্যাট্রিক্সের গুণকে গবেষণা করুন।
কনার ক্লার্ক

54
এছাড়াও ... পর্যাপ্ত পরিমাণে বড় টেবিল
কনার ক্লার্ক

19
@ হটেন - এটি ধরে নিচ্ছে যে টেবিলের অনুসন্ধান ও (1), যা আপনি যে টেবিলগুলির কথা বলছেন তার আকারের জন্য এটি মোটেও দেওয়া হয়নি! :)
Jender

উত্তর:


267

নিম্নের চেয়ে উচ্চতর ও ও টাইম জটিলতার সাথে অ্যালগরিদম পছন্দ করার অনেক কারণ থাকতে পারে:

  • বেশিরভাগ সময়, লোয়ার বিগ-ও জটিলতা অর্জন করা আরও কঠিন এবং দক্ষ বাস্তবায়ন, প্রচুর জ্ঞান এবং প্রচুর পরীক্ষার প্রয়োজন।
  • বিগ-ও একটি ধ্রুবক সম্পর্কে বিশদগুলি লুকায় : 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)প্রকৃতপক্ষে বড় না হলে সময় এবং স্থানের চেয়ে এটি পছন্দনীয় হতে পারে । সমস্যাটি হ'ল আপনি দীর্ঘ সময়ের জন্য অপেক্ষা করতে পারেন, তবে অত্যন্ত সন্দেহ যে আপনি আপনার অ্যালগরিদমের সাথে এটি ব্যবহারের জন্য যথেষ্ট বড় একটি র‍্যাম খুঁজে পেতে পারেন
  • সমান্তরালতা আমাদের বিতরণ বিশ্বে একটি ভাল বৈশিষ্ট্য। এমন অ্যালগরিদম রয়েছে যা সহজেই সমান্তরাল হয়, এবং এমন কিছু আছে যা একেবারেই সমান্তরাল হয় না। কখনও কখনও কিছুটা জটিলতার সাথে একটি মেশিন ব্যবহার না করে উচ্চতর জটিলতার সাথে 1000 কমোডিটি মেশিনে একটি অ্যালগরিদম চালানো বুদ্ধিমান হয়।
  • কিছু জায়গায় (সুরক্ষা) জটিলতার প্রয়োজন হতে পারে। কেউ হ্যাশ অ্যালগরিদম রাখতে চায় না যে চটজলদিভাবে দ্রুত হ্যাশ করতে পারে (কারণ তখন অন্য লোকেরা আপনাকে দ্রুত পথে চলাচল করতে পারে)
  • যদিও এটি জটিলতার পরিবর্তনের সাথে সম্পর্কিত নয়, তবে সময়োপযোগী আক্রমণ রোধ করার জন্য কিছু সুরক্ষামূলক ফাংশন এমনভাবে লেখা উচিত । এগুলি বেশিরভাগ একই জটিলতার ক্লাসে থাকে তবে এগুলি এমনভাবে সংশোধন করা হয় যে কোনও কিছু করতে সর্বদা খারাপ পরিস্থিতি লাগে। একটি উদাহরণ তুলনা করা হয় যে স্ট্রিংগুলি সমান। বেশিরভাগ অ্যাপ্লিকেশনগুলিতে প্রথম বাইটগুলি পৃথক হলে দ্রুত বিরতি লাভ করা বোধগম্য হয় তবে সুরক্ষায় আপনি এখনও খারাপ সংবাদ বলার জন্য খুব শেষের জন্য অপেক্ষা করবেন।
  • কেউ নিম্ন-জটিলতার অ্যালগরিদমকে পেটেন্ট করেছিলেন এবং কোনও সংস্থার পক্ষে অর্থের চেয়ে বেশি জটিলতা ব্যবহার করা আরও অর্থনৈতিক।
  • কিছু অ্যালগরিদম নির্দিষ্ট পরিস্থিতিতে ভাল মানায়। সন্নিবেশ O(n^2)বাছাইকরণ, উদাহরণস্বরূপ, এর গড় সময়-জটিলতা , কুইকোর্ট বা মার্জোর্টের চেয়েও খারাপ, তবে একটি অনলাইন অ্যালগরিদম হিসাবে এটি প্রাপ্ত মানের সাথে তালিকার সাথে দক্ষতার সাথে বাছাই করতে পারে (ব্যবহারকারী ইনপুট হিসাবে) যেখানে বেশিরভাগ অন্যান্য অ্যালগোরিদম কেবল দক্ষতার সাথে পরিচালনা করতে পারে মানগুলির একটি সম্পূর্ণ তালিকায়।

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

@ লুয়ান "আসলে, আধুনিক সিপিইউগুলি যেভাবে তৈরি করা হয়েছে তার কারণে, বাইনারি অনুসন্ধানের মতো এমনকি লিনিয়ার অনুসন্ধানের মতো বাছাই করা অ্যারেগুলিতেও তত দ্রুত হতে পারে - প্রোফাইলিং একটি প্রয়োজনীয়তা" " মজাদার! আপনি কী ব্যাখ্যা করতে পারেন যে বাইনারি অনুসন্ধান এবং লিনিয়ার অনুসন্ধান একটি আধুনিক সিপুতে একই পরিমাণে সময় নিতে পারে?
ডিজেজি

3
@ লুয়ান - কিছু মনে করবেন না, আমি এটি খুঁজে পেয়েছি: schani.wordpress.com/2010/04/30/linear-vs-binary-search
ডিজেজি

2
@ ডেনিসেডবার্নার্ডি: না, আসলে তা হয় না। এগুলি পি তে অ্যালগরিদম হতে পারে And এবং এমনকি যদি এটি নাও হয় তবে এর সমান্তরালে কী বোঝাতে চেয়েছিল তার যুক্তিসঙ্গত সংজ্ঞা অনুসারে এটি পি! = এনপি দ্বারা বোঝায় না। এও মনে রাখবেন যে একটি অ-নিষেধাজ্ঞামূলক টিউরিং মেশিনের সম্ভাব্য রানগুলির স্থান অনুসন্ধান সমান্তরাল।
einpoklum

228

সর্বদা লুকানো ধ্রুবক থাকে যা (লগ এন ) অ্যালগরিদমের নীচে হতে পারে । সুতরাং এটি বাস্তব জীবনের ডেটার জন্য অনুশীলনে দ্রুত কাজ করতে পারে।

এছাড়াও স্থান সংক্রান্ত উদ্বেগ রয়েছে (যেমন টোস্টারে চালানো)।

বিকাশকারী সময় উদ্বেগ এছাড়াও আছে - (লগ এন ) বাস্তবায়ন এবং যাচাই করতে 1000 × সহজ হতে পারে।


সুন্দর ধন্যবাদ আপনাকে. আমি ভাবছিলাম প্রোগ্রামের স্থিতিশীলতা নিশ্চিতকরণের জন্য ও (লগন) অ্যালগরিদম বিবেচনা করাও উপযুক্ত (যেমন স্ব-ভারসাম্য বাইনারি গাছগুলিতে)
ভি.লাইমারি

16
একটি উদাহরণ যা আমি ভাবতে পারি: একটি ছোট সাজানো অ্যারের জন্য, একটি সম্পূর্ণ হ্যাশ মানচিত্র প্রয়োগের পরিবর্তে এবং এর পরিবর্তে এটি ব্যবহার করার চেয়ে প্রোগ্রামারটির পক্ষে বাইনারি অনুসন্ধান ফাংশন বাস্তবায়ন করা আরও সহজ এবং আরও কমপ্যাক্ট হতে পারে।
কর্নেল তিরিশ দুই

5
জটিলতার উদাহরণ: একটি অনিবদ্ধ তালিকার মাঝারি সন্ধান করা ও (এন * লগ এন) এ করা সহজ তবে ও (এন) এ করা শক্ত।
পল ড্রাগার

1
-1, আপনার টোস্টারে লগ রাখবেন না ... একপাশে মজা করছেন, এটি স্পট is lg nতাই তাই, এত kবড় nযে এতদূর কাছাকাছি যে বেশিরভাগ অপারেশন পার্থক্য লক্ষ্য করতে পারে না।
কর্সিকা

3
এই সত্যটিও রয়েছে যে বেশিরভাগ লোকের সাথে পরিচিত আলগোরিদিম জটিলতাগুলি ক্যাশে প্রভাবগুলিকে বিবেচনা করে না। বেশিরভাগ লোকের মতে বাইনারি গাছে কিছু খোঁজা হ'ল ও (লগ ২ (এন)) তবে বাস্তবে এটি আরও খারাপ কারণ বাইনারি গাছগুলির স্থানীয় অবস্থান খারাপ থাকে।
ডোভাল

57

আমি অবাক হয়েছি এখনও কেউ মেমরি-সীমাবদ্ধ অ্যাপ্লিকেশনগুলির উল্লেখ করেনি।

একটি অ্যালগরিদম থাকতে পারে এর জটিলতার কারণে (যেমন (1) < (লগ এন )) বা জটিলতার সামনে ধ্রুবক ছোট হওয়ায় (যেমন 2 এন 2 <6 এন 2 ) কম ভাসমান পয়েন্ট অপারেশন রয়েছে । নির্বিশেষে, আপনি যদি এখনও FLOP অ্যালগরিদম আরও মেমরি-সীমাবদ্ধ থাকে তবে আপনি আরও FLOP সহ অ্যালগরিদম পছন্দ করতে পারেন।

"মেমরি-বাউন্ড" বলতে আমি যা বোঝাতে চাইছি তা হল আপনি প্রায়শই ডেটা অ্যাক্সেস করেন যা ক্রমাগত ক্যাশের বাইরে থাকে। এই ডেটাটি আনতে, আপনার ক্রিয়াকলাপটি চালানোর আগে আপনাকে আপনার প্রকৃত মেমরির স্থান থেকে আপনার ক্যাশে আটকানো হবে। এই আনার পদক্ষেপটি প্রায়শই বেশ ধীর - আপনার অপারেশন নিজে থেকে অনেক ধীর।

সুতরাং, যদি আপনার অ্যালগরিদমের আরও ক্রিয়াকলাপের প্রয়োজন হয় (তবে এই ক্রিয়াকলাপগুলি ইতিমধ্যে ক্যাশে থাকা ডেটাতে সঞ্চালিত হয় [এবং তাই কোনও আনার প্রয়োজন নেই]), এটি আপনার অ্যালগরিদমকে আরও কম অপারেশন দিয়ে প্রকাশ করবে (যা অবশ্যই বাইরে থেকে সঞ্চালিত হবে) প্রকৃত ওয়াল-টাইমের ক্ষেত্রে ক্যাশে ডেটা [এবং সুতরাং একটি আনতে হবে]।


1
"স্থান সংক্রান্ত উদ্বেগ" সম্পর্কে কথা বলার সময় অলিস্ট্রা এটিকে অপ্রত্যক্ষভাবে সম্বোধন করেছিলেন
জ্যাচ

2
বিশাল পরিমাণে ক্যাশে মিস করে কেবল একটি ধ্রুবক মান দ্বারা চূড়ান্ত সম্পাদনকে গুণিত করে (যা 4-কোর 3.2GHz সিপিইউয়ের জন্য 1.6GHz র‌্যামের জন্য 8 এর চেয়ে বড় নয়, সাধারণত এটি অনেক কম থাকে) তাই এটি বড় স্থির স্থির হিসাবে গণনা করা হয় -এর স্বরলিপি সুতরাং কেবল ক্যাশে মিস করা জিনিসটি n এর প্রান্তিক স্থানটিকে সরিয়ে নিয়েছে যেখানে ও (এন) দ্রবণটি ও (1) সমাধানের চেয়ে ধীর হতে শুরু করে।
মারিয়ান স্প্যানিক

1
@ মারিয়ানস্প্যানিক আপনি অবশ্যই সঠিক। তবে এই প্রশ্নটি এমন পরিস্থিতির জন্য জিজ্ঞাসা করেছিল যেখানে আমরা O(logn)বেশি পছন্দ করব O(1)। আপনি খুব সহজেই এমন পরিস্থিতিটি কল্পনা করতে পারেন যেখানে আপনার সমস্ত সম্ভাব্যতার nজন্য কম মেমরি-সীমাবদ্ধ অ্যাপ্লিকেশনটি দ্রুততর প্রাচীর সময়ে চালিত হবে এমনকি উচ্চতর জটিলতায়ও।
নসকনোস সমস্ত

@ মারিয়ানস্প্যানিক ৩০০ ঘড়ির চক্র পর্যন্ত ক্যাশে মিস করছে না? 8 কোথা থেকে আসছে?
আশা করি

43

ডেটা সুরক্ষা একটি উদ্বেগের প্রসঙ্গে, আরও জটিল অ্যালগরিদমের সময় আক্রমণে আরও ভাল প্রতিরোধ ক্ষমতা থাকলে আরও জটিল অ্যালগরিদম কম জটিল অ্যালগরিদমের চেয়ে বেশি উপযুক্ত ।


6
আপনি যা বলেছেন তা সত্য, তবে সেই ক্ষেত্রে, ও (1) এ কার্যকর একটি অ্যালগরিদম সময় সংক্রমণের দ্বারা সংজ্ঞায়িত definition
জাস্টিন লেজার্ড

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

12
সীমাবদ্ধ থাকা অবস্থায় রানটাইমটি বিভিন্ন উপায়ে ওঠানামা করতে পারে। রানটাইমটি যদি আনুপাতিক হয় (n mod 5) + 1তবে এটি এখনও রয়েছে O(1), তবে তথ্য প্রকাশ করে n। সুতরাং স্মুথ রানটাইম সহ আরও জটিল অ্যালগরিদম পছন্দনীয় হতে পারে, যদিও এটি অ্যাসিপোটোটিকভাবে (এবং সম্ভবত অনুশীলনেও) ধীর হতে পারে।
খ্রিস্টান সেমরাউ 10'15

মূলত এই কারণেই বিসিক্রিপটকে ভাল হিসাবে বিবেচনা করা হয়; এটি বিষয়গুলিকে ধীর করে তোলে
ডেভিড মনিকা

@ ডেভিডগ্রিনবার্গ এ কারণেই বিক্রিপ্ট ব্যবহৃত হয় এবং প্রশ্নটি খাপ খায়। তবে এটি এই উত্তরটির সাথে সম্পর্কিত নয়, যা সময়োপযোগী আক্রমণগুলির কথা বলে।
খ্রিস্টান সেমরাউ

37

আলিস্ট্রা এটিকে পেরেক দিয়েছিল তবে কোনও উদাহরণ দিতে ব্যর্থ হয়েছে তাই আমি করব।

আপনার স্টোর যা বিক্রি করে তার জন্য আপনার 10,000 ইউপিসি কোডের একটি তালিকা রয়েছে। 10 ডিজিটের ইউপিসি, দামের পূর্ণসংখ্যা (পেনিগুলিতে দাম) এবং প্রাপ্তির জন্য বর্ণনার 30 টি অক্ষর।

ও (লগ এন) পদ্ধতির: আপনার একটি বাছাই করা তালিকা রয়েছে। এএসসিআইআই হলে 44 বাইট, ইউনিকোড হলে 84 পর্যায়ক্রমে, ইউপিসিটিকে একটি ইন্টার64 হিসাবে বিবেচনা করুন এবং আপনি 42 এবং 72 বাইট পাবেন। 10,000 রেকর্ডস - সর্বাধিক ক্ষেত্রে আপনি একটি মেগাবাইট স্টোরেজের অধীনে কিছুটা লক্ষ্য করছেন।

ও (1) পদ্ধতির: ইউপিসি সংরক্ষণ করবেন না, পরিবর্তে আপনি এটিকে এন্ট্রি হিসাবে ব্যবহার করবেন। সর্বনিম্ন ক্ষেত্রে আপনি এক টেরাবাইট সঞ্চয়স্থানের প্রায় এক তৃতীয়াংশ সন্ধান করছেন।

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


2
আমি এখানে একটু বিভ্রান্ত। আপনি কি 10 বিলিয়ন-এন্ট্রি অ্যারে তৈরি করার কথা বলছেন (যার বেশিরভাগ অপরিজ্ঞাত হবে) এবং ইউপিসিকে সেই অ্যারেতে সূচক হিসাবে বিবেচনা করছেন?
ডেভিড জেড

7
@ ডেভিডজ্যাড আপনি যদি একটি স্পার্স অ্যারে ব্যবহার করেন তবে আপনি ও (1) পেতে পারেন না তবে এটি কেবল 1 এমবি মেমরি ব্যবহার করবে। আপনি যদি সত্যিকারের অ্যারে ব্যবহার করেন তবে আপনার ও (1) অ্যাক্সেসের গ্যারান্টিযুক্ত তবে এটি 1/3 টিবি মেমরি ব্যবহার করবে।
নবীন

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

@ নব্যলোক্র্যাট ট্রু, তবে আপনি যদি র‌্যামে এটি করছেন তবে অনুসন্ধানের সময়টির কোনও ব্যাপার হবে না, 1 মেম্বরের পরিবর্তে 40 এমবি ব্যবহার করার কোনও কারণ নেই। অ্যারে সংস্করণটি কেবল তখনই বোঝায় যখন স্টোরেজ অ্যাক্সেস ব্যয় হয় - আপনি ডিস্কে চলে যাচ্ছেন।
লরেন পেচটেল

1
বা যখন এটি কোনও পারফরম্যান্স-সমালোচনামূলক অপারেশন নয় এবং বিকাশকারীদের সময় ব্যয়বহুল - বলা malloc(search_space_size)এবং এটি যা ফিরে আসে তাতে সাবস্ক্রিপশন পাওয়া যত সহজ।
ফিল মিলার

36

একটি লাল-কালো গাছ বিবেচনা করুন। এটিতে অ্যাক্সেস, অনুসন্ধান, সন্নিবেশ এবং মুছুন O(log n)। একটি অ্যারের সাথে তুলনা করুন, যার অ্যাক্সেস রয়েছে O(1)এবং বাকী অপারেশনগুলি O(n)

সুতরাং এমন একটি অ্যাপ্লিকেশন দেওয়া হয়েছে যেখানে আমরা অ্যাক্সেসের চেয়ে প্রায়শই প্রায়শই সন্নিবেশ করি, মুছে ফেলি বা অনুসন্ধান করি এবং কেবলমাত্র এই দুটি কাঠামোর মধ্যে একটি পছন্দ রয়েছে, আমরা লাল-কালো গাছ পছন্দ করব। এই ক্ষেত্রে, আপনি বলতে পারেন যে আমরা লাল-কালো গাছের আরও জটিল O(log n)অ্যাক্সেসের সময়টিকে পছন্দ করি ।

কেন? কারণ অ্যাক্সেস আমাদের ওভারাইডিং উদ্বেগ নয়। আমরা একটি বাণিজ্য বন্ধ করছি: আমাদের অ্যাপ্লিকেশনটির কার্যকারিতা এই ব্যতীত অন্য কারণগুলির দ্বারা আরও বেশি প্রভাবিত। আমরা এই নির্দিষ্ট অ্যালগরিদমকে কর্মক্ষমতা ভোগ করতে দিয়েছি কারণ আমরা অন্যান্য অ্যালগরিদমকে অনুকূল করে বড় লাভ করি।

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


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

@ কোনও একটি লাল-কালো গাছ একটি মানচিত্র / অভিধানের ধরণের কাঠামো সংজ্ঞায়িত করতে ব্যবহার করা যেতে পারে, তবে এটি হওয়ার দরকার নেই। নোডগুলি কেবলমাত্র উপাদান হতে পারে, মূলত বাছাই করা তালিকা কার্যকর করে।
jpmc26

সাজানো তালিকা এবং অ্যারে যা উপাদানগুলির ক্রমকে সংজ্ঞায়িত করে বিভিন্ন ধরণের তথ্য রয়েছে। একটি উপাদান এবং সেট মধ্যে অর্ডার উপর ভিত্তি করে এবং অন্যগুলি নির্বিচার ক্রম সংজ্ঞায়িত করে যে প্রয়োজনীয় উপাদানগুলির মধ্যে ক্রম সংজ্ঞায়িত করে না। অন্য জিনিসটি হ'ল "অ্যাক্সেস" এবং "অনুসন্ধান" যা আপনি O(log n)"লাল-কালো গাছ" হিসাবে ঘোষণা করেছেন? এর ঢোকান 5অ্যারের অবস্থান 2 [1, 2, 1, 4]পরিণাম ডেকে আনবে [1, 2, 5, 1 4](উপাদান 4সূচক 4 3 থেকে আপডেট করা হবে)। আপনি O(log n)"সাজানো তালিকার" হিসাবে উল্লেখ করেছেন এমন "লাল-কালো গাছ" তে আপনি এই আচরণটি কীভাবে পাবেন ?
ony

@ কোন "সাজানো তালিকা এবং অ্যারে যা উপাদানগুলির ক্রম সংজ্ঞায়িত করে বিভিন্ন ধরণের তথ্য রয়েছে" " হ্যাঁ, এবং এ কারণেই তাদের পারফরম্যান্সের বিভিন্ন বৈশিষ্ট্য রয়েছে। আপনি বিন্দু মিস করছি। একটি সমস্ত পরিস্থিতিতে অন্যের জন্য প্রতিস্থাপনের ড্রপ নয়। তারা বিভিন্ন জিনিস অপ্টিমাইজ করে এবং বিভিন্ন বাণিজ্য বন্ধ করে দেয় এবং মূল বিষয় হ'ল বিকাশকারীরা ক্রমাগত those বাণিজ্য অফগুলি সম্পর্কে সিদ্ধান্ত নিচ্ছেন।
jpmc26

অ্যালগরিদম পারফরম্যান্সের প্রসঙ্গে @ অ্যাক্সেস, অনুসন্ধান, সন্নিবেশ এবং মুছার নির্দিষ্ট অর্থ রয়েছে। অ্যাক্সেস অবস্থান অনুসারে একটি উপাদান আনছে। অনুসন্ধান মান অনুসারে একটি উপাদান সনাক্ত করছে (যা কেবল কোনও মানচিত্রহীন কাঠামোর জন্য ধারক চেক হিসাবে কোনও ব্যবহারিক প্রয়োগ রয়েছে)। সন্নিবেশ করা এবং মুছে ফেলা সহজ হওয়া উচিত, যদিও। উদাহরণ ব্যবহার এখানে দেখা যায় ।
jpmc26

23

হ্যাঁ.

প্রকৃত ক্ষেত্রে, আমরা সংক্ষিপ্ত এবং দীর্ঘ উভয় স্ট্রিং কী দিয়ে টেবিল লুকআপ করার জন্য কিছু পরীক্ষা চালিয়েছি।

আমরা একটি 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) অ্যালগরিদম (হ্যাশ ম্যাপিংয়ের মতো) সহজেই একই রকম বা বৃহত্তর ধ্রুবক উপাদান থাকতে পারে।


21

সমান্তরালভাবে একটি অ্যালগরিদম কার্যকর করার সম্ভাবনা।

ক্লাসগুলির জন্য উদাহরণ আছে কিনা তা আমি জানি না O(log n)এবং O(1)কিছু সমস্যার জন্য, যখন অ্যালগোরিদম সমান্তরালে চালানো সহজ হয় তখন আপনি একটি উচ্চতর জটিলতা শ্রেণীর সাথে একটি অ্যালগরিদম চয়ন করেন।

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


তবে যে সমস্ত সমান্তরালচনা ঘটে তা হ'ল অন্যরা যে ধ্রুবক ফ্যাক্টরটির কথা বলেছে তা হ্রাস করে, তাই না?
জেংকেভ

1
হ্যাঁ, তবে সমান্তরাল অ্যালগরিদম প্রতিবার আপনি এক্সিকিউটিভ মেশিনের সংখ্যা দ্বিগুণ করার মাধ্যমে ধ্রুবক ফ্যাক্টরটিকে 2 দ্বারা বিভক্ত করতে পারেন। আরেকটি একক থ্রেডযুক্ত অ্যালগরিদম ধ্রুবক ফ্যাক্টরকে ধ্রুবকভাবে কেবল একবারে হ্রাস করতে পারে। সুতরাং একটি সমান্তরাল অ্যালগরিদমের সাহায্যে আপনি গতিরূপে n এর আকারে প্রতিক্রিয়া জানাতে পারেন এবং প্রাচীর ঘড়ির প্রয়োগের সময়টিতে দ্রুত হতে পারেন।
সিমুল্যান্ট

15

ধরা যাক আপনি একটি এম্বেড থাকা সিস্টেমে একটি ব্ল্যাকলিস্ট বাস্তবায়ন করছেন, যেখানে 0 এবং 1,000,000 এর মধ্যে নম্বরগুলি কালো তালিকাভুক্ত করা যেতে পারে। এটি আপনাকে দুটি সম্ভাব্য বিকল্প দেয়:

  1. বিটসেট ব্যবহার করুন 1,000,000 বিট
  2. কালো তালিকাভুক্ত পূর্ণসংখ্যার বাছাই করা অ্যারে ব্যবহার করুন এবং এগুলি অ্যাক্সেস করতে বাইনারি অনুসন্ধান ব্যবহার করুন

বিটসেটে অ্যাক্সেসের গ্যারান্টিযুক্ত ধ্রুব অ্যাক্সেস থাকবে। সময়ের জটিলতার ক্ষেত্রে এটি সর্বোত্তম। উভয় তাত্ত্বিক এবং ব্যবহারিক দৃষ্টিভঙ্গি থেকে (এটি ও (1) অত্যন্ত নিম্ন ধ্রুবক ওভারহেড সহ)।

তবুও, আপনি দ্বিতীয় সমাধানটি পছন্দ করতে চাইতে পারেন। বিশেষত যদি আপনি আশা করেন যে কালো তালিকাভুক্ত পূর্ণসংখ্যার সংখ্যা খুব কম হবে, কারণ এটি আরও মেমরির দক্ষ হবে।

এমনকি আপনি যদি এমন এম্বেড থাকা সিস্টেমের জন্য বিকাশ না করেন যেখানে মেমরির ঘাটতি হয় না, আমি কেবল স্বেচ্ছাসেবী সীমাটি 1,000,000 থেকে 1,000,000,000,000 পর্যন্ত বাড়িয়ে তুলতে পারি এবং একই যুক্তি তৈরি করতে পারি। তারপরে বিটসেটটির জন্য প্রায় 125 জি মেমরির প্রয়োজন হবে। O (1) এর গ্যারান্টিযুক্ত সবচেয়ে খারাপ জটিলতা থাকা আপনার মনিবকে আপনাকে এ জাতীয় শক্তিশালী সার্ভার সরবরাহ করতে রাজি করতে পারে না।

এখানে, আমি দৃ strongly়ভাবে ও (1) বিটসেটের উপরে বাইনারি অনুসন্ধান (ও (লগ এন)) বা বাইনারি ট্রি (ও (লগ এন)) পছন্দ করব। এবং সম্ভবত, ও (এন) এর নিকৃষ্টতম জটিলতায় একটি হ্যাশ টেবিল অনুশীলনে তাদের সকলকে পরাজিত করবে।


13

আমার উত্তর এখানে স্টোকাস্টিক ম্যাট্রিক্সের সমস্ত সারি জুড়ে দ্রুত এলোমেলোভাবে নির্বাচন একটি উদাহরণ যেখানে জটিলতা হে (এম) সহ একটি অ্যালগরিদম জটিলতা ও (লগ (এম)) এর সাথে একের চেয়ে দ্রুত হয়, যখন mখুব বেশি বড় হয় না।


12

লোকেরা ইতিমধ্যে আপনার সঠিক প্রশ্নের উত্তর দিয়েছে, তাই আমি এখানে আসার সময় লোকেরা আসলে ভাবতে পারে এমন একটি সামান্য ভিন্ন প্রশ্নটি মোকাবিলা করব।

"O (1) সময়" অ্যালগরিদম এবং ডেটা স্ট্রাকচারগুলি প্রচুর পরিমাণে কেবল প্রত্যাশিত ও (1) সময় নেয়, যার অর্থ তাদের চলমান গড় সময় হ'ল (1), সম্ভবত কেবলমাত্র কিছু অনুমানের অধীনে।

সাধারণ উদাহরণ: হ্যাশ টেবিল, "অ্যারের তালিকাগুলি" বাড়ানো (ওরফে গতিশীল আকারের অ্যারে / ভেক্টর)।

এই জাতীয় পরিস্থিতিতে আপনি ডেটা স্ট্রাকচার বা অ্যালগরিদমগুলি ব্যবহার করতে পছন্দ করতে পারেন যার সময়টি একেবারে সীমিতভাবে লোগারিথ্মিকভাবে আবদ্ধ হওয়ার গ্যারান্টিযুক্ত , যদিও তারা গড় খারাপভাবে সম্পাদন করতে পারে।
উদাহরণস্বরূপ একটি ভারসাম্য বাইনারি অনুসন্ধান গাছ হতে পারে, যার চলমান সময় গড় গড় খারাপ তবে সবচেয়ে খারাপ ক্ষেত্রে।


11

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


10

আমার 2 সেন্ট লাগাতে:

কখনও কখনও অ্যালগরিদম একটি নির্দিষ্ট হার্ডওয়্যার পরিবেশে চললে আরও খারাপের জায়গায় আরও খারাপ জটিলতার অ্যালগরিদম নির্বাচন করা হয়। ধরুন আমাদের ও (1) অ্যালগরিদম অ-ক্রমানুসারে আমাদের সমস্যা সমাধানের জন্য একটি খুব বড়, স্থির আকারের অ্যারের প্রতিটি উপাদানকে অ্যাক্সেস করে। তারপরে সেই অ্যারেটিকে যান্ত্রিক হার্ড ড্রাইভে বা চৌম্বকীয় টেপে রাখুন।

সেক্ষেত্রে ও (লগন) অ্যালগরিদম (ধরুন এটি ধারাবাহিকভাবে ডিস্ক অ্যাক্সেস করে) আরও অনুকূল হয়ে যায়।


আমি এখানে যুক্ত করতে পারি যে সিক্যুয়াল-অ্যাক্সেস ড্রাইভ বা টেপে ও (1) অ্যালগোরিদম পরিবর্তে ও (এন) হয়ে যায়, যার কারণে ক্রমযুক্ত সমাধানটি আরও অনুকূল হয়ে ওঠে। অনেকগুলি ও (1) ক্রিয়া যুক্ত করা এবং সূচিকৃত লুকআপকে ধ্রুবক-সময় অ্যালগরিদম হিসাবে নির্ভর করে, যা এটি অনুক্রমিক-অ্যাক্সেসের জায়গাতে নয়।
TheHansinator

9

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


9

সহজভাবে: কারণ সহগ - সেটআপ, স্টোরেজ এবং সেই পদক্ষেপের সম্পাদনের সময়ের সাথে সম্পর্কিত ব্যয়গুলি - বৃহত্তরটির চেয়ে ছোট বিগ-ও সমস্যার সাথে অনেক বেশি হতে পারে। বিগ-ও হ'ল আলগোরিদিমগুলি স্কেলাবিলিটির একমাত্র পরিমাপ ।

কোয়ান্টাম মেকানিক্সের একাধিক ওয়ার্ল্ড ব্যাখ্যার উপর নির্ভর করে বাছাই করা অ্যালগরিদমকে প্রস্তাব করে হ্যাকারের অভিধান থেকে নিম্নলিখিত উদাহরণটি বিবেচনা করুন :

  1. কোয়ান্টাম প্রক্রিয়া ব্যবহার করে এলোকে এলোমেলোভাবে পারমুট করুন,
  2. অ্যারে বাছাই না হলে মহাবিশ্বকে ধ্বংস করুন।
  3. সমস্ত অবশিষ্ট মহাবিশ্ব এখন বাছাই করা হয়েছে [আপনি যে একটিতে রয়েছেন সেগুলি সহ]।

(সূত্র: http://catb.org/~esr/jargon/html/B/bogo-sort.html )

লক্ষ্য করুন যে এই অ্যালগরিদমের বিগ-ও হ'ল O(n)জেনেরিক আইটেমগুলিতে যে কোনও পরিচিত বাছাই করা অ্যালগরিদমকে মারধর করে। রৈখিক পদক্ষেপের সহগ এছাড়াও খুব কম (যেহেতু এটি কেবল তুলনা হয়, অদলবদল নয়, এটি লিনিয়ারালি সম্পন্ন করা হয়)। একই জাতীয় অ্যালগরিদম, আসলে, এনপি এবং সহ-এনপি উভয় ক্ষেত্রেই যে কোনও সমস্যা সমাধানের জন্য ব্যবহার করা যেতে পারেকোয়ান্টাম প্রক্রিয়াটি ব্যবহার করে প্রতিটি সম্ভাব্য সমাধান (বা কোনও সমাধান নেই যে কোনও প্রমাণ নেই) যেহেতু প্রতিটি সম্ভাব্য সমাধান (বা কোনও সমাধান নেই যে কোনও সমাধান নেই) যেহেতু, বহুপক্ষীয় সময়ে যেতে পারে বহুপক্ষীয় সময়

তবে, বেশিরভাগ ক্ষেত্রেই, আমরা সম্ভবত ঝুঁকি নিতে চাই না যে মাল্টিপল ওয়ার্ল্ডগুলি সঠিক নাও হতে পারে, এটি উল্লেখ করার জন্য নয় যে পদক্ষেপ 2 বাস্তবায়নের কাজটি এখনও "পাঠকের অনুশীলন হিসাবে ছেড়ে গেছে"।


7

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


6

একটি রিয়েলটাইম পরিস্থিতিতে যেখানে আপনার দৃ upper় ওপেন বাউন্ডের প্রয়োজন হয় আপনি উদাহরণস্বরূপ একটি কুইকোর্টের বিপরীতে হিপসোর্ট নির্বাচন করবেন, কারণ হিপসোর্টের গড় আচরণও এটি সবচেয়ে খারাপ পরিস্থিতি।


6

ইতিমধ্যে ভাল উত্তরের সাথে যুক্ত করা হচ্ছে post একটি বাস্তব উদাহরণ হ্যাশ সূচকগুলি পোস্টগ্রিস ডাটাবেসে বনাম-গাছের সূচীগুলি হবে।

হ্যাশ সূচকগুলি ডিস্কের ডেটা অ্যাক্সেস করতে একটি হ্যাশ টেবিল সূচক তৈরি করে যখন বিটি্রি নাম অনুসারে বিট্রি ডেটা স্ট্রাকচার ব্যবহার করে।

বিগ-ও সময়ে এগুলি হ'ল ও (1) বনাম ও (লগএন)।

হ্যাশ সূচকগুলি বর্তমানে পোস্টগ্রিজগুলিতে নিরুৎসাহিত হয়েছে যেহেতু বাস্তব জীবনের পরিস্থিতি বিশেষত ডাটাবেস সিস্টেমে, সংঘর্ষ ছাড়াই হ্যাশ অর্জন করা খুব শক্ত (একটি ও (এন) সবচেয়ে খারাপ ক্ষেত্রে জটিলতা সৃষ্টি করতে পারে) এবং এর কারণে এটি তৈরি করা আরও বেশি কঠিন সেগুলি ক্র্যাশ করে নিরাপদ (পোস্ট লগিং লিখুন বলা হয় - পোস্টগ্রাসে ওয়াল)।

এই ট্রেডঅফটি এই পরিস্থিতিতে তৈরি করা হয়েছে যেহেতু ও (লগএন) সূচকগুলির পক্ষে যথেষ্ট ভাল এবং ও (1) বাস্তবায়ন করা বেশ শক্ত এবং সময়ের পার্থক্যটি সত্যই গুরুত্বপূর্ণ নয়।


4

যখন nছোট হয়, এবং O(1)ক্রমাগত ধীর হয়।


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

অথবা

  1. যখন ও (1) অ্যালগরিদমের মেমরি বা অন্যান্য সময়-সংস্থানীয় সংস্থানগুলি ও (লগ এন) অ্যালগরিদমের তুলনায় ব্যতিক্রমীভাবে বড় হয়।

3
  1. কোনও প্রোগ্রাম পুনরায় ডিজাইন করার সময়, একটি পদ্ধতি ও (এলজিএন) এর পরিবর্তে ও (1) দিয়ে অনুকূলিত হতে পারে তবে এটি যদি এই প্রোগ্রামের বাধা না হয় এবং ও (1) আলগা বোঝা মুশকিল। তাহলে আপনাকে ও (1) অ্যালগোরিদম ব্যবহার করতে হবে না
  2. যখন ও (1) এর অনেক বেশি মেমরি দরকার যা আপনি সরবরাহ করতে পারবেন না, যখন ও (এলজিএন) এর সময়টি গ্রহণ করা যেতে পারে।

1

সুরক্ষা অ্যাপ্লিকেশনগুলির ক্ষেত্রে এটি প্রায়শই ঘটে থাকে যে আমরা সমস্যার ডিজাইন করতে চাই যার অ্যালগরিদম উদ্দেশ্যহেতু ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে নামকরণ

এখানে আমার মাথার উপরের দিকের কয়েকটি উদাহরণ রয়েছে।

  • সংক্ষিপ্ত-বল দ্বারা পাসওয়ার্ডগুলি অনুমান করা আরও শক্ত করার জন্য কখনও কখনও পাসওয়ার্ড হ্যাশিং ইচ্ছামত ধীরে ধীরে তৈরি করা হয়। এই তথ্য সুরক্ষা পোস্টটির সম্পর্কে একটি বুলেট পয়েন্ট রয়েছে (এবং আরও অনেক কিছু)।
  • বিট কয়েন কম্পিউটারগুলির একটি নেটওয়ার্কের জন্য "খনি" মুদ্রার সমাধান করার জন্য একটি নিয়ন্ত্রণমূলক ধীর সমস্যা ব্যবহার করে। এটি সম্মিলিত সিস্টেমের দ্বারা নিয়ন্ত্রিত হারে মুদ্রাটি খননের অনুমতি দেয়।
  • সামঁজস্যহীন সাইফারগুলির (যেমন আরএসএ ) অর্ডার এনক্রিপশন ফাটল ব্যক্তিগত কী ছাড়া অন্য কেউ প্রতিরোধ করার জন্য ইচ্ছাকৃতভাবে ধীর কী ছাড়া ডিক্রিপশন করতে ডিজাইন করা হয়। অ্যালগরিদমগুলি আশাকরি এমনভাবে তৈরি করার জন্য ডিজাইন করা হয়েছে O(2^n)যেখানে nকীটির বিট-দৈর্ঘ্য (এটি নিষ্ঠুর শক্তি)।

সিএসের অন্য কোথাও, কুইক বাছাই O(n^2)সবচেয়ে খারাপ ক্ষেত্রে তবে সাধারণ ক্ষেত্রে O(n*log(n))। এই কারণে, অ্যালগরিদম দক্ষতা বিশ্লেষণ করার সময় কখনও কখনও "বিগ ও" বিশ্লেষণ আপনার কেবল যত্নশীল হয় না।

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