You are on page 1of 5

Big O notation and Complexity Analysis

Nafis Ul Haque

14 January, 2022

1
১িট েপৰ্াগৰ্াম িলখার পর িনশ্চয়ই আমরা ভািব েয েপৰ্াগৰ্াম িট কতখািন efficient? ইনপুট বাড়ার সােথ সােথ
এিট েকমন সময় িনেব চলেত? কতখািন েমমির িনেব? বুঝাই যােচ্ছ, িবষয় গুেলা ইনপুট সাইেজর উপর িনভর্র
কের। কােজই উত্তর টা 5 েসেকন্ড বা 100MB এমন ভােব িনিদর্ষ্ট কের বেল েদয়া যােব না। তেব কাজটা
কীভােব করা যায়?
উত্তর হেচ্ছ Big O notation!
Big O notation মূ লত েকােনা ১িট অয্ালগিরদম ইনপুট সাইজ n বাড়ার সােথ সােথ worst-case (অথর্াৎ
যখন অয্ালগিরদমিট সবেচেয় খারাপ perform কের) এ িক পিরমাণ অপােরশন েনয় তা n এর ১িট ফাংশন
রূেপ পৰ্কাশ কের।
আচ্ছা এখােন worst-case িদেয় িক বুঝািচ্ছ?
মেন কর েতামার কােছ n িট সংখয্ার array েদয়া আেছ, এর মেধয্ েথেক তুিম েদখেত চােচ্ছা 1 সংখয্ািট আেছ
িকনা।
এর জনয্ তুিম array এর বাম েথেক একিট একিট কের সংখয্া েচক কের েদখেত পার, যতক্ষণ না পযর্ন্ত 1
পাও। সবগুেলা সংখয্া েচক করার পর ও যিদ 1 পাওয়া না যায়, তার মােন 1 আসেল array েতই েনই।

যিদ array টা এমন হয়, তেব আমােদর কপাল অেনক ভােলা, array এর শুরুেতই 1 েপেয় েগিছ, array
এর পেরর উপাদান গুেলা আর েচক করেত হেচ্ছ না! এরকম ইনপুট এ, অথর্াৎ যা খুজ
ঁ িছ তা যিদ একদম
শুরুেতই থােক, তখন আমােদর এই েখাঁজাখুঁিজ এর অয্ালগিরদমিট সবেচেয় ভােলা কাজ করেব। তাই এটােক
আমরা অয্ালগিরদমিটর best-case বলেত পাির!
এবার worst-case িদেয় িক বুঝািচ্ছ তাও িনশ্চয়ই বুঝা যােচ্ছ!

এবার আর আমােদর কপাল এেতা ভােলা না, এবার 1 খুজ


ঁ েত িগেয় পুেরা array এর সব গুেলা উপাদান ই
আমােদর েচক করেত হেচ্ছ! এিট ই হেচ্ছ আমােদর এই অয্ালগিরদমিটর worst-case!

েকােনা অয্ালগিরদম কতখািন efficient তা মাপার একিট উপায় হেচ্ছ এিট worst-case এ িকরকম perform
কের তা েদখা।

ধরা যাক অেনক িহসাব িনকাস কের আমরা ১িট অয্ালগিরদম worst-case এ কতগুেলা অপােরশন িনেব তা
n এর একিট ফাংশন f (n) দব্ারা পৰ্কাশ করলাম। আপাতত ধের েনই f (n) এমন িকছু ,

f (n) = n3 + 2n2 + 5n + 3

2
িকন্তু এত জিটল একিট ফাংশেনর িক দরকার আেছ? িচন্তা কের েদখ, n এর মান একটু বড় হেলই 2n2 +5n+3
অংশটুকু n3 এর তুলনায় এতই েছাট হেয় যায় েয এেদর িহসােব না আনেলও িকছু যায় আেস না! n এর মান
মাতৰ্ 1000 এর জনয্ই পরীক্ষা কের েদখেত পার!

তাই আমরা বেল িদেত পাির, অয্ালগিরদমিট worst-case এ েমাটােমািটভােব n3 িট অপােরশন েনয়। এিট ই
অয্ালগিরদমিটর Time Complexity! িবষয়িট Big O Notation িদেয় এভােব িলখা হয় - O(n3 ) ।

বুঝাই যােচ্ছ, Big O ফাংশেন n এর সবেচেয় বড় ঘাতিট েরেখ বািক গুেলা েফেল েদয়া হয়। েযমন -
O(n2 + 66n − 4) = O(n2 )।
শুধু তাই নয়, আমরা n এর সােথ েকােনা constant গুণ আকাের থাকেল তাও েফেল েদই! েযমন -
O(3n2 ) = O(n2 ) িকংবা O(5n3 ) = O(n3 ) । িকন্তু েকন? শুরুেতই বেলিছলাম, Big O notation ইনপুট
সাইজ n বাড়ার সােথ সােথ ফাংশনিট েকমন দৰ্ুত বাড়েত থাকেব তা িনেয় মাথা ঘামায়, কােজই একিট
constant িদেয় গুন করেল linear ফাংশন linear ই েথেক যােব, একিট quadratic ফাংশন quadratic
ই েথেক যােব। তাই Big O notation constant িনেয় মাথা ঘামায় না।

