প্রকাশিত

জাভাস্ক্রিপ্টে সবচেয়ে বড় O নম্বর

লেখকগণ

Big O Notation: অ্যালগরিদমের পারফর্মেন্স বর্ণনা

বিগ ও নোটেশন, যাকে ব্যাকম্যান-ল্যান্ডাউ নোটেশন বা অ্যাসিম্পটোটিক নোটেশন বলা হয়, এটি হলো কোনো অ্যালগরিদমের পারফর্মেন্স বর্ণনা করার একটি পদ্ধতি।

এটি অ্যালগরিদমের সবচেয়ে খারাপ ক্ষেত্রে (worst-case scenario) বর্ণনা করে।

এটি বিভিন্ন অ্যালগরিদমের পারফর্মেন্স তুলনা করার জন্য ব্যবহৃত হয়।

এটি ইনপুট আকারের (input size) পরিপ্রেক্ষিতে কোনও অ্যালগরিদমের বাস্তবায়ন বর্ণনা করে।

বিগ ও নোটেশন কার্যকরীদের (functions) তাদের বৃদ্ধির হার (growth rates) অনুসারে চিহ্নিত করে: একই বৃদ্ধির হারের কাজগুলিকে একই ক্রম (order) হিসেবে বিবেচনা করা হয়।

এটি একটি গাণিতিক নোটেশন যা কোনো কার্যের সীমাবদ্ধ আচরণ (limiting behavior) বর্ণনা করে যখন আর্গুমেন্ট (argument) একটি নির্দিষ্ট মান বা অসীমের দিকে ধাবিত হয়।

এটি অ্যালগরিদমগুলিকে তাদের রান টাইম (run time) বা স্পেস রিকোয়ারমেন্ট (space requirements) ইনপুট আকার বৃদ্ধি পেলে কীভাবে বৃদ্ধি পায় তার ভিত্তিতে শ্রেণীবদ্ধ করার জন্য ব্যবহৃত হয়।

O অক্ষর ব্যবহার করা হয় কারণ একটি কার্যের বৃদ্ধির হারকে তার ক্রম (order) বলা হয়।

পুনরাবৃত্তি

For loop

for (let i = 0; i < n; i++) {
  console.log(i)
}

উপরোক্ত কোড n বার চলবে। এই কোডের সময় জটিলতা O(n)।

While loop

let i = 0
while (i < n) {
  console.log(i)
  i++
}

উপরোক্ত কোড n বার চলবে। এই কোডের সময় জটিলতা O(n)।

Do while loop

let i = 0
do {
  console.log(i)
  i++
} while (i < n)

উপরোক্ত কোড n বার চলবে। এই কোডের সময় জটিলতা O(n)।

পুনরায়োগ

ফ্যাক্টোরিয়াল

function factorial(n) {
  if (n === 0) {
    return 1
  }
  return n * factorial(n - 1)
}

উপরোক্ত কোড n বার চলবে। এই কোডের সময় জটিলতা O(n)।

ফিবোনাচি

function fibonacci(n) {
  if (n <= 1) {
    return n
  }
  return fibonacci(n - 1) + fibonacci(n - 2)
}

উপরোক্ত কোড n বার চলবে। এই কোডের সময় জটিলতা O(n)।

অনুসন্ধান

রৈখিক অনুসন্ধান

function linearSearch(arr, value) {
  for (let i = 0; i < arr.length; i++) {
    if (arr[i] === value) {
      return i
    }
  }
  return -1
}

উপরোক্ত কোড n বার চলবে। এই কোডের সময় জটিলতা O(n)।

বাইনারি অনুসন্ধান

function binarySearch(arr, value) {
  let start = 0
  let end = arr.length - 1
  let middle = Math.floor((start + end) / 2)
  while (arr[middle] !== value && start <= end) {
    if (value < arr[middle]) {
      end = middle - 1
    } else {
      start = middle + 1
    }
    middle = Math.floor((start + end) / 2)
  }
  if (arr[middle] === value) {
    return middle
  }
  return -1
}

