ما هي Big O Notation وتعقيد الزمن (Time Complexity)؟
المقدمة
في هذا المقال، سنتعرف على مفهوم Big O Notation وتعقيد الزمن (Time Complexity)، وكيفية استخدامهما في قياس أداء الخوارزميات. هذه المفاهيم أساسية لأي مبرمج لتحديد مدى كفاءة الحلول البرمجية.
ما هو Big O Notation؟
Big O Notation هو طريقة رياضية تُستخدم لتقدير مدى تعقيد الخوارزمية أو أداء الكود البرمجي. لا يركز Big O على الوقت الفعلي للتنفيذ، بل يركز على كيفية تغير الوقت أو المساحة المستخدمة بناءً على حجم المدخلات. يستخدم المبرمجون Big O لتحديد مدى “قابلية التوسع” في الخوارزمية؛ أي ما الذي يحدث عند زيادة حجم المدخلات؟
بعبارة أخرى، يعطينا Big O لمحة عن كيفية نمو الزمن الذي تستغرقه الخوارزمية مع زيادة حجم البيانات (n). الهدف الرئيسي من Big O هو تحديد ما إذا كانت الخوارزمية فعالة وقابلة للتنفيذ على نطاق واسع أم لا.
أنواع Big O الشائعة
فيما يلي بعض أشهر أنواع Big O الشائعة، والتي تعبر عن مدى تعقيد الزمن في الخوارزميات:
- O(1) – ثابت: الزمن لا يتغير مع زيادة حجم المدخلات.
- O(n) – خطي: الزمن يزداد بشكل مباشر مع زيادة حجم المدخلات.
- O(log n) – لوغاريتمي: الزمن يزيد ببطء مع زيادة حجم المدخلات.
- O(n^2) – تربيعي: الزمن يزيد بشكل كبير مع زيادة حجم المدخلات.
- O(2^n) – أسي: الزمن ينمو بسرعة كبيرة جدًا مع زيادة حجم المدخلات.
ما هو تعقيد الزمن (Time Complexity)؟
تعقيد الزمن هو مقياس يُستخدم لتحديد الزمن الذي تستغرقه الخوارزمية لتنفيذ مهمتها بناءً على حجم المدخلات. الفكرة الأساسية هي قياس مدى سرعة نمو الزمن الذي تستغرقه الخوارزمية عند زيادة عدد المدخلات.
أمثلة على تعقيد الزمن
1. O(1) – الوصول إلى عنصر في مصفوفة
الوصول إلى عنصر في مصفوفة باستخدام الفهرس:
// الوصول إلى عنصر في مصفوفة - O(1)
let array = [10, 20, 30, 40, 50];
console.log(array[2]); // يتم الوصول إلى العنصر فورًا
2. O(n) – حلقة تمر على كل العناصر
خوارزمية تمر على كل عنصر في المصفوفة:
// المرور على جميع العناصر - O(n)
let array = [10, 20, 30, 40, 50];
for (let i = 0; i < array.length; i++) {
console.log(array[i]); // طباعة كل عنصر
}
3. O(log n) – البحث الثنائي (Binary Search)
البحث الثنائي يقلل عدد العناصر إلى النصف في كل خطوة:
// البحث الثنائي - O(log n)
function binarySearch(array, target) {
let low = 0;
let high = array.length - 1;
while (low <= high) {
let mid = Math.floor((low + high) / 2);
if (array[mid] === target) {
return mid;
} else if (array[mid] < target) {
low = mid + 1;
} else {
high = mid - 1;
}
}
return -1; // في حالة لم يتم العثور على العنصر
}
let sortedArray = [10, 20, 30, 40, 50];
console.log(binarySearch(sortedArray, 30)); // يتم العثور على العنصر بسرعة
4. O(n^2) – الترتيب بالفقاعات (Bubble Sort)
مثال لخوارزمية الترتيب بالفقاعات:
// الترتيب بالفقاعات - O(n^2)
function bubbleSort(array) {
let n = array.length;
for (let i = 0; i < n; i++) {
for (let j = 0; j < n - 1; j++) {
if (array[j] > array[j + 1]) {
let temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
}
return array;
}
let unsortedArray = [50, 30, 20, 40, 10];
console.log(bubbleSort(unsortedArray)); // الترتيب يأخذ وقتًا طويلًا مع البيانات الكبيرة
الخلاصة
فهم Big O Notation وتعقيد الزمن يساعد على تحسين أداء الخوارزميات في المشاريع البرمجية. باستخدام هذه المفاهيم، يمكن للمطورين اتخاذ قرارات مدروسة حول الخوارزميات التي سيستخدمونها وفقًا لحجم البيانات وتعقيد العمليات المطلوبة.
اترك تعليقاً