الفصل الثالث


Growth of functions
نمو الدوال

مقدمة
في الفصل التاني اتعرضنا لبعض الalgorithms اللي بتحل مشكلة الsorting واتكلمنا عن الrunning time لكل algorithm ولكن أجلنا الكلام عن ازاي نعبر عن الrunning time باستخدام الnotations , في الفصل ده هنتعلم ازاي نعبر عم الrunning time لاي algorithm بشكل precise(دقيق جدا).

نفهم عنوان الفصل اللي بنتكلم فيه , functions يعني دوال وده لأنه بيستخدم بعض الدوال للتعبير عن الrunning time للalgorithms , بعد تعريف الدوال دي بيستخدمها كnotation بعد كدة على مدار الكتاب , وكلمة growth يعني نمو أو زيادة الدخل , وده لإن أهم حاجة وانت بتمثل الrunning time ان التمثيل ده يكون بيوصف الrunning time صح مهما الinput يزيد , يعني من الاخر هنستخدم بعض الدوال للتعبير عن كفاءة الalgorithm او الrunning time للalgorithm عند زيادة الدخل , وليه عند زيادة الدخل؟ ده لإن أي algorithm ممكن يكون أداءه سريع على input صغير ولكن الalgorithm بتبان مدى كفاءته عند زيادة الدخل لأرقام كبيرة جدا. اتعرضنا في الفصل التاني لمفهوم ال order of growth , وكلمة order لما تيجي وسط الكلام عن الرياضة والمعادلات بتعني أس , ال order of growth هو الأس اللي له أكبر تأثير على الخرج عند زيادة الدخل , وهو طبعا أكبر أس في المعادلة , يعني مثلا لو عندنا المعادلة دي 3n3 + 5n2 + 10 وانها معادلة بتوصف الrunning time لalgorithm , طبعا واضح إن أكبر أس في المعادلة هو 3 فهو ده الorder of growth , هو اللي بياثر عند زيادة الدخل بمعنى ان لو الدخل وصل 1000 فقيمة باقي المعادلة(5000010) بتساوي قليل جدا بالنسبة لقيمة الn3 أعلى أس(3000000000) يعني قيمة باقي المعادلة تمثل 0.0017 من قيمة الorder of growth لدرجة يمكن إهمال باقي المعادلة دي عند تمثيل الrunning time.

Asymptotic notation
كلمة asymptotic جاية من كلمة asymptote ومعناها line(خط مستقيم) بيقترب جدا من curve(منحنى) بس عند زيادة الدخل , أما عند الدخل الصغير بيكون بعيد عنه زي مانت شايف في الصورة.

يعني ايه بقى asymptotic notation؟ يعني notation بيقترب جدا من القيمة الحقيقية للrunning time عند زيادة الدخل , ولكن عند دخل صغير بيكون بعيد. وبنفس المعنى asymptotic efficiency يعني الكفاءة عند زيادة الدخل , والasymptotic analysis التحليل عند زيادة الدخل , بيقولك معلومة ان الalgorithm الاكثر كفاءة asymptotically هو أفضل اختيار إلا مع الدخل الصغير, هنعرف باذن الله 5 Asymptotic notations :

1) Big O notation
الO notation هي function بتستخدم لتحديد ال upper bound(الحد الأقصى) لأي function تانية , والحد الأقصى مش بالضرورة يكون حاجة واحدة بس بمعنى ان انا ممكن احدد اكتر من حد لدالة معينة متقدرش تعدي ولا واحد فيهم , يعني كمثال f(n) = 5n2 + 11n + 13 الO notation ليها f(n) = O(n2) وده رياضيا معناه ان فيه constant لو ضربته في n2 الدالة f(n) متقدرش تعديه لما يكون الدخل أكبر من قيمة معينة بنسميها n0 , والصورة اللي جاية بتمثل ال O notation .

