Data Structures in AI - Part 2 PDF
Document Details
Uploaded by DedicatedSilver
الحكم بن هشام بالمهد - مسارات
Tags
Summary
This document explains data structures used in artificial intelligence (AI). It describes different types of data structures, such as primitive and non-primitive data structures, and covers examples of linear and non-linear structures. It also provides practical code examples using Python. The document is intended for instructional purposes and demonstrates fundamental programming concepts related to AI applications.
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 , in () 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: ----------------------------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: ----------------------------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 , in () 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 5 شكل :1.27ر سم تو ضيحي للقائمة املرتابطة القائمة املرتابطة (:)Linked List القائم ة املرتابط ة ه ي ن وع م ن هي اكل البيان ات اخلط َّي ة الت ي ت ش به سل س لة م ن العُقد. العُقدة (:)Node ال ُعق دة ه ي اللبن ة الفردي ة املُك ِّون ة لهي كل البيان ات وحتت وي عل ى البيان ات وراب ط واح د أو أ ك رثر م ن الرواب ط الت ي تربطه ا بالعُقد األأخرى. العُقدة Node تتكون كل عُ قدة يف القائمة املرتابطة من جزئني: اجلزء األأول يحتوي على البيانات. اجلزء الثاين يحتوي على م ؤ شر يُ شري إىل العُقدة التالية. 12 م ؤ شر إلى العُقدة التالية. لقراءة حمتوى عُقدة حمددة ،عليك املرور على كل العُقد ال سابقة. شكل :1.28ر سم تو ضيحي للعُقد مثااًل على القائمة املرتابطة لألأعداد ال صحيحة. لت شاهد ً تتكون القائمة املرتابطة من خم س عُ قد. القيمة الفارغة 21 الر أ س 95 حقل البيانات. 1 12 3 القيمة الفارغة تعني أنها بال قيمة ،أو غري ُحُمدَّدة ،أو فارغة.على الرغم من أنه يف بع ض األأحيان ن ستخدم الرقم 0لإلإ شارة إىل القيمة الفارغة، إال أنه رقم حمدَّد وقد ي شري إىل قيمة حقيقية. شكل :1.29ر سم تو ضيحي ُمُيثّل قائمة مرتابطة لألأعداد ال صحيحة ال ُعق د يف القائم ة ال يك ون له ا ا س م ،وم ا تعرف ه عنها هو عنوانها (املوقع الذي تخزن في ة العُقدة يف الذاكرة).للو صول إىل أي عُ ق دة بالقائم ة ،حتت اج فق ط إىل معرف ة عن وان ال ُعق دة األأوىل.ث م تتب ع سل س لة ال ُعق د للو ص ول إىل ال ُعق دة املطلوبة. 44 عل ى س بيل املث ال ،إن كن ت ترغب يف الو ص ول إىل العُقدة الثالثة يف القائم ة ملعاجل ة البيان ات التي حتتوي عليها ،عليك البدء من ال ُعق دة األأوىل يف القائم ة ،وم ن ال ُعق دة األأوىل للو ص ول إىل الثانية ،ومن الثانية للو صول إىل الثالثة. عنوان العُقدة األأوىل ُخُمزَّن يف مُتغري خا ص (مُ ستقِل) يُطلق عليه عاد ًة الر أ س (.)Head قيمة م ؤ شر العُقدة األأخرية يف القائمة قيمة فارغة (،)Null ُومُيثَّل بالرمز . عندما تكون القائمة فارغة ،ي ش رير م ؤ ش ر الر أ س إىل القيمة الفارغة (.)Null الر أ س القيم الفارغة 25 30 العُقدة الثالثة 15 العُقدة الثانية العُقدة األأوىل شكل :1.30الو صول إىل العُقدة الثالثة يف القائمة املرتابطة إلي ك مث ً ااًل تو ضيح ًي ا عل ى القائم ة املرتابط ة يف ش كل ،1.31كما ذُ ك ر من قبل ف إن كل عُ قدة تتكون من بيانات وم ؤ ش ر ي شري إىل ال ُعقدة التالية ،بحيث تُخزّن كل عُ قدة يف الذاكرة يف عنوان ُحُم َّدد. لرنب ط ال ُعق دة ال س ابقة بال ُعق دة التالي ة بقيم ة بيان ات ،42 الت ي بدوره ا تُ ش رير إىل ال ُعق دة الثالث ة واألأخ ريرة عن د عن وان 30بقيمة بيانات .37 37 30 30 42 20 20 15 مثال على العُقدة: بيانات العُقدة هي الرقم .15 عنوان العُقدة يف الذاكرة هو .10 عنوان العُقدة التالية هو .20 10 20 العنوان التايل 15 البيانات 10 العنوان/الر أ س شكل :1.31امل ؤ شرات يف القائمة املرتابطة جدول :1.8االختالفات بني القائمة والقائمة املرتابطة القائمة االختالفات طريقة تخزين الذاكرة املواقع متجاورة يف الذاكرة. ميكن الو صول إىل كل عن صر برقم الهيكل الفهر س (.)Index يُخ َّزن كل عن صر تلو اآلآخر. احلجم القائمة املرتابطة املواقع ع شوائية يف الذاكرة. ميكن الو صول إىل العنا صر من خالل امل ؤ شر (.)Pointer ُتخ زَّن الكائن ات يف ص ورة عُ ق د حتت وي عل ى البيانات وعنوان العن صر التايل. تُخ َّزن البيانات وامل ؤ شرات يف الذاكرة. تُخ َّزن البيانات وحدَ ها يف الذاكرة. ا ستخدام الذاكرة نوع الو صول إىل البيانات الو صول الع شوائي إىل أي عن صر بالقائمة.الو صول املت سل سل إىل العنا صر. سرعة إ ضافة العنا صر وحذفها. سرعة اإلإ ضافة واحلذف بطء إ ضافة العنا صر وحذفها. 45 القائمة املرتابطة يف لغة البايثون Linked List in Python ال تُوف ر لغ ة البايث ون ن وع بيان ات ُحُم َّدد ُم س بقًا للقوائ م املرتابطة.عليك إن ش اء نوع البيانات متثياًل لهذا النوع من البيانات.إلإن شاء اخلا ص بك ،أو ا ستخدام مكتبات البايثون التي توفر ً قائم ة مرتابط ة ،ا س تخدم فئ ات البايث ون.يف املث ال املو ض ح بال ش كل ،1.32ستُن ش ئ قائم ة مرتابطة مكونة من ثالث ُعقد ،كل واحدة ت ضم يومً ا من أيام األأ سبوع. Wednesday Tuesday شكل :1.32مثال على القائمة املرتابطة Monday الفئة (:)Class الفئ ة ه ي هي كل بيان ات مع رّف بوا س طة امل س تخدم ،ويحت وي عل ى أع ضاء البيانات (ال س مات ،)Propertiesوالطرا ئ ق ( ا ل س لو ك )B e h a v i o r اخلا ص ة بها.وتُ س تخدَ م الفئات كقوالب إلإن شاء الكائنات. ستُن شئ ًأواًل عُ قدة با ستخدام الفئة. # single node class Node: def __init__(self, data, next=None): self.data = data # node data self.next = next # Pointer to the next node # Create a single node )"first = Node("Monday )print(first.data Monday اخلطوة التالية هي إن ش اء قائمة مرتابطة حتتوي على عُ قدة واحدة ،وهذه املرة ستَ س تخدِ م م ؤ ش ر الر أ س لإلإ ش ارة إىل العُقدة األأوىل. # single node class Node: def __init__(self, data = None, next=None): self.data = data self.next = next # linked list with one head node class LinkedList: def __init__(self): self.head = None # list linked with a single node )(Linkedlist1 = LinkedList )"Linkedlist1.head = Node("Monday )print(Linkedlist1.head.data Monday 46 ِأ ض ْف اآلآن املزيد من العُقد إىل القائمة املرتابطة. # single node class Node: def __init__(self, data = None, next=None): self.data = data self.next = next # an empty linked list with a head node. class LinkedList: def __init__(self): self.head = None # the main program )(linked_list = LinkedList # the first node )"linked_list.head = Node("Monday # the second node )"linked_list.head.next = Node("Tuesday # the third node )"linked_list.head.next.next = Node("Wednesday # print the linked list node = linked_list.head while node: )print (node.data node = node.next تُ ستخدَ م عبارة whileللتنقل من عُ قدة إلى أخرى. Monday Tuesday Wednesday إ ضافة العُقدة إىل القائمة املرتابطة 99 Add a Node to a Linked List لتتمكن من إ ضافة عُ قدة جديدة ،اتبع اخلطوات التالية: يج ب أن يُ ش رير م ؤ ش ر ال ُعق دة األأوىل إىل عن وان ال ُعق دة اجلدي دة ،حت ى ت صبح العُقدة اجلديدة هي العُقدة الثانية. يجب أن يُ شري م ؤ شر العُقدة اجلديدة (الثانية) إىل عنوان العُقدة الثالثة. به ذه الطريق ة ،ل ن حتت اج إىل تغي رير العنا ص ر عن د إ ضاف ة عن ص ر جدي د يف املنت ص ف.تقت ص ر العملي ة عل ى تغيري ِقيَم العناوين يف العُقدة التي تُ س رِّع من عملية اإلإ ضافة يف حالة القوائم املرتابطة ،مقارنًة بحالة القوائم املت سل سلة. مثال: 12 node node.next .1أن ش ئ ال ُعق دة اجلديدة. 99 node.next.next لدي ك قائم ة مرتابط ة م ن عن صري ن 12 :و ،99وتري د إدراج العن ص ر 37كعن ص ر ثانٍ بالقائمة.يف النهاية ،سيكون لديك قائمة من ثالثة عنا صر 12 :و 37و.99 2 1 37 37 3 node.next 12 node .2اربُط العُقدة 37بالعُقدة .99 .3ار ُب ط ال ُعق دة 12بال ُعق دة 37 (متت إ ضافة العُقدة اجلديدة). 47 # single node class Node: def __init__(self, data = None, next=None): self.data = data self.next = next # linked list with one head node class LinkedList: def __init__(self): self.head = None def insertAfter(new, prev): # create the new node new_node = Node(new) # make the next of the new node the same as the next of the previous node new_node.next = prev.next # make the next of the previous node the new node prev.next = new_node # create the linked list L_list = LinkedList() # add the first two nodes L_list.head = Node(12) second = Node(99) L_list.head.next = second # insert the new node after node 12 (the head of the list) insertAfter(37, L_list.head) # print the linked list node = L_list.head while node: print (node.data) node = node.next 12 37 99 Delete a Node from a Linked List حذف العُقدة من القائمة املرتابطة. عليك تغيري ُم ؤ شر العُقدة التي ت سبق العُقدة املراد حذفها إىل م ؤ شر العُقدة التي تلي العُقدة املحذوفة،حلذف عُ قدة خ ص ص م س احة الذاكرة َّ ) و س ُتUseless Data( أ صبح ت ال ُعق دة املحذوف ة (الثاني ة) عب ارة ع ن بيانات غري ُمفيدة.التي ت شغلها ال ستخدامات أخرى :مثال س يكون لدي ك، يف النهاي ة.37 وترغ ب يف ح ذف العن ص ر،99 و37 و12 :لدي ك قائم ة مرتابط ة م ن ثالث ة عنا ص ر.99 و12 :قائمة من عن صرين 48 # single node class Node: def __init__(self, data = None, next=None): self.data = data self.next = next # linked list with one head node class LinkedList: def __init__(self): self.head = None def deleteNode(key, follow): # store the head node 12 37 99 node node.next node.next.next.99 بالعُقدة12 اربُط م ؤ شر العُقدة.1.37 احذف العُقدة.2 1 12 node node.next temp = follow.head 37 # find the key to be deleted, # the trace of the previous node to be changed while(temp is not None): if temp.data == key: break prev = temp temp = temp.next # unlink the node from the linked list prev.next = temp.next temp = None 99 2 node.next النتيجة النهائية.3 12 99 node node.next 3 # create the linked list L_list = LinkedList() # add the first three nodes L_list.head = Node(12) second = Node(37) third = Node(99) L_list.head.next = second second.next = third # delete node 37 deleteNode(37,L_list) # print the linked list node = L_list.head while node: print (node.data) node = node.next 12 99 49 إذا كنت تريد حذف العُقدة األأوىل من عليك نقل م ؤ شر،القائمة املرتابطة.الر أ س إىل العُقدة الثانية من القائمة