مقدمة
عند تعلم البرمجة، من المهم جدًا فهم كفاءة الخوارزميات. المفهوم الذي يظهر دائمًا في هذه الحالة هو ** التعقيد ** (Complexity). في هذه المقالة، سنشرح بالتفصيل من أساسيات تعقيد الوقت والمساحة، إلى شرح مفصل لتدوين O (تدوين Big O)، ورؤى عميقة مع أمثلة عملية، في حجم يقارب 20 ألف حرف.
ما هو التعقيد
التعقيد هو مقياس لتقييم أداء الخوارزمية. يمكن تقسيم التعقيد بشكل عام إلى النوعين التاليين:
- ** تعقيد الوقت ** (Time Complexity)
- ** تعقيد المساحة ** (Space Complexity)
1. تعقيد الوقت
تعقيد الوقت هو مقياس يمثل “الوقت” أو “عدد الخطوات” اللازمة للخوارزمية لإكمال تنفيذها.
2. تعقيد المساحة
تعقيد المساحة هو مقياس يمثل “مساحة الذاكرة” اللازمة للخوارزمية لإكمال تنفيذها.
ما هو تدوين O (تدوين Big O)
تدوين O (Big O Notation) هو تدوين رياضي يوضح الحد الأعلى لمعدل الزيادة في التعقيد عندما يصبح حجم الإدخال $n$ كبيرًا بما يكفي.
$$ O(f(n)) = \{ g(n) \mid \text{يوجد ثابت موجب } c, n_0 \text{ بحيث لجميع } n \ge n_0 \text{ يتحقق } 0 \le g(n) \le c f(n) \} $$القواعد الأساسية لتدوين O
- ** تجاهل الثوابت ** : $O(2n)$ يصبح $O(n)$.
- ** الاحتفاظ بالمصطلح ذي التأثير الأكبر فقط ** : $O(n^2 + n)$ يصبح $O(n^2)$.
graph TD
A["حجم الإدخال n"] -->|"تقييم"| B["تدوين O"]
B --> C["تعقيد الوقت"]
B --> D["تعقيد المساحة"]
تعقيدات الوقت النموذجية وأمثلة بلغة بايثون
من هنا، دعونا نلقي نظرة على شروحات مفصلة وأمثلة تعليمات برمجية بلغة بايثون لفئات تدوين O النموذجية.
1. O(1) : وقت ثابت (Constant Time)
خوارزمية يكتمل فيها المعالجة دائمًا في عدد ثابت من الخطوات، بغض النظر عن حجم الإدخال $n$.
| |
2. O(log n) : وقت لوغاريتمي (Logarithmic Time)
يزداد وقت التنفيذ مع زيادة حجم الإدخال $n$، لكن وتيرة هذه الزيادة بطيئة جدًا. المثال النموذجي هو البحث الثنائي.
| |
3. O(n) : وقت خطي (Linear Time)
خوارزمية يزداد فيها وقت التنفيذ بشكل متناسب مع حجم الإدخال $n$.
| |
4. O(n log n) : وقت شبه خطي (Linearithmic Time)
هو حاصل ضرب O(n) و O(log n). العديد من خوارزميات الفرز المقارن الفعالة (مثل فرز الدمج، الفرز السريع، وفرز الكومة) تمتلك هذا التعقيد.
| |
5. O(n^2) : وقت تربيعي (Quadratic Time)
يزداد وقت التنفيذ بشكل متناسب مع مربع حجم الإدخال $n$. تنطبق هذه الحالة على خوارزميات الفرز البسيطة مثل فرز الفقاعة وفرز الإدراج.
| |
6. O(2^n) : وقت أسي (Exponential Time)
يتضاعف وقت التنفيذ في كل مرة يزداد فيها حجم الإدخال $n$ بمقدار 1. تنطبق هذه الحالة على التطبيق العودي البسيط لتسلسل فيبوناتشي.
| |
7. O(n!) : وقت عاملي (Factorial Time)
يزداد وقت التنفيذ بشكل متناسب مع مضروب حجم الإدخال. تنطبق هذه الحالة على البحث الشامل (القوة الغاشمة) لمشكلة بائع المتجول.
| |
هياكل البيانات والتعقيد
| هيكل البيانات | الوصول | البحث | الإدراج | الحذف | تعقيد المساحة |
|---|---|---|---|---|---|
| Array | $O(1)$ | $O(n)$ | $O(n)$ | $O(n)$ | $O(n)$ |
| Linked List | $O(n)$ | $O(n)$ | $O(1)$ | $O(1)$ | $O(n)$ |
| Hash Table | - | $O(1)$ | $O(1)$ | $O(1)$ | $O(n)$ |
| BST | $O(\log n)$ | $O(\log n)$ | $O(\log n)$ | $O(\log n)$ | $O(n)$ |
خوارزميات الفرز والتعقيد
| الخوارزمية | الأفضل | المتوسط | الأسوأ | تعقيد المساحة |
|---|---|---|---|---|
| Bubble Sort | $O(n)$ | $O(n^2)$ | $O(n^2)$ | $O(1)$ |
| Merge Sort | $O(n \log n)$ | $O(n \log n)$ | $O(n \log n)$ | $O(n)$ |
| Quick Sort | $O(n \log n)$ | $O(n \log n)$ | $O(n^2)$ | $O(\log n)$ |
مقدمة
عند تعلم البرمجة، من المهم جدًا فهم كفاءة الخوارزميات. المفهوم الذي يظهر دائمًا في هذه الحالة هو ** التعقيد ** (Complexity). في هذه المقالة، سنشرح بالتفصيل من أساسيات تعقيد الوقت والمساحة، إلى شرح مفصل لتدوين O (تدوين Big O)، ورؤى عميقة مع أمثلة عملية، في حجم يقارب 20 ألف حرف.
ما هو التعقيد
التعقيد هو مقياس لتقييم أداء الخوارزمية. يمكن تقسيم التعقيد بشكل عام إلى النوعين التاليين:
- ** تعقيد الوقت ** (Time Complexity)
- ** تعقيد المساحة ** (Space Complexity)
1. تعقيد الوقت
تعقيد الوقت هو مقياس يمثل “الوقت” أو “عدد الخطوات” اللازمة للخوارزمية لإكمال تنفيذها.
2. تعقيد المساحة
تعقيد المساحة هو مقياس يمثل “مساحة الذاكرة” اللازمة للخوارزمية لإكمال تنفيذها.
ما هو تدوين O (تدوين Big O)
تدوين O (Big O Notation) هو تدوين رياضي يوضح الحد الأعلى لمعدل الزيادة في التعقيد عندما يصبح حجم الإدخال $n$ كبيرًا بما يكفي.
$$ O(f(n)) = \{ g(n) \mid \text{يوجد ثابت موجب } c, n_0 \text{ بحيث لجميع } n \ge n_0 \text{ يتحقق } 0 \le g(n) \le c f(n) \} $$القواعد الأساسية لتدوين O
- ** تجاهل الثوابت ** : $O(2n)$ يصبح $O(n)$.
- ** الاحتفاظ بالمصطلح ذي التأثير الأكبر فقط ** : $O(n^2 + n)$ يصبح $O(n^2)$.
graph TD
A["حجم الإدخال n"] -->|"تقييم"| B["تدوين O"]
B --> C["تعقيد الوقت"]
B --> D["تعقيد المساحة"]
تعقيدات الوقت النموذجية وأمثلة بلغة بايثون
من هنا، دعونا نلقي نظرة على شروحات مفصلة وأمثلة تعليمات برمجية بلغة بايثون لفئات تدوين O النموذجية.
1. O(1) : وقت ثابت (Constant Time)
خوارزمية يكتمل فيها المعالجة دائمًا في عدد ثابت من الخطوات، بغض النظر عن حجم الإدخال $n$.
| |
2. O(log n) : وقت لوغاريتمي (Logarithmic Time)
يزداد وقت التنفيذ مع زيادة حجم الإدخال $n$، لكن وتيرة هذه الزيادة بطيئة جدًا. المثال النموذجي هو البحث الثنائي.
| |
3. O(n) : وقت خطي (Linear Time)
خوارزمية يزداد فيها وقت التنفيذ بشكل متناسب مع حجم الإدخال $n$.
| |
4. O(n log n) : وقت شبه خطي (Linearithmic Time)
هو حاصل ضرب O(n) و O(log n). العديد من خوارزميات الفرز المقارن الفعالة (مثل فرز الدمج، الفرز السريع، وفرز الكومة) تمتلك هذا التعقيد.
| |
5. O(n^2) : وقت تربيعي (Quadratic Time)
يزداد وقت التنفيذ بشكل متناسب مع مربع حجم الإدخال $n$. تنطبق هذه الحالة على خوارزميات الفرز البسيطة مثل فرز الفقاعة وفرز الإدراج.
| |
6. O(2^n) : وقت أسي (Exponential Time)
يتضاعف وقت التنفيذ في كل مرة يزداد فيها حجم الإدخال $n$ بمقدار 1. تنطبق هذه الحالة على التطبيق العودي البسيط لتسلسل فيبوناتشي.
| |
7. O(n!) : وقت عاملي (Factorial Time)
يزداد وقت التنفيذ بشكل متناسب مع مضروب حجم الإدخال. تنطبق هذه الحالة على البحث الشامل (القوة الغاشمة) لمشكلة بائع المتجول.
| |
هياكل البيانات والتعقيد
| هيكل البيانات | الوصول | البحث | الإدراج | الحذف | تعقيد المساحة |
|---|---|---|---|---|---|
| Array | $O(1)$ | $O(n)$ | $O(n)$ | $O(n)$ | $O(n)$ |
| Linked List | $O(n)$ | $O(n)$ | $O(1)$ | $O(1)$ | $O(n)$ |
| Hash Table | - | $O(1)$ | $O(1)$ | $O(1)$ | $O(n)$ |
| BST | $O(\log n)$ | $O(\log n)$ | $O(\log n)$ | $O(\log n)$ | $O(n)$ |
خوارزميات الفرز والتعقيد
| الخوارزمية | الأفضل | المتوسط | الأسوأ | تعقيد المساحة |
|---|---|---|---|---|
| Bubble Sort | $O(n)$ | $O(n^2)$ | $O(n^2)$ | $O(1)$ |
| Merge Sort | $O(n \log n)$ | $O(n \log n)$ | $O(n \log n)$ | $O(n)$ |
| Quick Sort | $O(n \log n)$ | $O(n \log n)$ | $O(n^2)$ | $O(\log n)$ |
مقدمة
عند تعلم البرمجة، من المهم جدًا فهم كفاءة الخوارزميات. المفهوم الذي يظهر دائمًا في هذه الحالة هو ** التعقيد ** (Complexity). في هذه المقالة، سنشرح بالتفصيل من أساسيات تعقيد الوقت والمساحة، إلى شرح مفصل لتدوين O (تدوين Big O)، ورؤى عميقة مع أمثلة عملية، في حجم يقارب 20 ألف حرف.
ما هو التعقيد
التعقيد هو مقياس لتقييم أداء الخوارزمية. يمكن تقسيم التعقيد بشكل عام إلى النوعين التاليين:
- ** تعقيد الوقت ** (Time Complexity)
- ** تعقيد المساحة ** (Space Complexity)
1. تعقيد الوقت
تعقيد الوقت هو مقياس يمثل “الوقت” أو “عدد الخطوات” اللازمة للخوارزمية لإكمال تنفيذها.
2. تعقيد المساحة
تعقيد المساحة هو مقياس يمثل “مساحة الذاكرة” اللازمة للخوارزمية لإكمال تنفيذها.
ما هو تدوين O (تدوين Big O)
تدوين O (Big O Notation) هو تدوين رياضي يوضح الحد الأعلى لمعدل الزيادة في التعقيد عندما يصبح حجم الإدخال $n$ كبيرًا بما يكفي.
$$ O(f(n)) = \{ g(n) \mid \text{يوجد ثابت موجب } c, n_0 \text{ بحيث لجميع } n \ge n_0 \text{ يتحقق } 0 \le g(n) \le c f(n) \} $$القواعد الأساسية لتدوين O
- ** تجاهل الثوابت ** : $O(2n)$ يصبح $O(n)$.
- ** الاحتفاظ بالمصطلح ذي التأثير الأكبر فقط ** : $O(n^2 + n)$ يصبح $O(n^2)$.
graph TD
A["حجم الإدخال n"] -->|"تقييم"| B["تدوين O"]
B --> C["تعقيد الوقت"]
B --> D["تعقيد المساحة"]
تعقيدات الوقت النموذجية وأمثلة بلغة بايثون
من هنا، دعونا نلقي نظرة على شروحات مفصلة وأمثلة تعليمات برمجية بلغة بايثون لفئات تدوين O النموذجية.
1. O(1) : وقت ثابت (Constant Time)
خوارزمية يكتمل فيها المعالجة دائمًا في عدد ثابت من الخطوات، بغض النظر عن حجم الإدخال $n$.
| |
2. O(log n) : وقت لوغاريتمي (Logarithmic Time)
يزداد وقت التنفيذ مع زيادة حجم الإدخال $n$، لكن وتيرة هذه الزيادة بطيئة جدًا. المثال النموذجي هو البحث الثنائي.
| |
3. O(n) : وقت خطي (Linear Time)
خوارزمية يزداد فيها وقت التنفيذ بشكل متناسب مع حجم الإدخال $n$.
| |
4. O(n log n) : وقت شبه خطي (Linearithmic Time)
هو حاصل ضرب O(n) و O(log n). العديد من خوارزميات الفرز المقارن الفعالة (مثل فرز الدمج، الفرز السريع، وفرز الكومة) تمتلك هذا التعقيد.
| |
5. O(n^2) : وقت تربيعي (Quadratic Time)
يزداد وقت التنفيذ بشكل متناسب مع مربع حجم الإدخال $n$. تنطبق هذه الحالة على خوارزميات الفرز البسيطة مثل فرز الفقاعة وفرز الإدراج.
| |
6. O(2^n) : وقت أسي (Exponential Time)
يتضاعف وقت التنفيذ في كل مرة يزداد فيها حجم الإدخال $n$ بمقدار 1. تنطبق هذه الحالة على التطبيق العودي البسيط لتسلسل فيبوناتشي.
| |
7. O(n!) : وقت عاملي (Factorial Time)
يزداد وقت التنفيذ بشكل متناسب مع مضروب حجم الإدخال. تنطبق هذه الحالة على البحث الشامل (القوة الغاشمة) لمشكلة بائع المتجول.
| |
هياكل البيانات والتعقيد
| هيكل البيانات | الوصول | البحث | الإدراج | الحذف | تعقيد المساحة |
|---|---|---|---|---|---|
| Array | $O(1)$ | $O(n)$ | $O(n)$ | $O(n)$ | $O(n)$ |
| Linked List | $O(n)$ | $O(n)$ | $O(1)$ | $O(1)$ | $O(n)$ |
| Hash Table | - | $O(1)$ | $O(1)$ | $O(1)$ | $O(n)$ |
| BST | $O(\log n)$ | $O(\log n)$ | $O(\log n)$ | $O(\log n)$ | $O(n)$ |
خوارزميات الفرز والتعقيد
| الخوارزمية | الأفضل | المتوسط | الأسوأ | تعقيد المساحة |
|---|---|---|---|---|
| Bubble Sort | $O(n)$ | $O(n^2)$ | $O(n^2)$ | $O(1)$ |
| Merge Sort | $O(n \log n)$ | $O(n \log n)$ | $O(n \log n)$ | $O(n)$ |
| Quick Sort | $O(n \log n)$ | $O(n \log n)$ | $O(n^2)$ | $O(\log n)$ |
مقدمة
عند تعلم البرمجة، من المهم جدًا فهم كفاءة الخوارزميات. المفهوم الذي يظهر دائمًا في هذه الحالة هو ** التعقيد ** (Complexity). في هذه المقالة، سنشرح بالتفصيل من أساسيات تعقيد الوقت والمساحة، إلى شرح مفصل لتدوين O (تدوين Big O)، ورؤى عميقة مع أمثلة عملية، في حجم يقارب 20 ألف حرف.
ما هو التعقيد
التعقيد هو مقياس لتقييم أداء الخوارزمية. يمكن تقسيم التعقيد بشكل عام إلى النوعين التاليين:
- ** تعقيد الوقت ** (Time Complexity)
- ** تعقيد المساحة ** (Space Complexity)
1. تعقيد الوقت
تعقيد الوقت هو مقياس يمثل “الوقت” أو “عدد الخطوات” اللازمة للخوارزمية لإكمال تنفيذها.
2. تعقيد المساحة
تعقيد المساحة هو مقياس يمثل “مساحة الذاكرة” اللازمة للخوارزمية لإكمال تنفيذها.
ما هو تدوين O (تدوين Big O)
تدوين O (Big O Notation) هو تدوين رياضي يوضح الحد الأعلى لمعدل الزيادة في التعقيد عندما يصبح حجم الإدخال $n$ كبيرًا بما يكفي.
$$ O(f(n)) = \{ g(n) \mid \text{يوجد ثابت موجب } c, n_0 \text{ بحيث لجميع } n \ge n_0 \text{ يتحقق } 0 \le g(n) \le c f(n) \} $$القواعد الأساسية لتدوين O
- ** تجاهل الثوابت ** : $O(2n)$ يصبح $O(n)$.
- ** الاحتفاظ بالمصطلح ذي التأثير الأكبر فقط ** : $O(n^2 + n)$ يصبح $O(n^2)$.
graph TD
A["حجم الإدخال n"] -->|"تقييم"| B["تدوين O"]
B --> C["تعقيد الوقت"]
B --> D["تعقيد المساحة"]
تعقيدات الوقت النموذجية وأمثلة بلغة بايثون
من هنا، دعونا نلقي نظرة على شروحات مفصلة وأمثلة تعليمات برمجية بلغة بايثون لفئات تدوين O النموذجية.
1. O(1) : وقت ثابت (Constant Time)
خوارزمية يكتمل فيها المعالجة دائمًا في عدد ثابت من الخطوات، بغض النظر عن حجم الإدخال $n$.
| |
2. O(log n) : وقت لوغاريتمي (Logarithmic Time)
يزداد وقت التنفيذ مع زيادة حجم الإدخال $n$، لكن وتيرة هذه الزيادة بطيئة جدًا. المثال النموذجي هو البحث الثنائي.
| |
3. O(n) : وقت خطي (Linear Time)
خوارزمية يزداد فيها وقت التنفيذ بشكل متناسب مع حجم الإدخال $n$.
| |
4. O(n log n) : وقت شبه خطي (Linearithmic Time)
هو حاصل ضرب O(n) و O(log n). العديد من خوارزميات الفرز المقارن الفعالة (مثل فرز الدمج، الفرز السريع، وفرز الكومة) تمتلك هذا التعقيد.
| |
5. O(n^2) : وقت تربيعي (Quadratic Time)
يزداد وقت التنفيذ بشكل متناسب مع مربع حجم الإدخال $n$. تنطبق هذه الحالة على خوارزميات الفرز البسيطة مثل فرز الفقاعة وفرز الإدراج.
| |
6. O(2^n) : وقت أسي (Exponential Time)
يتضاعف وقت التنفيذ في كل مرة يزداد فيها حجم الإدخال $n$ بمقدار 1. تنطبق هذه الحالة على التطبيق العودي البسيط لتسلسل فيبوناتشي.
| |
7. O(n!) : وقت عاملي (Factorial Time)
يزداد وقت التنفيذ بشكل متناسب مع مضروب حجم الإدخال. تنطبق هذه الحالة على البحث الشامل (القوة الغاشمة) لمشكلة بائع المتجول.
| |
هياكل البيانات والتعقيد
| هيكل البيانات | الوصول | البحث | الإدراج | الحذف | تعقيد المساحة |
|---|---|---|---|---|---|
| Array | $O(1)$ | $O(n)$ | $O(n)$ | $O(n)$ | $O(n)$ |
| Linked List | $O(n)$ | $O(n)$ | $O(1)$ | $O(1)$ | $O(n)$ |
| Hash Table | - | $O(1)$ | $O(1)$ | $O(1)$ | $O(n)$ |
| BST | $O(\log n)$ | $O(\log n)$ | $O(\log n)$ | $O(\log n)$ | $O(n)$ |
خوارزميات الفرز والتعقيد
| الخوارزمية | الأفضل | المتوسط | الأسوأ | تعقيد المساحة |
|---|---|---|---|---|
| Bubble Sort | $O(n)$ | $O(n^2)$ | $O(n^2)$ | $O(1)$ |
| Merge Sort | $O(n \log n)$ | $O(n \log n)$ | $O(n \log n)$ | $O(n)$ |
| Quick Sort | $O(n \log n)$ | $O(n \log n)$ | $O(n^2)$ | $O(\log n)$ |
مقدمة
عند تعلم البرمجة، من المهم جدًا فهم كفاءة الخوارزميات. المفهوم الذي يظهر دائمًا في هذه الحالة هو ** التعقيد ** (Complexity). في هذه المقالة، سنشرح بالتفصيل من أساسيات تعقيد الوقت والمساحة، إلى شرح مفصل لتدوين O (تدوين Big O)، ورؤى عميقة مع أمثلة عملية، في حجم يقارب 20 ألف حرف.
ما هو التعقيد
التعقيد هو مقياس لتقييم أداء الخوارزمية. يمكن تقسيم التعقيد بشكل عام إلى النوعين التاليين:
- ** تعقيد الوقت ** (Time Complexity)
- ** تعقيد المساحة ** (Space Complexity)
1. تعقيد الوقت
تعقيد الوقت هو مقياس يمثل “الوقت” أو “عدد الخطوات” اللازمة للخوارزمية لإكمال تنفيذها.
2. تعقيد المساحة
تعقيد المساحة هو مقياس يمثل “مساحة الذاكرة” اللازمة للخوارزمية لإكمال تنفيذها.
ما هو تدوين O (تدوين Big O)
تدوين O (Big O Notation) هو تدوين رياضي يوضح الحد الأعلى لمعدل الزيادة في التعقيد عندما يصبح حجم الإدخال $n$ كبيرًا بما يكفي.
$$ O(f(n)) = \{ g(n) \mid \text{يوجد ثابت موجب } c, n_0 \text{ بحيث لجميع } n \ge n_0 \text{ يتحقق } 0 \le g(n) \le c f(n) \} $$القواعد الأساسية لتدوين O
- ** تجاهل الثوابت ** : $O(2n)$ يصبح $O(n)$.
- ** الاحتفاظ بالمصطلح ذي التأثير الأكبر فقط ** : $O(n^2 + n)$ يصبح $O(n^2)$.
graph TD
A["حجم الإدخال n"] -->|"تقييم"| B["تدوين O"]
B --> C["تعقيد الوقت"]
B --> D["تعقيد المساحة"]
تعقيدات الوقت النموذجية وأمثلة بلغة بايثون
من هنا، دعونا نلقي نظرة على شروحات مفصلة وأمثلة تعليمات برمجية بلغة بايثون لفئات تدوين O النموذجية.
1. O(1) : وقت ثابت (Constant Time)
خوارزمية يكتمل فيها المعالجة دائمًا في عدد ثابت من الخطوات، بغض النظر عن حجم الإدخال $n$.
| |
2. O(log n) : وقت لوغاريتمي (Logarithmic Time)
يزداد وقت التنفيذ مع زيادة حجم الإدخال $n$، لكن وتيرة هذه الزيادة بطيئة جدًا. المثال النموذجي هو البحث الثنائي.
| |
3. O(n) : وقت خطي (Linear Time)
خوارزمية يزداد فيها وقت التنفيذ بشكل متناسب مع حجم الإدخال $n$.
| |
4. O(n log n) : وقت شبه خطي (Linearithmic Time)
هو حاصل ضرب O(n) و O(log n). العديد من خوارزميات الفرز المقارن الفعالة (مثل فرز الدمج، الفرز السريع، وفرز الكومة) تمتلك هذا التعقيد.
| |
5. O(n^2) : وقت تربيعي (Quadratic Time)
يزداد وقت التنفيذ بشكل متناسب مع مربع حجم الإدخال $n$. تنطبق هذه الحالة على خوارزميات الفرز البسيطة مثل فرز الفقاعة وفرز الإدراج.
| |
6. O(2^n) : وقت أسي (Exponential Time)
يتضاعف وقت التنفيذ في كل مرة يزداد فيها حجم الإدخال $n$ بمقدار 1. تنطبق هذه الحالة على التطبيق العودي البسيط لتسلسل فيبوناتشي.
| |
7. O(n!) : وقت عاملي (Factorial Time)
يزداد وقت التنفيذ بشكل متناسب مع مضروب حجم الإدخال. تنطبق هذه الحالة على البحث الشامل (القوة الغاشمة) لمشكلة بائع المتجول.
| |
هياكل البيانات والتعقيد
| هيكل البيانات | الوصول | البحث | الإدراج | الحذف | تعقيد المساحة |
|---|---|---|---|---|---|
| Array | $O(1)$ | $O(n)$ | $O(n)$ | $O(n)$ | $O(n)$ |
| Linked List | $O(n)$ | $O(n)$ | $O(1)$ | $O(1)$ | $O(n)$ |
| Hash Table | - | $O(1)$ | $O(1)$ | $O(1)$ | $O(n)$ |
| BST | $O(\log n)$ | $O(\log n)$ | $O(\log n)$ | $O(\log n)$ | $O(n)$ |
خوارزميات الفرز والتعقيد
| الخوارزمية | الأفضل | المتوسط | الأسوأ | تعقيد المساحة |
|---|---|---|---|---|
| Bubble Sort | $O(n)$ | $O(n^2)$ | $O(n^2)$ | $O(1)$ |
| Merge Sort | $O(n \log n)$ | $O(n \log n)$ | $O(n \log n)$ | $O(n)$ |
| Quick Sort | $O(n \log n)$ | $O(n \log n)$ | $O(n^2)$ | $O(\log n)$ |
مقدمة
عند تعلم البرمجة، من المهم جدًا فهم كفاءة الخوارزميات. المفهوم الذي يظهر دائمًا في هذه الحالة هو ** التعقيد ** (Complexity). في هذه المقالة، سنشرح بالتفصيل من أساسيات تعقيد الوقت والمساحة، إلى شرح مفصل لتدوين O (تدوين Big O)، ورؤى عميقة مع أمثلة عملية، في حجم يقارب 20 ألف حرف.
ما هو التعقيد
التعقيد هو مقياس لتقييم أداء الخوارزمية. يمكن تقسيم التعقيد بشكل عام إلى النوعين التاليين:
- ** تعقيد الوقت ** (Time Complexity)
- ** تعقيد المساحة ** (Space Complexity)
1. تعقيد الوقت
تعقيد الوقت هو مقياس يمثل “الوقت” أو “عدد الخطوات” اللازمة للخوارزمية لإكمال تنفيذها.
2. تعقيد المساحة
تعقيد المساحة هو مقياس يمثل “مساحة الذاكرة” اللازمة للخوارزمية لإكمال تنفيذها.
ما هو تدوين O (تدوين Big O)
تدوين O (Big O Notation) هو تدوين رياضي يوضح الحد الأعلى لمعدل الزيادة في التعقيد عندما يصبح حجم الإدخال $n$ كبيرًا بما يكفي.
$$ O(f(n)) = \{ g(n) \mid \text{يوجد ثابت موجب } c, n_0 \text{ بحيث لجميع } n \ge n_0 \text{ يتحقق } 0 \le g(n) \le c f(n) \} $$القواعد الأساسية لتدوين O
- ** تجاهل الثوابت ** : $O(2n)$ يصبح $O(n)$.
- ** الاحتفاظ بالمصطلح ذي التأثير الأكبر فقط ** : $O(n^2 + n)$ يصبح $O(n^2)$.
graph TD
A["حجم الإدخال n"] -->|"تقييم"| B["تدوين O"]
B --> C["تعقيد الوقت"]
B --> D["تعقيد المساحة"]
تعقيدات الوقت النموذجية وأمثلة بلغة بايثون
من هنا، دعونا نلقي نظرة على شروحات مفصلة وأمثلة تعليمات برمجية بلغة بايثون لفئات تدوين O النموذجية.
1. O(1) : وقت ثابت (Constant Time)
خوارزمية يكتمل فيها المعالجة دائمًا في عدد ثابت من الخطوات، بغض النظر عن حجم الإدخال $n$.
| |
2. O(log n) : وقت لوغاريتمي (Logarithmic Time)
يزداد وقت التنفيذ مع زيادة حجم الإدخال $n$، لكن وتيرة هذه الزيادة بطيئة جدًا. المثال النموذجي هو البحث الثنائي.
| |
3. O(n) : وقت خطي (Linear Time)
خوارزمية يزداد فيها وقت التنفيذ بشكل متناسب مع حجم الإدخال $n$.
| |
4. O(n log n) : وقت شبه خطي (Linearithmic Time)
هو حاصل ضرب O(n) و O(log n). العديد من خوارزميات الفرز المقارن الفعالة (مثل فرز الدمج، الفرز السريع، وفرز الكومة) تمتلك هذا التعقيد.
| |
5. O(n^2) : وقت تربيعي (Quadratic Time)
يزداد وقت التنفيذ بشكل متناسب مع مربع حجم الإدخال $n$. تنطبق هذه الحالة على خوارزميات الفرز البسيطة مثل فرز الفقاعة وفرز الإدراج.
| |
6. O(2^n) : وقت أسي (Exponential Time)
يتضاعف وقت التنفيذ في كل مرة يزداد فيها حجم الإدخال $n$ بمقدار 1. تنطبق هذه الحالة على التطبيق العودي البسيط لتسلسل فيبوناتشي.
| |
7. O(n!) : وقت عاملي (Factorial Time)
يزداد وقت التنفيذ بشكل متناسب مع مضروب حجم الإدخال. تنطبق هذه الحالة على البحث الشامل (القوة الغاشمة) لمشكلة بائع المتجول.
| |
هياكل البيانات والتعقيد
| هيكل البيانات | الوصول | البحث | الإدراج | الحذف | تعقيد المساحة |
|---|---|---|---|---|---|
| Array | $O(1)$ | $O(n)$ | $O(n)$ | $O(n)$ | $O(n)$ |
| Linked List | $O(n)$ | $O(n)$ | $O(1)$ | $O(1)$ | $O(n)$ |
| Hash Table | - | $O(1)$ | $O(1)$ | $O(1)$ | $O(n)$ |
| BST | $O(\log n)$ | $O(\log n)$ | $O(\log n)$ | $O(\log n)$ | $O(n)$ |
خوارزميات الفرز والتعقيد
| الخوارزمية | الأفضل | المتوسط | الأسوأ | تعقيد المساحة |
|---|---|---|---|---|
| Bubble Sort | $O(n)$ | $O(n^2)$ | $O(n^2)$ | $O(1)$ |
| Merge Sort | $O(n \log n)$ | $O(n \log n)$ | $O(n \log n)$ | $O(n)$ |
| Quick Sort | $O(n \log n)$ | $O(n \log n)$ | $O(n^2)$ | $O(\log n)$ |
مقدمة
عند تعلم البرمجة، من المهم جدًا فهم كفاءة الخوارزميات. المفهوم الذي يظهر دائمًا في هذه الحالة هو ** التعقيد ** (Complexity). في هذه المقالة، سنشرح بالتفصيل من أساسيات تعقيد الوقت والمساحة، إلى شرح مفصل لتدوين O (تدوين Big O)، ورؤى عميقة مع أمثلة عملية، في حجم يقارب 20 ألف حرف.
ما هو التعقيد
التعقيد هو مقياس لتقييم أداء الخوارزمية. يمكن تقسيم التعقيد بشكل عام إلى النوعين التاليين:
- ** تعقيد الوقت ** (Time Complexity)
- ** تعقيد المساحة ** (Space Complexity)
1. تعقيد الوقت
تعقيد الوقت هو مقياس يمثل “الوقت” أو “عدد الخطوات” اللازمة للخوارزمية لإكمال تنفيذها.
2. تعقيد المساحة
تعقيد المساحة هو مقياس يمثل “مساحة الذاكرة” اللازمة للخوارزمية لإكمال تنفيذها.
ما هو تدوين O (تدوين Big O)
تدوين O (Big O Notation) هو تدوين رياضي يوضح الحد الأعلى لمعدل الزيادة في التعقيد عندما يصبح حجم الإدخال $n$ كبيرًا بما يكفي.
$$ O(f(n)) = \{ g(n) \mid \text{يوجد ثابت موجب } c, n_0 \text{ بحيث لجميع } n \ge n_0 \text{ يتحقق } 0 \le g(n) \le c f(n) \} $$القواعد الأساسية لتدوين O
- ** تجاهل الثوابت ** : $O(2n)$ يصبح $O(n)$.
- ** الاحتفاظ بالمصطلح ذي التأثير الأكبر فقط ** : $O(n^2 + n)$ يصبح $O(n^2)$.
graph TD
A["حجم الإدخال n"] -->|"تقييم"| B["تدوين O"]
B --> C["تعقيد الوقت"]
B --> D["تعقيد المساحة"]
تعقيدات الوقت النموذجية وأمثلة بلغة بايثون
من هنا، دعونا نلقي نظرة على شروحات مفصلة وأمثلة تعليمات برمجية بلغة بايثون لفئات تدوين O النموذجية.
1. O(1) : وقت ثابت (Constant Time)
خوارزمية يكتمل فيها المعالجة دائمًا في عدد ثابت من الخطوات، بغض النظر عن حجم الإدخال $n$.
| |
2. O(log n) : وقت لوغاريتمي (Logarithmic Time)
يزداد وقت التنفيذ مع زيادة حجم الإدخال $n$، لكن وتيرة هذه الزيادة بطيئة جدًا. المثال النموذجي هو البحث الثنائي.
| |
3. O(n) : وقت خطي (Linear Time)
خوارزمية يزداد فيها وقت التنفيذ بشكل متناسب مع حجم الإدخال $n$.
| |
4. O(n log n) : وقت شبه خطي (Linearithmic Time)
هو حاصل ضرب O(n) و O(log n). العديد من خوارزميات الفرز المقارن الفعالة (مثل فرز الدمج، الفرز السريع، وفرز الكومة) تمتلك هذا التعقيد.
| |
5. O(n^2) : وقت تربيعي (Quadratic Time)
يزداد وقت التنفيذ بشكل متناسب مع مربع حجم الإدخال $n$. تنطبق هذه الحالة على خوارزميات الفرز البسيطة مثل فرز الفقاعة وفرز الإدراج.
| |
6. O(2^n) : وقت أسي (Exponential Time)
يتضاعف وقت التنفيذ في كل مرة يزداد فيها حجم الإدخال $n$ بمقدار 1. تنطبق هذه الحالة على التطبيق العودي البسيط لتسلسل فيبوناتشي.
| |
7. O(n!) : وقت عاملي (Factorial Time)
يزداد وقت التنفيذ بشكل متناسب مع مضروب حجم الإدخال. تنطبق هذه الحالة على البحث الشامل (القوة الغاشمة) لمشكلة بائع المتجول.
| |
هياكل البيانات والتعقيد
| هيكل البيانات | الوصول | البحث | الإدراج | الحذف | تعقيد المساحة |
|---|---|---|---|---|---|
| Array | $O(1)$ | $O(n)$ | $O(n)$ | $O(n)$ | $O(n)$ |
| Linked List | $O(n)$ | $O(n)$ | $O(1)$ | $O(1)$ | $O(n)$ |
| Hash Table | - | $O(1)$ | $O(1)$ | $O(1)$ | $O(n)$ |
| BST | $O(\log n)$ | $O(\log n)$ | $O(\log n)$ | $O(\log n)$ | $O(n)$ |
خوارزميات الفرز والتعقيد
| الخوارزمية | الأفضل | المتوسط | الأسوأ | تعقيد المساحة |
|---|---|---|---|---|
| Bubble Sort | $O(n)$ | $O(n^2)$ | $O(n^2)$ | $O(1)$ |
| Merge Sort | $O(n \log n)$ | $O(n \log n)$ | $O(n \log n)$ | $O(n)$ |
| Quick Sort | $O(n \log n)$ | $O(n \log n)$ | $O(n^2)$ | $O(\log n)$ |
مقدمة
عند تعلم البرمجة، من المهم جدًا فهم كفاءة الخوارزميات. المفهوم الذي يظهر دائمًا في هذه الحالة هو ** التعقيد ** (Complexity). في هذه المقالة، سنشرح بالتفصيل من أساسيات تعقيد الوقت والمساحة، إلى شرح مفصل لتدوين O (تدوين Big O)، ورؤى عميقة مع أمثلة عملية، في حجم يقارب 20 ألف حرف.
ما هو التعقيد
التعقيد هو مقياس لتقييم أداء الخوارزمية. يمكن تقسيم التعقيد بشكل عام إلى النوعين التاليين:
- ** تعقيد الوقت ** (Time Complexity)
- ** تعقيد المساحة ** (Space Complexity)
1. تعقيد الوقت
تعقيد الوقت هو مقياس يمثل “الوقت” أو “عدد الخطوات” اللازمة للخوارزمية لإكمال تنفيذها.
2. تعقيد المساحة
تعقيد المساحة هو مقياس يمثل “مساحة الذاكرة” اللازمة للخوارزمية لإكمال تنفيذها.
ما هو تدوين O (تدوين Big O)
تدوين O (Big O Notation) هو تدوين رياضي يوضح الحد الأعلى لمعدل الزيادة في التعقيد عندما يصبح حجم الإدخال $n$ كبيرًا بما يكفي.
$$ O(f(n)) = \{ g(n) \mid \text{يوجد ثابت موجب } c, n_0 \text{ بحيث لجميع } n \ge n_0 \text{ يتحقق } 0 \le g(n) \le c f(n) \} $$القواعد الأساسية لتدوين O
- ** تجاهل الثوابت ** : $O(2n)$ يصبح $O(n)$.
- ** الاحتفاظ بالمصطلح ذي التأثير الأكبر فقط ** : $O(n^2 + n)$ يصبح $O(n^2)$.
graph TD
A["حجم الإدخال n"] -->|"تقييم"| B["تدوين O"]
B --> C["تعقيد الوقت"]
B --> D["تعقيد المساحة"]
تعقيدات الوقت النموذجية وأمثلة بلغة بايثون
من هنا، دعونا نلقي نظرة على شروحات مفصلة وأمثلة تعليمات برمجية بلغة بايثون لفئات تدوين O النموذجية.
1. O(1) : وقت ثابت (Constant Time)
خوارزمية يكتمل فيها المعالجة دائمًا في عدد ثابت من الخطوات، بغض النظر عن حجم الإدخال $n$.
| |
2. O(log n) : وقت لوغاريتمي (Logarithmic Time)
يزداد وقت التنفيذ مع زيادة حجم الإدخال $n$، لكن وتيرة هذه الزيادة بطيئة جدًا. المثال النموذجي هو البحث الثنائي.
| |
3. O(n) : وقت خطي (Linear Time)
خوارزمية يزداد فيها وقت التنفيذ بشكل متناسب مع حجم الإدخال $n$.
| |
4. O(n log n) : وقت شبه خطي (Linearithmic Time)
هو حاصل ضرب O(n) و O(log n). العديد من خوارزميات الفرز المقارن الفعالة (مثل فرز الدمج، الفرز السريع، وفرز الكومة) تمتلك هذا التعقيد.
| |
5. O(n^2) : وقت تربيعي (Quadratic Time)
يزداد وقت التنفيذ بشكل متناسب مع مربع حجم الإدخال $n$. تنطبق هذه الحالة على خوارزميات الفرز البسيطة مثل فرز الفقاعة وفرز الإدراج.
| |
6. O(2^n) : وقت أسي (Exponential Time)
يتضاعف وقت التنفيذ في كل مرة يزداد فيها حجم الإدخال $n$ بمقدار 1. تنطبق هذه الحالة على التطبيق العودي البسيط لتسلسل فيبوناتشي.
| |
7. O(n!) : وقت عاملي (Factorial Time)
يزداد وقت التنفيذ بشكل متناسب مع مضروب حجم الإدخال. تنطبق هذه الحالة على البحث الشامل (القوة الغاشمة) لمشكلة بائع المتجول.
| |
هياكل البيانات والتعقيد
| هيكل البيانات | الوصول | البحث | الإدراج | الحذف | تعقيد المساحة |
|---|---|---|---|---|---|
| Array | $O(1)$ | $O(n)$ | $O(n)$ | $O(n)$ | $O(n)$ |
| Linked List | $O(n)$ | $O(n)$ | $O(1)$ | $O(1)$ | $O(n)$ |
| Hash Table | - | $O(1)$ | $O(1)$ | $O(1)$ | $O(n)$ |
| BST | $O(\log n)$ | $O(\log n)$ | $O(\log n)$ | $O(\log n)$ | $O(n)$ |
خوارزميات الفرز والتعقيد
| الخوارزمية | الأفضل | المتوسط | الأسوأ | تعقيد المساحة |
|---|---|---|---|---|
| Bubble Sort | $O(n)$ | $O(n^2)$ | $O(n^2)$ | $O(1)$ |
| Merge Sort | $O(n \log n)$ | $O(n \log n)$ | $O(n \log n)$ | $O(n)$ |
| Quick Sort | $O(n \log n)$ | $O(n \log n)$ | $O(n^2)$ | $O(\log n)$ |
