Presentation is loading. Please wait.

Presentation is loading. Please wait.

ساختمان داده ها و الگوريتمها

Similar presentations


Presentation on theme: "ساختمان داده ها و الگوريتمها"— Presentation transcript:

1 ساختمان داده ها و الگوريتمها
صف Queue ساختمان داده ها و الگوريتمها

2 صف نيز مانند پشته براي نگهداري مجموعه هاي پويا استفاده مي شود
صف Queue صف نيز مانند پشته براي نگهداري مجموعه هاي پويا استفاده مي شود هر صف يك ابتدا و يك انتها دارد عناصر جديد به انتهاي صف اضافه مي شوند عناصر قديمي از ابتداي صف حذف مي شوند صف براي پياده سازي نوبت بندي استفاده مي شود و سا ختار آن First In First Out (FIFO) است. M A S in out

3 هر صف ابتدا و انتهايي دارد
صف Queue هر صف ابتدا و انتهايي دارد ابتداي صف(head): محلي است كه عضو موجود در آن كانديداي حذف است. انتهاي صف(tail): محلي است كه عضو جديدي كه وارد صف مي شود در آن قرار مي گيرد هر صف ظرفيت محدودي دارد هر صف مي توان در يكي از وضعيتهاي پر، نيمه پر يا خالي باشد اگر ابتدا و انتهاي صف يكي باشند، صف خالي است اگر ابتداي صف بلافاصله بعد از انتهاي آن باشد، صف پر است. مشابه پشته مي توان صف را براحتي با استفاده از آرايه پياده سازي كرد

4 مثال صف

