কোনও ও (1 / এন) অ্যালগরিদম আছে?
বা অন্য কিছু যা ও (1) এর চেয়ে কম?
কোনও ও (1 / এন) অ্যালগরিদম আছে?
বা অন্য কিছু যা ও (1) এর চেয়ে কম?
উত্তর:
এই প্রশ্নটি বোধহয় বোকা নয়। কমপক্ষে তাত্ত্বিকভাবে, ও (1 / এন ) এর মতো কিছু পুরোপুরি বোধগম্য হয় যখন আমরা বিগ ও স্বরলিপিটির গাণিতিক সংজ্ঞা গ্রহণ করি :
এখন আপনি সহজেই 1 / x এর জন্য g ( x ) কে প্রতিস্থাপন করতে পারেন … এটি স্পষ্টত যে উপরের সংজ্ঞাটি এখনও কিছু f এর জন্য ধারণ করে ।
অ্যাসিম্পটোটিক রান-টাইম বৃদ্ধি অনুমানের উদ্দেশ্যে, এটি কম কার্যকর -… ইনপুট বাড়ার সাথে সাথে একটি অর্থবহ অ্যালগরিদম দ্রুততর হতে পারে না। অবশ্যই, আপনি এটি পূরণের জন্য একটি স্বেচ্ছাসেবী অ্যালগরিদম তৈরি করতে পারেন, উদাহরণস্বরূপ নিম্নলিখিতটি:
def get_faster(list):
how_long = (1 / len(list)) * 100000
sleep(how_long)
স্পষ্টতই, ইনপুট আকারটি বাড়ার সাথে সাথে এই ফাংশনটি কম সময় ব্যয় করে ... কমপক্ষে কিছু সীমা না হওয়া পর্যন্ত, হার্ডওয়্যার দ্বারা প্রয়োগ করা হয় (সংখ্যার যথার্থতা, sleep
অপেক্ষা করতে পারে এমন ন্যূনতম সময় , আর্গুমেন্টগুলি প্রক্রিয়া করার সময় ইত্যাদি): এই সীমাটি তখন এক হবে ধ্রুবক নিম্ন আবদ্ধ তাই বাস্তবে উপরের ফাংশনটিতে এখনও রানটাইম হে (1) থাকে।
কিন্তু হয় আসলে বাস্তব-বিশ্বের আলগোরিদিম যেখানে রানটাইম (অন্তত আংশিকভাবে) হ্রাস করতে পারেন যখন ইনপুট আকার বৃদ্ধি পায়। মনে রাখবেন যে এই অ্যালগরিদমগুলি যদিও ও (1) এর নীচে রানটাইম আচরণ প্রদর্শন করবে না । তবুও, তারা আকর্ষণীয়। উদাহরণস্বরূপ, দ্বারা খুব সহজ পাঠ্য অনুসন্ধান আলগোরিদিম নেওয়া Horspool । এখানে, অনুসন্ধানের প্যাটার্নের দৈর্ঘ্য বাড়ার সাথে সাথে প্রত্যাশিত রানটাইম হ্রাস পাবে (তবে খড়ের দৈর্ঘ্য আরও একবার রানটাইম বাড়িয়ে দেবে)।
হ্যাঁ.
রানটাইম ও (1 / n) এর সাথে "খালি" অ্যালগরিদম সহ অবিকল একটি অ্যালগরিদম রয়েছে।
অ্যালগরিদমের জন্য ও (1 / এন) হওয়ার অর্থ এটি কোনও একক নির্দেশনা সমন্বিত অ্যালগরিদমের চেয়ে কম পদক্ষেপে অ্যাসিপোটোটিক্যালি কার্যকর করে। যদি এটি সমস্ত এন> এন 0 এর জন্য এক ধাপের চেয়ে কম পদক্ষেপে কার্যকর হয় তবে অবশ্যই সেই এন এর জন্য অবশ্যই কোনও নির্দেশনা থাকা উচিত। যেহেতু 'if n> n0' চেক করতে কমপক্ষে 1 টি নির্দেশিকা ব্যয় করা হয়েছে, তাই এটি অবশ্যই সমস্ত এন এর কোনও নির্দেশনা সমন্বিত থাকতে হবে।
সংশ্লেষ: একমাত্র আলগোরিদিম যা হে (1 / এন) হ'ল খালি অ্যালগরিদম, কোনও নির্দেশাবলীর সমন্বয়ে ।
তীক্ষ্ণতম সঠিক, হে (1) সেরা সম্ভাব্য পারফরম্যান্স। তবে এটি দ্রুত সমাধান বোঝায় না, কেবল একটি নির্দিষ্ট সময় সমাধান।
একটি আকর্ষণীয় বৈকল্পিক, এবং সম্ভবত যা বলা হচ্ছে তা হ'ল জনসংখ্যা বৃদ্ধির সাথে সাথে সমস্যাগুলি আরও সহজ হয়। আমি 1 টি ভাবতে পারি, যদিও এটি স্বীকৃত এবং জিভ-ইন-গাল উত্তর:
কোনও সেটে দু'জনের কি একই জন্মদিন হয়? যখন এন 365 ছাড়িয়ে গেছে, সত্যটি ফিরে আসুন। যদিও 365 এরও কম সময়ের জন্য এটি ও (n ln n)। সমস্যাটি আস্তে আস্তে সহজ হয়ে ওঠে না, তবে এন> 365 এর জন্য কেবল ও (1) হয়ে যায় সম্ভবত কোনও দুর্দান্ত উত্তর নয়।
এটা সম্ভব না. বিগ-ও এর সংজ্ঞা অসমতার চেয়ে বৃহত্তর নয় :
A(n) = O(B(n))
<=>
exists constants C and n0, C > 0, n0 > 0 such that
for all n > n0, A(n) <= C * B(n)
সুতরাং বি (এন) প্রকৃতপক্ষে সর্বাধিক মান, অতএব এটি এন হিসাবে বৃদ্ধি পেলে অনুমান পরিবর্তন হবে না।
বিগ হে নোটেশন সম্পর্কে আমার পূর্ববর্তী শিখন থেকে, আপনার যদি 1 টি পদক্ষেপের প্রয়োজন হয় (যেমন কোনও ভেরিয়েবল পরীক্ষা করা, একটি অ্যাসাইনমেন্ট করা) তবে এটি ও (1)।
মনে রাখবেন যে ও (1) ও (6) এর সমান, কারণ "ধ্রুবক" কোনও বিষয় নয়। এজন্য আমরা বলি যে (এন) ও (3 এন) এর সমান।
সুতরাং আপনার যদি আরও 1 টি পদক্ষেপের প্রয়োজন হয় তবে এটি হে (1) ... এবং যেহেতু আপনার প্রোগ্রামটির কমপক্ষে 1 টি পদক্ষেপ প্রয়োজন, তাই সর্বনিম্ন একটি অ্যালগরিদম যেতে পারে ও (1)। যদি না আমরা এটি না করি, তবে এটি ও (0), আমি মনে করি? আমরা যদি কিছু কিছু করি তবে তা ও (1), এবং এটি সর্বনিম্ন যেতে পারে।
(আমরা যদি এটি না করা বেছে নিই, তবে এটি জেন বা টাও প্রশ্নে পরিণত হতে পারে ... প্রোগ্রামিংয়ের ক্ষেত্রে, ও (1) এখনও সর্বনিম্ন)।
বা এটি সম্পর্কে:
প্রোগ্রামার : মনিব, আমি ও (1) সময়ে এটি করার একটি উপায় খুঁজে পেয়েছি!
বস : এটি করার দরকার নেই, আমরা আজ সকালে দেউলিয়ার।
প্রোগ্রামার : ওহ, তবে এটি ও (0) হয়ে যায়।
না, এটি সম্ভব নয়:
যেহেতু n 1 / n তে অনন্তের দিকে ঝুঁকেছে আমরা শেষ পর্যন্ত 1 / (inf) অর্জন করি যা কার্যকরভাবে 0।
সুতরাং, সমস্যার বড়-ওহ শ্রেণিটি একটি বৃহত্তর এন সহ ও (0) হবে তবে কম এন দিয়ে ধ্রুবক সময়ের কাছাকাছি থাকবে। এটি বোধগম্য নয়, কারণ ধ্রুব সময়ের চেয়ে দ্রুততম কাজ কেবলমাত্র:
void nothing() {};
এমনকি এটি তর্কযোগ্য!
আপনি কোনও আদেশ কার্যকর করার সাথে সাথে আপনি কমপক্ষে ও (1) এ রয়েছেন, তাই না, আমাদের ও (1 / n) এর একটি বড়-ওহ শ্রেণি থাকতে পারে না!
কীভাবে ফাংশনটি চালাবেন না (এনওওপি)? বা একটি নির্দিষ্ট মান ব্যবহার করে। সেটা কি হিসাবের মধ্যে আসে?
ইনপুটগুলি বড় হওয়ার সাথে সাথে ছোট হওয়ার সম্ভাবনাগুলি বর্ণনা করতে আমি প্রায়শই ও (1 / এন) ব্যবহার করি - উদাহরণস্বরূপ, লগ 2 (এন) ফ্লিপগুলিতে একটি ন্যায্য মুদ্রার লেজ উপস্থিত হওয়ার সম্ভাবনা হ'ল ও (1 / এন)।
ও (1) এর সহজ অর্থ "ধ্রুবক সময়"।
আপনি যখন কোনও লুপটিতে প্রারম্ভিক প্রস্থান যোগ করেন [1] আপনি (বিগ-ও স্বরলিপিতে) কোনও ও (1) অ্যালগরিদমকে ও (এন) এ পরিণত করছেন, তবে এটি দ্রুত তৈরি করছেন।
কৌশলটি সাধারণভাবে ধ্রুবক সময় অ্যালগরিদম সর্বোত্তম, এবং রৈখিক ততক্ষণে তাত্ক্ষণিক, তবে ক্ষুদ্র পরিমাণ এন এর জন্য ক্ষতিকারক অ্যালগোরিদ সম্ভবত দ্রুততর হতে পারে।
1: এই উদাহরণের জন্য একটি স্থির তালিকার দৈর্ঘ্য ধরে নেওয়া
যার জন্য এই প্রশ্নটি পড়ে এবং কথোপকথনটি কী তা বুঝতে চায়, তার পক্ষে এটি সহায়তা করতে পারে:
| |constant |logarithmic |linear| N-log-N |quadratic| cubic | exponential |
| n | O(1) | O(log n) | O(n) |O(n log n)| O(n^2) | O(n^3) | O(2^n) |
| 1 | 1 | 1 | 1| 1| 1| 1 | 2 |
| 2 | 1 | 1 | 2| 2| 4| 8 | 4 |
| 4 | 1 | 2 | 4| 8| 16| 64 | 16 |
| 8 | 1 | 3 | 8| 24| 64| 512 | 256 |
| 16 | 1 | 4 | 16| 64| 256| 4,096 | 65536 |
| 32 | 1 | 5 | 32| 160| 1,024| 32,768 | 4,294,967,296 |
| 64 | 1 | 6 | 64| 384| 4,069| 262,144 | 1.8 x 10^19 |
আমি বিশ্বাস করি কোয়ান্টাম অ্যালগরিদমগুলি সুপারপজিশনের মাধ্যমে "একবারে" একাধিক গণনা করতে পারে ...
আমি সন্দেহ করি এটি একটি দরকারী উত্তর।
অনেকের সঠিক উত্তর ছিল (না) এটি প্রমাণ করার আরও একটি উপায় এখানে রয়েছে: কোনও ক্রিয়াকলাপ করার জন্য আপনাকে ফাংশনটি কল করতে হবে এবং আপনাকে একটি উত্তর ফিরে আসতে হবে। এটি একটি নির্দিষ্ট ধ্রুব পরিমাণ সময় নেয়। যদি বাকি প্রক্রিয়াজাতকরণগুলি বড় ইনপুটগুলির জন্য কম সময় নেয় তবে উত্তরটি মুদ্রণ করে (যা আমরা এককভাবে ধরে নিতে পারি) কমপক্ষে ধ্রুবক সময় নেয়।
জনসংখ্যা বৃদ্ধির সাথে সাথে কোন সমস্যাগুলি আরও সহজ হয়? একটি উত্তর বিটোরেন্টের মতো জিনিস যেখানে ডাউনলোডের গতি নোডের সংখ্যার বিপরীত ফাংশন। একটি গাড়ির বিপরীতে, যা আপনি এটি লোড করার পরিমাণ তত কমিয়ে দেন, বিটোরেন্টের মতো একটি ফাইল-শেয়ারিং নেটওয়ার্ক আরও সংযুক্ত নোডকে গতিবেগ করে।
আপনি ও (1) এর নীচে যেতে পারবেন না, তবে ও (কে) যেখানে কে এন এর চেয়ে কম হবে এটি সম্ভব। আমরা তাদের সাবলাইনার টাইম অ্যালগরিদম বলেছি । কিছু সমস্যাগুলিতে, সাবলাইনার টাইম অ্যালগোরিদম কেবলমাত্র একটি নির্দিষ্ট সমস্যার আনুমানিক সমাধান দিতে পারে। যাইহোক, কখনও কখনও, একটি আনুমানিক সমাধানগুলি ঠিকঠাক হয়, সম্ভবত ডেটাসেটটি অনেক বড়, বা এটি সমস্ত গণনা করার জন্য কম্পিউটেশনাল ব্যয়বহুল।
এই সম্পর্কে কি:
void FindRandomInList(list l)
{
while(1)
{
int rand = Random.next();
if (l.contains(rand))
return;
}
}
তালিকার আকার বাড়ার সাথে সাথে প্রোগ্রামটির প্রত্যাশিত রানটাইম হ্রাস পাবে।
constains
রয়েছে ও (1)
ও (1 / এন) এর পরে ও (1) এর চেয়ে কম নয়, এটির মূলত অর্থ হল আপনার যত বেশি ডেটা থাকবে তত দ্রুত অ্যালগরিদম চলে। বলুন যে আপনি একটি অ্যারে পেয়েছেন এবং সর্বদা এটি একটি 100 100 উপাদানগুলি পূরণ করুন যদি এর কম থাকে তবে আর কিছু না থাকলে কিছুই করবেন না। এটি অবশ্যই ও (1 / এন) নয় তবে ও (-এন) এর মতো কিছু :) খুব খারাপ ও-বড় স্বরলিপি নেতিবাচক মানগুলিকে অনুমতি দেয় না।
হিসাবে উল্লেখ করা হয়েছে, নাল ফাংশন এর সম্ভাব্য ব্যতিক্রম বাদে, কোন কিছুই হতে পারে O(1/n)
ফাংশন , কারণ সময়কালে সময় 0 যেতে হবে।
অবশ্যই, কিছু অ্যালগরিদম রয়েছে যেমন কনরাড দ্বারা সংজ্ঞায়িত করা হয়েছে, যা মনে হয় এগুলি O(1)
কমপক্ষে কিছুটা অর্থে কম হওয়া উচিত ।
def get_faster(list):
how_long = 1/len(list)
sleep(how_long)
আপনি যদি এই অ্যালগরিদমগুলি তদন্ত করতে চান তবে আপনার নিজের অ্যাসিপটোটিক পরিমাপ বা নিজের সময়ের নিজস্ব ধারণাটি সংজ্ঞায়িত করা উচিত। উদাহরণস্বরূপ, উপরের অ্যালগরিদমে, আমি বেশ কয়েকটি "ফ্রি" অপারেশনগুলিকে একটি নির্দিষ্ট পরিমাণ সময় ব্যবহারের অনুমতি দিতে পারি। উপরের অ্যালগরিদমে, আমি যদি ঘুমের বাদে সমস্ত কিছুর জন্য সময় বাদ দিয়ে টি'র সংজ্ঞা দিই, তবে টি '= 1 / এন, যা হে (1 / এন)। সম্ভবত আরও ভাল উদাহরণ রয়েছে, যেহেতু অ্যাসিপটোটিক আচরণটি নগণ্য। প্রকৃতপক্ষে, আমি নিশ্চিত যে এর বাইরে কেউ এমন সংবেদন নিয়ে আসতে পারে যা অ-তুচ্ছ ফলাফল দেয়।
উত্তরগুলির বেশিরভাগ অংশই বিগ-ওকে একটি অ্যালগরিদমের চলমান সময় সম্পর্কে একচেটিয়াভাবে ব্যাখ্যা করে। তবে যেহেতু প্রশ্নটি উল্লেখ করে নি, তাই আমি ভেবেছিলাম সংখ্যাসূচক বিশ্লেষণে বিগ-ও এর অন্যান্য প্রয়োগ উল্লেখ করা ভাল, যা ত্রুটি সম্পর্কিত।
আপনি ধাপের আকার (এইচ) বা বিভাগের সংখ্যা (এন) সম্পর্কে কথা বলছেন কিনা তার উপর নির্ভর করে অনেকগুলি অ্যালগরিদমগুলি ও (এইচ ^ পি) বা ও (এন ^ {- পি}) হতে পারে। উদাহরণস্বরূপ, ইউলারের পদ্ধতিতে আপনি y (h) এর অনুমানের জন্য সন্ধান করেছেন যে আপনি y (0) এবং dy / dx (y এর ডেরিভেটিভ) জানেন। আপনার y (h) এর অনুমানটি আরও নিখুঁত হয় 0 এর নিকটতম 0 প্রতিটি বিন্দুতে, y (0) থেকে y (x / n) থেকে y (2x / n), ইত্যাদি পেতে।
সুতরাং অয়লারের পদ্ধতিটি তখন একটি ও (এইচ) বা ও (1 / এন) অ্যালগরিদম হয়, যেখানে h সাধারণত একটি ধাপের আকার হিসাবে ব্যাখ্যা করা হয় এবং n আপনি একটি বিরতি ভাগ করার সময় হিসাবে সংখ্যায়িত হয়।
আসল সংখ্যামূলক বিশ্লেষণ অ্যাপ্লিকেশনগুলিতে আপনার ও (1 / ঘন্টা) থাকতে পারে, কারণ ভাসমান পয়েন্ট গোলাকার ত্রুটির । আপনি আপনার ব্যবধান যত ছোট করবেন, নির্দিষ্ট অ্যালগরিদমের বাস্তবায়নের জন্য আরও বাতিল হবে, উল্লেখযোগ্য অঙ্কের আরও ক্ষতি এবং এর ফলে আরও ত্রুটি, যা অ্যালগোরিদমের মাধ্যমে প্রচারিত হয়।
ইউলারের পদ্ধতির জন্য, আপনি যদি ভাসমান পয়েন্টগুলি ব্যবহার করছেন তবে একটি ছোট পর্যাপ্ত পদক্ষেপ এবং বাতিলকরণ ব্যবহার করুন এবং আপনি একটি বৃহত সংখ্যায় একটি ছোট সংখ্যা যুক্ত করছেন, বড় সংখ্যাটি অপরিবর্তিত রেখে। অ্যালগরিদমগুলির জন্য যা দুটি খুব নিকটস্থ স্থানে মূল্যায়ন করা ফাংশন থেকে একে অপরকে দুটি সংখ্যার বিয়োগের মাধ্যমে ডেরাইভেটিভ গণনা করে, মসৃণ ক্রিয়ায় y '(x) সঙ্গে (y (x + h) - y (x) / ঘন্টা) সমান করে (x + h) y (x) এর নিকটবর্তী হয় যার ফলে বৃহত্তর বাতিল হয়ে যায় এবং এর চেয়ে কম উল্লেখযোগ্য পরিসংখ্যান সহ ডেরিভেটিভের জন্য অনুমান করা যায়। এটি আপনার ডেরিভেটিভের (যেমন, একটি সীমানা মান সমস্যা) জন্য প্রয়োজনীয় যে কোনও অ্যালগরিদমকে প্রচার করবে।
ঠিক আছে, আমি এটি সম্পর্কে কিছুটা চিন্তাভাবনা করেছি, এবং সম্ভবত একটি অ্যালগরিদম রয়েছে যা এই সাধারণ ফর্মটি অনুসরণ করতে পারে:
আপনাকে 1000 নোড গ্রাফের জন্য ভ্রমণ ভ্রমণকারীদের সমস্যা গণনা করতে হবে, তবে আপনাকে নোডগুলির একটি তালিকাও দেওয়া হয়েছে যা আপনি দেখতে পারবেন না। অযাচিত নোডগুলির তালিকাটি বড় হওয়ার সাথে সাথে সমস্যাটি সমাধান করা সহজ হয়ে যায়।
আমি একটি অ্যালগরিদম দেখতে পাচ্ছি যা ও (1 / n) একটি উপরের সীমানায় স্বীকৃত:
আপনার কাছে প্রচুর ইনপুট রয়েছে যা রুটিনের বাহ্যিক কিছু কারণে পরিবর্তিত হচ্ছে (সম্ভবত তারা হার্ডওয়্যার প্রতিবিম্বিত হয় বা এটি করা প্রসেসরের এটি অন্য কোনও কোরও হতে পারে)) এবং আপনাকে অবশ্যই এলোমেলো তবে বৈধ একটি নির্বাচন করতে হবে।
এখন, যদি এটি পরিবর্তন না করা হয় তবে আপনি কেবল আইটেমের একটি তালিকা তৈরি করবেন, এলোমেলোভাবে চয়ন করুন এবং ও (1) সময় পাবেন। তবে তথ্যের গতিশীল প্রকৃতি তালিকা তৈরির বিষয়টি বাদ দেয়, আপনাকে এলোমেলোভাবে তদন্ত করতে হবে এবং তদন্তের বৈধতা পরীক্ষা করতে হবে। (এবং লক্ষ করুন যে সহজাতভাবে উত্তর নেই যে এটি ফিরে আসার পরেও কার্যকর আছে guarantee এটি এখনও ব্যবহার করতে পারে - বলুন, একটি গেমের ইউনিটের জন্য এআই। এটি লক্ষ্যবস্তুতে গুলি করতে পারে যা দৃশ্যটি বাইরে ছিটকে গিয়েছিল was ট্রিগারটি টানছে)
এটি অনন্তের সবচেয়ে খারাপ ক্ষেত্রে পারফরম্যান্স পেয়েছে তবে ডেটা স্থান পূরণের সাথে সাথে একটি গড় কেস পারফরম্যান্স down
সংখ্যা বিশ্লেষণে, আনুমানিক অ্যালগরিদমে আনুমানিক সহনশীলতায় উপ-ধ্রুবক অ্যাসিম্পোটিক জটিলতা থাকা উচিত।
class Function
{
public double[] ApproximateSolution(double tolerance)
{
// if this isn't sub-constant on the parameter, it's rather useless
}
}
আমি অনুমান করি যে ও (1) এর চেয়ে কম সম্ভব নয়। আলগো দ্বারা নেওয়া যে কোনও সময়কে ও (1) হিসাবে আখ্যায়িত করা হয়। তবে ও (1 / n) এর জন্য নীচের ফাংশনটি সম্পর্কে। (আমি জানি এই সমাধানটিতে ইতিমধ্যে উপস্থাপিত অনেকগুলি রূপ রয়েছে তবে আমি অনুমান করি যে তাদের সকলের কিছু ত্রুটি রয়েছে (প্রধান নয়, তারা ধারণাটি ভালভাবে ব্যাখ্যা করেছেন) So সুতরাং এখানে একটি যুক্তি রয়েছে কেবল যুক্তি দেখানোর জন্য:
def 1_by_n(n, C = 10): #n could be float. C could be any positive number
if n <= 0.0: #If input is actually 0, infinite loop.
while True:
sleep(1) #or pass
return #This line is not needed and is unreachable
delta = 0.0001
itr = delta
while delta < C/n:
itr += delta
সুতরাং এন বৃদ্ধি হিসাবে ফাংশন কম এবং কম সময় নিতে হবে। এছাড়াও এটি নিশ্চিত করা হয় যে যদি ইনপুটটি আসলে 0 হয় তবে ফাংশনটি চিরতরে ফিরে আসতে লাগবে।
কেউ তর্ক করতে পারে যে এটি মেশিনের নির্ভুলতার দ্বারা আবদ্ধ হবে। এইভাবে সিন ইটের একটি ওপেন বাউন্ড রয়েছে এটি হে (1)। তবে আমরা স্ট্রমে এন এবং সি ইনপুট গ্রহণ করে সেইটিকেও বাইপাস করতে পারি। এবং সংযোজন এবং তুলনা স্ট্রিং উপর সম্পন্ন করা হয়। আইডিয়াটি হ'ল এটির সাহায্যে আমরা স্বল্প পরিমাণে কমিয়ে আনতে পারি। সুতরাং আমরা n = 0 উপেক্ষা করলেও ফাংশনের উপরের সীমাটি সীমাবদ্ধ নয়।
আমি আরও বিশ্বাস করি যে আমরা কেবল এটি বলতে পারি না যে রান সময়টি ও (1 / n)। তবে আমাদের ও (1 + 1 / n) এর মতো কিছু বলা উচিত
O (1 / n) একটি অ্যালগরিদম নির্মাণ করা সম্ভব হতে পারে। একটি উদাহরণ এমন একটি লুপ হবে যা f (n) এর একাধিক বারের পুনরাবৃত্তি করে যেখানে f (n) এমন কিছু ফাংশন যার মান n এর চেয়ে বড় হওয়ার গ্যারান্টিযুক্ত এবং f (n) -n এর সীমানা হিসাবে এন অফ ইনফিনিটি হয় শূন্য। F (n) এর গণনাও সমস্ত n এর জন্য ধ্রুবক হওয়া দরকার। আমি জানি না এফ (এন) দেখতে কেমন হবে বা এই জাতীয় অ্যালগরিদমের কী প্রয়োগ হবে, আমার মতে তবে এই ধরনের ফাংশন থাকতে পারে তবে ফলিত অ্যালগরিদমের সাথে কোনও অ্যালগোরিদমের সম্ভাবনা প্রমাণ করা ছাড়া অন্য কোনও উদ্দেশ্য থাকতে পারে না I হে (1 / ঢ)।
আমি অ্যালগরিদমগুলি সম্পর্কে জানি না তবে ও (1) এর চেয়ে কম জটিলতা এলোমেলোভাবে অ্যালগরিদমে উপস্থিত হয়। আসলে, ও (1) (ছোট ও) ও (1) এর চেয়ে কম। এ জাতীয় জটিলতা এলোমেলোভাবে সাধারণত অ্যালগরিদমে উপস্থিত হয়। উদাহরণস্বরূপ, যেমন আপনি বলেছেন, যখন কোনও ইভেন্টের সম্ভাব্যতা 1 / n অর্ডার হয় তারা ও (1) দিয়ে এটিকে বোঝায়। অথবা যখন তারা বলতে চান যে উচ্চ সম্ভাবনার সাথে কিছু ঘটে (যেমন 1 - 1 / n) তারা এটিকে 1 - ও (1) দিয়ে বোঝায়।
উত্তর যদি ইনপুট ডেটা নির্বিশেষে একই হয় তবে আপনার কাছে একটি ও (0) অ্যালগরিদম রয়েছে।
বা অন্য কথায় - ইনপুট ডেটা জমা দেওয়ার আগে উত্তরটি জানা যায় - ফাংশনটি অপ্টিমাইজ করা যায় - সুতরাং হে (0)
বিগ-ও স্বরলিপিটি একটি অ্যালগরিদমের জন্য সবচেয়ে খারাপ পরিস্থিতি উপস্থাপন করে যা এটির সাধারণ রান সময় হিসাবে একই জিনিস নয়। এটি প্রমাণ করা সহজ যে কোনও হে (1 / এন) অ্যালগরিদম হল একটি হে (1) অ্যালগরিদম। সংজ্ঞা অনুসারে,
ও (1 / এন) -> টি (এন) <= 1 / এন, সমস্ত এন> = সি> 0
ও (1 / এন) -> টি (এন) <= 1 / সি, যেহেতু 1 / n <= 1 / C সকল এন এর জন্য = সি
ও (1 / এন) -> ও (1), যেহেতু বিগ-ও স্বীকৃতি ধ্রুবকগুলিকে উপেক্ষা করে (অর্থাত সি এর মান কিছু যায় না)
hashtable-contains
অ্যালগরিদমের প্রত্যাশিত (এবং গড়) রানটাইমটি বিবেচনা করুন যা ও (1) হিসাবে চিহ্নিত করা যেতে পারে - এবং সবচেয়ে নিকৃষ্টতম পরিস্থিতি খুব স্পষ্টভাবে থেটা (এন) হিসাবে দেওয়া যেতে পারে! ওমেগা এবং থেটাকে কেবল অন্য সীমানা বোঝাতে ব্যবহৃত হতে পারে তবে এটি আবার বলা যেতে পারে : গড় বা সর্বোত্তম ক্ষেত্রে তাদের কিছুই করার নেই।
ও (1) এর চেয়ে কিছুই ছোট নয় বিগ-ও স্বরলিপিটি একটি অ্যালগোরিদমের জটিলতার বৃহত্তম ক্রমকে বোঝায়
যদি একটি অ্যালগরিদমের n time 3 + n ^ 2 + n + 5 এর রানটাইম থাকে তবে এটি O (n ^ 3) নিম্ন শক্তিগুলি এখানে মোটেই গুরুত্ব দেয় না কারণ এন -> ইনফ, এন ^ 2 এর তুলনায় অপ্রাসঙ্গিক হবে এন ^ 3
অনুরূপভাবে এন -> ইনফ, ও (1 / এন) ও (1) এর তুলনায় অপ্রাসঙ্গিক হবে সুতরাং 3 + ও (1 / এন) ও (1) এর সমান হবে সুতরাং ও (1) সবচেয়ে কম সম্ভাব্য গণনাযোগ্য হবে জটিলতা
inline void O0Algorithm() {}
এখানে একটি সাধারণ হে (1 / এন) অ্যালগরিদম। এবং এটি এমনকি আকর্ষণীয় কিছু করে!
function foo(list input) {
int m;
double output;
m = (1/ input.size) * max_value;
output = 0;
for (int i = 0; i < m; i++)
output+= random(0,1);
return output;
}
ও (1 / এন) এটি সম্ভব যেমন এটি বর্ণনা করে যে কীভাবে কোনও ক্রমের আউটপুট পরিবর্তনের আকারের ইনপুট পরিবর্তন করে। যদি আমরা কোন ফাংশনটি কার্যকর করে তার নির্দেশনার সংখ্যা বর্ণনা করতে 1 / n ফাংশনটি ব্যবহার করি তবে ফাংশনটি কোনও ইনপুট আকারের শূন্য নির্দেশাবলীর দরকার নেই। বরং এটি হ'ল প্রতিটি ইনপুট আকারের জন্য n কিছু প্রান্তিকের উপরে, প্রয়োজনীয় নির্দেশাবলীর সংখ্যা উপরে 1 / n দ্বারা ধনাত্মক ধ্রুবক দ্বারা আবদ্ধ হয়। যেহেতু কোনও আসল সংখ্যা নেই যার জন্য 1 / n 0 হয় এবং ধ্রুবকটি ইতিবাচক হয়, তবে ফাংশনটি 0 বা তার চেয়ে কম নির্দেশাবলী গ্রহণে বাধা দেওয়ার কোনও কারণ নেই।