এবার িকছু িজিনস-পািতর Complexity িননর্য় করা যাক!

ধর আমরা 1 েথেক n পযর্ন্ত সংখয্া গুেলার েযাগফল িননর্য় করেত চািচ্ছ।

int sum = 0;
for(int i = 1; i <= n; i++) {
sum = sum + i;
}
cout << sum << endl;

এখােন েযাগফল িননর্য় করেত আমরা ১িট লুপ চািলেয়িছ, 1 েথেক n পযর্ন্ত। বুঝাই যােচ্ছ, েযাগফল িননর্য়
করেত েমাটােমািট n িট অপােরশন লাগেছ, তাই এিটর Time Complexity হেচ্ছ O(n)।

যারা হালকা গিণত জােন তারা িনশ্চয়ই ভাবেছ এই কাজিটর জনয্ েতা কষ্ট কের লুপ চালােত হয় না, ১িট খুব
সহজ সূ তৰ্ই আেছ। 1 েথেক n পযর্ন্ত সংখয্া গুেলার েযাগফল হেচ্ছ n×(n+1)
2 !

int sum = (n * (n + 1)) / 2;


cout << sum << endl;

এবার েদখ েযাগফল িননর্য় করেত কয়িট অপােরশন লাগেব তা আর n এর উপর িনভর্র করেছ না, n = 5 হেল

3
যত গুেলা অপােরশন লাগেব, n = 100 হেলও িঠক ততগুেলাই লাগেব! কােজই এবার অয্ালগিরদমিট সবসময়
constant সময় ই িনেব! Big O notation এ এিটেক িলখা হয় এভােব - O(1)। অথর্াৎ এই েযাগফল িননর্েয়র
অয্ালগিরদমিটর Time Complexity হেচ্ছ O(1)।

আচ্ছা িনেচর code িটর Complexity েকমন হেব?

for(int i = 1; i <= 8 * n + 4; i++) {


//some constant time code here
}

বুঝাই যােচ্ছ, code িট েমাটােমািট 8 × n + 4 এর মত অপােরশন িনেব, আমরা constant factor বাদ িদেয়
এর Complexity পাই, O(n)।

এবার আেরকিট উদাহরণ েদখা যাক।

for(int i = 1; i <= n; i++) {


for(int j = 1; j <= n; j++) {
//some constant time code here
}
}

এখােন ২িট লুপ চলেছ, i = 1, 2, 3, ...n পৰ্িত েক্ষেতৰ্ই িভতের ১িট লুপ 1 েথেক n পযর্ন্ত চলেব। েমাট অপােরশন
দাঁড়ােচ্ছ n × n = n2 িটর মত, কােজই এর complexity O(n2 )।

আচ্ছা এবার?

for(int i = 1; i <= n; i++) {


for(int j = 1; j <= i; j++) {
//some constant time code here
}
}

i = 1 এর জনয্ j এর লুপ িট 1 পযর্ন্ত চলেব, i = 2 এর জনয্ চলেব 2 পযর্ন্ত, একই ভােব i = n এর জনয্ n
পযর্ন্ত। সব িমিলেয় অপােরশন হেচ্ছ 1 + 2 + ... + n = n×(n+1)
2 = n2 +n
2 িট। Constant factor 1
2 এবং n
এর েছাট ঘাত বাদ িদেল এর complexity দাঁড়ােচ্ছ O(n2 )।

4
Complexity েয সব সময় n এর polynomial হেব এমন েকােনা কথা েনই, যিদ আমরা েকােনা েসট এর
সকল উপেসট এর উপর iterate করতাম তেব হয়েতা complexity হত O(2n )। আবার যিদ n সাইেজর
সকল permutation েচক করেত হয় কখেনা তেব complexity হেব O(n!)।

Competitive Programming এর সমসয্া গুেলার constraint েদেখই বুেঝ েফলা যায় েকমন Complexity
এর solution িলখেত হেব। েমাটােমািটভােব ধের েনয়া যায় 1 েসেকেন্ড কিম্পউটার 108 িট অপােরশন করেত
পাের, তার উপর িভিত্ত কের আমরা এমন ১িট েটিবল দাঁড়া কের েফলেত পাির!

Constraint Possible complexities


on n

n ≤ 10 O(n!), O(n7 ), O(n6 )

n ≤ 20 O(2n × n), O(n5 )

n ≤ 80 O(n4 )

n ≤ 400 O(n3 )

n ≤ 7500 O(n2 )


n ≤ 2 × 105 O(n n), O(n log2 n)

n ≤ 5 × 105 O(n log n)

n ≤ 5 × 106 O(n)

n ≤ 1018 O(1), O(log n), O(log2 n)

উেল্লখয্, েটিবলিট এখান েথেক েনওয়া হেয়েছ।

You might also like