5 public interface Queue { public boolean isEmpty();
The Interface Queue public interface Queue { public boolean isEmpty(); public Object getFrontEelement(); public Object getRearEelement(); public void put(Object theObject); public Object remove(); }

6 بازنگري كاربردهاي پشته
جاهايي كه نمي توان از صف به جاي پشته استفاده كرد: Parentheses matching. Towers of Hanoi. Method invocation and return. Try-catch-throw implementation. جاهايي كه مي توان از صف به جاي پشته استفاده كرد: Rat in a maze. Results in finding shortest path to exit.

7 Label all reachable squares 1 unit from start.
Lee’s Wire Router start pin end pin Could use rat in a maze animation from Web site instead. Blue squares are blocked squares. Orange squares are available to route a wire. A queue of reachable squares is used. The queue is initially empty, and the start pin square/cell is the examine cell. This cell has a distance value of 0. Unreached unblocked squares adjacent to the examine cell are marked with their distance (this is 1 more than the distance value of the examine cell) and added to the queue. Then a cell is removed from the queue and made the new examine cell. This process is repeated until the end pin is reached or the queue becomes empty. Cells become examine cells in order of their distance from the start pin. Label all reachable squares 1 unit from start.

8 Label all reachable unlabeled squares 2 units from start.
Lee’s Wire Router start pin end pin 1 1 Label all reachable unlabeled squares 2 units from start.

9 Label all reachable unlabeled squares 3 units from start.
Lee’s Wire Router start pin 2 2 end pin 1 1 2 2 2 Label all reachable unlabeled squares 3 units from start.

10 Label all reachable unlabeled squares 4 units from start.
Lee’s Wire Router start pin 3 3 2 2 end pin 1 1 2 2 2 3 3 Label all reachable unlabeled squares 4 units from start.

11 Label all reachable unlabeled squares 5 units from start.
Lee’s Wire Router start pin 4 3 3 2 2 end pin 1 1 2 2 2 3 4 3 4 4 4 Label all reachable unlabeled squares 5 units from start.

12 Label all reachable unlabeled squares 6 units from start.
Lee’s Wire Router 5 start pin 4 5 3 3 2 2 end pin 1 1 2 2 2 3 4 3 4 5 4 4 5 5 5 Label all reachable unlabeled squares 6 units from start.

13 End pin reached. Traceback.
Lee’s Wire Router 6 5 6 start pin 4 5 3 3 2 2 end pin 1 1 2 2 2 6 3 4 3 4 5 6 4 4 5 6 5 6 5 6 6 End pin reached. Traceback.

14 End pin reached. Traceback.
Lee’s Wire Router 6 5 6 start pin 4 5 3 3 2 2 end pin 1 1 1 2 2 2 2 6 3 4 3 3 4 4 5 5 6 4 4 5 6 5 6 5 6 6 End pin reached. Traceback.

15 Derive From ArrayLinearList
1 2 3 4 5 6 a b c d e اگر front‌ انتهاي سمت چپ و rear انتهاي سمت راست ليست باشد: Queue.isEmpty() => super.isEmpty() O(1) time getFrontElement() => get(0) getRearElement() => get(size() - 1) put(theObject) => add(size(), theObject) remove() => remove(0) O(size) time

16 Derive From ArrayLinearList
1 2 3 4 5 6 e d c b a اگر front‌ انتهاي سمت راست و rear انتهاي سمت چپ ليست باشد: Queue.isEmpty() => super.isEmpty() O(1) time getFrontElement() => get(size() - 1) getRearElement() => get(0) put(theObject) => add(0, theObject) O(size) time remove() => remove(size() - 1)

17 Derive From ArrayLinearList
در ادامه همين درس نمونه اي از اين نمايش ويژه را خواهيم ديد

18 Derive From ExtendedChain
b c d e null firstNode lastNode front rear اگر front‌ انتهاي سمت چپ و rear انتهاي سمت راست ليست باشد: Queue.isEmpty() => super.isEmpty() O(1) time getFrontElement() => get(0)

19 Derive From ExtendedChain
b c d e null firstNode lastNode front rear getRearElement() => getLast() … new method O(1) time put(theObject) => append(theObject) remove() => remove(0)

20 Derive From ExtendedChain
b a null firstNode lastNode rear front اگر front‌ انتهاي سمت راست و rear انتهاي سمت چپ ليست باشد: Queue.isEmpty() => super.isEmpty() O(1) time getFrontElement() => getLast()

21 Derive From ExtendedChain
b c d e null firstNode lastNode rear front getRearElement() => get(0) O(1) time put(theObject) => add(0, theObject) remove() => remove(size-1) O(size) time

22 ليست پيوندي ويژه صف كلاس ليست پيوندي ويژه اي براي نمايش صف تعريف كنيد تا كارايي بالاتري را نسبت به استفاده از كلاسهاي موجود داشته باشيد

23 نمايش چرخشي آرايه استفاده از آرايه يك بعدي براي نمايش صف queue[] [0]
[1] [2] [3] [4] [5]

24 چيدن سه عضو در يك آرايه چرخشي:
نمايش چرخشي آرايه چيدن سه عضو در يك آرايه چرخشي: [0] [1] [2] [3] [4] [5] A B C

25 نمايش چرخشي آرايه ترتيب ديگر چيدن سه عضو [0] [1] [2] [3] [4] [5] A B C

26 استفاده از متغيرهاي صحيح front, rear براي نمايش ابتدا و انتهاي صف
نمايش چرخشي آراي استفاده از متغيرهاي صحيح front, rear براي نمايش ابتدا و انتهاي صف front به محلي از آرايه اشاره مي كند که يكی قبل از اولين عضو آرايه – در جهت ساعتگرد – قرار دارد rear به آخرين عضو آرايه اشاره مي كند [0] [1] [2] [3] [4] [5] A B C [0] [1] [2] [3] [4] [5] A B C rear rear front front

27 rear‌ را در جهت ساعتگرد يك واحد جلو مي بريم :
افزودن يك عضو rear‌ را در جهت ساعتگرد يك واحد جلو مي بريم : [0] [1] [2] [3] [4] [5] A B C front rear

28 عضو جديد را در محل queue[rear]. قرار مي دهيم
افزودن يك عضو rear‌در جهت ساعتگرد يك واحد جلو مي بريم : عضو جديد را در محل queue[rear]. قرار مي دهيم [0] [1] [2] [3] [4] [5] A B C front rear D

29 front‌ را يك واحد جلو مي بريم
حذف يك عضو front‌ را يك واحد جلو مي بريم [0] [1] [2] [3] [4] [5] A B C front rear

30 عضو queue[front]. را مي خوانيم
حذف يك عضو front‌ را يك واحد جلو مي بريم عضو queue[front]. را مي خوانيم [0] [1] [2] [3] [4] [5] A B C front rear

31 حركت rear‌در جهت ساعتگرد
if (rear = = queue.length) rear = 0; [0] [1] [2] [3] [4] [5] A B C front rear rear = (rear + 1) % queue.length;

32 صف خالي [0] [1] [2] [3] [4] [5] A B C front rear

33 صف خالي [0] [1] [2] [3] [4] [5] B C rear front

34 صف خالي [0] [1] [2] [3] [4] [5] C rear front

35 صف خالي [0] [1] [2] [3] [4] [5] rear front بعد از حذف چندين عضو، صف خالي مي شود و front = rear. هنگام ساخت اوليه، صف خالي است بنابراين در ابتداي ساختن صف بهتر است :front = rear = 0.

36 صف پر [0] [1] [2] [3] [4] [5] A B C front rear

37 صف پر [0] [1] [2] [3] [4] [5] rear D front C B A

38 صف پر [0] [1] [2] [3] [4] [5] rear D E front C B A

39 بعد از افزودن چند عضو، صف پر مي شود و در نتيجه :front = rear.
[0] [1] [2] [3] [4] [5] D E front C F B A rear بعد از افزودن چند عضو، صف پر مي شود و در نتيجه :front = rear. چگونه صف پر را از خالي تشخيص دهيم ؟

40 صف دوطرفه Deque / Double Ended Queue
صفهای ویژه صف اولویت دار کاربرد: Event Handling پیاده سازی: درخت Heap صف دوطرفه Deque / Double Ended Queue کاربرد: شبیه سازی سیستمهای موازی و همروند پیاده سازی: لیست پیوندی دوطرفه

41 Keyboard Buffer Windows Event Queue
صف هاي مهم Keyboard Buffer هر حرفي را كه با استفاده از صفحه كليد تايپ مي كنيد در حافظه اي قرار مي گيرد كه به Keyboard Buffer معروف است. سيستم عامل به طور مرتب اين حافظه را تحت نظر دارد و حرف موجود در ابتداي اين صف را برداشته و به مصرف مي رساند اگر تايپ شما آنقدر سريع باشد كه اين حافظه پر شود، كامپيوتر با بوق كوتاهي شما را مطلع مي سازد اين حالت، در سيستم عامل Dos، كه بافر آن گنجايش حداكثر 16 حرف را دارد، خيلي اتفاق مي افتد(مي افتاد!؟) Windows Event Queue در سيستم عامل ويندوز، هر واقعه(فشار دادن كليد، كليك ماووس، فرارسيدن زماني خاص و...) در يك صف واقعه مختص هر برنامه قرار مي گيرد.

42 پروژه2 – حل مساله موش و پنير با استفاده از صف
اين مساله در درس پشته ها و همچنين صفها بررسي شد اين مساله را با استفاه از صف حل كنيد توضيحات بيشتر در سايت درس


Download ppt "ساختمان داده ها و الگوريتمها"

Similar presentations


Ads by Google