الذكاء الاصطناعي1 - الدرس 2 [23-49].pdf
Document Details
Uploaded by DedicatedSilver
الحكم بن هشام بالمهد - مسارات
Tags
Full Transcript
الدر�س الثاين هياكل البيانات يف الذكاء اال�صطناعي �أهمية هياكل البيانات يف الذكاء اال�صطناعي The Importance of Data Structures in AI للبيان��ات �أهمي��ة ك�ربرى يف جم��االت ال��ذكاء اال�صطناع��ي ألأنه��ا األأ�سا���س املُ�س��تخدَ م يف هياكل البيانات تدري��ب من��اذج تعلُّ��م اآلآل��ة ح...
الدر�س الثاين هياكل البيانات يف الذكاء اال�صطناعي �أهمية هياكل البيانات يف الذكاء اال�صطناعي The Importance of Data Structures in AI للبيان��ات �أهمي��ة ك�ربرى يف جم��االت ال��ذكاء اال�صطناع��ي ألأنه��ا األأ�سا���س املُ�س��تخدَ م يف هياكل البيانات تدري��ب من��اذج تعلُّ��م اآلآل��ة حي��ث ُحُت� ِّ�دد ج��ودة البيان��ات وكميّته��ا املتواف��رة دق��ة وفعالي��ة من��اذج ال��ذكاء اال�صطناع��ي .وب��دون بيان��ات كافي��ة وذات �صل��ة ،ل��ن تتع ّل��م خوارزمي��ات (:)Data Structure الذكاء اال�صطناعي األأمناط ،ولن تقوم بالتنب�ؤات ،ولن تتمكن من �أداء املهام بفاعلية. هي��اكل البيان��ات ه��ي تقني��ة وبالت��ايل ،تلع��ب البيان��ات دورًا رئي� ًس��ا يف ت�ش��كيل ق��درات و�إمكان��ات ُ�صن��ع الق��رار ل��دى لتخزي��ن وتنظي��م البيان��ات يف �أنظم��ة ال��ذكاء اال�صطناع��ي .هي��اكل البيان��ات له��ا �أهمي��ة كب�ريرة يف ال��ذكاء اال�صطناعي الذاكرة ال�ستخدامها بكفاءة. ألأنه��ا توف��ر طريق��ة ف َّعال��ة لتنظي��م وتخزي��ن البيان��ات ،كم��ا ت�س��مح با�س�رترجاع ومعاجل��ة البيان��ات بكف��اءة .وكذل��كُ ،حُت� ِّ�دد م��دى تعقي��د وكف��اءة اخلوارزمي��ات املُ�س��تخدَ مة يف معاجل��ة البيان��ات ،وبالت��ايل ت�ؤث��ر مبا�ش��ر ًة للتو�س��ع على �أداء �أنظمة الذكاء اال�صطناعي .على �س��بيل املثال ،ميكن حت�س�نين �س��رعة وقابلية خوارزميات الذكاء اال�صطناعي ُّ با�ستخدام هياكل البيانات املنا�سبة ،مما يجعلها �أكرث مالءمة للتطبيقات يف العامل احلقيقي .وكذلك ،ت�ساعد هياكل البيانات املُ�ص َّممة جيدً ا يف تقليل ا�ستخدام الذاكرة وزيادة كفاءة اخلوارزميات ،لتمكينها من معاجلة جمموعات �أكرب من البيانات. تُخزِّ ن �أجهزة احلا�سب البيانات وتُعاجلها ب�سرعة ودقة فائقتني .لذلك ،من ال�ضروري تخزين البيانات بكفاءة ،وتوفري الو�صول �إليها بطريقة �سريعة .ميكن ت�صنيف هياكل البيانات على النحو التايل: •هياكل البيانات األأوليّة. يُطلّق على البيانات الب�سيطة كذلك البيانات األأوليّة� ،أو اخلام� ،أو األأ�سا�سية. •هياكل البيانات غري األأوليّة. يو�ضح املُخطَّ ط يف ال�شكل 1.11ت�صنيف هياكل البيانات. هياكل البيانات ()Data Structures هياكل البيانات غري األأوليّة هياكل البيانات األأوليّة )(Non-Primitive Data Structures )(Primitive Data Structures �أعداد �صحيحة )(Integer �أرقام ع�شرية )(Float منطقية هياكل البيانات غري اخلطيَّة ن�صية )(Non-Linear Data Structures )(Boolean) (Character هياكل البيانات اخلطيَّة )(Linear Data Structures القائمة املرتابطة )(Linked List الطابور )(Queue املُك ّد�س )(Stack القامو�س )(Dictionary �شكل ُ :1.11خُمطَّ ط هياكل البيانات ال�صف )(Tuple املخطط )(Graphs امل�صفوفة )(Array ال�شجرة )(Trees القائمة )(List 23 هياكل البيانات األأوليّة Primitive Data Structures يُ�ش��ار �إىل هي��اكل البيان��ات األأول ّي��ة با�س��م هي��اكل البيان��ات األأ�سا�س��ية يف لغ��ة البايث��ون ،ويحت��وي ه��ذا ُرتجم بن��وع البيانات الن��وع م��ن الهي��اكل عل��ى قي��م ب�س��يطة للبياناتُ .تخ�ربر �أنواع البيانات الب�س��يطة امل ِّ خزنها .هياكل البيانات األأولية يف لغة البايثون هي: التي ُي ِّ •األأرقام ( :)Numbersتُ�ستخدَ م األأرقام لتمثيل البيانات الرقمية وهي: األأعداد ال�صحيحة األأرقام الع�شرية•ال�سال�سل الن�صيّة ( :)Stringsال�سال�سل الن�صيّة هي جمموعات من األأحرف والكلمات. •البيانات املنطقية ( :)Booleanتكون قيم البيانات املنطقية �إما �صحيحة �أو خاطئة. تُ�ستخدَم �أنواع خمتلفة من هياكل البيانات لتطبيقات احلا�سب ومهامّه املختلفة بنا ًء على ما يتطلبه امل�شروع والقيود املفرو�ضة على الذاكرة. هياكل البيانات غري األأوليّة Non-Primitive Data Structures ُربمج وال هي��اكل البيان��ات غ�رير األأول ّي��ة ه��ي هي��اكل متخ�ص�ص��ة ُتخ��زِّ ن جمموع��ة من القي��م .يكتبه��ا امل ِّ تُع َّرف بلغة البايثون مثل هياكل البيانات األأوليّة. ميكن تق�سيم هياكل البيانات غري األأوليّة كذلك �إىل نوعني: •هي��اكل البيان��ات اخلط ّي��ة �أو امل ُت�سل�س��لة (:)Linear or sequential data structures معنّي. تُخزِّ ن هياكل البيانات اخلطيّة عنا�صر البيانات يف ت�سل�سل ّ •هي��اكل البيان��ات غ�رير اخلط َّي��ة ( :)Non-linear data structuresال حتت��وي هي��اكل البيان��ات غ�رير اخلط َّي��ة عل��ى ارتباط ت�سل�س��لي بني عنا�ص��ر البياناتُ ،ومُيكن رب��ط �أي زوج �أو جمموعة من عنا�صر البيانات معًا ،والو�صول �إليها دون ت�سل�سل ُحُم َّدد. هياكل البيانات اخلطيَّة Linear Data Structures ُتخ��زِّ ن هي��اكل البيان��ات اخلط َّي��ة عنا�ص��ر البيان��ات يف ت�سل�س��ل مع� ّنّين .يف هذا الدر���س �س��تتعلّم بع���ض هي��اكل البيان��ات اخلط ّي��ة مث��ل امل ُك ّد���س ( )Stackوالطاب��ور ( ،)Queueوهم��ا نوع��ان من هياكل البيانات األأكرث ا�ستخدامً ا يف احلياة اليومية. املُكدّ �س Stack ميك��ن متثي��ل املُك ّد���س يف الواق��ع مبجموع��ة م��ن الكت��ب ُر َّ�ص��ت ف��وق بع�ضه��ا البع���ض ،كم��ا ه��و مو�ض��ح يف ال�ش��كل .1.12فإلإن�ش��اء تل��ك املجموع��ة ،علي��ك �أن ت�ض��ع الكت��ب بع�ضها فوق بع�ض، ّ وعندم��ا تري��د ا�س��تخدام �أح��د الكت��ب ،علي��ك �أخ��ذ الكت��اب من �أعل��ى املجموع��ة .وللو�صول �إىل الكتب األأخرى عليك �إنزال الكتب من �أعلى املجموعة. متغرّيًا ديناميكيًا. قد يكون حجم امل ُكدّ�س ثابتًا �أو ّ تُطبِّق لغة البايثون امل ُكدّ�سات با�ستخدام القوائم. 24 �شكل :1.12كومة من الكتب كمثال واقعي على املُكدّ�س قاعدة املُ�ضاف �آخرً ا أواًل َخرج � ً ي ُ (:)Last In First Out-LIFO �آخر عن�صر ُم�ضاف ميكن الو�صول �إليه � ًأواًل. العمليات يف املُكدّ �س Operations on the stack هناك عمليتان رئي�ستان يف املُكدّ�س: •�إ�ضافة عن�صر ( :)Pushتُ�ستخدَ م العملية إلإ�ضافة عن�صر يف قمة املُكدّ�س. •حذف عن�صر ( :)Popتُ�ستخدَ م العملية حلذف عن�صر من قمة املُكدّ�س. عملية �إ�ضافة عن�صر Push operation يُط َل��ق عل��ى عملي��ة �إ�ضاف��ة عن�ص��ر جدي��د �إىل املُك ّد���س ا�س��م �إ�ضاف��ة عن�ص��ر (.)Push يَ�س��تخدِ م املُك ّد���س م�ؤ�شّ �رًا ُيطل��ق علي��ه م�ؤ�ش��ر األأعل��ى ( ،)Topويُ�ش�رير �إىل العن�صر املوجود يف قمة املُكدّ�س ،وعند �إ�ضافة عن�صر جديد �إىل املُكدّ�س: •ت��زداد قيم��ة م�ؤ�ش��ر األأعل��ى بقيم��ة واح��دة إلإظه��ار املوق��ع اجلدي��د ال��ذي �س ُي�ضاف العن�صر فيه. •يُ�ضاف العن�صر اجلديد �إىل قمة املُكدّ�س. َفيْ�ض امل ُكدّ�س Stack Overflow يتميز املُكدّ�س ب�سعة تخزينية ُحُمدَّدة تعتمد على ذاكرة احلا�سب� .إذا كانت الذاكرة ممتلئة ،ف�إن �إ�ضافة عن�صر جديد �سينتج عنها م�شكلة َفيْ�ض امل ُكدّ�س ( .)Stack Overflowويق�صد بها جتاوز ال�سعة؛ لذا يجب التحقق من امتالء ذاكرة املُكدّ�س قبل �إ�ضافة �أي عن�صر جديد. العن�صر عند القمة َغيْ�ض امل ُكدّ�س Stack Underflow �إذا كن�ت ترغ�ب يف ح�ذف عن�ص�ر من املُك ّد��س ،عليك التّحقّ�ق � ًأواًل من �أن املُك ّد��س يحت�وي عل�ى عن�ص�ر واح�د عل�ى األأق�ل؛ ف��إذا كان املُك ّد��س فارغًا� ،سوف ينتج عن ذلك م�شكلة َغيْ�ض امل ُكدّ�س ()StackUnderflow ويق�صد بها االنخفا�ض عن احلد األأدنى لل�سعة. العن�صر عند القمة E E D D D C C C B B B A A A املُكدّ�س النهائي املُكدّ�س األأ ّويل �شكل :1.13عملية �إ�ضافة عن�صر �إىل املُكدّ�س حذف عن�صر من امل ُكدّ�س عملية حذف عن�صر Pop operation يُطلق على عملية حذف عن�صر من املُكدّ�س ا�سم حذف عن�صر (.)Pop عند حذف عن�صر من املُكدّ�س: •يُحذَ ف العن�صر من قمة املُكدّ�س. •تنخف�ض قيمة م�ؤ�ش��ر األأعلى بقيمة واحد إلإظهار العن�صر التايل عند قمة املُكدّ�س. �إ�ضافة عن�صر �إىل امل ُكدّ�س العن�صر عند القمة العن�صر عند القمة E E D D D C C C B B B A A A املُكدّ�س النهائي املُكدّ�س األأ ّويل �شكل :1.14عملية حذف عن�صر من املُكدّ�س 25 املُكدّ �س يف لغة البايثون Stack in Python ُمُتثَّل املُكدّ�سات يف لغة البايثون با�ستخدام القوائم التي بدورها تُقدِّ م بع�ض العمليات التي ُمُيكن تطبيقها مبا�شر ًة على املُكدّ�سات. كد�س جدول :1.2عمليات املُ ّ العملية )listName.append(x )(listName.pop الو�صف �إ�ضافة العن�صر � xإىل نهاية القائمة. حذف العن�صر األأخري من القائمة. تُطبَّق عملية �إ�ضافة عن�صر للمُكدّ�س يف لغة البايثون با�ستخدام دالة .append مثااًل على تطبيق املُكدّ�س يف لغة البايثون: �ست�شاهد ً � 1أن�شئ املُكدّ�س لتخزين جمموعة من األأرقام (.)45 ،32 ،21 ،1 2 ِ ا�ستخدم عملية حذف عن�صر ( )Popمن املُكدّ�س مرتني حلذف العن�صرين األأخريين ( )45 ،32من املُكدّ�س. ِ 3 ا�ستخدم عملية �إ�ضافة عن�صر (� )Pushإىل املُكدّ�س إلإ�ضافة عن�صر جديد (� )78إىل املُكدّ�س. �إ�ضافة عن�صر �إىل امل ُكدّ�س العن�صر عند القمة 45 45 �إ�ضافة عن�صر �إىل امل ُكدّ�س �إ�ضافة عن�صر �إىل امل ُكدّ�س 32 32 32 21 21 21 1 1 1 �إ�ضافة عن�صر �إىل امل ُكدّ�س 21 1 1 1 45 �إ�ضافة عن�صر �إىل امل ُكدّ�س 32 حذف عن�صر من امل ُكدّ�س 78 45 32 32 21 21 21 21 21 1 1 1 1 1 78 2 3 26 حذف عن�صر من امل ُكدّ�س �شكل :1.15مثال على املُكدّ�س مفكرة جوبيرت Jupyter Notebook يف ه��ذه الوح��دة �س��تكتب مقط ًع��ا برجم ًّي��ا بلغ��ة البايث��ون با�س��تخدام مفك��رة جوبي�رتر �تخدم إلإن�ش��اء املُ�س��تندات احلا�س��وبية ( .)Jupyter Notebookوه��ي تطبي��ق الوي��ب املُ�س� َ وم�ش��اركتها .كل ُم�س��تند ُي�س��مى مفك��رة ،ويحت��وي عل��ى املقط��ع الربجم��ي ال��ذي كتب َت��ه، والتعليق��ات ،والبيان��ات األأول ّي��ة واملُعاجل��ة ،وت�ص�وّرات البيان��ات� .ستَ�س��تخدِ م اإلإ�ص��دار غ�رير امل ُت�ص��ل باإلإنرتن��ت ( )Offlineم��ن مفك��رة جوبي�رتر ،و�أ�س��هل طريقة لتثبيت��ه حمليًا هي من خ�الال �أناكون��دا ( )Anacondaوه��ي من�ص��ة توزي��ع مفتوح��ة امل�ص��در للطلب��ة واله��واة، وميكنك تنزيلها وتثبيتها من الرابط التايل: َ https://www.anaconda.com/products/distribution 2 و�سيتم تثبيت لغة البايثون ومفكرة جوبيرت تلقائيًا. لفتح مفكرة جوبيرت (:)Jupyter Notebook 3 >ا�ضغط على ( Startبدء) 1 ,ثم ا�ضغط على �( Anaconda3أناكوندا .)3 >اخرت ( Jupyter Notebookمفكرة جوبيرت)3 . >�ستظهر ال�صفحة الرئي�سة ملفكرة جوبيرت يف املت�صفح. 2 1 ال�صفحة الرئي�سة لمفكرة جوبيتر. �شكل :1.16ال�صفحة الرئي�سة ملفكرة جوبيرت 27 إلإن�شاء مفكرة جوبيرت جديدة: >يف الزاوية اليمنى العلوية من �شا�شتك ،ا�ضغط على ( Newجديد). >حدِّ د )( Python 3 (ipykernelبايثون 2 .)3 >�سيتم فتح املفكرة اخلا�صة بك يف عالمة تبويب جديدة يف املت�صفح اخلا�ص بك. 1 1 3 يمكنك تحميل مفكرتك من جهاز الحا�سب الخا�ص بك. 2 3 اال�سم االفترا�ضي للمفكرة هو "بدون عنوان". 28 �شريط �أدوات المفكرة. �شكل � :1.17إن�شاء مفكرة جوبيرت جديدة خلية المقطع البرمجي .يمكنك كتابة ن�ص� ،أو معادلة ريا�ضية �أو �أمر بلغة البايثون. اآلآن وبع��د �أن �أ�صبح��ت مُفكرت��ك جاه��زة ،ح��ان الوق��ت لكتاب��ة برناجمك األأول وت�شغيله فيها. إلإن�شاء برنامج يف مفكرة جوبيرت: >�أكتب األأوامر داخل خلية املقطع الربجمي. >ا�ضغط على ( Runت�شغيل)2 . >�سيتم عر�ض النتيجة حتت األأوامر3 . ميكنك احل�صول على العديد من اخلاليا املختلفة التي حتتاجها يف نف�س املفكرة حيث حتتوي كل خلية على مقطعها الربجمي اخلا�ص. 1 2 1 عند ت�شغيل برنامجك �ستتم �إ�ضافة خلية مقطع برمجي جديدة تلقائيًا. 3 �شكل � :1.18إن�شاء برنامج يف مفكرة جوبيرت حان الوقت حلفظ مفكّرتك. ُمُيكنك ت�شغيل برناجمك بال�ضغط على Shift + Enter . حلفظ املفكرة اخلا�صة بك: 1 >ا�ضغط على ( Fileملف) >اخرت ( Save asحفظ كــ)2 . >اكتب ا�سمًا ملفكرتك3 . >ا�ضغط على ( Saveحفظ)4 . 1 2 لقد تغ ّير ا�سم المفكرة. يتم حفظ املفكرة تلقائيًا �أثناء عملك. �شكل :1.19حفظ املفكرة اخلا�صة بك 4 3 29 : يف مفكرة جوبيرت1.15 لت�شاهد املثال يف ال�شكل .)45 ،32 ،21 ،1( �أن�شئ املُكدّ�س لتخزين جمموعة من األأرقام.1 ِ .) من املُكدّ�س مرتني حلذف العن�صرين األأخريين منهPop( ا�ستخدم عملية حذف عن�صر .2 ِ .) �إىل املُكدّ�س إلإ�ضافة عن�صر جديد �إليهPush( ا�ستخدم عملية �إ�ضافة عن�صر .3 myStack=[1,21,32,45] print("Initial stack: ", myStack) print(myStack.pop()) print(myStack.pop()) print("The new stack after pop: ", myStack) myStack.append(78) print("The new stack after push: ", myStack) لعر�ضprint(myStack.pop()) تُ�ستخدَ م الدالة .myStack.Pop() ُ�سترجعة من دالة َ القيم الم Initial stack: [1, 21, 32, 45] 45 32 The new stack after pop: [1, 21] The new stack after push: [1, 21, 78] myStack=[1,21,32,45] print("Initial stack:", myStack) a=len(myStack) print("size of stack",a) . لعر�ض طول المُكدّ�سlen تُ�ستخدَ م الدالة # empty the stack for i in range(a): myStack.pop() print(myStack) myStack.pop() يُ�ستخدَ م هذا األأمر لحذف .كل العنا�صر من المُكدّ�س Initial stack: [1, 21, 32, 45] size of stack 4 [] -------------------------------------------------------------------IndexError Traceback (most recent call last) Input In [3], in <cell line: 9>() 7 myStack.pop() يظهر الخط�أ ألأن المُكدّ�س 8 print(myStack) فارغ و�أنت كتبت �أمر حذف ----> 9 myStack.pop() .عن�صر منه IndexError: pop from empty list IndexError خط�أ الفهر�س �س�تالحظ ظه�ور خط��أ عندم�ا كتب�تَ �أم�ر ح�ذف عن�ص�ر م�ن املُك ّد��س الف�ارغ وت�س�بب ه�ذا يف َغ ْي��ض امل ُك ّد��س . عليك دومً ا التحقق من وجود عنا�صر يف املُكدّ�س قبل حماولة حذف عن�صر منه.)Stack Underflow( 30 �س��يظهر بالربنام��ج قائم��ة تطل��ب من��ك، �أو حتذفه��ا من��ه،يف الربنام��ج الت��ايل �ستن�ش��ئ مُكدّ� ًس��ا جدي��دً ا وت�ضي��ف العنا�ص��ر �إلي��ه .حتديد اإلإجراء الذي تود القيام به يف كل مرة . من قائمة الربنامج1 ا�ضغط على الرقم،•إلإ�ضافة عن�صر �إىل املُكدّ�س . من قائمة الربنامج2 ا�ضغط على الرقم،•حلذف عن�صر من املُكدّ�س . من قائمة الربنامج3 ا�ضغط على الرقم،•للخروج من الربنامج def push(stack,element): stack.append(element) def pop(stack): return stack.pop() def isEmpty(stack): return len(stack)==0 def createStack(): return [] newStack=createStack() while True: print("The stack so far is:",newStack) print("-----------------------------") print("Choose 1 for push") print("Choose 2 for pop") print("Choose 3 for end") print("-----------------------------") choice=int(input("Enter your choice: ")) while choice!=1 and choice!=2 and choice!=3: print ("Error") choice=int(input("Enter your choice: ")) if choice==1: x=int(input("Enter element for push: ")) push(newStack,x) elif choice==2: if not isEmpty(newStack): print("The pop element is:",pop(newStack)) else: print("The stack is empty") else: print("End of program") break; 31 The stack so far is: [] ----------------------------Choose 1 for push Choose 2 for pop Choose 3 for end ----------------------------Enter your choice: 1 Enter element for push: 26 The stack so far is: [26] ----------------------------Choose 1 for push Choose 2 for pop Choose 3 for end ----------------------------Enter your choice: 1 Enter element for push: 18 The stack so far is: [26, 18] ----------------------------Choose 1 for push Choose 2 for pop Choose 3 for end ----------------------------Enter your choice: 1 Enter element for push: 23 The stack so far is: [26, 18, 23] ----------------------------- :َنفِّذ الربنامج ال�سابق كما يلي .•�أن�شئ مُكدّ�سً ا من ثالثة �أرقام .•�أ�ضف العنا�صر �إىل املُكدّ�س �أ�ضف العن�صر �إىل امل ُكدّ�س �أ�ضف العن�صر �إىل امل ُكدّ�س 23 �أ�ضف العن�صر �إىل امل ُكدّ�س 18 18 26 26 26 �إ�ضافة العنا�صر:1.20 �شكل Choose 1 for push Choose 2 for pop Choose 3 for end ----------------------------Enter your choice: 2 The pop element is: 23 The stack so far is: [26, 18] ----------------------------Choose 1 for push Choose 2 for pop Choose 3 for end ----------------------------Enter your choice: 2 The pop element is: 18 The stack so far is: [26] ----------------------------Choose 1 for push Choose 2 for pop Choose 3 for end ----------------------------Enter your choice: 3 End of program ثم،ميكن��ك اآلآن ح��ذف عن�صري��ن م��ن املُك ّد���س .اخلروج من الربنامج حذف العن�صر من امل ُكدّ�س 23 حذف العن�صر من امل ُكدّ�س 23 18 18 18 26 26 26 حذف العنا�صر:1.21 �شكل 32 الطابور Queue هي��كل البيان��ات الت��ايل ال��ذي �ست�س��تعر�ضه ه��و الطاب��ور .تُ�ص��ا ِدف ع��اد ًة طواب�رير يف حيات��ك اليومي��ة .الطاب��ور األأك�رثر �ش��يوعً ا ه��و طاب��ور انتظ��ار ال�س��يارات عن��د �إ�ش��ارة املرور .عندما تتحول �إ�ش��ارة املرور �إىل اللون األأخ�ضر� ،س��تكون ال�س��يارة التي دخلت �إىل الطاب��ور � ًأواًل ه��ي نف�س��ها الت��ي تخ��رج من��ه � ًأواًل .الطابور هو هي��كل البيانات الذي أواًل ( ، )First In First Out - FIFOمم��ا يعن��ي أواًل َيخ�رُج � ً َيتب��ع قاع��دة امل ُ�ض��اف � ً �أن كل عن�صر يف الطابور ُيق َّدم بالرتتيب نف�سه الذي و�صل به �إىل الطابور. قاعدة المُ�ضاف � ًأواًل يَخرُج � ًأواًل أواًل أواًل يَخرُ ج � ً قاعدة املُ�ضاف � ً (:)First In First Out (FIFO) rule العن�ص��ر األأول املُ�ض��اف �إىل القائمة ُيعالَج � ًأواًل ،والعن�صر األأحدث ُيعالَج �آخرًا. الفرق بني امل ُكدّ�س والطابور هو �أنه يف امل ُكدّ�س تتم �إ�ضافة وحذف العن�صر من نف�س اجلانب، ويف الطابور تتم اإلإ�ضافة من جانب ،بينما يتم احلذف من اجلانب اآلآخر .وهكذا ،عند احلذف يف امل ُكدّ�س ،يُحذف العن�صر امل ُ�ضاف �آخرًا ،بينما يف الطابور ،يُحذف العن�صر أواًل. امل ُ�ضاف � ً العمليات يف الطابور :Operations on the Queue هناك عمليتان رئي�ستان يف الطابور: •�إ�ضافة عن�صر للطابور ( :)Enqueueتُ�ستخدَ م العملية إلإ�ضافة عن�صر يف �آخر الطابور. •ح��ذف عن�ص��ر م��ن الطاب��ور ( :)Dequeueتُ�س��تخدَ م العملي��ة حل��ذف عن�ص��ر من مقدمة الطابور. م�ؤ�شرات الطابور Queue Pointers الفهر�س (:)Index الفهر���س ه��و رق��م ُيح� ِّ�دد مو�ض��ع العن�صر يف هيكل البيانات. يحتوي الطابور على م�ؤ�شرين: •امل�ؤ�شر األأمامي ( :)Front Pointerيُ�شري �إىل العن�صر األأول يف الطابور. •امل�ؤ�شر األأخري (ُ :)Rear Pointerي�شري �إىل العن�صر األأخري يف الطابور. �إ�ضافة عن�صر للطابور امل�ؤ�شر اخللفي امل�ؤ�شر (:)Pointer امل�ؤ�ش��ر ه��و ُمتغري يُخزِّ ن �أو يُ�ش�رير �إىل عن��وان ُمتغ�رير �آخ��ر .امل�ؤ�ش��ر ي�ش��به رق��م ال�صفح��ة يف فهر���س الكت��اب الذي ُي�س� ِّهل عل��ى القارئ الو�صول �إىل املحتوى املطلوب. امل�ؤ�شر األأمامي Q u e u e 31 14 4 23 56 12 7 21 43 17 9 10 9 8 7 6 5 4 3 2 1 0 �شكل :1.22العمليات يف الطابور حذف عن�صر من الطابور الفهر�س 33 عملية �إ�ضافة عن�صر للطابور Enqueue Operation يُطل��ق عل��ى عملي��ة �إ�ضاف��ة عن�ص��ر جدي��د �إىل الطاب��ور ا�س��م �إ�ضاف��ة عن�ص��ر للطاب��ور ( .)Enqueueإلإ�ضافة عن�صر جديد �إىل الطابور: •تت��م زي��ادة قيم��ة امل�ؤ�ش��ر اخللف��ي بقيم��ة واح��د بحي��ث ي�ش�رير �إىل مو�ض��ع العن�ص��ر اجلدي��د الذي �سيُ�ضاف. •تتمّ �إ�ضافة العن�صر. اخللفي األأمامي C B A 2 1 0 اخللفي D قبل ال ميكنك �إ�ضافة عن�صر �أو حذفه من و�سط الطابور. األأمامي اخللفي األأمامي C B A D C B A 2 1 0 3 2 1 0 بعد �إ�ضافة عن�صر للطابور �شكل :1.23عملية �إ�ضافة عن�صر للطابور عملية حذف عن�صر من الطابور Dequeue Operation يُطلق على عملية حذف عن�صر من الطابور ا�سم حذف عن�صر من الطابور (.)Dequeue حلذف عن�صر من الطابور: •يُحذف العن�صر املُ�شار �إليه بامل�ؤ�شر األأمامي. •تتم زيادة قيمة امل�ؤ�ش��ر األأمامي بقيمة واحد بحيث ي�ش�رير �إىل العن�صر اجلديد التايل يف الطابور. اخللفي األأمامي اخللفي األأمامي اخللفي األأمامي D C B A D C B A D C B 3 2 1 0 3 2 1 0 2 1 0 قبل حذف عن�صر من الطابور �شكل :1.24عملية حذف عن�صر من الطابور 34 قبل �أي �إجراء عليك التحقق مما �إذا كانت هناك م�ساحة فارغة يف الطابور إلإ�ضافة عن�صر جديد، وتوافر عن�صر واحد على األأقل لت�صديره. بعد الطابور يف لغة البايثون Queue in Python ميك��ن متثي��ل الطاب��ور بع��دة ط��رق متنوع��ة يف لغ��ة البايث��ون منه��ا القوائ��م ( .)Listsويرج��ع ذل��ك �إىل حقيق��ة �أن القائم��ة متث��ل جمموعة من العنا�صر اخلطيّة ،كما ميكن �إ�ضافة عن�صر يف نهاية القائمة وحذف عن�صر من بداية القائمة. �ستتعلم فيما يلي ال�صيغ العامة لبع�ض العمليات التي ميكن تنفيذها على الطابور: جدول ُ :1.3ط ُرق الطابور الو�صف الطريقة ) listName.append(xت�ضيف العن�صر � xإىل القائمة التي متثل الطابور. حتذف العن�صر األأول من القائمة. )listName.pop(0 تُ�س��تخدَ م طريق��ة )( listName.popل� ٍ �كل م��ن هي��اكل بيان��ات املُك ّد���س والطاب��ور .عندم��ا تُ�س��تخدَ م م��ع املُك ّد���س ،ال تتطل��ب الطريق��ة �أي مُعام��ل .بينم��ا تتطل��ب الطريق��ة �إ�ضاف��ة �صف��ر �إىل املُعام��ل عندم��ا تُ�س��تخدم م��ع الطاب��ور: ُو�ضح يف اجلدول � 1.4أدناه. ( .listName.pop(0الفرق بني الدالتني م ّ جدول :1.4طريقة )( listName.popمقابل طريقة )listName.pop(0 الطريقة )(listName.pop )listName.pop(0 الو�صف �إذا كان ُم ِ عامل الدالة فارغً اُ ،يحذف العن�صر األأخري من نهاية القائمة التي متثل املُكدّ�س. �إذا كان ُم ِ عامل الدالة �صف ًراُ ،يحذف العن�صر األأول من القائمة التي متثل الطابور. مثااًل على تطبيق الطابور يف لغة البايثون: �سن�ستعر�ض لك ً •�أن�شئ طابورًا لتخزين جمموعة من األأرقام (.)45 ،32 ،21 ،1 •ا�ستخدم عملية حذف عن�صر من الطابور مرتني حلذف العن�صرين األأ َّولَني منه. •ا�ستخدم عملية �إ�ضافة عن�صر �إىل الطابور إلإ�ضافة عن�صر جديد �إليه. اخللفي األأمامي األأمامي اخللفي األأمامي اخللفي 45 32 21 45 32 21 1 45 32 21 1 1 0 حذف عن�صر من الطابور 2 1 0 حذف عن�صر من الطابور 3 2 1 0 اخللفي الطابور األأخير اخللفي األأمامي األأمامي 78 45 32 78 45 32 2 1 0 �إ�ضافة عن�صر للطابور 1 0 �شكل :1.25مثال تو�ضيحي ملفهوم الطابور 35 كم��ا فعل��ت يف، �ستَ�س��تخدِ م قائم��ة البايث��ون لتنفي��ذ هي��كل الطاب��ور،لربجم��ة اخلط��وات املو�ضح��ة باألأعل��ى بلغ��ة البايث��ون .املُكدّ�س myQueue=[1,21,32,45] print("Initial queue: ", myQueue) myQueue.pop(0) myQueue.pop(0) print("The new queue after pop: ", myQueue) myQueue.append(78) print("The new queue after push: ", myQueue) Initial queue: [1, 21, 32, 45] The new queue after pop: [32, 45] The new queue after push: [32, 45, 78] .عليك � ًأواًل �أن تُفرِ غ الطابور من العنا�صر َ ،لكي ت�شاهد ما قد يحدث عندما حتاول حذف عن�صر من طابور فارغ myQueue=[1,21,32,45] print("Initial queue: ", myQueue) a=len(myQueue) print("size of queue ",a) # empty the queue for i in range(a): myQueue.pop(0) print(myQueue) myQueue.pop(0) Initial queue: [1, 21, 32, 45] size of queue 4 [] -------------------------------------------------------------------IndexError Traceback (most recent call last) Input In [6], in <cell line: 9>() 7 myQueue.pop() 8 print(myQueue) ----> 9 myQueue.pop() IndexError: pop from empty list عليك �أن تتحقق دومًا من وجود عنا�صر يف .الطابور قبل حماولة حذف عن�صر منه ظهر الخط�أ ألأنك حاولت .حذف عن�صر من طابور فارغ 36 تطبيقات على الطابور Queue Applications �أح��د األأمثل��ة عل��ى تطبيق��ات الطاب��ور يف عل��وم احلا�س��ب هو طابور الطباعة .على �س��بيل املثال ،لديك معمل حا�س��ب به 30جهاز حا�س��ب مت�صل�نين بطابع��ة واح��دة .عندم��ا يرغ��ب الطلب��ة يف طباع��ة املُ�س��تندات� ،ست�ش�كّل مه��ا ّم الطّ باع� ِة طاب��ورًا ملعاجلته��ا وف��ق قاع��دة امل ُ�ض��اف أواًل (� ،)FIFOأي �أنّ تل��ك امله��ام �س�تُنج ُز بالرتتي��ب الزمن��ي ال��ذي أُ�ر�س�لَت ب��ه �إىل الطابع��ة .املهم��ة املُر�س��لة � ًأواًل �س��وف ُتطب��ع أواًل َيخ�رُج � ً � ً قبل املهمة املُر�س��لة بعدها ولن ُتطبع املهمة يف نهاية الطابور قبل طباعة كل املهام التي قبلها .عندما تنتهي الطابعة من �أحد األأوامر، �سوف تبحث يف الطابور ملعرِ فة ما �إن كانت هناك �أوامر �أخرى ملعاجلتها. املُكدّ �س والطابور با�ستخدام وحدة الطابور النمطية Stack and Queue Using Queue Module ميكن اعتبار القائمة يف لغة البايثون مبثابة طابور وكذلك مُكدّ�س .تُقدِّ م لغة البايثون الوحدة النمطية للطابور ()Queue Module وهي طريقة �أخرى لتنفيذ هيكلَيّ البيانات املو�ضحني .تت�ضمن الوحدة النمطية للطابور بع�ض الدوال اجلاهزة لال�ستخدام التي ميكن تطبيقها على كل من املُكدّ�س والطابور. جدول :1.5وظائف وحدة الطابور النمطية الو�صف الوظيفة )( queueName=queue.Queueتن�شئ طابورًا جديدً ا ا�سمه .queueName ت�ضيف العن�صر � xإىل الطابور. )queueName.put(x تعود بقيمة حجم الطابور. )(queueName.qsize تعر�ض وحتذف العن�صر األأول من الطابور والعن�صر األأخري من املُكدّ�س. )(queueName.get تع��ود بقيم��ة �( Trueصحي��ح) �إن كان الطاب��ور ممتل ًئ��ا ،وقيم��ة ( Falseخط��أ) )(queueName.full �إن كان الطابور فارغً ا ،وميكن تطبيقها على املُكدّ�س كذلك. تع��ود بقيم��ة �( Trueصحي��ح) �إن كان الطاب��ور فارغً ��ا والقيم��ة ( Falseخط��أ) )(queueName.empty �إن كان الطابور ممتلئًا ،ميكن تطبيقها على املُكدّ�س كذلك. تُ�ستخدَم وظائف مكتبة الطابور مع كلٍ من امل ُكدّ�س والطابور. �ست ِ َ�ستخدم وحدة الطابور النمطية إلإن�شاء طابور. يف هذا املثال عليك: •ا�س��ترياد مكتب��ة الطاب��ور ( )Queueال�س��تخدام طُ رُق الطابور. •�إن�شاء طابور فارغ با�سم ( myQueueطابوري). •�إ�ضاف��ة العنا�ص��ر � e ،d ،c ،b ،aإىل الطاب��ور ( myQueueطابوري). •طباعة عنا�صر الطابور. عليك ا�ستيراد وحدة الطابور في بداية المقطع البرمجي. * from queue import )(myQueue = Queue # add the elements in the queue )"myQueue.put("a )"myQueue.put("b )"myQueue.put("c )"myQueue.put("d )"myQueue.put("e # print the elements of the queue for element in list(myQueue.queue): )print(element a b c d e 37 ويف النهاية، ثم اطبع هذه القي��م،�أن�ش��ئ طاب��ورًا مُك َّو ًن��ا م��ن خم���س قي��م يق��وم املُ�س��تخدِ م ب�إدخالها �أثن��اء تنفيذ الربنام��ج .اطبع حجم الطابور from queue import * myQueue = Queue() # the user enters the elements of the queue for i in range(5): for i in range(5): element=input("enter queue element: ") myQueue.put(element) # print the elements of the queue for element in list(myQueue.queue): print(element) print ("Queue size is: ",myQueue.qsize()) enter enter enter enter enter 5 f 12 b 23 Queue queue queue queue queue queue element: element: element: element: element: 5 f 12 b 23 size is: 5 .�أن�شئ برناجمً ا للتحقق مما �إذا كان الطابور فارغً ا �أم ممتلئًا from queue import * myQueue = Queue() myQueue.put("a") myQueue.put("b") myQueue.put("c") myQueue.put("d") myQueue.put("e") checkFull=myQueue.full() print("Is the queue full? ", checkFull) checkEmpty= myQueue.empty() print("Is the queue empty? ", checkEmpty) Is the queue full? False Is the queue empty? False 38 كما ذُ ِكر من قبل ف�إن وحدة الطابور حتتوي على بع�ض الوظائف اجلاهزة لال�ستخدام مع املُكدّ�س �أو الطابور .اجلدول 1.6يو�ضح وظائف الوحدة التي ُمُيكن ا�ستخدامها مع هيكل بيانات املُكدّ�س. كد�س للم ّ جدول :1.6وظائف الوحدة املُ�ستخدمة ُ الو�صف الوظيفة )( stackName=queue.LifoQueueتن�شئ مُكدّ�سً ا جديدً ا ا�سمه .stackName )(stackName.get حتذف العن�صر األأخري من املُكدّ�س. �ستَ�ستخدِ م وحدة الطابور إلإن�شاء مُكدّ�س فارغ. تذكّر �أن العمليات يف امل ُكدّ�س تعمل وفقًا أواًل (.)LIFO لقاعدة امل ُ�ضاف �آخرًا يَخرُج � ً عند ا�ستخدام دالة getمع الطابور، �ستَ�ستنِد عمليات اال�ستدعاء والطباعة �إىل أواًل (.)FIFO أواًل يَخرُج � ً قاعدة امل ُ�ضاف � ً * from queue import )(myStack = LifoQueue )"myStack.put("a )"myStack.put("b )"myStack.put("c )"myStack.put("d )"myStack.put("e for i in range(5): )(k=myStack.get )print(k # empty the stack )(checkEmpty= myStack.empty )print("Is the stack empty?", checkEmpty e d c b a Is the stack empty? True مثال :الطباعة Print يظه��ر �أمام��ك يف املث��ال الت��ايل حم��اكاة لطاب��ور الطباع��ة يف الطابعة .عندما ي ِ ُر�س��ل املُ�س� ِ �تخدمون �أوام��ر طباعة ،تُ�ضاف �إىل طابور الطباعة .ت ِ َ�ستخدم الطابعة هذا الطابور لتحديد امللف الذي �س ُيطبع � ًأواًل. •افرت���ض �أن �س��عة الطابع��ة ه��ي فق��ط 7ملف��ات ،ولك��ن يف الوق��ت نف�س��ه ،حتت��اج �إىل طباع��ة 10ملف��ات م��ن املل��ف A �إىل امللف .J •اكتب برناجمً ا ُمُيثّل طابور الطباعة منذ بدء �أمر الطباعة األأول Aحتى االنتهاء من كل �أوامر الطباعة. •�أ�ضف اللبنة التي ت�ؤكد �أن طابور �أوامر الطباعة فارغ. 39 متت طباعته :ُمُيكنك ا�ستخدام اخلوارزمية اآلآتية . �أن�شئ طابور �أوامر الطباعة1 يفG �إىلA �أدرِج امللفات من2 .طابور �أوامر الطباعة A B C D E F G 0 1 2 3 4 5 6 B C D E F G H 0 1 2 3 4 5 6 C D E F G H I 0 1 2 3 4 5 6 D E F G H I J 0 1 2 3 4 5 6 D E F G H I J 0 1 2 3 4 5 6 A متت طباعته B متت طباعته C .H و�أدرج امللفA �أخرِ ج امللف 3 .I و�أدرج امللفB �أخرِ ج امللف 4 .J و�أدرج امللفC �أخرِ ج امللف 5 �أخرج امللفات التي متت طباعتها .) واحدً ا تلو اآلآخرD-E-F-G-H-I-J( 6 # import the queue library from queue import * # import the time library to use the sleep function import time # initialize the variables and the queue printDocument = " " printQueueSize = 0 printQueueMaxSize = 7 printQueue = Queue(printQueueMaxSize) # add a document to print the queue def addDocument(document): printQueueSize = printQueue.qsize() if printQueueSize == printQueueMaxSize: print("!! ", document, " was not sent to print queue.") print("The print queue is full.") print() return printQueue.put(document) time.sleep(0.5) #Wait 5.0 seconds print(document, " sent to print queue.") printQueueSizeMessage() # print a document from the print queue def printDocument(): printQueueSize = printQueue.qsize() if printQueueSize == 0: print("!! The print queue is empty.") 40 print() return printDocument = printQueue.get() time.sleep(1) # wait one second print ("OK - ", printDocument, " is printed.") printQueueSizeMessage() # print a message with the size of the queue def printQueueSizeMessage(): printQueueSize = printQueue.qsize() if printQueueSize == 0: print ("There are no documents waiting for printing.") elif printQueueSize == 1: print ("There is 1 document waiting for printing.") else: print ("There are ", printQueueSize, " documents waiting for printing.") print() # the main program # send documents to the print queue for printing addDocument("Document addDocument("Document addDocument("Document addDocument("Document addDocument("Document addDocument("Document addDocument("Document printDocument() addDocument("Document printDocument() addDocument("Document printDocument() addDocument("Document addDocument("Document printDocument() printDocument() printDocument() printDocument() printDocument() printDocument() printDocument() printDocument() A") B") C") D") E") F") G") H") I") J") K") Document A sent to print queue. There is 1 document waiting for printing. Document B sent to print queue. There are 2 documents waiting for printing. Document C sent to print queue. There are 3 documents waiting for printing. 41 Document D sent to print queue. There are 4 documents waiting for printing. Document E sent to print queue. There are 5 documents waiting for printing. Document F sent to print queue. There are 6 documents waiting for printing. Document G sent to print queue. There are 7 documents waiting for printing. OK - Document A is printed. There are 6 documents waiting for printing. Document H sent to print queue. There are 7 documents waiting for printing. OK - Document B is printed. There are 6 documents waiting for printing. Document I sent to print queue. There are 7 documents waiting for printing. OK - Document C is printed. There are 6 documents waiting for printing. Document J sent to print queue. There are 7 documents waiting for printing. !! Document K was not sent to print queue. The print queue is full. OK - Document D is printed. There are 6 documents waiting for printing. OK - Document E is printed. There are 5 documents waiting for printing. OK - Document F is printed. There are 4 documents waiting for printing. OK - Document G is printed. There are 3 documents waiting for printing. OK - Document H is printed. There are 2 documents waiting for printing. OK - Document I is printed. There is 1 document waiting for printing. OK - Document J is printed. There are no documents waiting for printing. !! The print queue is empty. 42 هياكل البيانات الثابتة واملتغرية Static and Dynamic Data Structures �س��بق تو�ضيح �أن هياكل البيانات هي طريقة فعالة لتخزين البيانات وتنظيمها ،وباإلإ�ضافة �إىل ما تعلمته حول ت�صنيف هياكل أي�ضا �إىل ثابتة ( )Staticو متغرية (.)Dynamic البيانات �إىل �أوليّة وغري �أوليّة ،ف�إنه ميكن ت�صنيفها � ً هياكل البيانات الثابتة Static Data Structure يف البيان��ات الثابت��ة ،يك��ون حج��م الهي��كل ثاب ًت��ا ،و ُتخ�زَّن عنا�ص��ر البيان��ات يف مواق��ع الذاك��رة املتج��اورةُ .تع� ُّد امل�صفوف��ة ( )Arrayاملثال األأبرز لهياكل البيانات الثابتة. هياكل البيانات املتغرية Dynamic Data Structure يف هي��اكل البيان��ات املتغ�ريرة ،ال يك��ون حج��م الهي��كل ثاب ًت��ا ولك��ن ميك��ن تعديل��ه �أثن��اء تنفي��ذ الربنام��ج ،ح�س��ب العملي��ات املُن َّف��ذة علي��ه .تُ�ص َّم��م هي��اكل البيان��ات املتغ�ريرة لت�س��هيل تغي�رير حج��م هي��اكل البيان��ات �أثن��اء الت�ش��غيل .و ُتع� ُّد القائم��ة املرتابطة ( )Linked Listاملثال األأبرز لهياكل البيانات املتغرية. جدول :1.7مقارنة بني هياكل البيانات الثابتة واملتغرية الثابتة حجم الذاكرة ثابت. حجم الذاكرة ُتخ�زَّن العنا�ص��ر يف مواقع متجاورة �أنواع ذاكرة التخزين يف الذاكرة الرئي�سة. �سرعة الو�صول �إىل البيانات �أ�سرع. املتغرية ميكن تغيري حجم الذاكرة �أثناء الت�شغيل. ُتخ � َّزن العنا�ص��ر يف مواق��ع ع�ش��وائية يف الذاك��رة الرئي�سة. �أبط�أ. تخ�صي�ص الذاكرة Memory Allocation تنتم��ي القوائ��م املرتابط��ة (� )Linked Listsإىل هي��اكل البيان��ات املتغ�ريرة ،وه��ذا يعن��ي �أن عُ ق��د القائم��ة املرتابط��ة ال ُتخ�زَّن يف مواقع الذاكرة املتجاورة مثل البيانات يف امل�صفوفات .ولهذا ال�سبب ،حتتاج �إىل تخزين امل�ؤ�شر من عُ قدة �إىل �أخرى. الثابتة = بايت واحد من الذاكرة املُ�ستخدَ مة 5 4 3 2 املتغرية = بايت واحد من الذاكرة املُ�ستخدَ مة 1 1 3 2 5 4 حتتاج امل�صفوفات �إىل لبنة ذاكرة متجاورة. ال حتتاج القوائم املرتابطة �إىل �أن تكون متجاورة يف الذاكرة ولكن يزداد حجمها بطريقة متغرية. �شكل :1.26مثال على تخ�صي�صيّ الذاكرة الثابتة واملتغرية. 43 القائمة املرتابطة Linked List القائم��ة املرتابط��ة ه��ي ن��وع م��ن هي��اكل البيان��ات اخلط َّي��ة ،وه��ي واح��دة م��ن هي��اكل البيان��ات األأك�رثر �ش��هرة يف الربجم��ة .القائم��ة املرتابط��ة ت�ش��به �سل�س��لة م��ن ال ُعق��د. حتت��وي كل عُ ق��دة عل��ى حقل�نين :حق��ل البيان��ات حي��ث ُتخ��زن البيان��ات ،وحق��ل يحتوي عل��ى امل�ؤ�ش��ر ال��ذي ُي�ش�رير �إىل ال ُعق��دة التالي��ةُ .ي�س��تثنى م��ن هذا ال ُعق��دة األأخرية التي ال يحم��ل فيه��ا حق��ل العن��وان �أي بيان��ات� .إح��دى مزاي��ا القائم��ة املرتابط��ة ه��ي �أن حجمها يزداد �أو يقل ب�إ�ضافة �أو حذف ال ُعقد. القيمة الفارغة ()Null الر�أ�س ()Head القائمة املرتابطة -2 ABC 7.2?