לחצי פונקציות של אלגוריתם ב- Python
ה לַחֲצוֹת מודול ב-Python מספק פונקציות פשוטות ומהירות (מבוססות חיפוש בינארי) לחיפוש אלמנט ברשימה ממוינת למצוא את המיקום הנכון להוספת אלמנטים חדשים ולהכנסת אלמנטים חדשים כדי להבטיח שהרשימה תישאר ממוינת.
למה אנחנו צריכים מודול Bisect?
- שימושי לפעולות חיפוש בינאריות לחיפוש ברשימה ממוינת ולאיתור נקודות הכנסה.
- מספק שיטות יעילות להכנסת אלמנטים לרשימה ממוינת תוך שמירה על הסדר.
- מונע את הצורך במיון ידני לאחר כל החדרה וחוסך זמן ומאמץ.
- מציע פונקציות כמו bisect() bisect_left() bisect_right() ו- insort() לקוד אופטימלי נקי.
- אידיאלי למשימות כמו שמירה על נתונים מדורגים בטבלאות או כל תרחיש הכולל הכנסת/חיפוש נתונים ממוינים.
פונקציות הליבה של מודול Bisect
מודול החצייה מציע בעיקר שני סוגים של פונקציונליות:
- מציאת נקודת ההכנסה (ללא הכנסה)
- הכנסת אלמנטים במיקום הנכון
1. מציאת נקודות הכנסה
פונקציות אלו מחזירות את האינדקס שבו יש להכניס את האלמנט החדש כדי לשמור על מיון הרשימה.
a) bisect.bisect(): מחזירה את נקודת ההכנסה הימנית ביותר עבור הרכיב. אם האלמנט כבר קיים, נקודת ההכנסה תהיה אחרי הערכים הקיימים.
bisect.bisect(list num beg=0 end=len(list))
פָּרָמֶטֶר:
- רְשִׁימָה: רשימה ממוינת.
- מספר: אלמנט להוספה.
- לְהִתְחַנֵן: התחל אינדקס לחיפוש (אופציונלי).
- סוֹף: אינדקס סיום לחיפוש (אופציונלי).
ב) bisect.bisect_left(): מחזירה את נקודת ההכנסה השמאלית ביותר עבור הרכיב. אם האלמנט קיים, נקודת ההכנסה תהיה לפני הערכים הקיימים.
bisect.bisect_left(list num beg=0 end=len(list))
ג) bisect.bisect_right(): זהה ל-bisect.bisect() מחזירה את נקודת ההכנסה הימנית ביותר.
bisect.bisect_right(list num beg=0 end=len(list))
דוּגמָה: מצא מדדי הכנסה עבור הערך 4 ברשימה ממוינת באמצעות פונקציות חצויות שונות.
Python import bisect li = [ 1 3 4 4 4 6 7 ] print ( bisect . bisect ( li 4 )) # right print ( bisect . bisect_left ( li 4 )) # left print ( bisect . bisect_right ( li 4 0 4 )) # subright
תְפוּקָה
5 2 4
הֶסבֵּר:
- חצוי(לי 4): מחזירה 5 מכיוון שהיא מוצאת את המיקום הימני ביותר אחרי ה-4 האחרונות ברשימה (אינדקס 4) כך שנקודת ההכנסה היא 5.
- bisect_left(li 4): מחזירה 2 מכיוון שהוא מוצא את המיקום השמאלי ביותר לפני ה-4 הראשונות ברשימה (אינדקס 2).
- bisect_right(li 4 0 4): עובד רק ברשימה משנה ש[0:4] ומחזיר 4 כי הוא מוסיף 4 אחרי ה-4 האחרונות ברשימה המשנה.
2. הכנסת אלמנטים
פונקציות אלה מכניסות את האלמנט במיקום הנכון כדי לשמור על המיון.
a) bisect.insort(): מכניס את האלמנט במיקום הימני ביותר. בניגוד לפונקציות bisect() זה בעצם משנה את הרשימה על ידי הכנסת האלמנט.
bisect.insort(list num beg=0 end=len(list))
פָּרָמֶטֶר:
- רְשִׁימָה: רשימה ממוינת.
- מספר: אלמנט להוספה.
- מתחנן (אופציונלי): אינדקס התחל להוספה (ברירת מחדל 0).
- סוף (אופציונלי): אינדקס סיום להוספה (ברירת מחדל len(list)).
ב) bisect.insort_left(): מכניס את האלמנט במיקום השמאלי ביותר.
bisect.insort_left(list num beg=0 end=len(list))
ג) bisect.insort_right(): מכניס את האלמנט במיקום הימני ביותר (בדומה ל-insort()).
bisect.insort_right(list num beg=0 end=len(list))
דוּגמָה: הכנס את הערך 5 לרשימה ממוינת תוך שמירה על מיון באמצעות אסטרטגיות הכנסה שונות.
Python import bisect l1 = [ 1 3 4 4 4 6 7 ] l2 = [ 1 3 4 4 4 6 7 ] l3 = [ 1 3 4 4 4 6 7 ] bisect . insort ( l1 5 ) # right print ( l1 ) bisect . insort_left ( l2 5 ) # left print ( l2 ) bisect . insort_right ( l3 5 0 4 ) # subright print ( l3 )
תְפוּקָה
[1 3 4 4 4 5 6 7] [1 3 4 4 4 5 6 7] [1 3 4 4 5 4 6 7]
הֶסבֵּר:
- להתעורר (l1 5) מכניס 5 במיקום המתאים ביותר - אחרי כל ה-4 ולפני 6.
- insort_left(l2 5) מוסיף 5 במיקום המתאים ביותר השמאלי - זהה להוספת כאן מכיוון ש-5 אינו ברשימה.
- insort_right(l3 5 0 4) מוסיף 5 באינדקס 4 עובד רק על תת-רשימה l3[0:4] = [1 3 4 4] אחרי ≤ 5 האחרון בטווח הזה מבלי להשפיע על שאר הרשימה.