āĻĄā§āĻāĻž āϏā§āĻā§āϰāĻžāĻāĻāĻžāϰ āĻāĻŦāĻ āĻ ā§āϝāĻžāϞāĻāϰāĻŋāĻĻāĻŽ (DSA) āĻļā§āĻāĻžāϰ āĻĒā§āϰāĻĨāĻŽ āĻāĻŦāĻ āϏāĻŦāĻĨā§āĻā§ āĻā§āϰā§āϤā§āĻŦāĻĒā§āϰā§āĻŖ āϧāĻžāĻĒ āĻšāϞ⧠āĻ ā§āϝāĻžāϞāĻāϰāĻŋāĻĻāĻŽ āĻ ā§āϝāĻžāύāĻžāϞāĻžāĻāϏāĻŋāϏ āĻāϰāĻžāĨ¤ āĻāĻ āϰāĻŋāĻĒā§āĻāĻŋāĻāϰāĻŋāϤ⧠āĻāĻŽāĻŋ āĻāĻžāĻāĻŽ āĻāĻŦāĻ āϏā§āĻĒā§āϏ āĻāĻŽāĻĒā§āϞā§āĻā§āϏāĻŋāĻāĻŋ āύāĻŋā§ā§ āĻāĻŽāĻžāϰ āĻŦāĻŋāϏā§āϤāĻžāϰāĻŋāϤ āϞāĻžāϰā§āύāĻŋāĻ āύā§āĻāϏ āĻļā§ā§āĻžāϰ āĻāϰāĻāĻŋāĨ¤
āĻāĻžāĻāĻŽ āĻāĻŽāĻĒā§āϞā§āĻā§āϏāĻŋāĻāĻŋ āĻŽāĻžāύ⧠āĻāĻ āύ⧠āϝ⧠āĻā§āĻĄ āϰāĻžāύ āĻšāϤ⧠āĻāϤ āϏā§āĻā§āύā§āĻĄ āϏāĻŽā§ āϞāĻžāĻāĻā§āĨ¤ āĻŦāϰāĻ, āĻāύāĻĒā§āĻ āϏāĻžāĻāĻ ($n$) āĻŦāĻžā§āĻžāϰ āϏāĻžāĻĨā§ āϏāĻžāĻĨā§ āĻ ā§āϝāĻžāϞāĻāϰāĻŋāĻĻāĻŽāĻāĻŋ āϰāĻžāύ āĻšāϤ⧠āĻā§āĻŽāύ āϏāĻŽā§ āύā§āĻŦā§, āϤāĻžāϰ āĻāĻžāĻŖāĻŋāϤāĻŋāĻ āĻšāĻžāϰāĻā§ āĻāĻžāĻāĻŽ āĻāĻŽāĻĒā§āϞā§āĻā§āϏāĻŋāĻāĻŋ āĻŦāϞā§āĨ¤
āĻāύāĻĒā§āĻ āϝāĻžāĻ āĻšā§āĻ āύāĻž āĻā§āύ, āĻāĻžāĻ āϏāĻŦāϏāĻŽā§ āĻāĻāĻ āϏāĻŽā§ā§ āĻļā§āώ āĻšā§āĨ¤
int a = 10, b = 20;
int sum = a + b; // āĻāĻāĻŋ āϏāĻŦāϏāĻŽā§ O(1)
āĻĒā§āϰāϤāĻŋ āϧāĻžāĻĒā§ āĻāύāĻĒā§āĻ āĻ āϰā§āϧā§āĻ āĻšā§ā§ āϝāĻžā§āĨ¤ āĻāĻāĻŋ āĻ āϤā§āϝāύā§āϤ āĻĻā§āϰā§āϤāĨ¤
for (int i = n; i > 1; i = i / 2) {
cout << i; // āĻāĻāĻŋ O(log n)
}
āĻāύāĻĒā§āĻ āϝāϤ āĻŦāĻžā§āĻŦā§, āϏāĻŽā§āĻ āĻ āĻŋāĻ āϤāϤāĻā§āĻā§āĻ āĻŦāĻžā§āĻŦā§āĨ¤ āĻāĻāĻāĻŋ āϞā§āĻĒ āĻĨāĻžāĻāϞ⧠āĻāĻŽāύ āĻšā§āĨ¤
for (int i = 0; i < n; i++) {
cout << i; // n āĻŦāĻžāϰ āĻāϞāĻŦā§
}
āĻāĻāĻāĻŋ $n$ āĻŦāĻžāϰā§āϰ āϞā§āĻĒā§āϰ āĻā§āϤāϰ āϝāĻĻāĻŋ āĻĒā§āϰāϤāĻŋāĻŦāĻžāϰ $\log n$ āĻāĻžāĻ āĻšā§āĨ¤ āϏāϰā§āĻāĻŋāĻ āĻ ā§āϝāĻžāϞāĻāϰāĻŋāĻĻāĻŽā§ (Merge Sort) āĻāĻāĻŋ āĻĻā§āĻāĻž āϝāĻžā§āĨ¤ āϏāĻšāĻ āĻāĻĨāĻžā§, āĻāĻāĻŋ $O(n)$ āĻāĻŦāĻ $O(\log n)$ āĻāϰ āĻā§āĻŖāĻĢāϞāĨ¤
// āĻŦāĻžāĻāϰā§āϰ āϞā§āĻĒāĻāĻŋ n āĻŦāĻžāϰ āĻāϞ⧠-> O(n)
for (int i = 0; i < n; i++) {
// āĻā§āϤāϰā§āϰ āϞā§āĻĒāĻāĻŋ āĻĒā§āϰāϤāĻŋāĻŦāĻžāϰ āĻ
āϰā§āϧā§āĻ āĻšā§ā§ āϝāĻžāĻā§āĻā§ -> O(log n)
for (int j = n; j > 1; j = j / 2) {
cout << "Working...";
}
}
āĻāĻāĻžāύ⧠āĻā§āĻāĻžāϞ āĻāĻŽāĻĒā§āϞā§āĻā§āϏāĻŋāĻāĻŋ āĻšāĻŦā§ $n \times \log n = O(n \log n)$āĨ¤
āϞā§āĻĒā§āϰ āĻā§āϤāϰ āϞā§āĻĒ āĻĨāĻžāĻāϞ⧠(Nested Loop) āĻāĻŽāύ āĻšā§āĨ¤ āĻāύāĻĒā§āĻ āĻĻā§āĻŦāĻŋāĻā§āĻŖ āĻšāϞ⧠āϏāĻŽā§ āĻāĻžāϰāĻā§āĻŖ āĻŦā§ā§ā§ āϝāĻžā§āĨ¤
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cout << i << j; // n * n āĻŦāĻžāϰ āĻāϞāĻŦā§
}
}
āĻāĻāĻŋ āĻŽā§āϞāϤ āύā§āϏā§āĻā§āĻĄ āϞā§āĻĒā§āϰ āĻā§āϤāϰ āύā§āϏā§āĻā§āĻĄ āϞā§āĻĒāĨ¤ āĻ āϰā§āĻĨāĻžā§ ā§ŠāĻāĻŋ āϞā§āĻĒ āĻāĻā§ āĻ āĻĒāϰā§āϰ āĻā§āϤāϰ⧠āĻĨāĻžāĻāĻŦā§āĨ¤
for (int i = 0; i < n; i++) { // ā§§āĻŽ āϞā§āĻĒ (n āĻŦāĻžāϰ)
for (int j = 0; j < n; j++) { // ⧍⧠āϞā§āĻĒ (n āĻŦāĻžāϰ)
for (int k = 0; k < n; k++) { // ā§Šā§ āϞā§āĻĒ (n āĻŦāĻžāϰ)
cout << i << j << k;
}
}
}
āϏāĻŦ āϏāĻŽā§ āϝ⧠āĻāύāĻĒā§āĻ āĻļā§āϧ⧠āĻāĻāĻāĻžāĻ ($n$) āĻšāĻŦā§ āϤāĻž āĻāĻŋāύā§āϤ⧠āύā§āĨ¤ āĻāĻāύ⧠āĻāĻāύ⧠āĻāĻĒāύāĻžāϰ āĻā§āĻĄ āĻĻā§āĻāĻŋ āĻāϞāĻžāĻĻāĻž āĻāύāĻĒā§āĻā§āϰ āĻāĻĒāϰ āύāĻŋāϰā§āĻāϰ āĻāϰā§āĨ¤
āĻāĻĻāĻžāĻšāϰāĻŖ: āϧāϰā§āύ āĻāĻĒāύāĻžāϰ āĻāĻžāĻā§ $n$ āϏāĻāĻā§āϝāĻ āĻāĻžāϤā§āϰ āĻāĻā§ āĻāĻŦāĻ āĻĒā§āϰāϤāĻŋāĻāĻŋ āĻāĻžāϤā§āϰā§āϰ $k$ āĻāĻŋ āĻāϰ⧠āϏāĻžāĻŦāĻā§āĻā§āĻ āĻāĻā§āĨ¤ āĻāĻĒāύāĻŋ āϏāĻŦāĻžāϰ āϏāĻŦ āϏāĻžāĻŦāĻā§āĻā§āĻ āĻĒā§āϰāĻŋāύā§āĻ āĻāϰāĻŦā§āύāĨ¤
void printGrades(int n, int k) {
for (int i = 0; i < n; i++) { // n āĻŦāĻžāϰ āĻāϞā§
for (int j = 0; j < k; j++) { // k āĻŦāĻžāϰ āĻāϞā§
cout << "Student " << i << " Subject " << j;
}
}
}
O(n) + O(n) = O(2n) -> O(n) (āĻāύāϏā§āĻā§āϝāĻžāύā§āĻ ā§¨ āĻŦāĻžāĻĻ āϝāĻžāĻŦā§)āĨ¤āĻā§āĻŖā§āϰ āύāĻŋā§āĻŽ (Multiplication): āϞā§āĻĒā§āϰ āĻā§āϤāϰ āϞā§āĻĒ āĻĨāĻžāĻāϞā§:
n * n = O(n^2)āĨ¤
O(n^2 + n + 1), āĻāĻŽāϰāĻž āĻļā§āϧ⧠āĻŦā§āĻāĻŋ āϰāĻžāĻāĻŦ: O(n^2)āĨ¤āĻā§āĻĄ āϰāĻžāύ āĻāϰāĻžāϰ āϏāĻŽā§ āĻŽā§āĻŽā§āϰāĻŋāϤ⧠(RAM) āĻ āϤāĻŋāϰāĻŋāĻā§āϤ āĻāϤāĻā§āĻā§ āĻāĻžā§āĻāĻž āϞāĻžāĻāĻā§ āϏā§āĻāĻžāĻ āϏā§āĻĒā§āϏ āĻāĻŽāĻĒā§āϞā§āĻā§āϏāĻŋāĻāĻŋāĨ¤
**āĻ ā§āϝāĻžāϞāĻāϰāĻŋāĻĻāĻŽāĻā§āϞā§āϰ āĻŽāϧā§āϝ⧠Binary Search āĻšāϞ⧠āĻ āύā§āϝāϤāĻŽ āϏā§āϰāĻž āĻāĻāĻāĻŋ āĻāĻĻāĻžāĻšāϰāĻŖ āϝāĻž āĻā§āĻŦ āĻĻā§āϰā§āϤ āĻāĻžāĻ āĻāϰā§āĨ¤ āĻāϞā§āύ āϏāĻšāĻāĻāĻžāĻŦā§ āĻŦā§āĻāĻŋ āĻā§āύ āĻāĻāĻŋ $O(\log n)$: **
\(\frac{n}{2^k} = 1\) \((n = 2^k)\)
āĻāĻāĻžāύ⧠āĻāĻā§ āĻĒāĻžāĻļā§ Log āύāĻŋāϞ⧠āĻāĻŽāϰāĻž āĻĒāĻžāĻ: \(\log_2(n) = k\)
āĻ āϰā§āĻĨāĻžā§, āĻāĻŽāϰāĻž $n$ āĻā§ āĻāϤāĻŦāĻžāϰ ⧍ āĻĻāĻŋā§ā§ āĻāĻžāĻ āĻāϰāϞ⧠⧧-āĻ āĻĒā§āĻāĻāĻžāĻŦā§? āĻāϤā§āϤāϰ āĻšāϞ⧠$\log_2 n$ āĻŦāĻžāϰāĨ¤ āĻāĻāĻžāϰāĻŖā§āĻ āĻāĻžāĻāĻŽ āĻāĻŽāĻĒā§āϞā§āĻā§āϏāĻŋāĻāĻŋ $O(\log n)$āĨ¤
Big-O āύāĻŋāϰā§āĻĻā§āĻļ āĻāϰ⧠āĻāĻāĻāĻŋ āĻ ā§āϝāĻžāϞāĻāϰāĻŋāĻĻāĻŽ āϏāϰā§āĻŦā§āĻā§āĻ āĻāϤ āϏāĻŽā§ āύāĻŋāϤ⧠āĻĒāĻžāϰ⧠(Worst Case)āĨ¤ āĻāĻāĻŋ āĻāĻŽāĻžāĻĻā§āϰ āĻā§āϝāĻžāϰāĻžāύā§āĻāĻŋ āĻĻā§ā§ āϝā§, âāĻāĻžāĻ, āĻāĻ āĻā§āĻĄāĻāĻž āϰāĻžāύ āĻšāϤ⧠āĻāϰ āĻā§ā§ā§ āĻŦā§āĻļāĻŋ āϏāĻŽā§ āĻāϰ āϞāĻžāĻāĻŦā§ āύāĻžāĨ¤â
Big-Theta āĻšāϞ⧠āĻāϰāĻ āĻŦā§āĻļāĻŋ āϏā§āύāĻŋāϰā§āĻĻāĻŋāώā§āĻāĨ¤ āĻāĻāĻŋ āύāĻŋāϰā§āĻĻā§āĻļ āĻāϰ⧠āϝ⧠āĻ ā§āϝāĻžāϞāĻāϰāĻŋāĻĻāĻŽāĻāĻŋ āϏāĻŦāϏāĻŽā§ āĻāĻāĻāĻŋ āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āϏā§āĻŽāĻžāϰ āĻŽāϧā§āϝā§āĻ āĻāĻžāĻ āĻāϰāĻŦā§āĨ¤ āĻāĻāĻŋ Upper Bound āĻāĻŦāĻ Lower Bound āĻĻā§āĻā§āϰ āϏāĻŽāύā§āĻŦāϝāĻŧāĨ¤
āϧāϰā§āύ āĻāĻĒāύāĻžāϰ āĻāĻžāĻā§ āĻāĻāĻāĻŋ āĻ ā§āϝāĻžāϰ⧠āĻāĻā§ āĻāĻŦāĻ āĻāĻĒāύāĻŋ āϏā§āĻāĻžāύ⧠āĻāĻāĻāĻŋ āϏāĻāĻā§āϝāĻž āĻā§āĻāĻāĻā§āύ (Linear Search):
Big-O ($O$): āĻāĻŽāϰāĻž āĻŦāϞāϤ⧠āĻĒāĻžāϰāĻŋ āĻāĻ āϏāĻžāϰā§āĻā§āϰ āĻāĻŽāĻĒā§āϞā§āĻā§āϏāĻŋāĻāĻŋ $O(n)$āĨ¤ āĻāϰ āĻŽāĻžāύ⧠āĻšāϞ⧠āϏāϰā§āĻŦā§āĻā§āĻ $n$ āĻŦāĻžāϰ āϞā§āĻĒāĻāĻŋ āĻā§āϰāĻŦā§āĨ¤ (āϝāĻĻāĻŋāĻ ā§§ āĻŦāĻžāϰ āĻā§āĻ āĻāϰā§āĻ āϏāĻāĻā§āϝāĻžāĻāĻŋ āĻĒāĻžāĻā§āĻž āϝā§āϤ⧠āĻĒāĻžāϰā§, āĻāĻŋāύā§āϤ⧠$O(n)$āĻŦāϞāĻžāĻāĻž āĻā§āϞ āύ⧠āĻāĻžāϰāĻŖ āĻāĻāĻŋ āϏāϰā§āĻŦā§āĻā§āĻ āϏā§āĻŽāĻž āĻŦā§āĻāĻžāĻā§āĻā§)āĨ¤
Big-Theta ($\Theta$): āĻāĻĒāύāĻŋ āϝāĻāύ āĻŦāϞāĻŦā§āύ āĻāĻŽāĻĒā§āϞā§āĻā§āϏāĻŋāĻāĻŋ $\Theta(n)$, āϤāĻžāϰ āĻŽāĻžāύ⧠āĻšāϞ⧠āĻ ā§āϝāĻžāϞāĻāϰāĻŋāĻĻāĻŽāĻāĻŋ āĻāύāĻĒā§āĻā§āϰ āϏāĻžāĻĨā§ āϏāĻžāĻĨā§ āϞāĻŋāύāĻŋā§āĻžāϰāϞāĻŋāĻ āĻŦāĻžā§āĻā§, āĻāϰ āĻā§āύ⧠āĻŦā§āϝāϤāĻŋāĻā§āϰāĻŽ āύā§āĻāĨ¤
Big-Omega āύāĻŋāϰā§āĻĻā§āĻļ āĻāϰ⧠āĻāĻāĻāĻŋ āĻ ā§āϝāĻžāϞāĻāϰāĻŋāĻĻāĻŽ āϰāĻžāύ āĻšāϤ⧠āĻāĻŽāĻĒāĻā§āώ⧠āĻŦāĻž āϏāϰā§āĻŦāύāĻŋāĻŽā§āύ (Best Case) āĻāϤāĻā§āĻā§ āϏāĻŽā§ āύā§āĻŦā§āĨ¤ āĻāĻāĻŋ āĻšāϞ⧠āĻ ā§āϝāĻžāϞāĻāϰāĻŋāĻĻāĻŽā§āϰ Lower BoundāĨ¤
āϏāĻšāĻ āĻāĻĻāĻžāĻšāϰāĻŖ: āĻāĻĒāύāĻŋ āϝāĻĻāĻŋ āĻāĻžāĻāĻā§ āĻŦāϞā§āύ, âāĻāĻ āĻāĻžāĻāĻāĻž āĻāϰāϤ⧠āĻāĻŽāĻžāϰ āĻāĻŽāĻĒāĻā§āώ⧠ā§Ģ āĻŽāĻŋāύāĻŋāĻ āϞāĻžāĻāĻŦā§āĨ¤â āĻāϰ āĻŽāĻžāύ⧠āĻšāϞ⧠āĻāĻžāĻāĻāĻž ā§Ģ āĻŽāĻŋāύāĻŋāĻā§āĻ āĻšāϤ⧠āĻĒāĻžāϰā§, āĻŦāĻž āϤāĻžāϰ āĻŦā§āĻļāĻŋ (ā§§ā§Ļ āĻŦāĻž ⧍ā§Ļ āĻŽāĻŋāύāĻŋāĻ) āϞāĻžāĻāϤ⧠āĻĒāĻžāϰā§, āĻāĻŋāύā§āϤ⧠āĻāĻāύā§āĻ ā§Ģ āĻŽāĻŋāύāĻŋāĻā§āϰ āĻāĻŽ āϞāĻžāĻāĻŦā§ āύāĻžāĨ¤ āĻāĻāĻžāĻ ($\Omega$)āĨ¤
āϧāϰāĻž āϝāĻžāĻ, āĻāĻāĻāĻž āĻ ā§āϝāĻžāϰā§āϤ⧠āĻāĻĒāύāĻŋ āĻāĻāĻāĻŋ āϏāĻāĻā§āϝāĻž āĻā§āĻāĻāĻā§āύāĨ¤
āϏāĻžāϧāĻžāϰāĻŖ āύāĻŋā§āĻŽ ($O(n^3)$):āĻāĻŽāϰāĻž āϏā§āĻā§āϞ-āĻāϞā§āĻā§ āϝā§āĻāĻžāĻŦā§ āĻŽā§āϝāĻžāĻā§āϰāĻŋāĻā§āϏ āĻā§āĻŖ āĻāϰāĻž āĻļāĻŋāĻāĻŋ (Row āĻĻāĻŋā§ā§ Column-āĻā§ āĻā§āĻŖ), āϏā§āĻ āĻĒāĻĻā§āϧāϤāĻŋāϤ⧠āĻĻā§āĻāĻŋ $n \times n$ āĻŽā§āϝāĻžāĻā§āϰāĻŋāĻā§āϏ āĻā§āĻŖ āĻāϰāϞ⧠āĻāĻŽāĻžāĻĻā§āϰ ā§ŠāĻāĻŋ āύā§āϏā§āĻā§āĻĄ āϞā§āĻĒ āϞāĻžāĻā§āĨ¤ āϤāĻžāĻ āĻāϰ āĻāĻžāĻāĻŽ āĻāĻŽāĻĒā§āϞā§āĻā§āϏāĻŋāĻāĻŋ āĻšā§ $O(n^3)$āĨ¤
āϏā§āĻā§āϰā§āϝāĻžāϏā§āύ āĻ ā§āϝāĻžāϞāĻāϰāĻŋāĻĻāĻŽ (Strassenâs Algorithm):⧧⧝ā§Ŧ⧝ āϏāĻžāϞ⧠āĻāϞāĻāĻžāϰ āϏā§āĻā§āϰā§āϝāĻžāϏā§āύ āĻĻā§āĻāĻžāύ āϝā§, āĻŽā§āϝāĻžāĻā§āϰāĻŋāĻā§āϏ āĻā§āĻŖāύ $O(n^3)$ āĻāϰ āĻā§ā§ā§āĻ āĻĻā§āϰā§āϤ āĻāϰāĻž āϏāĻŽā§āĻāĻŦāĨ¤ āϤāĻŋāύāĻŋ āĻāĻāĻāĻŋ āĻŦāĻŋāĻļā§āώ āĻāĻžāĻŖāĻŋāϤāĻŋāĻ āĻā§āϰāĻŋāĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻā§āĻŖā§āϰ āϏāĻāĻā§āϝāĻž āĻāĻŽāĻŋā§ā§ āĻāύā§āύāĨ¤ āϤāĻžāϰ āĻ ā§āϝāĻžāϞāĻāϰāĻŋāĻĻāĻŽā§āϰ āĻāĻŽāĻĒā§āϞā§āĻā§āϏāĻŋāĻāĻŋ āĻāĻŋāϞ āĻĒā§āϰāĻžā§ $O(n^{2.81})$āĨ¤
āĻŦāϰā§āϤāĻŽāĻžāύ āϏā§āϰāĻž āϰā§āĻāϰā§āĻĄ ($O(n^{2.373})$):āϏā§āĻā§āϰā§āϝāĻžāϏā§āύā§āϰ āĻĒāϰ āĻ āύā§āĻ āĻāĻŖāĻŋāϤāĻŦāĻŋāĻĻ āĻāĻāĻŋ āĻāϰāĻ āĻāĻŽāĻžāύā§āϰ āĻā§āώā§āĻāĻž āĻāϰā§āĻā§āύāĨ¤ āĻŦāϰā§āϤāĻŽāĻžāύ⧠āϏāĻŦāĻĨā§āĻā§ āĻĒāϰāĻŋāĻāĻŋāϤ āĻāĻŦāĻ āĻĻā§āϰā§āϤāϤāĻŽ āĻ ā§āϝāĻžāϞāĻāϰāĻŋāĻĻāĻŽāĻāĻŋ āĻšāϞ⧠CoppersmithâWinograd algorithm (āĻāĻŦāĻ āĻāϰ āĻāϧā§āύāĻŋāĻ āĻāĻžāϰā§āϏāύāĻā§āϞā§), āϝāĻžāϰ āĻāĻŽāĻĒā§āϞā§āĻā§āϏāĻŋāĻāĻŋ āĻĒā§āϰāĻžā§ $O(n^{2.373})$āĨ¤
āϏāĻšāĻ āĻāĻžāώāĻžā§: āĻā§āύ⧠āĻāĻāĻāĻŋ āĻāĻžāĻā§ āĻŽāĻžāĻā§ āĻŽāĻžāĻā§ āĻ āύā§āĻ āĻŦā§āĻļāĻŋ āϏāĻŽā§ āϞāĻžāĻā§, āĻāĻŋāύā§āϤ⧠āĻŦā§āĻļāĻŋāϰāĻāĻžāĻ āϏāĻŽā§ āϏā§āĻāĻŋ āĻā§āĻŦ āĻĻā§āϰā§āϤ āĻšā§ā§ āϝāĻžā§āĨ¤ āĻāĻ âāĻŦā§āĻļāĻŋ āϏāĻŽā§â āϞāĻžāĻāĻžāϰ āĻāϰāĻāĻāĻž āϝāĻāύ āĻ āύā§āϝ āϏāĻŦ âāĻĻā§āϰā§āϤ āĻšāĻā§āĻžâ āĻāĻžāĻā§āϰ āĻāĻĒāϰ āĻāĻžāĻ āĻāϰ⧠āĻĻā§āĻā§āĻž āĻšā§, āϤāĻāύ āϤāĻžāĻā§ Amortized āϏāĻŽā§ āĻŦāϞā§āĨ¤
āĻŦāĻžāϏā§āϤāĻŦ āĻāĻĻāĻžāĻšāϰāĻŖ: Dynamic Array (āϝā§āĻŽāύ Vector āĻŦāĻž ArrayList)
āϧāϰā§āύ āĻāĻĒāύāĻžāϰ āĻāĻžāĻā§ āĻāĻāĻāĻŋ āĻ ā§āϝāĻžāϰ⧠āĻāĻā§ āϝāĻžāϰ āϏāĻžāĻāĻ ā§ĒāĨ¤ āĻāĻĒāύāĻŋ āĻāϤ⧠ā§ĒāĻāĻŋ āĻāϞāĻŋāĻŽā§āύā§āĻ āĻāύāϏāĻžāϰā§āĻ āĻāϰāϞā§āύ āĻā§āĻŦ āĻĻā§āϰā§āϤ ($O(1)$ āϏāĻŽā§)āĨ¤
āĻāĻŋāύā§āϤ⧠āĻāĻ $O(n)$ āĻāĻžāĻāĻāĻž āĻāĻŋ āϏāĻŦāϏāĻŽā§ āĻšā§? āύāĻž, āĻāĻāĻŋ āĻā§āĻŦ āĻāĻŽ āϏāĻŽā§ā§ āĻāĻāĻŦāĻžāϰ āĻšā§āĨ¤
āĻā§āύ āĻāĻāĻŋ Average Case āύā§?
Average Case: āĻāĻāĻžāύ⧠āĻāĻŽāϰāĻž āϧāϰ⧠āύāĻŋāĻ āĻāύāĻĒā§āĻāĻā§āϞ⧠āϰâā§āϝāĻžāύā§āĻĄāĻŽ (Random) āĻšāϤ⧠āĻĒāĻžāϰā§āĨ¤
Amortized Analysis: āĻāĻāĻžāύ⧠āĻāĻŽāϰāĻž āύāĻŋāĻļā§āĻāĻŋāϤ āϝā§, āĻāĻāĻāĻž āϏāĻŋāĻā§ā§ā§āύā§āϏ āĻŦāĻž āϧāĻžāϰāĻžāĻŦāĻžāĻšāĻŋāĻ āĻ āĻĒāĻžāϰā§āĻļāύā§āϰ āĻĒāϰ āĻā§ āĻāϰāĻ āϏāĻŦ āϏāĻŽā§ āĻāĻŽāĻ āĻšāĻŦā§āĨ¤ āϝā§āĻŽāύ: āĻĄāĻžāĻāύāĻžāĻŽāĻŋāĻ āĻ ā§āϝāĻžāϰā§āϤ⧠āĻāĻĒāύāĻŋ $n$ āϏāĻāĻā§āϝāĻ āĻĄā§āĻāĻž āĻĒā§āĻļ āĻāϰāϞ⧠āĻā§ āĻāϰāĻ āϏāĻŦ āϏāĻŽā§ $O(1)$ Amortized-āĻ āĻšāĻŦā§āĨ¤
Worst-CaseāĻāĻāĻŦāĻžāϰ⧠āϏāϰā§āĻŦā§āĻā§āĻ āĻāϤ āϏāĻŽā§ āϞāĻžāĻāϤ⧠āĻĒāĻžāϰ⧠(āϝā§āĻŽāύ āϰāĻŋ-āϏāĻžāĻāĻā§āϰ āϏāĻŽā§ $O(n)$)āĨ¤
AmortizedāĻ āύā§āĻāĻā§āϞ⧠āĻ āĻĒāĻžāϰā§āĻļāύ āĻļā§āώ⧠āĻā§āĻĒā§āϤāĻž āĻāϤ āϏāĻŽā§ āϞāĻžāĻāϞ (āĻā§āϝāĻžāϰāĻžāύā§āĻāĻŋāĻĄ $O(1)$)āĨ¤
āĻāĻāĻŋ āĻāĻāĻāĻŋ āĻ āϤā§āϝāύā§āϤ āĻā§āϰā§āϤā§āĻŦāĻĒā§āϰā§āĻŖ āĻāύāϏā§āĻĒā§āĻ, āĻāĻžāϰāĻŖ āĻ āύā§āĻ āϏāĻŽā§ āĻāĻŽāϰāĻž āĻŽāύ⧠āĻāϰāĻŋ āĻā§āĻĄā§ āĻā§āύ⧠āĻ ā§āϝāĻžāϰ⧠āĻŦāĻž āĻā§āĻā§āĻāϰ āύāĻž āĻĨāĻžāĻāϞ⧠āϏā§āĻĒā§āϏ āĻāĻŽāĻĒā§āϞā§āĻā§āϏāĻŋāĻāĻŋ $O(1)$ āĻšāĻŦā§āĨ¤ āĻāĻŋāύā§āϤ⧠Recursion-āĻāϰ āĻā§āώā§āϤā§āϰ⧠āĻŦāĻŋāώā§āĻāĻŋ āĻāϞāĻžāĻĻāĻžāĨ¤
āĻā§āύ āĻāĻāĻŋ $O(n)$ āĻšāĻŦā§?
āϝāĻāύ āĻāĻāĻāĻŋ āĻĢāĻžāĻāĻļāύ āύāĻŋāĻā§āĻā§ āĻāϞ āĻāϰ⧠(Recursive Call), āϤāĻāύ āĻāĻŽā§āĻĒāĻŋāĻāĻāĻžāϰ āϏā§āĻ āĻĢāĻžāĻāĻļāύā§āϰ āĻāύā§āϝ āĻŽā§āĻŽā§āϰāĻŋāϤ⧠āĻāĻāĻāĻŋ āĻāĻžā§āĻāĻž āĻŦāϰāĻžāĻĻā§āĻĻ āĻāϰā§, āϝāĻžāĻā§ āĻŦāϞāĻž āĻšā§ Stack FrameāĨ¤
āĻĒā§āϰāϤāĻŋāĻāĻŋ āϏā§āĻā§āϝāĻžāĻ āĻĢā§āϰā§āĻŽā§ āĻāĻŋāĻā§ āϞā§āĻāĻžāϞ āĻā§āϰāĻŋā§ā§āĻŦāϞ āĻāĻŦāĻ āϰāĻŋāĻāĻžāϰā§āύ āĻ ā§āϝāĻžāĻĄā§āϰā§āϏ āĻĨāĻžāĻā§ (āϝāĻž āĻāĻāĻāĻŋ Constant Space)āĨ¤
āϝāĻĻāĻŋ āĻĒā§āϰāϤāĻŋāĻāĻŋ āĻĢā§āϰā§āĻŽā§āϰ āϏāĻžāĻāĻ $C$ āĻšā§, āϤāĻŦā§ $n$ āĻāĻŋ āĻĢā§āϰā§āĻŽā§āϰ āĻāύā§āϝ āĻŽā§āĻ āĻāĻžā§āĻāĻž āϞāĻžāĻāĻŦā§:\(n \times C = O(n)\)
āϧāϰāĻž āϝāĻžāĻ, ā§§ āĻĨā§āĻā§ $n$ āĻĒāϰā§āϝāύā§āϤ āϏāĻāĻā§āϝāĻžāϰ āϝā§āĻāĻĢāϞ āĻŦā§āϰ āĻāϰāĻžāϰ āĻāĻāĻāĻŋ āϰāĻŋāĻāĻžāϰā§āϏāĻŋāĻ āĻĢāĻžāĻāĻļāύ:
int sum(int n) {
if (n == 0) return 0;
return n + sum(n - 1); // āĻāĻāĻžāύ⧠āύāϤā§āύ āĻāϞ āĻšāĻā§āĻā§
}
āϝāĻĻāĻŋ $n = 5$ āĻšā§, āϤāĻŦā§ āĻŽā§āĻŽā§āϰāĻŋāϤ⧠sum(5), sum(4), sum(3), sum(2), sum(1) āĻāĻŦāĻ sum(0) â āĻāĻ āϏāĻŦāĻā§āϞā§āϰ āĻāύā§āϝ āĻāϞāĻžāĻĻāĻž āĻāĻžā§āĻāĻž āϞāĻžāĻāĻŦā§ āϝāϤāĻā§āώāĻŖ āύāĻž āĻļā§āώ āĻāϞāĻāĻŋ āϤāĻžāϰ āϰā§āĻāĻžāϞā§āĻ āĻĢā§āϰāϤ āĻĒāĻžāĻ āĻžāĻā§āĻā§āĨ¤ āϤāĻžāĻ āĻāĻāĻžāύ⧠āϏā§āĻĒā§āϏ āĻāĻŽāĻĒā§āϞā§āĻā§āϏāĻŋāĻāĻŋ $O(n)$āĨ¤
āĻā§āϰā§āϤā§āĻŦāĻĒā§āϰā§āĻŖ āύā§āĻ (Tail Recursion): āĻāĻŋāĻā§ āĻāϧā§āύāĻŋāĻ āĻāĻŽā§āĻĒāĻžāĻāϞāĻžāϰ Tail Recursion Optimization āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻāĻ āϏā§āĻĒā§āϏ āĻāĻŽāĻŋā§ā§ $O(1)$-āĻ āύāĻŋā§ā§ āĻāϏāϤ⧠āĻĒāĻžāϰā§, āĻāĻŋāύā§āϤ⧠āϏāĻžāϧāĻžāϰāĻŖ āĻā§āώā§āϤā§āϰ⧠āĻāĻŦāĻ āĻāύā§āĻāĻžāϰāĻāĻŋāĻāϤ⧠āĻāϤā§āϤāϰ āϏāĻŦ āϏāĻŽā§ $O(n)$-āĻ āϧāϰāĻž āĻšā§āĨ¤
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
for(int k=0; k<n; k++){
sum +=arr[i][j][k];
}
}
}
āĻā§āĻĄāĻāĻŋāĻ¤ā§ ā§ŠāĻāĻŋ āύā§āϏā§āĻā§āĻĄ āϞā§āĻĒ (āĻāĻāĻāĻŋāϰ āĻā§āϤāϰ⧠āĻāϰā§āĻāĻāĻŋ) āĻāĻā§:āϏāĻŦāĻā§ā§ā§ āĻŦāĻžāĻāϰā§āϰ āϞā§āĻĒ (i):
āϏāĻŦāĻā§āϝāĻŧā§ āĻā§āϤāϰā§āϰ āϞā§āĻĒ (k): āĻŽāĻžāĻāĻāĻžāύā§āϰ āϞā§āĻĒā§āϰ āĻĒā§āϰāϤāĻŋ ā§§ āĻŦāĻžāϰ āĻā§āϰāĻžāϰ āĻāύā§āϝ āĻāĻ āϞā§āĻĒāĻāĻŋ āĻāĻŦāĻžāϰ $n$ āĻŦāĻžāϰ āĻāϞā§āĨ¤
āĻāĻāĻŋ āĻŦā§āĻļ āϏā§āϞ⧠(Slow) āĻāĻŽāĻĒā§āϞā§āĻā§āϏāĻŋāĻāĻŋāĨ¤
for(int i=0; i<n; i++){
for(int j=0; j<m; j++){
arr[i][j]=0;
}
}
āĻāĻāĻžāύ⧠āĻĻā§āĻāĻŋ āĻāϞāĻžāĻĻāĻž āĻāύāĻĒā§āĻ āĻŦāĻž āĻā§āϰāĻŋā§ā§āĻŦāϞ āĻāĻžāĻ āĻāϰāĻā§:
āϝā§āĻšā§āϤ⧠āĻāĻāĻāĻŋ āϞā§āĻĒā§āϰ āĻā§āϤāϰ āĻāϰā§āĻāĻāĻŋ āϞā§āĻĒ āĻāĻā§, āϤāĻžāĻ āĻŽā§āĻ āĻāĻžāĻā§āϰ āϏāĻāĻā§āϝāĻž āĻšāĻŦā§ āϤāĻžāĻĻā§āϰ āĻā§āĻŖāĻĢāϞ:\(Total\ Operations = n \times m\)āϤāĻžāĻ āĻŦāĻŋāĻ-āĻ āύā§āĻā§āĻļāύ⧠āĻāĻāĻŋ $O(n \times m)$āĨ¤
int i=n;
while(i>1){
i=i/2
}
āĻāĻ āĻā§āĻĄāĻāĻŋāϰ āĻāĻžāĻāĻŽ āĻāĻŽāĻĒā§āϞā§āĻā§āϏāĻŋāĻāĻŋ āĻšāϞ⧠$O(\log n)$ (Logarithmic Time Complexity)āĨ¤
āϏāĻšāĻāĻāĻžāĻŦā§ āĻŦāϞāϞā§, āĻĒā§āϰāϤāĻŋāĻŦāĻžāϰ āϞā§āĻĒāĻāĻŋ āĻāϞāĻžāϰ āϏāĻŽā§ āĻāύāĻĒā§āĻ $i$ āĻāϰ āĻŽāĻžāύ āĻ āϰā§āϧā§āĻ āĻšā§ā§ āϝāĻžāĻā§āĻā§āĨ¤ āϧāϰāĻž āϝāĻžāĻ, $n = 16$:
āĻā§ā§āĻžāϞ āĻāϰā§āύ, āĻāύāĻĒā§āĻ ā§§ā§Ŧ āĻšāϞā§āĻ āϞā§āĻĒ āĻāϞā§āĻā§ āĻŽāĻžāϤā§āϰ ā§Ē āĻŦāĻžāϰāĨ¤ āĻāĻŖāĻŋāϤā§āϰ āĻāĻžāώāĻžā§, $2^4 = 16$āĨ¤ āĻ āϰā§āĻĨāĻžā§ ā§§ā§Ŧ āĻā§ āĻāϤāĻŦāĻžāϰ ⧍ āĻĻāĻŋā§ā§ āĻāĻžāĻ āĻāϰāϞ⧠⧧ āĻĒāĻžāĻā§āĻž āϝāĻžā§? āĻāϤā§āϤāϰ āĻšāϞ⧠$\log_2 16 = 4$ āĻŦāĻžāϰāĨ¤
for(int i=0; i<n; i++){
for(int j=0; j<n; j=j*2){
sum++;
}
}
āĻāĻ āĻā§āĻĄāĻāĻŋāϰ āĻāĻžāĻāĻŽ āĻāĻŽāĻĒā§āϞā§āĻā§āϏāĻŋāĻāĻŋ āĻšāϞ⧠$O(n \log n)$āĨ¤
āĻŦāĻžāĻāϰā§āϰ āϞā§āĻĒ (i): āĻāĻāĻŋ 0 āĻĨā§āĻā§ āĻļā§āϰ⧠āĻāϰ⧠n-1 āĻĒāϰā§āϝāύā§āϤ āϝāĻžāĻā§āĻā§ āĻāĻŦāĻ āĻĒā§āϰāϤāĻŋāĻŦāĻžāϰ ā§§ āĻāϰ⧠āĻŦāĻžā§āĻā§ (i++)āĨ¤ āĻāĻāĻŋ āĻāĻāĻāĻŋ āϏāĻžāϧāĻžāϰāĻŖ āϞāĻŋāύāĻŋā§āĻžāϰ āϞā§āĻĒ, āϝāĻž āĻŽā§āĻ $n$ āĻŦāĻžāϰ āĻāϞāĻŦā§āĨ¤
āĻā§āϤāϰā§āϰ āϞā§āĻĒ (j): āĻāĻ āϞā§āĻĒāĻāĻŋ āĻļā§āϰ⧠āĻšāĻā§āĻā§ 1 āĻĨā§āĻā§ āĻāĻŦāĻ āĻĒā§āϰāϤāĻŋāĻŦāĻžāϰ ⧍ āĻĻāĻŋā§ā§ āĻā§āĻŖ āĻšā§ā§ āĻŦāĻžā§āĻā§ (j = j * 2)āĨ¤ āĻāĻŽāϰāĻž āĻāĻžāύāĻŋ, āϝ⧠āϞā§āĻĒ āĻā§āĻŖ āĻŦāĻž āĻāĻžāĻā§āϰ āĻŽāĻžāϧā§āϝāĻŽā§ āϞāĻžāĻĢāĻŋā§ā§ āĻāϞ⧠āϤāĻžāϰ āĻāĻŽāĻĒā§āϞā§āĻā§āϏāĻŋāĻāĻŋ āĻšā§ $\log n$āĨ¤ āϏā§āϤāϰāĻžāĻ āĻāĻ āϞā§āĻĒāĻāĻŋ āĻĒā§āϰāϤāĻŋāĻŦāĻžāϰ $\log n$ āĻŦāĻžāϰ āĻāϞāĻŦā§āĨ¤
āϝā§āĻšā§āϤ⧠āĻāĻāĻāĻŋ āϞā§āĻĒā§āϰ āĻā§āϤāϰ⧠āĻāϰā§āĻāĻāĻŋ āϞā§āĻĒ āĻāĻā§, āϤāĻžāĻ āĻŽā§āĻ āĻāĻžāĻā§āϰ āĻĒāϰāĻŋāĻŽāĻžāĻŖ āĻšāĻŦā§ āϞā§āĻĒ āĻĻā§āĻāĻŋāϰ āĻā§āĻŖāĻĢāϞ:
\[Total\ Time = (Outer\ Loop\ Iterations) \times (Inner\ Loop\ Iterations)\] \[Total\ Time = n \times \log n = O(n \log n)\]āĻāĻ $O(n \log n)$ āĻāĻŽāĻĒā§āϞā§āĻā§āϏāĻŋāĻāĻŋāĻāĻŋ āĻāĻĒāύāĻŋ āϏāĻŦāĻā§ā§ā§ āĻŦā§āĻļāĻŋ āĻĻā§āĻāĻŦā§āύ āĻĻāĻā§āώ āϏāϰā§āĻāĻŋāĻ āĻ ā§āϝāĻžāϞāĻāϰāĻŋāĻĻāĻŽāĻā§āϞā§āϤā§, āϝā§āĻŽāύ: Merge Sort āĻŦāĻž Quick SortāĨ¤ āĻāĻāĻŋ $O(n^2)$ āĻāϰ āĻā§ā§ā§ āĻ āύā§āĻ āĻŦā§āĻļāĻŋ āĻĢāĻžāϏā§āĻ āĻāĻŋāύā§āϤ⧠$O(n)$ āĻāϰ āĻā§ā§ā§ āĻāĻŋāĻā§āĻāĻž āϏā§āϞā§āĨ¤
void func(int n){
if(n<=1)return;
func(n/2);
func(n/2);
}
āĻāĻ āĻā§āĻĄāĻāĻŋāϰ āĻāĻžāĻāĻŽ āĻāĻŽāĻĒā§āϞā§āĻā§āϏāĻŋāĻāĻŋ āĻšāϞ⧠$O(n)$āĨ¤
āĻāĻāĻŋ āĻāĻāĻāĻŋ āϰāĻŋāĻāĻžāϰā§āϏāĻŋāĻ āĻĢāĻžāĻāĻļāύ āϝāĻž āĻĻā§āĻā§ āĻļā§āϰā§āϤ⧠āĻ āύā§āĻā§āϰāĻ āĻŽāύ⧠āĻšāϤ⧠āĻĒāĻžāϰ⧠āϝ⧠āĻāĻāĻŋ $O(\log n)$ āĻšāĻŦā§ (āϝā§āĻšā§āϤ⧠$n$ āĻ⧠⧍ āĻĻāĻŋā§ā§ āĻāĻžāĻ āĻāϰāĻž āĻšāĻā§āĻā§)āĨ¤ āĻāĻŋāύā§āϤ⧠āĻāĻāĻžāύ⧠āĻāĻāĻāĻŋ āĻā§āϰāĻŋāĻ āĻāĻā§āĨ¤ āĻāϞā§āύ āϰāĻŋāĻāĻžāϰā§āϏāύ āĻā§āϰāĻŋ (Recursion Tree) āĻĻāĻŋā§ā§ āĻŦāĻŋāώā§āĻāĻŋ āϏāĻšāĻā§ āĻŦā§āĻāĻŋ:
āĻĢāĻžāĻāĻļāύāĻāĻŋ āĻĒā§āϰāϤāĻŋāĻāĻŋ āϧāĻžāĻĒ⧠⧍ āĻāĻžāĻā§ āĻāĻžāĻ āĻšāĻā§āĻā§ āĻāĻŦāĻ ā§¨ āĻŦāĻžāϰ āύāĻŋāĻā§āĻā§ āĻāϞ āĻāϰāĻā§āĨ¤
āĻāĻŽāϰāĻž āϝāĻĻāĻŋ āĻŽā§āĻ āĻāϞā§āϰ āϏāĻāĻā§āϝāĻž āĻšāĻŋāϏā§āĻŦ āĻāϰāĻŋ: \(Total\ Calls = 1 + 2 + 4 + 8 + \dots + n\)
āĻāĻāĻŋ āĻāĻāĻāĻŋ āĻā§āϝāĻžāĻŽāĻŋāϤāĻŋāĻ āϧāĻžāϰāĻž (Geometric Series)āĨ¤ āĻāĻ āϧāĻžāϰāĻžāϰ āϝā§āĻāĻĢāϞ āĻšāϞ⧠āĻĒā§āϰāĻžā§ $2n - 1$āĨ¤
āĻŦāĻŋāĻ-āĻ āύā§āĻā§āĻļāύ⧠āĻāĻŽāϰāĻž āĻāύāϏā§āĻā§āϝāĻžāύā§āĻ (āϝā§āĻŽāύ ⧍) āĻŦāĻžāĻĻ āĻĻā§āĻ, āϤāĻžāĻ āĻāĻāĻŋ āĻĻāĻžāĻā§āĻžā§ $O(n)$āĨ¤
āĻ ā§āϝāĻžāĻĄāĻāĻžāύā§āϏāĻĄ āϞā§āĻā§āϞ⧠āĻāĻ āϧāϰāύā§āϰ āĻāĻā§āϝāĻŧā§āĻļāύ āϏāϞāĻ āĻāϰāϤ⧠āĻŽāĻžāϏā§āĻāĻžāϰ āĻĨāĻŋāĻāϰā§āĻŽ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āĻšā§:\(T(n) = 2T(n/2) + O(1)\)
\[T(n) = 2T(n/2) + O(1)\]āĻāĻāĻžāύā§:
āϝā§āĻšā§āϤ⧠$\log_b a = \log_2 2 = 1$ āĻāĻŦāĻ $f(n)$ āĻāϰ āĻĒāĻžāĻā§āĻžāϰ ā§Ļ, āϤāĻžāĻ āĻŽāĻžāϏā§āĻāĻžāϰ āĻĨāĻŋāĻāϰā§āĻŽā§āϰ ā§§āĻŽ āĻā§āϏ āĻ āύā§āϝāĻžā§ā§ āĻāĻŽāĻĒā§āϞā§āĻā§āϏāĻŋāĻāĻŋ āĻšā§ $O(n^{\log_2 2}) = O(n^1) = O(n)$āĨ¤
for(int i=1; i<=n; i++){
for(int j=1; j<=i*i; j++){
sum++;
}
}
āĻāĻ āĻā§āĻĄāĻāĻŋāϰ āĻāĻžāĻāĻŽ āĻāĻŽāĻĒā§āϞā§āĻā§āϏāĻŋāĻāĻŋ āĻšāϞ⧠$O(n^3)$āĨ¤
āĻāĻāĻžāύ⧠āĻā§āϤāϰā§āϰ āϞā§āĻĒāĻāĻŋ ($j$) āĻŦāĻžāĻāϰā§āϰ āϞā§āĻĒā§āϰ āĻāύāĻĄā§āĻā§āϏ $i$ āĻāϰ āĻāĻĒāϰ āύāĻŋāϰā§āĻāϰ āĻāϰāĻā§āĨ¤
āĻŽā§āĻ āĻāĻžāĻā§āϰ āϏāĻāĻā§āϝāĻž āĻŦā§āϰ āĻāϰāϤ⧠āĻāĻŽāĻžāĻĻā§āϰ āĻāĻ āĻŦāϰā§āĻā§āϰ āϧāĻžāϰāĻžāĻāĻŋ (Series of Squares) āϝā§āĻ āĻāϰāϤ⧠āĻšāĻŦā§:
\[Total\ Work = 1^2 + 2^2 + 3^2 + ... + n^2\]āĻāĻŽāϰāĻž āĻāĻžāύāĻŋ, āĻĒā§āϰāĻĨāĻŽ $n$ āϏāĻāĻā§āϝāĻ āϏā§āĻŦāĻžāĻāĻžāĻŦāĻŋāĻ āϏāĻāĻā§āϝāĻžāϰ āĻŦāϰā§āĻā§āϰ āϝā§āĻāĻĢāϞā§āϰ āϏā§āϤā§āϰ āĻšāϞā§:\(Sum = \frac{n(n+1)(2n+1)}{6}\)
āĻāĻŽāϰāĻž āϝāĻĻāĻŋ āĻāĻĒāϰā§āϰ āĻāĻā§ā§ā§āĻļāύāĻāĻŋāĻā§ āĻā§āĻŖ āĻāϰāĻŋ:
\[Sum = \frac{(n^2 + n)(2n + 1)}{6} = \frac{2n^3 + 3n^2 + n}{6}\]āϝāĻĻāĻŋ āĻāĻĒāύāĻžāϰ āĻŦāĻžāĻāϰā§āϰ āϞā§āĻĒ $n$ āĻĒāϰā§āϝāύā§āϤ āĻāϞ⧠āĻāĻŦāĻ āĻā§āϤāϰā§āϰ āϞā§āĻĒ $i^k$ āĻĒāϰā§āϝāύā§āϤ āĻāϞā§, āϤāĻŦā§ āϤāĻžāϰ āĻāĻŽāĻĒā§āϞā§āĻā§āϏāĻŋāĻāĻŋ āϏāĻžāϧāĻžāϰāĻŖāϤ $O(n^{k+1})$ āĻšā§āĨ¤ āĻāĻāĻžāύ⧠$k=2$ āĻāĻŋāϞ, āϤāĻžāĻ āĻāϤā§āϤāϰ āĻšā§ā§āĻā§ $O(n^{2+1}) = O(n^3)$āĨ¤
for(int i=1; i<=n; i=i*3){
for(int j=1; j<=n; j++){
sum++;
}
}
āĻāĻ āĻā§āĻĄāĻāĻŋāϰ āĻāĻžāĻāĻŽ āĻāĻŽāĻĒā§āϞā§āĻā§āϏāĻŋāĻāĻŋ āĻšāϞ⧠$O(n \log_3 n)$, āϝāĻž āĻŦāĻŋāĻ-āĻ āύā§āĻā§āĻļāύ⧠āϏāĻžāϧāĻžāϰāĻŖāϤ $O(n \log n)$ āĻšāĻŋāϏā§āĻŦā§ āϞā§āĻāĻž āĻšā§āĨ¤
āĻŦāĻžāĻāϰā§āϰ āϞā§āĻĒ (i): āϞā§āĻĒāĻāĻŋ i = i * 3 āĻāĻžāĻŦā§ āĻŦāĻžā§āĻā§āĨ¤ āĻāϰ āĻŽāĻžāύ⧠āĻĒā§āϰāϤāĻŋ āϧāĻžāĻĒā§ $i$ āĻāϰ āĻŽāĻžāύ ā§Š āĻā§āĻŖ āĻšāĻā§āĻā§āĨ¤ āĻāĻāĻŋ āĻāĻāĻāĻŋ āϞāĻāĻžāϰāĻŋāĻĻāĻŽāĻŋāĻ āϞā§āĻĒāĨ¤ āϝā§āĻšā§āϤ⧠āĻāĻāĻŋ ā§Š āĻāϰ āĻĒāĻžāĻā§āĻžāϰ āĻšāĻŋāϏā§āĻŦā§ āĻŦāĻžā§āĻā§, āϤāĻžāĻ āĻāĻāĻŋ āĻŽā§āĻ $\log_3 n$ āĻŦāĻžāϰ āĻāϞāĻŦā§āĨ¤
āĻā§āϤāϰā§āϰ āϞā§āĻĒ (j): āĻāĻāĻŋ āĻāĻāĻāĻŋ āϏāĻžāϧāĻžāϰāĻŖ āϞāĻŋāύāĻŋā§āĻžāϰ āϞā§āĻĒ āϝāĻž ā§§ āĻĨā§āĻā§ $n$ āĻĒāϰā§āϝāύā§āϤ āĻĒā§āϰāϤāĻŋāĻāĻŋ āϏāĻāĻā§āϝāĻž āĻā§āĻ āĻāϰā§āĨ¤ āϤāĻžāĻ āĻāĻāĻŋ āĻĒā§āϰāϤāĻŋāĻŦāĻžāϰ $n$ āĻŦāĻžāϰ āĻāϞāĻŦā§āĨ¤
āĻāĻāĻāĻŋ āϞā§āĻĒā§āϰ āĻā§āϤāϰ⧠āĻāϰā§āĻāĻāĻŋ āϞā§āĻĒ āĻĨāĻžāĻāϞ⧠āĻāĻŽāϰāĻž āϤāĻžāĻĻā§āϰ āĻāĻžāĻā§āϰ āĻĒāϰāĻŋāĻŽāĻžāĻŖ āĻā§āĻŖ āĻāϰāĻŋ:
\[Total\ Time = (\text{Outer Loop}) \times (\text{Inner Loop})\] \[Total\ Time = \log_3 n \times n = O(n \log_3 n)\]āϝā§āĻšā§āϤ⧠āĻŦāĻŋāĻ-āĻ āύā§āĻā§āĻļāύ⧠āϞāĻāĻžāϰāĻŋāĻĻāĻŽā§āϰ āĻŦā§āϏ (⧍, ā§Š āĻŦāĻž ā§§ā§Ļ) āĻā§āĻŦ āĻāĻāĻāĻž āĻĒā§āϰāĻāĻžāĻŦ āĻĢā§āϞ⧠āύāĻž (āϏāĻŦāĻā§āϞā§āĻ āĻāĻā§ āĻ āĻĒāϰā§āϰ āĻāύāϏā§āĻā§āϝāĻžāύā§āĻ āĻŽāĻžāϞā§āĻāĻŋāĻĒāϞ), āϤāĻžāĻ āĻāĻā§ āϏāĻžāϧāĻžāϰāĻŖāĻāĻžāĻŦā§ $O(n \log n)$ āĻŦāϞāĻž āĻšā§āĨ¤ ___
int i=0;
while(i<n){
int j=n;
while(j>0){
j = j/2;
}
i++
}
āĻāĻ āĻā§āĻĄāĻāĻŋāϰ āĻāĻžāĻāĻŽ āĻāĻŽāĻĒā§āϞā§āĻā§āϏāĻŋāĻāĻŋ āĻšāϞ⧠$O(n \log n)$āĨ¤
āĻŦāĻžāĻāϰā§āϰ āϞā§āĻĒ (i): āĻāĻāĻŋ i = 0 āĻĨā§āĻā§ āĻļā§āϰ⧠āĻāϰ⧠n-1 āĻĒāϰā§āϝāύā§āϤ āϝāĻžāĻā§āĻā§ āĻāĻŦāĻ āĻĒā§āϰāϤāĻŋāĻŦāĻžāϰ ā§§ āĻāϰ⧠āĻŦāĻžā§āĻā§ (i++)āĨ¤ āĻāĻāĻŋ āĻāĻāĻāĻŋ āϏāĻžāϧāĻžāϰāĻŖ āϞāĻŋāύāĻŋā§āĻžāϰ āϞā§āĻĒ, āϝāĻž āĻŽā§āĻ $n$ āĻŦāĻžāϰ āĻāϞāĻŦā§āĨ¤
āĻā§āϤāϰā§āϰ āϞā§āĻĒ (j): āĻāĻ āϞā§āĻĒāĻāĻŋ āĻļā§āϰ⧠āĻšāĻā§āĻā§ j = n āĻĨā§āĻā§ āĻāĻŦāĻ āĻĒā§āϰāϤāĻŋāĻŦāĻžāϰ ⧍ āĻĻāĻŋā§ā§ āĻāĻžāĻ āĻšā§ā§ āĻāĻŽāĻā§ (j = j / 2)āĨ¤ āĻāĻŽāϰāĻž āĻāĻžāύāĻŋ, āϝ⧠āϞā§āĻĒ āĻā§āĻŖ āĻŦāĻž āĻāĻžāĻā§āϰ āĻŽāĻžāϧā§āϝāĻŽā§ āϞāĻžāĻĢāĻŋā§ā§ āĻāϞ⧠āϤāĻžāϰ āĻāĻŽāĻĒā§āϞā§āĻā§āϏāĻŋāĻāĻŋ āĻšā§ $\log n$āĨ¤ āϏā§āϤāϰāĻžāĻ āĻāĻ āϞā§āĻĒāĻāĻŋ āĻĒā§āϰāϤāĻŋāĻŦāĻžāϰ $\log n$ āĻŦāĻžāϰ āĻāϞāĻŦā§āĨ¤
āϝā§āĻšā§āϤ⧠āĻāĻāĻāĻŋ āϞā§āĻĒā§āϰ āĻā§āϤāϰ⧠āĻāϰā§āĻāĻāĻŋ āϞā§āĻĒ āĻāĻā§, āϤāĻžāĻ āĻŽā§āĻ āĻāĻžāĻā§āϰ āĻĒāϰāĻŋāĻŽāĻžāĻŖ āĻšāĻŦā§ āϞā§āĻĒ āĻĻā§āĻāĻŋāϰ āĻā§āĻŖāĻĢāϞ: \(Total\ Time = (Outer\ Loop\ Iterations) \times (Inner\ Loop\ Iterations)\)
\[Total\ Time = n \times \log n = O(n \log n)\]HashMap <Integer, List<Integer>>map=new HashMap<>();
for(int i=0; i<n; i++){
List<Integer> list = new ArrayList<>();
for(int j=0; j<n; j++){
list.add(j);
}
map.put(i,list);
}
āĻāĻ āĻā§āĻĄāĻāĻŋāϰ āϏā§āĻĒā§āϏ āĻāĻŽāĻĒā§āϞā§āĻā§āϏāĻŋāĻāĻŋ āĻšāϞ⧠$O(n^2)$āĨ¤
āĻāĻĒāύāĻŋ āĻāĻāĻāĻŋ HashMap āϤā§āϰāĻŋ āĻāϰāĻā§āύ āϝā§āĻāĻžāύ⧠$n$ āĻāĻŋ āĻā§ (Key) āĻĨāĻžāĻāĻŦā§āĨ¤ āϏā§āϤāϰāĻžāĻ, āĻŽā§āϝāĻžāĻĒā§āϰ āĻā§āĻā§āϞā§āϰ āĻāύā§āϝ āĻāĻžā§āĻāĻž āϞāĻžāĻāĻā§ $O(n)$āĨ¤
āϞā§āĻĒā§āϰ āĻĒā§āϰāϤāĻŋāĻāĻŋ āϧāĻžāĻĒā§ (āĻŽā§āĻ $n$ āĻŦāĻžāϰ), āĻāĻĒāύāĻŋ āĻāĻāĻāĻŋ āĻāϰ⧠āύāϤā§āύ ArrayList āϤā§āϰāĻŋ āĻāϰāĻā§āύāĨ¤ āĻĒā§āϰāϤāĻŋāĻāĻŋ āϞāĻŋāϏā§āĻā§āϰ āĻā§āϤāϰ āĻāĻŦāĻžāϰ $n$ āĻāĻŋ āĻāϰ⧠āĻāϞāĻŋāĻŽā§āύā§āĻ āϰāĻžāĻāĻā§āύāĨ¤
āĻŦāĻŋāĻ-āĻ ($O$) āύā§āĻā§āĻļāύā§āϰ āύāĻŋā§āĻŽ āĻ āύā§āϝāĻžā§ā§, āĻāĻŽāϰāĻž āĻŦā§ āĻĒāĻžāĻā§āĻžāϰāĻāĻŋ āϰāĻžāĻāĻŋāĨ¤ āϤāĻžāĻ āĻĢāĻžāĻāύāĻžāϞ āϰā§āĻāĻžāϞā§āĻ āĻšāϞ⧠$O(n^2)$āĨ¤
āĻāĻ āϧāϰāύā§āϰ āĻĄā§āĻāĻž āϏā§āĻā§āϰāĻžāĻāĻāĻžāϰ āϏāĻžāϧāĻžāϰāĻŖāϤ āĻā§āϰāĻžāĻĢ āĻĨāĻŋāĻāϰāĻŋāϤ⧠Adjacency List āϤā§āϰāĻŋāϰ āϏāĻŽā§ āĻŦā§āϝāĻŦāĻšā§āϤ āĻšā§āĨ¤ āϝāĻĻāĻŋ āĻāĻāĻāĻŋ āĻā§āϰāĻžāĻĢā§āϰ $n$ āĻāĻŋ āύā§āĻĄ āĻĨāĻžāĻā§ āĻāĻŦāĻ āĻĒā§āϰāϤāĻŋāĻāĻŋ āύā§āĻĄ āĻŦāĻžāĻāĻŋ āϏāĻŦ āύā§āĻĄā§āϰ āϏāĻžāĻĨā§ āĻāĻžāύā§āĻā§āĻā§āĻĄ āĻĨāĻžāĻā§ (Complete Graph), āϤāĻŦā§ āϏā§āĻāĻŋāϰ āĻŽā§āĻŽā§āϰāĻŋ āĻāϰāĻ āĻšāĻŦā§ $O(n^2)$āĨ¤
for(int i=1; i*i<=n; i++){
print(i);
}
āĻāĻ āĻā§āĻĄāĻāĻŋāϰ āĻāĻžāĻāĻŽ āĻāĻŽāĻĒā§āϞā§āĻā§āϏāĻŋāĻāĻŋ āĻšāϞ⧠$O(\sqrt{n})$ (Square Root of $n$)āĨ¤
āĻāĻāĻŋ āĻāĻāĻāĻŋ āĻ āϤā§āϝāύā§āϤ āϏā§āĻŽāĻžāϰā§āĻ āϞā§āĻĒ āĻāύā§āĻĄāĻŋāĻļāύ, āϝāĻž āĻāĻŽāϰāĻž āϏāĻžāϧāĻžāϰāĻŖāϤ āĻā§āύ⧠āϏāĻāĻā§āϝāĻžāϰ Primality Testing (āϏāĻāĻā§āϝāĻžāĻāĻŋ āĻŽā§āϞāĻŋāĻ āĻāĻŋ āύāĻž) āĻŦāĻž Divisors (āĻā§āĻĒāĻžāĻĻāĻ) āĻŦā§āϰ āĻāϰāĻžāϰ āϏāĻŽā§ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻŋāĨ¤ āĻāϞā§āύ āĻĻā§āĻāĻŋ āĻā§āύ āĻāĻāĻŋ $\sqrt{n}$ āĻšāϞā§āĨ¤
āϞā§āĻĒā§āϰ āĻļāϰā§āϤāĻāĻŋ āĻšāϞā§: $i \times i \le n$āĨ¤
āĻāĻā§ āĻ āύā§āϝāĻāĻžāĻŦā§ āϞā§āĻāĻž āϝāĻžā§: $i \le \sqrt{n}$āĨ¤
āĻ āϰā§āĻĨāĻžā§, āϞā§āĻĒāĻāĻŋ ā§§ āĻĨā§āĻā§ āĻļā§āϰ⧠āĻšā§ā§ āϤāϤāĻā§āώāĻŖ āĻĒāϰā§āϝāύā§āϤ āĻāϞāĻŦā§ āϝāϤāĻā§āώāĻŖ $i$ āĻāϰ āĻŽāĻžāύ $\sqrt{n}$ āĻāϰ āϏāĻŽāĻžāύ āĻŦāĻž āĻā§āĻ āĻĨāĻžāĻā§āĨ¤
āϞā§āĻĒāĻāĻŋ āϝāĻĻāĻŋ $k$ āĻŦāĻžāϰ āĻāϞā§, āϤāĻŦā§ āĻļāϰā§āϤ āĻ āύā§āϝāĻžā§ā§:
\[k^2 \le n\] \[k \le \sqrt{n}\]āϏā§āϤāϰāĻžāĻ, āĻŽā§āĻ āĻāĻžāĻā§āϰ āĻĒāϰāĻŋāĻŽāĻžāĻŖ āĻŦāĻž āĻāĻžāĻāĻŽ āĻāĻŽāĻĒā§āϞā§āĻā§āϏāĻŋāĻāĻŋ āĻšāϞ⧠$O(\sqrt{n})$āĨ¤
$O(\sqrt{n})$ āϞāĻŋāύāĻŋā§āĻžāϰ āĻāĻžāĻāĻŽ ($O(n)$) āĻāϰ āĻā§ā§ā§ āĻ āύā§āĻ āĻŦā§āĻļāĻŋ āĻĻā§āϰā§āϤ āĻāĻŋāύā§āϤ⧠āϞāĻāĻžāϰāĻŋāĻĻāĻŽāĻŋāĻ āĻāĻžāĻāĻŽ ($O(\log n)$) āĻāϰ āĻā§ā§ā§ āĻāĻŋāĻā§āĻāĻž āϧā§āϰāĨ¤
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
break;
}
}
āĻāĻ āĻā§āĻĄāĻāĻŋāϰ āĻāĻžāĻāĻŽ āĻāĻŽāĻĒā§āϞā§āĻā§āϏāĻŋāĻāĻŋ āĻšāϞ⧠$O(n)$āĨ¤
āĻŽā§āĻ āĻāĻžāĻā§āϰ āϏāĻāĻā§āϝāĻž = (āĻŦāĻžāĻāϰā§āϰ āϞā§āĻĒā§āϰ āĻĒā§āύāϰāĻžāĻŦā§āϤā§āϤāĻŋ) $\times$ (āĻā§āϤāϰā§āϰ āϞā§āĻĒā§āϰ āĻĒā§āύāϰāĻžāĻŦā§āϤā§āϤāĻŋ)
\[\text{Total Operations} = n \times 1 = n\]āϤāĻžāĻ āĻŦāĻŋāĻ-āĻ āύā§āĻā§āĻļāύ⧠āĻāĻāĻŋ $O(n)$āĨ¤
void foo(int n){
if(n<=1) return;
foo(n/2);
for(int i=0; i<n; i++){
print(i)
}
foo(n/2);
}
āĻāĻ āĻā§āĻĄāĻāĻŋāϰ āĻāĻžāĻāĻŽ āĻāĻŽāĻĒā§āϞā§āĻā§āϏāĻŋāĻāĻŋ āĻšāϞ⧠$O(n \log n)$āĨ¤
āĻāĻāĻŋ āĻāĻāĻāĻŋ āĻ āϤā§āϝāύā§āϤ āĻā§āϞāĻžāϏāĻŋāĻ āϰāĻŋāĻāĻžāϰā§āϏāĻŋāĻ āĻĒā§āϝāĻžāĻāĻžāϰā§āύ āϝāĻž āĻāĻŽāϰāĻž āϏāĻžāϧāĻžāϰāĻŖāϤ Merge Sort āĻŦāĻž āĻāĻ āĻāĻžāϤā§ā§ Divide and Conquer āĻ ā§āϝāĻžāϞāĻāϰāĻŋāĻĻāĻŽā§ āĻĻā§āĻā§ āĻĨāĻžāĻāĻŋāĨ¤ āĻāϞā§āύ āϰāĻŋāĻāĻžāϰā§āϏāύ āĻā§āϰāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻāϰ āĻāĻā§āϰ⧠āϝāĻžāĻā§āĻž āϝāĻžāĻ:
āĻāĻ āĻĢāĻžāĻāĻļāύāĻāĻŋ āĻŽā§āϞāϤ āϤāĻŋāύāĻāĻŋ āĻāĻžāĻ āĻāϰāĻā§:
āĻāϰ āϰāĻŋāĻāĻžāϰā§āύā§āϏ āϰāĻŋāϞā§āĻļāύāĻāĻŋ āĻšāĻŦā§:
\[T(n) = 2T(n/2) + n\]āĻāĻĒāύāĻŋ āϝāĻĻāĻŋ āĻāϞā§āĻĒāύāĻž āĻāϰā§āύ āĻāĻ āĻĢāĻžāĻāĻļāύāĻāĻŋ āĻā§āĻāĻžāĻŦā§ āĻā§āĻŋā§ā§ āĻĒā§āĻā§:
āĻĒā§āϰāϤāĻŋāĻāĻŋ āϞā§āĻā§āϞ⧠āĻŽā§āĻ āĻāĻžāĻā§āϰ āĻĒāϰāĻŋāĻŽāĻžāĻŖ āĻāĻŋāύā§āϤ⧠$n$ āĻ āĻĨāĻžāĻāĻā§āĨ¤ āĻāĻāύ āĻĒā§āϰāĻļā§āύ āĻšāϞā§, āĻāϤāĻā§āϞ⧠āϞā§āĻā§āϞ āĻāĻā§? āϝā§āĻšā§āϤ⧠$n$ āĻĒā§āϰāϤāĻŋāĻŦāĻžāϰ āĻ āϰā§āϧā§āĻ āĻšāĻā§āĻā§, āϤāĻžāĻ āĻŽā§āĻ āϞā§āĻā§āϞ āĻāĻā§ $\log_2 n$ āĻāĻŋāĨ¤
āϝāĻĻāĻŋ āĻāĻĒāύāĻŋ āϏāϰāĻžāϏāϰāĻŋ āϏā§āϤā§āϰ āĻĻāĻŋā§ā§ āĻāϰāϤ⧠āĻāĻžāύ:
\[T(n) = aT(n/b) + f(n)\]āĻāĻāĻžāύ⧠$a = 2$, $b = 2$, āĻāĻŦāĻ $f(n) = n^1$āĨ¤
āϝā§āĻšā§āϤ⧠$\log_b a = \log_2 2 = 1$, āϝāĻž $f(n)$-āĻāϰ āĻĒāĻžāĻā§āĻžāϰā§āϰ āϏāĻŽāĻžāύ, āĻāĻāĻŋ āĻŽāĻžāϏā§āĻāĻžāϰ āĻĨāĻŋāĻāϰā§āĻŽā§āϰ ⧍⧠āĻā§āϏāĨ¤ āϤāĻžāĻ āϰā§āĻāĻžāϞā§āĻ āĻšāĻŦā§ $O(n^1 \log n)$āĨ¤
for(int i=0; i<n; i++){
for(int j=0; j<n; i++){
for(int k=j; k<n; k++){
sum++;
}
}
}
āĻāĻ āĻā§āĻĄāĻāĻŋāϰ āĻāĻžāĻāĻŽ āĻāĻŽāĻĒā§āϞā§āĻā§āϏāĻŋāĻāĻŋ āĻšāϞ⧠$O(n^3)$āĨ¤
āϏāĻŦāĻā§āϝāĻŧā§ āĻŦāĻžāĻāϰā§āϰ āϞā§āĻĒ (i): āĻāĻāĻŋ $0$ āĻĨā§āĻā§ $n-1$ āĻĒāϰā§āϝāύā§āϤ āĻāϞā§āĨ¤ āĻ āϰā§āĻĨāĻžā§ āĻāĻāĻŋ āĻŽā§āĻ $n$ āĻŦāĻžāϰ āĻā§āϰā§āĨ¤
āĻāĻ āĻā§āϤāϰā§āϰ āĻĻā§āĻāĻŋ āϞā§āĻĒā§āϰ āĻŽā§āĻ āĻāĻžāĻā§āϰ āĻĒāϰāĻŋāĻŽāĻžāĻŖ āĻšāϞ⧠āĻāĻāĻāĻŋ āĻāĻžāĻŖāĻŋāϤāĻŋāĻ āϧāĻžāϰāĻž (Arithmetic Progression):
\[n + (n-1) + (n-2) + \dots + 1 = \frac{n(n+1)}{2}\]āĻāĻāĻŋ āĻŽā§āϞāϤ $O(n^2)$ āĻāϰ āϏāĻŽāĻžāύāĨ¤
āĻāĻāύ āĻāĻŽāĻžāĻĻā§āϰ āĻāĻžāĻā§ āĻāĻā§:
āϏāĻŦ āĻŽāĻŋāϞāĻŋā§ā§ āĻŽā§āĻ āĻāĻžāĻā§āϰ āĻĒāϰāĻŋāĻŽāĻžāĻŖ:
\[\text{Total Operations} = n \times \frac{n^2+n}{2} = \frac{n^3+n^2}{2}\]āĻŦāĻŋāĻ-āĻ āύā§āĻā§āĻļāύā§āϰ āύāĻŋā§āĻŽ āĻ āύā§āϝāĻžā§ā§, āĻāĻŽāϰāĻž āĻāύāϏā§āĻā§āϝāĻžāύā§āĻ ($1/2$) āĻāĻŦāĻ āĻā§āĻ āĻāĻžāϤ ($n^2$) āĻŦāĻžāĻĻ āĻĻāĻŋā§ā§ āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āϏāĻŦāĻĨā§āĻā§ āĻŦā§ āĻāĻžāϤāĻāĻŋ āĻā§āϰāĻšāĻŖ āĻāϰāĻŋāĨ¤ āϤāĻžāĻ āϰā§āĻāĻžāϞā§āĻ āĻĻāĻžāĻā§āĻžā§ $O(n^3)$āĨ¤
void solve(int n){
if(n <=1) return;
for(int i=0; i<n; i++){
print(i)
}
solve(n/3)
}
āĻāĻ āĻā§āĻĄāĻāĻŋāϰ āĻāĻžāĻāĻŽ āĻāĻŽāĻĒā§āϞā§āĻā§āϏāĻŋāĻāĻŋ āĻšāϞ⧠$O(n)$āĨ¤
āĻāĻāĻŋ āĻāĻāĻāĻŋ āϰāĻŋāĻāĻžāϰā§āϏāĻŋāĻ āĻĢāĻžāĻāĻļāύ āϝāĻžāϰ āĻā§āϤāϰ⧠āĻāĻāĻāĻŋ āϞā§āĻĒ āϰā§ā§āĻā§āĨ¤ āĻāĻāĻŋ āĻā§āύ $O(n)$ āĻšāϞā§, āϤāĻž āĻŦā§āĻāϤ⧠āĻāĻŽāĻžāĻĻā§āϰ āĻĒā§āϰāϤāĻŋāĻāĻŋ āϰāĻŋāĻāĻžāϰā§āϏāύ āϞā§āĻā§āϞ⧠āĻāϤāĻā§āĻā§ āĻāĻžāĻ āĻšāĻā§āĻā§ āϤāĻž āϝā§āĻ āĻāϰāϤ⧠āĻšāĻŦā§āĨ¤
āĻĢāĻžāĻāĻļāύāĻāĻŋ āĻĒā§āϰāϤāĻŋāĻāĻŋ āϧāĻžāĻĒā§ āύāĻŋāĻā§āϰ āĻāĻžāĻāĻā§āϞ⧠āĻāϰāĻā§:
āĻāϞā§āύ āĻĻā§āĻāĻŋ āĻŽā§āĻ āĻāϤāĻŦāĻžāϰ print āĻšāĻā§āĻā§:
āĻŽā§āĻ āĻāĻžāĻā§āϰ āĻĒāϰāĻŋāĻŽāĻžāĻŖ āĻšāϞ⧠āĻāĻāĻāĻŋ āĻ āϏā§āĻŽ āĻā§āĻŖā§āϤā§āϤāϰ āϧāĻžāϰāĻž (Infinite Geometric Series) āĻāϰ āϝā§āĻāĻĢāϞ (āϤāĻžāϤā§āϤā§āĻŦāĻŋāĻāĻāĻžāĻŦā§):
\[\text{Total Work} = n + \frac{n}{3} + \frac{n}{9} + \frac{n}{27} + \dots\]āĻāĻŽāϰāĻž āϝāĻĻāĻŋ $n$ āĻāĻŽāύ āύā§āĻ:
\[\text{Total Work} = n \left( 1 + \frac{1}{3} + \frac{1}{9} + \frac{1}{27} + \dots \right)\]āĻāĻ āϧāĻžāϰāĻžāϰ āϝā§āĻāĻĢāϞā§āϰ āϏā§āϤā§āϰ $\frac{a}{1-r}$ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϞ⧠āĻāĻŽāϰāĻž āĻĒāĻžāĻ:
\[\text{Total Work} = n \times \left( \frac{1}{1 - 1/3} \right) = n \times \frac{3}{2} = 1.5n\]āϝā§āĻšā§āϤ⧠$1.5$ āĻāĻāĻāĻŋ āĻāύāϏā§āĻā§āϝāĻžāύā§āĻ āĻŦāĻž āϧā§āϰā§āĻŦāĻ, āϤāĻžāĻ āĻŦāĻŋāĻ-āĻ āύā§āĻā§āĻļāύ⧠āĻāĻŽāϰāĻž āĻāĻā§ āĻŦāĻžāĻĻ āĻĻā§āĻāĨ¤ āĻĢāϞ⧠āĻā§ā§āĻžāύā§āϤ āĻāĻžāĻāĻŽ āĻāĻŽāĻĒā§āϞā§āĻā§āϏāĻŋāĻāĻŋ āĻĻāĻžāĻā§āĻžā§: $O(n)$
āϝāĻĻāĻŋ āĻĻā§āĻā§āύ āĻāĻāĻāĻŋ āϰāĻŋāĻāĻžāϰā§āϏāĻŋāĻ āĻĢāĻžāĻāĻļāύ⧠āĻāύāĻĒā§āĻ āĻāĻžāĻ āĻšāĻā§āĻā§ (āϝā§āĻŽāύ $n/2, n/3$) āĻāĻŦāĻ āϏā§āĻ āĻĢāĻžāĻāĻļāύā§āϰ āĻā§āϤāϰ⧠āĻāĻāĻāĻŋ āϞāĻŋāύāĻŋā§āĻžāϰ āϞā§āĻĒ ($O(n)$) āĻāĻā§ āϝāĻž āĻĒā§āϰāϤāĻŋāĻŦāĻžāϰ āĻāĻŽāĻā§, āϤāĻŦā§ āϏā§āĻ āĻĒā§āϰ⧠āĻā§āĻĄā§āϰ āĻāĻŽāĻĒā§āϞā§āĻā§āϏāĻŋāĻāĻŋ āϏāĻžāϧāĻžāϰāĻŖāϤ āϞāĻŋāύāĻŋā§āĻžāϰ āĻŦāĻž $O(n)$ āĻ āĻĨāĻžāĻā§āĨ¤ āĻāĻžāϰāĻŖ āĻĒā§āϰāĻĨāĻŽ āĻāϞā§āϰ āĻāĻžāĻāĻ āϏāĻŦāĻĨā§āĻā§ āĻŦā§āĻļāĻŋ, āĻĒāϰā§āϰ āĻāϞāĻā§āϞā§āϰ āĻāĻžāĻ āĻāϤāĻ āĻĻā§āϰā§āϤ āĻāĻŽā§ āϝ⧠āϏā§āĻā§āϞ⧠āϝā§āĻ āĻāϰāϞā§āĻ āĻĒā§āϰāĻĨāĻŽ āĻāϞā§āϰ āĻĻā§āĻŦāĻŋāĻā§āĻŖ āĻšāϤ⧠āĻĒāĻžāϰ⧠āύāĻžāĨ¤
for(int i=0; i<n; i++){
for(int j=0; j<n; i++){
c[i][j]=0;
for(int k=0; k<n; k++){
c[i][j]+=a[i][k]*b[k][j]
}
}
}
āĻāĻ āĻā§āĻĄāĻāĻŋāϰ āĻāĻžāĻāĻŽ āĻāĻŽāĻĒā§āϞā§āĻā§āϏāĻŋāĻāĻŋ āĻšāϞ⧠$O(n^3)$āĨ¤
āĻāĻāĻŋ āĻāĻāĻāĻŋ āĻ āϤā§āϝāύā§āϤ āϏā§āĻĒāϰāĻŋāĻāĻŋāϤ āĻ ā§āϝāĻžāϞāĻāϰāĻŋāĻĻāĻŽâMatrix Multiplication (āĻŽā§āϝāĻžāĻā§āϰāĻŋāĻā§āϏ āĻā§āĻŖāĻĢāϞ)āĨ¤ āĻāϞā§āύ āĻŦāĻŋāĻļā§āϞā§āώāĻŖ āĻāϰ⧠āĻĻā§āĻāĻŋ āĻā§āύ āĻāĻāĻŋ $O(n^3)$ āĻšāϞā§:
āĻāĻ āĻā§āĻĄāĻāĻŋāϤ⧠āϤāĻŋāύāĻāĻŋ āύā§āϏā§āĻā§āĻĄ (āĻāĻāĻāĻŋāϰ āĻā§āϤāϰ āĻāϰā§āĻāĻāĻŋ) āϞā§āĻĒ āϰā§ā§āĻā§:
āϝā§āĻšā§āϤ⧠āϞā§āĻĒāĻā§āϞ⧠āĻāĻā§ āĻ āĻĒāϰā§āϰ āĻā§āϤāϰ⧠āĻ āĻŦāϏā§āĻĨāĻžāύ āĻāϰāĻā§, āϤāĻžāĻ āĻŽā§āĻ āĻāĻžāĻā§āϰ āĻĒāϰāĻŋāĻŽāĻžāĻŖ āĻšāĻŦā§ āϞā§āĻĒāĻā§āϞā§āϰ āĻā§āĻŖāĻĢāϞ:
\[\text{Total Operations} = n \times n \times n = n^3\]āĻŦāĻŋāĻ-āĻ āύā§āĻā§āĻļāύ⧠āĻāĻā§ āĻāĻŽāϰāĻž āϞāĻŋāĻāĻŋ $O(n^3)$āĨ¤
āĻāϞā§āĻĒāύāĻž āĻāϰā§āύ āĻāĻāĻāĻŋ āĻāύāĻ (Cube) āϝāĻžāϰ āĻĻā§āϰā§āĻā§āϝ, āĻĒā§āϰāϏā§āĻĨ āĻāĻŦāĻ āĻāĻā§āĻāϤāĻž āĻĒā§āϰāϤāĻŋāĻāĻŋāĻ $n$āĨ¤ āĻŽā§āϝāĻžāĻā§āϰāĻŋāĻā§āϏ āĻā§āĻŖā§āϰ āĻā§āώā§āϤā§āϰ⧠āĻĒā§āϰāϤāĻŋāĻāĻŋ āϏā§āϞā§āϰ āĻŽāĻžāύ āĻŦā§āϰ āĻāϰāĻžāϰ āĻāύā§āϝ āĻāĻŽāĻžāĻĻā§āϰ āĻĒā§āϰ⧠āĻāĻāĻāĻŋ āϰ⧠āĻāĻŦāĻ āĻāĻāĻāĻŋ āĻāϞāĻžāĻŽā§āϰ āĻāĻĒāϰ āĻĻāĻŋā§ā§ āϝā§āϤ⧠āĻšā§, āϝāĻž āĻāĻ āĻāĻŋāĻāĻŦāĻŋāĻ āĻāĻŽāĻĒā§āϞā§āĻā§āϏāĻŋāĻāĻŋ āϤā§āϰāĻŋ āĻāϰā§āĨ¤
int power(int base, int exp){
if (exp == 0 ) return 1;
if(exp % 2 ==0)
return power(base * base, exp / 2 )
else
return base * power (base, exp - 1)
}
āĻāĻ āĻā§āĻĄāĻāĻŋāϰ āĻāĻžāĻāĻŽ āĻāĻŽāĻĒā§āϞā§āĻā§āϏāĻŋāĻāĻŋ āĻšāϞ⧠$O(\log \text{exp})$āĨ¤
āĻāĻ āĻĢāĻžāĻāĻļāύāĻāĻŋāϰ āĻŽā§āϞ āĻļāĻā§āϤāĻŋ āϞā§āĻāĻŋā§ā§ āĻāĻā§ exp / 2 āĻ āĻāĻļāĻāĻŋāϤā§āĨ¤ āĻĒā§āϰāϤāĻŋāĻāĻŋ āϧāĻžāĻĒā§ āĻāĻŽāϰāĻž āĻāĻā§āϏāĻĒā§āύā§āύā§āĻ āĻŦāĻž āĻĒāĻžāĻā§āĻžāϰāĻā§ āĻĻā§āĻ āĻāĻžāĻā§ āĻāĻžāĻ āĻāϰ⧠āĻĻāĻŋāĻā§āĻāĻŋāĨ¤
āϝā§āĻšā§āϤ⧠āĻāĻŽāϰāĻž āĻŦā§āĻļāĻŋāϰāĻāĻžāĻ āϧāĻžāĻĒā§ āĻāύāĻĒā§āĻāĻ⧠⧍ āĻĻāĻŋā§ā§ āĻāĻžāĻ āĻāϰāĻāĻŋ, āϤāĻžāĻ āĻāĻāĻŋ āĻāĻāĻāĻŋ Logarithmic āĻĒā§āϰāϏā§āϏāĨ¤
āϧāϰāĻž āϝāĻžāĻ āĻāĻŽāϰāĻž $2^{10}$ āĻŦā§āϰ āĻāϰāϤ⧠āĻāĻžāĻ:
āĻāĻāĻžāύ⧠exp = 10 āĻāĻŋāύā§āϤ⧠āĻĢāĻžāĻāĻļāύāĻāĻŋ āĻŽāĻžāϤā§āϰ ā§ŦāĻāĻŋ āϧāĻžāĻĒā§ āĻāĻžāĻ āĻļā§āώ āĻāϰā§āĻā§āĨ¤ āĻāύāĻĒā§āĻ āϝāϤ āĻŦāĻžā§āĻŦā§, āĻāĻ āĻĒāĻžāϰā§āĻĨāĻā§āϝā§āϰ āĻŽāĻžāĻšāĻžāϤā§āĻŽā§āϝ āϤāϤ āĻŦāĻžā§āĻŦā§āĨ¤
āĻāĻāĻžāύ⧠āϰāĻŋāĻāĻžāϰā§āϏāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āĻšā§ā§āĻā§āĨ¤ āϝā§āĻšā§āϤ⧠āϰāĻŋāĻāĻžāϰā§āϏāύ āϏā§āĻā§āϝāĻžāĻā§āϰ āĻāĻā§āϰāϤāĻžāĻ āϞāĻāĻžāϰāĻŋāĻĻāĻŽāĻŋāĻāĻāĻžāĻŦā§ āĻŦāĻžā§ā§, āϤāĻžāĻ āĻāϰ āϏā§āĻĒā§āϏ āĻāĻŽāĻĒā§āϞā§āĻā§āϏāĻŋāĻāĻŋ āĻšāϞ⧠$O(\log \text{exp})$āĨ¤
for(int i=0; i<n; i++){
int x=i;
while(x>0){
x/=10;
}
}
āĻāĻ āĻā§āĻĄāĻāĻŋāϰ āĻāĻžāĻāĻŽ āĻāĻŽāĻĒā§āϞā§āĻā§āϏāĻŋāĻāĻŋ āĻšāϞ⧠$O(n \log_{10} n)$āĨ¤
āĻāĻāĻŋ āĻāĻāĻāĻŋ āĻ āϤā§āϝāύā§āϤ āĻāύā§āĻāĻžāϰā§āϏā§āĻāĻŋāĻ āĻĒā§āϝāĻžāĻāĻžāϰā§āύ āϝā§āĻāĻžāύ⧠āĻŦāĻžāĻāϰā§āϰ āϞā§āĻĒāĻāĻŋ āϞāĻŋāύāĻŋā§āĻžāϰ āĻšāϞā§āĻ āĻā§āϤāϰā§āϰ āϞā§āĻĒāĻāĻŋ āĻāύāĻĒā§āĻā§āϰ āĻŽāĻžāύā§āϰ āĻāĻĒāϰ āύāĻŋāϰā§āĻāϰ āĻāϰāĻā§āĨ¤ āĻāϞā§āύ āϧāĻžāĻĒā§ āϧāĻžāĻĒā§ āĻāϰ āĻŦāĻŋāĻļā§āϞā§āώāĻŖ āĻĻā§āĻāĻŋ:
āĻŦāĻžāĻāϰā§āϰ āϞā§āĻĒ ($i$): āĻāĻāĻŋ $0$ āĻĨā§āĻā§ āĻļā§āϰ⧠āĻāϰ⧠$n-1$ āĻĒāϰā§āϝāύā§āϤ āĻĒā§āϰāϤāĻŋāĻāĻŋ āϏāĻāĻā§āϝāĻžāϰ āĻāύā§āϝ āĻāĻāĻŦāĻžāϰ āĻāϰ⧠āĻāϞā§āĨ¤ āĻ āϰā§āĻĨāĻžā§ āĻāĻāĻŋ āĻŽā§āĻ $n$ āĻŦāĻžāϰ āĻā§āϰā§āĨ¤
āĻā§āϤāϰā§āϰ āϞā§āĻĒ ($while$): āĻā§āϝāĻŧāĻžāϞ āĻāϰā§āύ, āĻāĻ āϞā§āĻĒāĻāĻŋ āĻĒā§āϰāϤāĻŋāĻāĻŋ $i$-āĻāϰ āĻāύā§āϝ āĻāϞāĻžāĻĻāĻžāĻāĻžāĻŦā§ āĻāϞā§āĨ¤ āĻāĻāĻŋ $i$-āĻāϰ āĻŽāĻžāύāĻā§ āĻĒā§āϰāϤāĻŋāĻŦāĻžāϰ ā§§ā§Ļ āĻĻāĻŋā§ā§ āĻāĻžāĻ āĻāϰāĻā§ āϝāϤāĻā§āώāĻŖ āύāĻž āϏā§āĻāĻŋ ā§Ļ āĻšā§āĨ¤ āĻā§āύ⧠āϏāĻāĻā§āϝāĻžāĻā§ āĻŦāĻžāϰāĻŦāĻžāϰ ā§§ā§Ļ āĻĻāĻŋā§ā§ āĻāĻžāĻ āĻāϰāϞ⧠āϏā§āĻāĻŋ āĻāϤāĻŦāĻžāϰ āĻāϞāĻŦā§, āϤāĻž āύāĻŋāϰā§āĻāϰ āĻāϰ⧠āĻāĻ āϏāĻāĻā§āϝāĻžāĻāĻŋāϰ āĻ āĻā§āĻ āϏāĻāĻā§āϝāĻžāϰ (number of digits) āĻāĻĒāϰāĨ¤
āĻāĻāĻāĻŋ āϏāĻāĻā§āϝāĻž $x$-āĻā§ ā§§ā§Ļ āĻĻāĻŋā§ā§ āĻāĻžāĻ āĻāϰ⧠ā§Ļ-āϤ⧠āύāĻžāĻŽāĻŋā§ā§ āĻāύāϤ⧠āĻāĻžāĻŖāĻŋāϤāĻŋāĻāĻāĻžāĻŦā§ $\log_{10} x$ āĻŦāĻžāϰ āϞā§āĻĒ āĻāĻžāϞāĻžāϤ⧠āĻšā§āĨ¤
āĻāĻāĻžāύ⧠āĻŽā§āĻ āĻāĻžāĻā§āϰ āĻĒāϰāĻŋāĻŽāĻžāĻŖ āĻšāĻŦā§ āĻĒā§āϰāϤāĻŋāĻāĻŋ $i$-āĻāϰ āĻāύā§āϝ āĻā§āϤāϰā§āϰ āϞā§āĻĒā§āϰ āĻāĻžāĻā§āϰ āϝā§āĻāĻĢāϞ:
\[\text{Total Work} = \sum_{i=1}^{n} \log_{10} i\]āϞāĻāĻžāϰāĻŋāĻĻāĻŽā§āϰ āϧāϰā§āĻŽ āĻ āύā§āϝāĻžā§ā§, $\log 1 + \log 2 + \dots + \log n = \log(n!)$āĨ¤ āϏā§āĻāĻžāϰā§āϞāĻŋāĻā§ā§āϰ āĻ ā§āϝāĻžāĻĒā§āϰā§āĻā§āϏāĻŋāĻŽā§āĻļāύ (Stirlingâs Approximation) āĻ āύā§āϝāĻžā§ā§, $\log(n!)$ āĻāϰ āĻŽāĻžāύ āĻĒā§āϰāĻžā§ $n \log n$ āĻāϰ āϏāĻŽāĻžāύāĨ¤
āϤāĻžāĻ āĻŦāĻŋāĻ-āĻ ($O$) āύā§āĻā§āĻļāύ⧠āĻāĻŽāϰāĻž āĻĒāĻžāĻ: $O(n \log_{10} n)$
āϏāĻšāĻāĻāĻžāĻŦā§ āĻŦā§āĻāĻžāϰ āĻāĻĒāĻžā§:
āĻā§āϤāϰā§āϰ āϞā§āĻĒāĻāĻŋ āĻŽā§āϞāϤ āĻĒā§āϰāϤāĻŋāĻāĻŋ āϏāĻāĻā§āϝāĻžāϰ āĻĄāĻŋāĻāĻŋāĻ āĻŦāĻž āĻ āĻā§āĻ āϏāĻāĻā§āϝāĻž āĻāĻžāĻāύā§āĻ āĻāϰāĻā§āĨ¤ āϝā§āĻšā§āϤ⧠$n$ āĻĒāϰā§āϝāύā§āϤ āĻĒā§āϰāϤāĻŋāĻāĻŋ āϏāĻāĻā§āϝāĻžāϰ āĻā§ āĻ āĻā§āĻ āϏāĻāĻā§āϝāĻž āĻĒā§āϰāĻžā§ $\log_{10} n$, āϤāĻžāĻ āĻĒā§āϰ⧠āĻāĻžāĻāĻāĻŋ āĻāϰāϤ⧠$n \times \log_{10} n$ āϏāĻŽā§ āϞāĻžāĻāĻā§āĨ¤
boolean isPrime(int n){
if (n<2) return false;
for(int i=2; i*i <=n; i++){
if(n%i==0) return false;
}
return true;
}
āĻāĻ āĻā§āĻĄāĻāĻŋāϰ āĻāĻžāĻāĻŽ āĻāĻŽāĻĒā§āϞā§āĻā§āϏāĻŋāĻāĻŋ āĻšāϞ⧠$O(\sqrt{n})$āĨ¤
āϞā§āĻĒā§āϰ āĻāύā§āĻĄāĻŋāĻļāύāĻāĻŋ āĻā§ā§āĻžāϞ āĻāϰā§āύ: i * i <= nāĨ¤ āĻāĻā§ āϏāĻšāĻ āĻŦā§āĻāĻāĻžāĻŖāĻŋāϤāĻŋāĻ āύāĻŋā§āĻŽā§ āϞāĻŋāĻāϞ⧠āĻĻāĻžāĻā§āĻžā§:
\[i \leq \sqrt{n}\]āĻ āϰā§āĻĨāĻžā§, āϞā§āĻĒāĻāĻŋ $2$ āĻĨā§āĻā§ āĻļā§āϰ⧠āĻšā§ā§ āϏāϰā§āĻŦā§āĻā§āĻ $\sqrt{n}$ āĻĒāϰā§āϝāύā§āϤ āĻāϞāĻŦā§āĨ¤ āϝā§āĻšā§āϤ⧠āϞā§āĻĒā§āϰ āĻā§āϤāϰā§āϰ āĻāĻžāĻāĻā§āϞ⧠(āĻāĻžāĻāĻļā§āώ āĻā§āĻ āĻāϰāĻž) āϧā§āϰā§āĻŦāĻ āϏāĻŽā§ā§āϰ āĻāĻžāĻ āĻŦāĻž $O(1)$, āϤāĻžāĻ āĻĒā§āϰ⧠āĻĢāĻžāĻāĻļāύāĻāĻŋāϰ āϏāĻŽā§ āύāĻŋāϰā§āĻāϰ āĻāϰāĻā§ āϞā§āĻĒāĻāĻŋ āĻāϤāĻŦāĻžāϰ āĻā§āϰāĻā§ āϤāĻžāϰ āĻāĻĒāϰāĨ¤
āϝāĻĻāĻŋ $n$ āĻāĻāĻāĻŋ āϝā§āĻāĻŋāĻ āϏāĻāĻā§āϝāĻž āĻšā§, āϤāĻŦā§ āϤāĻžāϰ āĻ āύā§āϤāϤ āĻāĻāĻāĻŋ āĻā§āĻĒāĻžāĻĻāĻ (factor) $a$ āĻĨāĻžāĻāĻŦā§ āϝāĻž $1 < a \leq \sqrt{n}$ āĻļāϰā§āϤāĻāĻŋ āĻŽā§āύ⧠āĻāϞāĻŦā§āĨ¤
āĻāĻĻāĻžāĻšāϰāĻŖāϏā§āĻŦāϰā§āĻĒ, $n = 36$ āĻšāϞ⧠āĻāϰ $\sqrt{36} = 6$āĨ¤ āĻāϰ āĻā§āĻĒāĻžāĻĻāĻāĻā§āϞ⧠āĻšāϞā§: $(2, 18), (3, 12), (4, 9), (6, 6)$āĨ¤
āĻā§ā§āĻžāϞ āĻāϰā§āύ, āĻĒā§āϰāϤāĻŋāĻāĻŋ āĻā§ā§āĻžāϰ āĻŽāϧā§āϝ⧠āĻ āύā§āϤāϤ āĻāĻāĻāĻŋ āϏāĻāĻā§āϝāĻž $6$-āĻāϰ āϏāĻŽāĻžāύ āĻŦāĻž āĻā§āĻāĨ¤ āϤāĻžāĻ āĻāĻŽāϰāĻž āϝāĻĻāĻŋ $6$ āĻĒāϰā§āϝāύā§āϤ āĻā§āύ⧠āĻā§āĻĒāĻžāĻĻāĻ āύāĻž āĻĒāĻžāĻ, āϤāĻŦā§ āύāĻŋāĻļā§āĻāĻŋāϤāĻāĻžāĻŦā§āĻ āĻŦāϞāĻž āϝāĻžā§ $36$-āĻāϰ āĻāĻĒāϰā§āϰ āĻĻāĻŋāĻā§āĻ āĻā§āύ⧠āĻā§āĻĒāĻžāĻĻāĻ āĻĨāĻžāĻāĻŦā§ āύāĻžāĨ¤
Best Case: $O(1)$ (āϝāĻĻāĻŋ $n$ āĻāĻāĻāĻŋ āĻā§ā§ āϏāĻāĻā§āϝāĻž āĻšā§ āĻāĻŦāĻ ā§¨ āĻĻāĻŋā§ā§ āĻāĻžāĻ āϝāĻžā§)āĨ¤
Worst Case: $O(\sqrt{n})$ (āϝāĻĻāĻŋ $n$ āĻāĻāĻāĻŋ āĻŽā§āϞāĻŋāĻ āϏāĻāĻā§āϝāĻž āĻšā§, āϤāĻŦā§ āϞā§āĻĒāĻāĻŋ āĻĒā§āϰ⧠$\sqrt{n}$ āĻĒāϰā§āϝāύā§āϤ āĻāϞāĻŦā§)āĨ¤ ___
void permute(int[] arr, int l, int r) {
if (l == r) { print(arr); return; }
for (int i = l; i <= r; i++) {
swap(arr[l], arr[i]);
permute(arr, l + 1, r);
swap(arr[l], arr[i]);
}
}
āĻāĻ āĻā§āĻĄāĻāĻŋāϰ āĻāĻžāĻāĻŽ āĻāĻŽāĻĒā§āϞā§āĻā§āϏāĻŋāĻāĻŋ āĻšāϞ⧠$O(n \times n!)$āĨ¤
āĻāĻāĻŋ āĻāĻāĻāĻŋ āĻ āϤā§āϝāύā§āϤ āĻĒāϰāĻŋāĻāĻŋāϤ āĻŦā§āϝāĻžāĻāĻā§āϰā§āϝāĻžāĻāĻŋāĻ (Backtracking) āĻ ā§āϝāĻžāϞāĻāϰāĻŋāĻĻāĻŽ, āϝāĻž āĻĻāĻŋā§ā§ āĻāĻāĻāĻŋ āĻ ā§āϝāĻžāϰā§āϰ āϏāĻŦ āϧāϰāύā§āϰ āĻĒāĻžāϰāĻŽā§āĻā§āĻļāύ (Permutation) āĻŦāĻž āĻŦāĻŋāύā§āϝāĻžāϏ āĻŦā§āϰ āĻāϰāĻž āĻšā§āĨ¤ āĻāϞā§āύ āĻĻā§āĻāĻŋ āĻā§āύ āĻāϰ āĻāĻŽāĻĒā§āϞā§āĻā§āϏāĻŋāĻāĻŋ āĻāϤ āĻŦā§āĻļāĻŋāĨ¤
āĻāĻāĻāĻŋ āĻ ā§āϝāĻžāϰā§āϰ āϏāĻžāĻāĻ āϝāĻĻāĻŋ $n$ āĻšā§, āϤāĻŦā§ āϤāĻžāϰ āĻŽā§āĻ āĻĒāĻžāϰāĻŽā§āĻā§āĻļāύ āϏāĻāĻā§āϝāĻž āĻšā§ $n!$ (n factorial)āĨ¤
āĻāĻ āϰāĻŋāĻāĻžāϰā§āϏāύ āĻĒā§āϰāĻā§āϰāĻŋā§āĻžā§ āĻŽā§āĻ āϞāĻŋāĻĢ āύā§āĻĄ (Leaf nodes) āĻŦāĻž āĻļā§āώ āϧāĻžāĻĒā§āϰ āϏāĻāĻā§āϝāĻž āĻšāϞ⧠$n!$āĨ¤ āĻ āϰā§āĻĨāĻžā§ āĻĢāĻžāĻāĻļāύāĻāĻŋ āĻŽā§āĻ $n!$ āĻŦāĻžāϰ āĻļā§āώ āĻĒāϰā§āϝāĻžā§ā§ āĻĒā§āĻāĻāĻžā§āĨ¤
āĻāĻžāĻāĻŽ āĻāĻŽāĻĒā§āϞā§āĻā§āϏāĻŋāĻāĻŋ āĻŦā§āϰ āĻāϰāĻžāϰ āĻāύā§āϝ āĻāĻŽāĻžāĻĻā§āϰ āĻĻā§āĻāĻŋ āĻāĻŋāύāĻŋāϏ āĻŽāĻžāĻĨāĻžā§ āϰāĻžāĻāϤ⧠āĻšāĻŦā§:
āϝā§āĻšā§āϤ⧠āĻāĻŽāϰāĻž $n!$ āϏāĻāĻā§āϝāĻ āĻŦāĻŋāύā§āϝāĻžāϏ āϤā§āϰāĻŋ āĻāϰāĻāĻŋ āĻāĻŦāĻ āĻĒā§āϰāϤāĻŋāĻāĻŋ āĻŦāĻŋāύā§āϝāĻžāϏ āĻĒā§āϰāĻŋāύā§āĻ āĻāϰāϤ⧠$O(n)$ āϏāĻŽā§ āϞāĻžāĻāĻā§, āϤāĻžāĻ āĻŽā§āĻ āĻāĻŽāĻĒā§āϞā§āĻā§āϏāĻŋāĻāĻŋ āĻĻāĻžāĻā§āĻžā§:
\[\text{Total Time} = O(n \times n!)\]āϝāĻĻāĻŋ $n=10$ āĻšā§:
void merge_sort(int[] arr, int l, int r) {
if (l >= r) return;
int mid = (l + r) / 2;
merge_sort(arr, l, mid);
merge_sort(arr, mid + 1, r);
merge(arr, l, mid, r); // uses O(n) temp array
}
$O(n!)$āĨ¤ āϤāĻŦā§ āĻāϰāĻ āύāĻŋāĻā§āĻāϤāĻāĻžāĻŦā§ āĻŦāϞāϞ⧠āĻāĻāĻŋ $O(n \times n!)$āĨ¤
āĻāĻ āĻĢāĻžāĻāĻļāύāĻāĻŋ āĻāĻāĻāĻŋ āĻ ā§āϝāĻžāϰā§āϰ āϏāĻŦ āϧāϰāύā§āϰ Permutation (āĻŦāĻŋāύā§āϝāĻžāϏ) āĻŦā§āϰ āĻāϰā§āĨ¤ āϝāĻĻāĻŋ āĻ ā§āϝāĻžāϰā§āϤ⧠$n$ āĻāĻŋ āĻāĻĒāĻžāĻĻāĻžāύ āĻĨāĻžāĻā§, āϤāĻŦā§ āĻŽā§āĻ āĻŦāĻŋāύā§āϝāĻžāϏ āϏāĻāĻā§āϝāĻž āĻšā§ $n!$ (n factorial)āĨ¤
āϞā§āĻā§āϞ ā§Ļ: āĻļā§āϰā§āϤ⧠āĻāĻŽāĻžāĻĻā§āϰ āĻāĻžāĻā§ $n$ āĻāĻŋ āĻ āĻĒāĻļāύ āĻĨāĻžāĻā§ (āϞā§āĻĒāĻāĻŋ $n$ āĻŦāĻžāϰ āĻāϞā§)āĨ¤
āϞā§āĻā§āϞ ā§§: āĻĒā§āϰāϤāĻŋāĻāĻŋ āĻ āĻĒāĻļāύā§āϰ āĻāύā§āϝ āĻāĻŽāϰāĻž ā§§āĻāĻŋ āĻāϞāĻŋāĻŽā§āύā§āĻ āĻĢāĻŋāĻā§āϏ āĻāϰ⧠āĻŦāĻžāĻāĻŋ $(n-1)$ āĻāĻŋ āĻāϞāĻŋāĻŽā§āύā§āĻā§āϰ āĻāύā§āϝ āĻĢāĻžāĻāĻļāύ āĻāϞ āĻāϰāĻŋāĨ¤
āϞā§āĻā§āϞ ⧍: āĻāϰāĻĒāϰ āĻĒā§āϰāϤāĻŋāĻāĻŋ āĻāϞā§āϰ āĻāύā§āϝ āĻāϰāĻ $(n-2)$ āĻāĻŋ āĻ āĻĒāĻļāύ āĻĨāĻžāĻā§āĨ¤
āĻāĻāĻāĻžāĻŦā§ āϰāĻŋāĻāĻžāϰā§āϏāύāĻāĻŋ āύāĻŋāĻā§ āύāĻžāĻŽāϤ⧠āĻĨāĻžāĻā§ āϝāϤāĻā§āώāĻŖ āύāĻž āĻāĻāĻāĻŋ āĻĒā§āϰā§āĻŖ āĻŦāĻŋāύā§āϝāĻžāϏ āϤā§āϰāĻŋ āĻšā§āĨ¤ āĻāĻ āϰāĻŋāĻāĻžāϰā§āϏāύ āĻā§āϰāĻŋāϤ⧠āĻŽā§āĻ āϞāĻŋāĻĢ āύā§āĻĄ (Leaf nodes) āĻŦāĻž āĻļā§āώ āϧāĻžāĻĒā§āϰ āϏāĻāĻā§āϝāĻž āĻšāϞ⧠$n!$āĨ¤
āĻāĻžāĻāĻŽ āĻāĻŽāĻĒā§āϞā§āĻā§āϏāĻŋāĻāĻŋ āĻšāĻŋāϏāĻžāĻŦ āĻāϰāĻžāϰ āϏāĻŽā§ āĻĻā§āĻāĻŋ āĻŦāĻŋāώ⧠āĻŽāĻžāĻĨāĻžā§ āϰāĻžāĻāϤ⧠āĻšā§:
āϰāĻŋāĻāĻžāϰā§āϏāĻŋāĻ āĻāϞā§āϰ āϏāĻāĻā§āϝāĻž: āϝāĻž āĻĒā§āϰāĻžā§ $O(n!)$āĨ¤
āĻĒā§āϰāϤāĻŋāĻāĻŋ āĻāϞā§āϰ āĻāĻžāĻ: āĻā§ā§āĻžāϞ āĻāϰā§āύ, āϝāĻāύ āϰāĻŋāĻāĻžāϰā§āϏāύāĻāĻŋ āĻāĻāĻĻāĻŽ āĻļā§āώ āĻĒāϰā§āϝāĻžā§ā§ (l == r) āĻĒā§āĻāĻāĻžā§, āϤāĻāύ āĻāĻŽāϰāĻž āĻĒā§āϰ⧠āĻ ā§āϝāĻžāϰā§āĻāĻŋ Print āĻāϰāĻāĻŋāĨ¤ āĻāĻāĻāĻŋ $n$ āϏāĻžāĻāĻā§āϰ āĻ ā§āϝāĻžāϰ⧠āĻĒā§āϰāĻŋāύā§āĻ āĻāϰāϤ⧠$O(n)$ āϏāĻŽā§ āϞāĻžāĻā§āĨ¤
āϤāĻžāĻ āĻŽā§āĻ āϏāĻŽā§ āϞāĻžāĻā§: $n! \times n$ āĻ āϰā§āĻĨāĻžā§ $O(n \times n!)$āĨ¤ āĻ āĻĒāĻļāύ⧠āϝā§āĻšā§āϤ⧠$O(n!)$ āĻāĻā§, āϤāĻžāĻ āĻāĻāĻŋāĻ āϏāĻ āĻŋāĻ āĻā§āϝāĻžāĻāĻžāĻāϰāĻŋāĨ¤
āϝāĻĻāĻŋ āĻāĻĒāύāĻžāϰ āĻ ā§āϝāĻžāϰā§āϤ⧠⧧ā§ĻāĻāĻŋ āϏāĻāĻā§āϝāĻž āĻĨāĻžāĻā§ ($n=10$):
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j = j + i) {
for (int k = 1; k <= n; k = k * 2) {
sum++;
}
}
}
Outer Loop ($i$): Runs $n$ times.
Middle Loop ($j$): The number of iterations depends on $i$. It runs $\frac{n}{i}$ times.
Inner Loop ($k$): This is a logarithmic loop, running $\log n$ times because $k$ doubles each iteration.
Total Complexity: The summation $\sum_{i=1}^{n} \frac{n}{i} \log n$ simplifies to $n \log n \sum \frac{1}{i}$. Since the Harmonic Series $\sum \frac{1}{i}$ is $O(\log n)$, the total time complexity is $O(n \log^2 n)$.
int binarySearch(int[] arr, int target, int lo, int hi) {
if (lo > hi) return -1;
int mid = (lo + hi) / 2;
if (arr[mid] == target) return mid;
if (arr[mid] > target)
return binarySearch(arr, target, lo, mid - 1);
return binarySearch(arr, target, mid + 1, hi);
}
āĻāĻ āĻā§āĻĄāĻāĻŋāϰ āĻāĻžāĻāĻŽ āĻāĻŽāĻĒā§āϞā§āĻā§āϏāĻŋāĻāĻŋ āĻšāϞ⧠$O(\log n)$āĨ¤
āĻāĻāĻŋ āĻāĻāĻāĻŋ āĻā§āϞāĻžāϏāĻŋāĻ Binary Search āĻ ā§āϝāĻžāϞāĻāϰāĻŋāĻĻāĻŽāĨ¤ āϞāĻŋāύāĻŋā§āĻžāϰ āϏāĻžāϰā§āĻā§āϰ āĻŽāϤ⧠āĻĒā§āϰāϤāĻŋāĻāĻŋ āĻāϞāĻŋāĻŽā§āύā§āĻ āĻāĻā§ āĻāĻā§ āĻā§āĻ āύāĻž āĻāϰā§, āĻāĻāĻŋ āĻĒā§āϰāϤāĻŋ āϧāĻžāĻĒā§ āϏāĻžāϰā§āĻ āĻāϰāĻŋā§āĻž āĻŦāĻž āĻā§āĻāĻāĻžāϰ āĻāĻžā§āĻāĻž āĻ āϰā§āϧā§āĻ āĻāϰ⧠āĻĢā§āϞā§āĨ¤
āĻŦāĻžāĻāύāĻžāϰāĻŋ āϏāĻžāϰā§āĻā§āϰ āĻŽā§āϞ āĻļāĻā§āϤāĻŋ āĻšāϞ⧠âDivide and Conquerâ āĻŦāĻž āĻāĻžāĻ āĻāϰ⧠āĻā§ āĻāϰāĻžāϰ āύā§āϤāĻŋāĨ¤ āĻāϞā§āύ āĻĻā§āĻāĻŋ āĻāĻāĻŋ āĻā§āĻāĻžāĻŦā§ āĻāĻžāĻ āĻāϰā§:
āĻāĻžāĻŖāĻŋāϤāĻŋāĻāĻāĻžāĻŦā§, āĻāĻŽāϰāĻž $n$ āĻā§ āĻāϤāĻŦāĻžāϰ $2$ āĻĻāĻŋā§ā§ āĻāĻžāĻ āĻāϰāϞ⧠$1$ āĻĒāĻžāĻŦā§? āĻāϤā§āϤāϰāĻāĻŋ āĻšāϞ⧠$\log_2 n$
āϝā§āĻšā§āϤ⧠āĻāĻāĻŋ āĻāĻāĻāĻŋ āϰāĻŋāĻāĻžāϰā§āϏāĻŋāĻ āĻĢāĻžāĻāĻļāύ, āĻĒā§āϰāϤāĻŋāĻāĻŋ āĻāϞ āĻāĻāĻāĻŋ āύāϤā§āύ āϏā§āĻā§āϝāĻžāĻ āϤā§āϰāĻŋ āĻāϰā§āĨ¤ āĻāĻŋāύā§āϤ⧠āĻāĻāĻžāύ⧠āĻŽāĻāĻžāϰ āĻŦā§āϝāĻžāĻĒāĻžāϰ āĻšāϞā§, āĻĒā§āϰāϤāĻŋāĻŦāĻžāϰ āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āĻāĻāĻāĻŋ āϰāĻŋāĻāĻžāϰā§āϏāĻŋāĻ āĻāϞ āĻāĻžāϰā§āϝāĻāϰ āĻšā§ (āĻšā§ āĻŦāĻžāĻŽ āĻĻāĻŋāĻā§, āύāĻžāĻšā§ āĻĄāĻžāύ āĻĻāĻŋāĻā§)āĨ¤ āĻĢāϞ⧠āĻāĻāĻŋ āĻŽāĻžāϰā§āĻ āϏāϰā§āĻā§āϰ āĻŽāϤ⧠āĻŦāĻŋāĻļāĻžāϞ āĻā§āύ⧠āĻā§āϰāĻŋ āϤā§āϰāĻŋ āĻāϰ⧠āύāĻž, āĻŦāϰāĻ āĻāĻāĻāĻŋ āϏā§āĻāĻž āϞāĻžāĻāύā§āϰ āĻŽāϤ⧠āύāĻŋāĻā§ āύāĻžāĻŽā§āĨ¤
Best Case: $O(1)$ - āϝāĻĻāĻŋ āĻāĻĒāύāĻžāϰ target āĻŽāĻžāύāĻāĻŋ āĻāĻāĻĻāĻŽ āĻĒā§āϰāĻĨāĻŽāĻŦāĻžāϰā§āĻ mid āĻĒāĻāĻŋāĻļāύ⧠āĻĒāĻžāĻā§āĻž āϝāĻžā§āĨ¤
Worst Case: $O(\log n)$ - āϝāĻĻāĻŋ āĻŽāĻžāύāĻāĻŋ āĻ ā§āϝāĻžāϰā§āϰ āĻāĻāĻĻāĻŽ āĻļā§āώ⧠āĻĨāĻžāĻā§ āĻŦāĻž āĻ ā§āϝāĻžāϰā§āϤ⧠āύāĻž āĻĨāĻžāĻā§āĨ¤
for (int i = 2; i <= n; i++) {
for (int j = 2; j * j <= i; j++) {
if (i % j == 0) break;
}
}
āĻāĻ āĻā§āĻĄāĻāĻŋāϰ āĻāĻžāĻāĻŽ āĻāĻŽāĻĒā§āϞā§āĻā§āϏāĻŋāĻāĻŋ āĻšāϞ⧠$O(n\sqrt{n})$ āĻŦāĻž $O(n^{1.5})$āĨ¤
āĻāĻāĻŋ āĻŽā§āϞāϤ $2$ āĻĨā§āĻā§ $n$ āĻĒāϰā§āϝāύā§āϤ āĻĒā§āϰāϤāĻŋāĻāĻŋ āϏāĻāĻā§āϝāĻž āĻŽā§āϞāĻŋāĻ (Prime) āĻāĻŋ āύāĻž āϤāĻž āĻā§āĻ āĻāϰāĻžāϰ āĻāĻāĻāĻŋ āĻ ā§āϝāĻžāϞāĻāϰāĻŋāĻĻāĻŽāĨ¤ āĻāϞā§āύ āĻāϰ āĻāĻžāĻŖāĻŋāϤāĻŋāĻ āĻāĻžāϰāĻŖāĻāĻŋ āĻĻā§āĻā§ āύāĻŋāĻ:
āĻŦāĻžāĻāϰā§āϰ āϞā§āĻĒ ($i$): āĻāĻāĻŋ $2$ āĻĨā§āĻā§ $n$ āĻĒāϰā§āϝāύā§āϤ āĻāϞā§āĨ¤ āĻ āϰā§āĻĨāĻžā§ āĻāĻāĻŋ āĻŽā§āĻ $n$ āĻŦāĻžāϰ āĻā§āϰā§āĨ¤
āĻā§āϤāϰā§āϰ āϞā§āĻĒ ($j$): āĻāĻāĻŋ āĻĒā§āϰāϤāĻŋāĻāĻŋ $i$-āĻāϰ āĻāύā§āϝ $2$ āĻĨā§āĻā§ āĻļā§āϰ⧠āĻāϰ⧠$\sqrt{i}$ āĻĒāϰā§āϝāύā§āϤ āĻāϞ⧠(āϝā§āĻšā§āϤ⧠j * j <= i āĻŽāĻžāύā§āĻ āĻšāϞ⧠$j \leq \sqrt{i}$)āĨ¤
āĻŽā§āĻ āĻāĻžāĻā§āϰ āĻĒāϰāĻŋāĻŽāĻžāĻŖ āĻŦā§āϰ āĻāϰāϤ⧠āĻāĻŽāĻžāĻĻā§āϰ āĻĒā§āϰāϤāĻŋāĻāĻŋ $i$-āĻāϰ āĻāύā§āϝ āĻā§āϤāϰā§āϰ āϞā§āĻĒāĻāĻŋ āĻāϤāĻŦāĻžāϰ āĻāϞāĻā§ āϤāĻžāϰ āϝā§āĻāĻĢāϞ āĻŦā§āϰ āĻāϰāϤ⧠āĻšāĻŦā§:
\[\text{Total Work} = \sqrt{2} + \sqrt{3} + \sqrt{4} + \dots + \sqrt{n}\]āĻā§āϝāĻžāϞāĻā§āϞāĻžāϏā§āϰ āĻāύā§āĻāĻŋāĻā§āϰā§āĻļāύ āĻĒāĻĻā§āϧāϤāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻāĻ āϧāĻžāϰāĻžāϰ āϝā§āĻāĻĢāϞ āĻŦā§āϰ āĻāϰāϞ⧠āĻĻā§āĻāĻž āϝāĻžā§:
\[\int_{2}^{n} \sqrt{x} dx \approx \frac{2}{3} n^{1.5}\]āϝā§āĻšā§āϤ⧠āĻŦāĻŋāĻ-āĻ ($O$) āύā§āĻā§āĻļāύ⧠āĻāĻŽāϰāĻž āĻāύāϏā§āĻā§āϝāĻžāύā§āĻ āĻŦāĻž āϧā§āϰā§āĻŦāĻ ($\frac{2}{3}$) āĻŦāĻžāĻĻ āĻĻāĻŋāĻ, āϤāĻžāĻ āĻā§ā§āĻžāύā§āϤ āĻāĻŽāĻĒā§āϞā§āĻā§āϏāĻŋāĻāĻŋ āĻĻāĻžāĻā§āĻžā§: $O(n\sqrt{n})$ āĻŦāĻž $O(n^{1.5})$āĨ¤
int count = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
for (int k = 0; k < n; k++) {
if (i + j + k < n) count++;
else break;
}
}
}
āĻāĻ āĻā§āĻĄāĻāĻŋāϰ āĻāĻžāĻāĻŽ āĻāĻŽāĻĒā§āϞā§āĻā§āϏāĻŋāĻāĻŋ āĻšāϞ⧠$O(n^3)$āĨ¤
āϝāĻĻāĻŋāĻ āĻāĻāĻžāύ⧠āĻāĻāĻāĻŋ break āϏā§āĻā§āĻāĻŽā§āύā§āĻ āĻāĻā§, āϝāĻž āĻĻā§āĻā§ āĻŽāύ⧠āĻšāϤ⧠āĻĒāĻžāϰ⧠āĻāĻāĻŋ āĻāĻŽāĻĒā§āϞā§āĻā§āϏāĻŋāĻāĻŋ āĻāĻŽāĻŋā§ā§ āĻĻā§āĻŦā§, āĻāĻŋāύā§āϤ⧠āĻāĻžāĻŖāĻŋāϤāĻŋāĻāĻāĻžāĻŦā§ āĻāĻāĻŋ āĻāĻāύ⧠āĻāĻŋāĻāĻŦāĻŋāĻ ($n^3$) āĻā§āϝāĻžāĻāĻžāĻāϰāĻŋāϤā§āĻ āĻ āĻŦāϏā§āĻĨāĻžāύ āĻāϰāĻā§āĨ¤ āĻāϞā§āύ āĻāϰ āĻāĻžāϰāĻŖāĻā§āϞ⧠āĻŦāĻŋāĻļā§āϞā§āώāĻŖ āĻāϰāĻŋ:
āϞā§āĻĒāĻā§āϞā§āϰ āĻāĻ āύ āϞāĻā§āώā§āϝ āĻāϰā§āύ:
āĻāĻāĻžāύ⧠break āϏā§āĻā§āĻāĻŽā§āύā§āĻāĻāĻŋ āĻŽā§āϞāϤ āĻāĻāĻāĻŋ āϤā§āϰāĻŋāĻā§āĻāĻžāĻāĻžāϰ āĻŦāĻž āĻĒāĻŋāϰāĻžāĻŽāĻŋāĻĄāĻžāϞ (Pyramidal) āĻāĻžāĻā§āϰ āĻā§āώā§āϤā§āϰ āϤā§āϰāĻŋ āĻāϰāĻā§āĨ¤ āϝāĻāύ $i$ āĻāĻŦāĻ $j$ āĻā§āĻ āĻšā§, āϤāĻāύ $k$ āϞā§āĻĒāĻāĻŋ āĻ āύā§āĻāĻŦāĻžāϰ āĻāϞā§āĨ¤ āϝāĻāύ $i$ āĻāĻŦāĻ $j$ āĻŦā§ āĻšā§, āϤāĻāύ $k$ āϞā§āĻĒāĻāĻŋ āĻĻā§āϰā§āϤ break āĻāϰā§āĨ¤
āĻāĻ āĻā§āĻĄāĻāĻŋ āĻŽā§āĻ āĻāϤāĻŦāĻžāϰ count++ āĻāϰāĻŦā§, āϤāĻž āĻŦā§āϰ āĻāϰāĻžāϰ āĻāύā§āϝ āĻāĻŽāĻžāĻĻā§āϰ āύāĻŋāĻā§āϰ āϏāĻŽāώā§āĻāĻŋāĻāĻŋ (Summation) āϏāĻŽāĻžāϧāĻžāύ āĻāϰāϤ⧠āĻšāĻŦā§:
\[\sum_{i=0}^{n-1} \sum_{j=0}^{n-i-1} \sum_{k=0}^{n-i-j-1} 1\]āĻāĻ āĻāĻžāĻŖāĻŋāϤāĻŋāĻ āĻšāĻŋāϏāĻžāĻŦāĻāĻŋ āϏāĻŽā§āĻĒāύā§āύ āĻāϰāϞ⧠āĻāĻŽāϰāĻž āĻāĻāĻāĻŋ āĻĢāϞāĻžāĻĢāϞ āĻĒāĻžāĻ āϝāĻž āĻŽā§āϞāϤ $\frac{n(n+1)(n+2)}{6}$ āĻāϰ āϏāĻŽāĻžāύāĨ¤
āĻāĻāĻŋ āĻŽā§āϞāϤ Tetrahedral Number āĻāϰ āϏā§āϤā§āϰāĨ¤ āĻāĻŽāϰāĻž āϝāĻĻāĻŋ āĻāĻ āϏāĻŽā§āĻāϰāĻŖāĻāĻŋ āĻŦāĻŋāϏā§āϤā§āϤ āĻāϰāĻŋ:
\[\frac{n^3 + 3n^2 + 2n}{6}\]āĻŦāĻŋāĻ-āĻ ($O$) āύā§āĻā§āĻļāύā§āϰ āύāĻŋā§āĻŽāĻžāύā§āϝāĻžā§ā§, āĻāĻŽāϰāĻž āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āϏāϰā§āĻŦā§āĻā§āĻ āĻāĻžāϤāĻāĻŋ āĻā§āϰāĻšāĻŖ āĻāϰāĻŋ āĻāĻŦāĻ āĻāύāϏā§āĻā§āϝāĻžāύā§āĻ (āϝā§āĻŽāύ $1/6$) āĻŦāĻžāĻĻ āĻĻāĻŋāĻāĨ¤ āĻĢāϞ⧠āĻā§ā§āĻžāύā§āϤ āĻĢāϞāĻžāĻĢāϞ āĻĻāĻžāĻā§āĻžā§ $O(n^3)$āĨ¤
āϝāĻĻāĻŋ $n = 100$ āĻšā§:
āϝāĻĻāĻŋāĻ break āĻāϰ āĻāĻžāϰāĻŖā§ āĻ āĻĒāĻžāϰā§āĻļāύ āϏāĻāĻā§āϝāĻž āĻĒā§āϰāĻžā§ ā§Ŧ āĻā§āĻŖ āĻāĻŽā§ āĻā§āĻā§, āĻāĻŋāύā§āϤ⧠āĻ ā§āϝāĻžāϞāĻāϰāĻŋāĻĻāĻŽāĻŋāĻ āĻā§āϰā§āĻĨ āϰā§āĻ āĻŦāĻž āĻāύāĻĒā§āĻ āĻŦāĻžā§āĻžāϰ āϏāĻžāĻĨā§ āϏāĻžāĻĨā§ āϏāĻŽā§ āĻŦāĻžā§āĻžāϰ āĻšāĻžāϰ āĻāĻāύ⧠$n^3$ āĻ āύā§āϝāĻžā§ā§āĻ āĻĒāϰāĻŋāĻŦāϰā§āϤāĻŋāϤ āĻšāĻā§āĻā§āĨ¤
void f(int n, int depth) {
if (depth == 0) return;
for (int i = 0; i < n; i++) {
print(i);
}
f(n, depth - 1);
f(n, depth - 1);
}
// Called as: f(n, log2(n))
āĻāĻ āĻā§āĻĄāĻāĻŋāϰ āĻāĻžāĻāĻŽ āĻāĻŽāĻĒā§āϞā§āĻā§āϏāĻŋāĻāĻŋ āĻšāϞ⧠$O(n^2)$āĨ¤
for (int i = 1; i <= n; i++) {
for (int j = i; j <= n; j += i) {
for (int k = j; k <= n; k += j) {
ans++;
}
}
}
āĻāĻ āĻā§āĻĄāĻāĻŋāϰ āĻāĻžāĻāĻŽ āĻāĻŽāĻĒā§āϞā§āĻā§āϏāĻŋāĻāĻŋ āĻšāϞ⧠$O(n \log^2 n)$āĨ¤
āĻāĻ āĻā§āĻĄāĻāĻŋāϤ⧠āϤāĻŋāύāĻāĻŋ āύā§āϏā§āĻā§āĻĄ āϞā§āĻĒ āϰā§ā§āĻā§ āϝāĻžāĻĻā§āϰ āĻāĻžāĻā§āϰ āϧāϰāĻŖ āύāĻŋāĻā§ āĻĻā§āĻā§āĻž āĻšāϞā§:
āĻĒā§āϰ⧠āĻāĻžāĻā§āϰ āĻĒāϰāĻŋāĻŽāĻžāĻŖ āĻŦā§āϰ āĻāϰāϤ⧠āĻāĻŽāĻžāĻĻā§āϰ āύāĻŋāĻā§āϰ āϏāĻžāĻŽā§āĻļāύāĻāĻŋ āϏāĻŽāĻžāϧāĻžāύ āĻāϰāϤ⧠āĻšāĻŦā§: \(\sum_{i=1}^{n} \sum_{j=i, 2i, \dots}^{n} \frac{n}{j}\)
āĻāĻŽāϰāĻž āĻāĻžāύāĻŋ āϝā§, āĻāĻāĻāĻŋ āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ $i$-āĻāϰ āĻāύā§āϝ $j$-āĻāϰ āĻŽāĻžāύāĻā§āϞ⧠āĻšāϞ⧠$i \times m$ (āϝā§āĻāĻžāύ⧠$m = 1, 2, \dots, n/i$). āϤāĻžāĻšāϞ⧠āĻā§āϤāϰā§āϰ āϞā§āĻĒ āĻĻā§āĻāĻŋāϰ āϏāĻŽā§āĻŽāĻŋāϞāĻŋāϤ āĻāĻžāĻ:
\(\sum_{j \in \{i, 2i, \dots\}} \frac{n}{j} = \frac{n}{i} + \frac{n}{2i} + \frac{n}{3i} + \dots = \frac{n}{i} (1 + \frac{1}{2} + \frac{1}{3} + \dots + \frac{1}{n/i})\)āĻšāĻžāϰāĻŽā§āύāĻŋāĻ āϏāĻŋāϰāĻŋāĻā§āϰ āϧāϰā§āĻŽ āĻ āύā§āϝāĻžā§ā§, $(1 + \frac{1}{2} + \dots + \frac{1}{x}) \approx \ln(x)$āĨ¤āϏā§āϤāϰāĻžāĻ, āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ $i$-āĻāϰ āĻāύā§āϝ āĻāĻžāĻ āĻšāĻā§āĻā§: $\frac{n}{i} \log(\frac{n}{i})$āĨ¤āĻāĻāύ āϏāĻŦ $i$-āĻāϰ āĻāύā§āϝ āĻŽā§āĻ āĻāĻžāĻ:\(\sum_{i=1}^{n} \frac{n}{i} \log(\frac{n}{i}) \leq \sum_{i=1}^{n} \frac{n}{i} \log(n) = n \log(n) \sum_{i=1}^{n} \frac{1}{i}\)āϝā§āĻšā§āϤ⧠$\sum \frac{1}{i}$ āĻāĻŦāĻžāϰāĻ āĻāĻāĻāĻŋ āĻšāĻžāϰāĻŽā§āύāĻŋāĻ āϏāĻŋāϰāĻŋāĻ āϝāĻž $\log n$ āĻāϰ āϏāĻŽāĻžāύ, āϤāĻžāĻ āĻā§ā§āĻžāύā§āϤ āĻĢāϞāĻžāĻĢāϞ āĻĻāĻžāĻā§āĻžā§:\(n \log n \times \log n = O(n \log^2 n)\)
āϝāĻāύāĻ āĻāĻĒāύāĻŋ āĻĻā§āĻāĻŦā§āύ āĻā§āύ⧠āϞā§āĻĒ j += i āĻŦāĻž k += j āϏā§āĻāĻžāĻāϞ⧠āĻāϞāĻā§ (āĻ āϰā§āĻĨāĻžā§ āĻāĻā§āϰ āϞā§āĻĒā§āϰ āĻā§āϰāĻŋā§ā§āĻŦāϞ āĻĻāĻŋā§ā§ āϞāĻžāĻĢ āĻĻāĻŋāĻā§āĻā§), āϏā§āĻāĻžāύ⧠Harmonic Series āĻŦāĻž $\log n$ āĻāϰ āĻĒā§āϰāĻāĻžāĻŦ āϤā§āϰāĻŋ āĻšā§āĨ¤ āĻāĻāĻžāύ⧠āĻĻā§āĻāĻŋ āĻāĻŽāύ āϞā§āĻĒ āĻĨāĻžāĻāĻžā§ āĻāĻŽāϰāĻž $n \times \log n \times \log n$ āĻĒāĻžāĻā§āĻāĻŋāĨ¤
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
int temp = j;
while (temp > 0) {
temp = temp & (temp - 1);
count++;
}
}
}
āĻāĻ āĻā§āĻĄāĻāĻŋāϰ āĻāĻžāĻāĻŽ āĻāĻŽāĻĒā§āϞā§āĻā§āϏāĻŋāĻāĻŋ āĻšāϞ⧠$O(n^2 \log n)$āĨ¤
āĻŦāĻžāĻāϰā§āϰ āĻĻā§āĻāĻŋ āϞā§āĻĒ ($i$ āĻāĻŦāĻ $j$): āĻāĻ āĻĻā§āĻāĻŋ āϞā§āĻĒ āĻā§āĻŦ āϏāĻžāϧāĻžāϰāĻŖ āϞāĻŋāύāĻŋā§āĻžāϰ āϞā§āĻĒāĨ¤ āĻĒā§āϰāϤāĻŋāĻāĻŋ āϞā§āĻĒ $n$ āĻŦāĻžāϰ āĻā§āϰā§āĨ¤ āϏā§āϤāϰāĻžāĻ āĻāĻ āĻĻā§āĻāĻŋ āϞā§āĻĒā§āϰ āϏāĻŽā§āĻŽāĻŋāϞāĻŋāϤ āĻāĻŽāĻĒā§āϞā§āĻā§āϏāĻŋāĻāĻŋ āĻšāϞ⧠$n \times n = \mathbf{O(n^2)}$āĨ¤
āĻā§āϤāϰā§āϰ $while$ āϞā§āĻĒ: āĻāĻ āĻ āĻāĻļāĻāĻŋāĻ āϏāĻŦāĻā§ā§ā§ āĻāύā§āĻāĻžāϰā§āϏā§āĻāĻŋāĻāĨ¤ āĻāĻāĻžāύ⧠temp = temp & (temp - 1) āĻ āĻĒāĻžāϰā§āĻļāύāĻāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āĻšā§ā§āĻā§āĨ¤
temp & (temp - 1) āĻ āĻĒāĻžāϰā§āĻļāύāĻāĻŋ āĻāĻāĻāĻŋ āϏāĻāĻā§āϝāĻžāϰ āĻŦāĻžāĻāύāĻžāϰāĻŋ āϰāĻŋāĻĒā§āϰā§āĻā§āύā§āĻā§āĻļāύ āĻĨā§āĻā§ āϏāĻŦāĻĨā§āĻā§ āĻĄāĻžāύāĻĻāĻŋāĻā§āϰ āϏā§āĻ āĻŦāĻŋāĻ (set bit āĻŦāĻž $1$) āĻāĻŋāĻā§ āϏāϰāĻŋā§ā§ āĻĻā§ā§āĨ¤
āϏāĻšāĻ āĻāĻĨāĻžā§, āĻāĻ āϞā§āĻĒāĻāĻŋ āϤāϤāĻŦāĻžāϰ āĻāϞāĻŦā§ āϝāϤāĻā§āϞ⧠$1$ āĻŦāĻž Set Bits āϏāĻāĻā§āϝāĻžāĻāĻŋāϰ āĻŦāĻžāĻāύāĻžāϰāĻŋ āϰā§āĻĒā§ āĻāĻā§āĨ¤
āϧāϰāĻž āϝāĻžāĻ $j = 7$ (āĻŦāĻžāĻāύāĻžāϰāĻŋ 111), āĻāĻāĻžāύ⧠āϞā§āĻĒāĻāĻŋ ā§Š āĻŦāĻžāϰ āĻāϞāĻŦā§āĨ¤
āϧāϰāĻž āϝāĻžāĻ $j = 8$ (āĻŦāĻžāĻāύāĻžāϰāĻŋ 1000), āĻāĻāĻžāύ⧠āϞā§āĻĒāĻāĻŋ ā§§ āĻŦāĻžāϰ āĻāϞāĻŦā§āĨ¤
āĻāĻāĻāĻŋ āϏāĻāĻā§āϝāĻž $n$ āĻāϰ āϏāϰā§āĻŦā§āĻā§āĻ āĻāϤāĻā§āϞ⧠āϏā§āĻ āĻŦāĻŋāĻ āĻĨāĻžāĻāϤ⧠āĻĒāĻžāϰā§? āĻāϤā§āϤāϰ āĻšāϞ⧠$\mathbf{\log_2 n}$āĨ¤āĻ āϰā§āĻĨāĻžā§, āĻĒā§āϰāϤāĻŋāĻāĻŋ $j$-āĻāϰ āĻāύā§āϝ āĻāĻ while āϞā§āĻĒāĻāĻŋ āĻā§ā§ $\log n$ āĻāϰ āĻŦā§āĻļāĻŋ āĻāϞāϤ⧠āĻĒāĻžāϰ⧠āύāĻžāĨ¤
āϤāĻžāĻšāϞ⧠āĻŽā§āĻ āĻāĻŽāĻĒā§āϞā§āĻā§āϏāĻŋāĻāĻŋ āĻĻāĻžāĻā§āĻžā§:
\[\text{Outer Loops} \times \text{Bitwise Loop} = n \times n \times \log n = \mathbf{O(n^2 \log n)}\]for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
int x = n;
while (x > 1) {
x = x / 3;
}
sum++;
}
}
āĻāĻ āĻā§āĻĄāĻāĻŋāϰ āĻāĻžāĻāĻŽ āĻāĻŽāĻĒā§āϞā§āĻā§āϏāĻŋāĻāĻŋ āĻšāϞ⧠$O(n^2 \log_3 n)$āĨ¤
āϏāĻŦāĻā§āϝāĻŧā§ āĻŦāĻžāĻāϰā§āϰ āϞā§āĻĒ ($i$): āĻāĻāĻŋ $0$ āĻĨā§āĻā§ $n-1$ āĻĒāϰā§āϝāύā§āϤ āĻāϞā§, āĻ āϰā§āĻĨāĻžā§ āĻāĻāĻŋ āĻŽā§āĻ $n$ āĻŦāĻžāϰ āĻā§āϰā§āĨ¤
āĻŽāĻžāĻāĻāĻžāύā§āϰ āϞā§āĻĒ ($j$): āĻāĻāĻŋāĻ $0$ āĻĨā§āĻā§ $n-1$ āĻĒāϰā§āϝāύā§āϤ āĻāϞā§, āĻ āϰā§āĻĨāĻžā§ āĻāĻāĻŋāĻ āĻŽā§āĻ $n$ āĻŦāĻžāϰ āĻā§āϰā§āĨ¤
āϏāĻŦāĻā§āϝāĻŧā§ āĻā§āϤāϰā§āϰ āϞā§āĻĒ ($while$): āĻāĻ āϞā§āĻĒāĻāĻŋ āĻĒā§āϰāϤāĻŋāĻŦāĻžāϰ $x = n$ āĻĨā§āĻā§ āĻļā§āϰ⧠āĻšāϝāĻŧ āĻāĻŦāĻ āĻĒā§āϰāϤāĻŋ āϧāĻžāĻĒā§ $x$-āĻā§ $3$ āĻĻāĻŋāϝāĻŧā§ āĻāĻžāĻ āĻāϰā§āĨ¤
āĻāĻŽāϰāĻž āĻāĻžāύāĻŋ, āĻā§āύ⧠āϏāĻāĻā§āϝāĻžāĻā§ āϝāĻĻāĻŋ āĻĒā§āϰāϤāĻŋ āϧāĻžāĻĒā§ āĻāĻāĻāĻŋ āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āϧā§āϰā§āĻŦāĻ (āĻāĻāĻžāύ⧠$3$) āĻĻāĻŋāϝāĻŧā§ āĻāĻžāĻ āĻāϰāĻž āĻšāϝāĻŧ āϝāϤāĻā§āώāĻŖ āύāĻž āϏā§āĻāĻŋ $1$-āĻ āĻĒā§āĻāĻāĻžāϝāĻŧ, āϤāĻŦā§ āϏā§āĻ āϞā§āĻĒāĻāĻŋ āĻŽā§āĻ $\log_{\text{base}} (\text{value})$ āĻŦāĻžāϰ āĻāϞā§āĨ¤ āĻāĻāĻžāύ⧠āĻŦā§āϏ āĻšāϞ⧠$3$ āĻāĻŦāĻ āĻā§āϝāĻžāϞ⧠āĻšāϞ⧠$n$, āϤāĻžāĻ āĻāĻ āϞā§āĻĒāĻāĻŋ āĻāϞ⧠$\log_3 n$ āĻŦāĻžāϰāĨ¤
for (int i = 0; i < n; i++) {
for(int j=1; j<i*i*i; j++){
sum++;
}
}
āĻāĻ āĻā§āĻĄāĻāĻŋāϰ āĻāĻžāĻāĻŽ āĻāĻŽāĻĒā§āϞā§āĻā§āϏāĻŋāĻāĻŋ āĻšāϞ⧠$O(n^4)$āĨ¤
int fibonacci(int n) {
if (n <= 1) return n;
// āĻĒā§āϰāϤāĻŋāĻŦāĻžāϰ āĻāĻāĻāĻŋ āĻĢāĻžāĻāĻļāύ āĻāϰāĻ ā§¨āĻāĻŋ āĻĢāĻžāĻāĻļāύāĻā§ āĻāϞ āĻāϰāĻā§
return fibonacci(n - 1) + fibonacci(n - 2);
}
āĻāĻāĻžāύ⧠āĻā§āύ āĻāĻžāĻ (Operations) āĻĻā§āĻŦāĻŋāĻā§āĻŖ āĻšāĻā§āĻā§? āϝāĻāύ āĻāĻĒāύāĻŋ fibonacci(5) āĻāϞ āĻāϰā§āύ:
āϏāĻšāĻ āĻāĻĨāĻž: āϝā§āĻāĻžāύ⧠āĻāĻāĻāĻŋ āϏāĻŽāϏā§āϝāĻžāϰ āϏāĻŽāĻžāϧāĻžāύ āĻāϰāϤ⧠āĻāĻŋā§ā§ āĻāĻĒāύāĻžāĻā§ āĻŦāĻžāϰāĻŦāĻžāϰ āĻāĻāĻ āĻāĻžāĻ âāĻļāĻžāĻāĻž-āĻĒā§āϰāĻļāĻžāĻāĻžâ āĻāĻāĻžāϰ⧠āĻāϰāϤ⧠āĻšā§, āϏā§āĻāĻžāύā§āĻ $O(2^n)$ āϤā§āϰāĻŋ āĻšā§āĨ¤ ___
āĻāĻāĻžāύ⧠āĻāĻŽāϰāĻž āĻāύāĻĒā§āĻ āĻ ā§āϝāĻžāϰā§āϰ āĻŦāĻžāĻāϰ⧠āĻļā§āϧ⧠āĻāĻāĻāĻŋ āĻā§āϰāĻŋā§ā§āĻŦāϞ sum āύāĻŋāĻā§āĻāĻŋāĨ¤
int solve(int arr[], int n) {
int sum = 0; // āĻāĻāĻž Auxiliary Space
for (int i = 0; i < n; i++) {
sum += arr[i];
}
return sum;
}
āϧāϰā§, āϝā§āĻ āĻāϰāĻžāϰ āĻāĻā§ āĻāĻŽāϰāĻž āϏāĻŦ āϏāĻāĻā§āϝāĻž āĻāĻĒāĻŋ āĻāϰ⧠āĻ āύā§āϝ āĻāĻāĻāĻž āĻ ā§āϝāĻžāϰā§āϤ⧠āϰāĻžāĻāĻāĻŋāĨ¤
int solve(int arr[], int n) {
int tempArr[n]; // āĻāĻāĻž Auxiliary Space
for (int i = 0; i < n; i++) {
tempArr[i] = arr[i]; // āĻāĻĒāĻŋ āĻāϰāĻāĻŋ
}
// āĻāϰāĻĒāϰ āϝā§āĻ āĻāϰāĻāĻŋ...
}
āĻāĻāĻžāύ⧠āĻāύāĻĒā§āĻā§āϰ āϏāĻžāĻāĻ āϝāĻžāĻ āĻšā§āĻ, āĻāĻŽāϰāĻž āĻŽāĻžāϤā§āϰ ā§§-⧍āĻāĻž āĻā§āϰāĻŋā§ā§āĻŦāϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻāĻŋāĨ¤ āĻŽā§āĻŽā§āϰāĻŋ āĻāĻāĻĻāĻŽ āĻĢāĻŋāĻā§āϏāĻĄāĨ¤
// findMax: āĻāĻāĻžāύ⧠āĻļā§āϧ⧠'maxVal' āĻāϰ 'i' āĻā§āϰāĻŋā§ā§āĻŦāϞ āĻāĻā§
int findMax(int arr[], int n) {
int maxVal = arr[0]; // ā§§āĻāĻŋ āĻā§āϰāĻŋā§ā§āĻŦāϞ
for (int i = 1; i < n; i++) { // āϞā§āĻĒā§āϰ āĻāύā§āϝ ā§§āĻāĻŋ āĻā§āϰāĻŋā§ā§āĻŦāϞ
if (arr[i] > maxVal) maxVal = arr[i];
}
return maxVal;
}