উপরোক্ত কোড log(n) বার চলবে। এই কোডের সময় জটিলতা O(log(n))।

সাজানো

বুবল সাজানো

function bubbleSort(arr) {
  for (let i = arr.length; i > 0; i--) {
    for (let j = 0; j < i - 1; j++) {
      if (arr[j] > arr[j + 1]) {
        let temp = arr[j]
        arr[j] = arr[j + 1]
        arr[j + 1] = temp
      }
    }
  }
  return arr
}

উপরোক্ত কোড n^2 বার চলবে। এই কোডের সময় জটিলতা O(n^2)।

নির্বাচন সাজানো

function selectionSort(arr) {
  for (let i = 0; i < arr.length; i++) {
    let lowest = i
    for (let j = i + 1; j < arr.length; j++) {
      if (arr[j] < arr[lowest]) {
        lowest = j
      }
    }
    if (i !== lowest) {
      let temp = arr[i]
      arr[i] = arr[lowest]
      arr[lowest] = temp
    }
  }
  return arr
}

উপরোক্ত কোড n^2 বার চলবে। এই কোডের সময় জটিলতা O(n^2)।

ইনসারশন সাজানো

function insertionSort(arr) {
  for (let i = 1; i < arr.length; i++) {
    let currentVal = arr[i]
    for (var j = i - 1; j >= 0 && arr[j] > currentVal; j--) {
      arr[j + 1] = arr[j]
    }
    arr[j + 1] = currentVal
  }
  return arr
}

উপরোক্ত কোড n^2 বার চলবে। এই কোডের সময় জটিলতা O(n^2)।

মার্জ সাজানো

function mergeSort(arr) {
  if (arr.length <= 1) return arr
  let mid = Math.floor(arr.length / 2)
  let left = mergeSort(arr.slice(0, mid))
  let right = mergeSort(arr.slice(mid))
  return merge(left, right)
}

function merge(left, right) {
  let results = []
  let i = 0
  let j = 0
  while (i < left.length && j < right.length) {
    if (left[i] < right[j]) {
      results.push(left[i])
      i++
    } else {
      results.push(right[j])
      j++
    }
  }
  while (i < left.length) {
    results.push(left[i])
    i++
  }
  while (j < right.length) {
    results.push(right[j])
    j++
  }
  return results
}

উপরোক্ত কোড n log(n) বার চলবে। এই কোডের সময় জটিলতা O(n log(n))।

কুইক সাজানো

function pivot(arr, start = 0, end = arr.length + 1) {
  let pivot = arr[start]
  let swapIdx = start
  function swap(array, i, j) {
    let temp = array[i]
    array[i] = array[j]
    array[j] = temp
  }
  for (let i = start + 1; i < arr.length; i++) {
    if (pivot > arr[i]) {
      swapIdx++
      swap(arr, swapIdx, i)
    }
  }
  swap(arr, start, swapIdx)
  return swapIdx
}

function quickSort(arr, left = 0, right = arr.length - 1) {
  if (left < right) {
    let pivotIndex = pivot(arr, left, right)
    quickSort(arr, left, pivotIndex - 1)
    quickSort(arr, pivotIndex + 1, right)
  }
  return arr
}

উপরোক্ত কোড n log(n) বার চলবে। এই কোডের সময় জটিলতা O(n log(n))।

বিগ ও টিপস

  • গাণিতিক ক্রিয়া (arithmetic operations) ধ্রুব (constant)
  • ভেরিয়েবল অ্যাসাইনমেন্ট (variable assignment) ধ্রুব (constant)
  • কোনও অ্যারের (array) (ইন্ডেক্স অনুসারে) বা অবজেক্টের (object) (কী অনুসারে) এলিমেন্ট অ্যাক্সেস করা ধ্রুব (constant)
  • লুপে, জটিলতা হল লুপের দৈর্ঘ্য গুণ লুপের ভেতরে যা ঘটে তার জটিলতা।

রিসোর্স