- نُشر في
رموز Big O في JavaScript
- الكتاب
- الاسم
- Imamuzzaki Abu Salam
- https://x.com/ImBIOS_Dev
تدوين O الكبير (التدوين المقارب)
تدوين O الكبير، المعروف أيضًا باسم تدوين باخمان-لانداو، هو طريقة لوصف أداء الخوارزميات. يُستخدم لوصف أسوأ سيناريو لأداء خوارزمية معينة. كما يُستخدم لمقارنة أداء خوارزميات مختلفة. يصف تنفيذ الخوارزمية من حيث حجم المدخلات.
تدوين O الكبير يصف وظائف وفقًا لمعدلات نموها: تُعتبر المهام التي لها نفس معدل النمو من نفس الترتيب. إنه تدوين رياضي يصف السلوك المحدد لوظيفة عندما تميل الوسيطة إلى قيمة معينة أو إلى اللانهاية. يستخدم لتصنيف الخوارزميات حسب نمو زمن تنفيذها أو متطلبات مساحة تخزينها مع نمو حجم المدخلات. يستخدم الحرف O لأن معدل نمو الوظيفة يسمى أيضًا ترتيبها.
التكرار
for
حلقة for (let i = 0; i < n; i++) {
console.log(i)
}
سيتم تنفيذ الكود أعلاه n مرات. تعقيد زمن تنفيذ هذا الكود هو O(n).
while
حلقة let i = 0
while (i < n) {
console.log(i)
i++
}
سيتم تنفيذ الكود أعلاه n مرات. تعقيد زمن تنفيذ هذا الكود هو O(n).
do while
حلقة 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)).
نصائح لتدوين O الكبير
- العمليات الحسابية ثابتة.
- تعيين المتغيرات ثابت.
- الوصول إلى عناصر في المصفوفة (عن طريق الفهرس) أو الكائن (عن طريق المفتاح) ثابت.
- في حلقة، يكون التعقيد هو طول الحلقة مضروبًا في تعقيد ما يحدث داخل الحلقة.