لما نكتب f(n) = O(n2) أو أي notation تاني احنا بنستخدم ال = بمعنى ينتمي إلى يعني الدالة f(n) بتنتمي للمجموعة(set) المتمثلة بO(n2) أو أي notation زي ماقلنا.
الحد اللي بتعرفه دالة الO فيه منه نوعين : نوع بنسميه asymptotically tight وده معناه ان الحد ده ممكن الدالة تساويه زي المثال اللي فات f(n) = 5n2 + 11n + 13 = O(n2)الدالة فيها أس n2 والحد الأقصى ليها n2 وبالتالي في علاقة تساوي بينهم ممكنة f(n) <= O(n2) , أما النوع التاني هو عكسه not asymptotically tight وده معناه ان الدالة لا يمكن تساوي أو تلامس الحد , كمثال f(n) = 5n2 + 11n + 13 = O(n3) الn3 برده حد أقصى لا يمكن الدالة f(n) تعديه ولكنها لا يمكن توصله برده وبالتالي العلاقة بينهم مفهاش تساوي f(n) < O(n3) .
الO notation بنستخدمه في إيه في ال algorithms? بنستخدمه في التعبير عن الWorst-case running time لإن احنا في الworst-case بنحتاج نحدد أقصى (upper) وقت ممكن ياخده الalgorithm في حل المشكلة , كمثال نقدر نعبر عن الworst-case running time للinsertion sort ب T(n) = O(n2) زي ماعرفنا فالفصل التاني.

2) Big Omega notation
الΩ notation هي function بتستخدم لتحديد الlower bound(الحد الأدنى) لأي function تانية , ونفس الكلام فيه اكتر من حد للدالة , نفس المثال f(n) = 5n2 + 11n + 13 الΩ notation ليها f(n) = Ω(n) , وبنفس الطريقة ده رياضيا معناه ان في constant لو ضربته في n الدالة f(n) متقدرش تعديه لما يكون الدخل أكبر من قيمة معينة بنسميها n0 , والصورة اللي جاية بتمثل الΩ notation

وبنفس الطريقة فيه نوعين للbound هما asymptotically tight والتاني not asymptotically tight وتم شرحهم ولكن الفرق ان ال Ω notation بتحدد الحد الادنى فبالتالي العلاقة f(n) >= Ω(n) او f(n) > Ω(n).
ال Ω notation بتستخدم في إيه في ال algorithms? بتستخدم في التعبير عن الbest-case running time لإن احنا في الbest-case بنحتاج نحدد أقل (lower) وقت ممكن ياخده ال algorithm لحل المشكلة , كمثال نقدر نعبر عن الbest-case running time للinsertion sort ب T(n) = Ω(n) زي ماعرفنا فالفصل التاني.

3) Theta notation
ال Θ notation هي عبارة عن مجموع ال O notation وال Ω notation يعني هي دالة بتحدد lower and upper bounds ل function تانية , كمثال f(n) = 15n + 3 ال Θ notation هيكون g(n) = Θ(n) , وفي الحالة دي بنسمي الدالة g(n) انها asymptotically tight bound للدالة f(n) , وده معناه رياضيا ان فيه 2 constants لو ضربتهم في n يمثلو upper and lower bounds للدالة f(n) لما يكون الدخل أكبر من قيمة معينة بنسميها n0 , والصورة دي بتوضح ال Θ notation

لو قلت ان f(n) = Θ(n) فتقدر تستنتج حاجتين
f(n) = O(n) , f(n) = Ω(n)
والعكس صحيح يعني لو اثبت ال O وال Ω وطلعو نفس الfunction تقدر تستنج ال Θ.

4) Little o notation
الo notation هي بالظبط الO notation بس الbound بتاعها بيكون not asymptotically tight بس ومينفعش يكون asymptotically tight , كمثال
f(n) = 19n3 + 4n2 + 8n + 3
f(n) = O(n4) , f(n) = O(n3)
f(n) = o(n4) , f(n) != o(n3)

يعني الo notation بيحدد upper bound للدالة لكن الدالة لا يمكن توصل للbound ده (not asymptotically tight)

5) Little ω notation
الω notation بالنسبة للΩ notation بالظبط زي مالo notation بالنسبة للO notation , يعني هي بتحدد lower bound برده بس not asymptotically tight , كمثال
f(n) = 10n2
f(n) = Ω(n) , f(n) = Ω(n2)
f(n) = ω(n) , f(n) != ω(n2)





تعليقات

المشاركات الشائعة من هذه المدونة

الفصل الرابع

الفصل السادس

الفصل الثاني عشر