Deque מייצג תור Double-Ended. זהו סוג מיוחד של מבנה נתונים המאפשר לך להוסיף ולהסיר אלמנטים משני הקצוות ביעילות.
שלא כמו תורים רגילים (שבדרך כלל עוקבים אחר First In First Out) ה-deque תומך גם בפעולות FIFO וגם LIFO. זה עושה את זה מאוד גמיש ושימושי ביישומים בעולם האמיתי כמו תזמון משימות בעיות בחלון הזזה ועיבוד נתונים בזמן אמת.
דוּגמָה:
Pythonfrom collections import deque # Declaring deque de = deque(['name''age''DOB']) print(de)
תְפוּקָה
deque(['name' 'age' 'DOB'])

למה אנחנו צריכים דקוו
- הוא תומך בזמן O(1) להוספה/הסרה של אלמנטים משני הקצוות.
- זה יעיל יותר מרשימות עבור פעולות חזיתיות.
- זה יכול לתפקד גם בתור (FIFO) וגם כמחסנית (LIFO).
- אידיאלי לתזמון בעיות בחלון הזזה ועיבוד נתונים בזמן אמת.
- הוא מציע שיטות מובנות חזקות כמו appendleft() popleft() ו לְסוֹבֵב().
סוגי קלט מוגבל
- Deque מוגבל קלט : הקלט מוגבל בקצה אחד ואילו מחיקה מותרת בשני הקצוות.
- Deque מוגבל פלט : הפלט מוגבל בקצה אחד אך הוספה מותרת בשני הקצוות.
פעולות על דסק
להלן טבלה המפרטת את הפעולות המובנות של ה-deque ב-Python עם תיאורים ומורכבות הזמן המתאימה להם:
רשימה בלתי ניתנת לשינוי
| מִבצָע | תֵאוּר | מורכבות זמן |
|---|---|---|
| append(x) | מוסיףxלקצה הימני של הדק. | O(1) |
| appendleft(x) | מוסיףxלקצה השמאלי של הדסק. | O(1) |
| פּוֹפּ() | מסיר ומחזיר אלמנט מהקצה הימני של ה-deque. | O(1) |
| popleft() | מסיר ומחזיר אלמנט מהקצה השמאלי של ה-deque. | O(1) |
| להרחיב (ניתן לחזור) | מוסיף את כל האלמנטים מiterableלקצה הימני של הדק. | בְּסֵדֶר) |
| extendleft (iterable) | מוסיף את כל האלמנטים מiterableלקצה השמאלי של הדסק (סדר הפוך). | בְּסֵדֶר) |
| להסיר (ערך) | מסיר את המופע הראשון שלvalueמהדסק. מעלהValueErrorאם לא נמצא. | עַל) |
| סובב (n) | מסובב את הדסקnצעדים ימינה. אִםnהוא שלילי מסתובב שמאלה. | בְּסֵדֶר) |
| בָּרוּר() | מסיר את כל האלמנטים מהדק. | עַל) |
| ספירה (ערך) | סופר את מספר המופעים שלvalueבדסק. | עַל) |
| אינדקס (ערך) | מחזירה את האינדקס של המופע הראשון שלvalueבדסק. מעלהValueErrorאם לא נמצא. | עַל) |
| לַהֲפוֹך() | הופך את האלמנטים של הדסק למקומם. | עַל) |
הוספה ומחיקה של פריטי תור
- append(x): מוסיף x לקצה הימני של הדסק.
- appendleft(x): מוסיף x לקצה השמאלי של הדסק.
- להרחיב (ניתן לעבור): מוסיף את כל האלמנטים מהחזרה לקצה הימני.
- extendleft(iterable): מוסיף את כל האלמנטים מהחזרה לקצה השמאלי (בסדר הפוך).
- להסיר (ערך): מסיר את ההופעה הראשונה של הערך שצוין מה-deque. אם הערך לא נמצא, זה מעלה ValueError.
- פּוֹפּ(): מסיר ומחזיר אלמנט מהקצה הימני.
- popleft(): מסיר ומחזיר אלמנט מהקצה השמאלי.
- בָּרוּר(): מסיר את כל האלמנטים מהדק.
from collections import deque dq = deque([10 20 30]) # Add elements to the right dq.append(40) # Add elements to the left dq.appendleft(5) # extend(iterable) dq.extend([50 60 70]) print('After extend([50 60 70]):' dq) # extendleft(iterable) dq.extendleft([0 5]) print('After extendleft([0 5]):' dq) # remove method dq.remove(20) print('After remove(20):' dq) # Remove elements from the right dq.pop() # Remove elements from the left dq.popleft() print('After pop and popleft:' dq) # clear() - Removes all elements from the deque dq.clear() # deque: [] print('After clear():' dq)
תְפוּקָה:
After extend([50 60 70]): deque([5 10 20 30 40 50 60 70])
After extendleft([0 5]): deque([5 0 5 10 20 30 40 50 60 70])
After remove(20): deque([5 0 5 10 30 40 50 60 70])
After pop and popleft: deque([0 5 10 30 40 50 60])
After clear(): deque([])
גישה לפריט ואורך הדסק
- הוספה לאינדקס: גישה לאלמנטים לפי מיקום באמצעות מדדים חיוביים או שליליים.
- רַק(): מחזירה את מספר האלמנטים ב-deque.
import collections dq = collections.deque([1 2 3 3 4 2 4]) # Accessing elements by index print(dq[0]) print(dq[-1]) # Finding the length of the deque print(len(dq))
תְפוּקָה
1 4 7
ספירת סיבוב והיפוך של דסק
- ספירה (ערך): שיטה זו סופרת את מספר המופעים של אלמנט ספציפי ב-deque.
- סובב (n): שיטה זו מסובבת את ה-deque ב-n שלבים. n חיובי מסתובב ימינה ו-n שלילי מסתובב שמאלה.
- לַהֲפוֹך(): שיטה זו הופכת את סדר האלמנטים בדסק.
from collections import deque # Create a deque dq = deque([10 20 30 40 50 20 30 20]) # 1. Counting occurrences of a value print(dq.count(20)) # Occurrences of 20 print(dq.count(30)) # Occurrences of 30 # 2. Rotating the deque dq.rotate(2) # Rotate the deque 2 steps to the right print(dq) dq.rotate(-3) # Rotate the deque 3 steps to the left print(dq) # 3. Reversing the deque dq.reverse() # Reverse the deque print(dq)
תְפוּקָה
3 2 deque([30 20 10 20 30 40 50 20]) deque([20 30 40 50 20 30 20 10]) deque([10 20 30 20 50 40 30 20])