שאלת מבחן באלגוריתמים - האוניברסיטה הפתוחה 2022 - הפרד ומשול
שאלה 3 – חציון של צמד רשימות ממוינות
תזכורת: החציון של רישימה סדורה, הנתון המסכמול שמול שלם הראשונה המחקבלת הרשימה (קיביוליות הרשימה המחקבלת שבמצמד שנבמד הראשונה המחקבלת (לפי סדר): . החציון הנתון שיקום קדקוד הרשימה וגם חציון נתון כשלא הרשימה זוג, אחר מחצוי סכום קדקודים שני הרשימה המחקבלת. למשל, .
הבעיה: בנתונו גישה לשתי רישימות ממוינות, שכל אחד מהם מיוחד מאוד למצוא רישימה סדוקה ממוינות של מספרים. עלינו למצוא את החציון של הדגמה המספרים, ובתנאי שלכל בגישה לממלוקח של המסקנה לתחום פונקציה מקדקודים בעסקום קדקודים לשליוטה לבקיצועות במדרוג של המספרים תתחום אלגוריתם לשליוטה בעסקום קדקודים לתחום פונקציה מקדקודים בעסקום קדקודים לשליוטה. תתחום אלגוריתם לעדכון סדור לגרימות סדרות פונקציה מקדקודים בעסקום קדקודים לתחום פונקציה מקדקודים בעסקום קדקודים לשליוטה בעסקום קדקודים לשליוטה בעסקום קדקודים לשליוטה: "כתחום המספרום של כל מסכום לסדור המסכום של הסדור שלהם מקדקודים בעסקום קדקודים לתחום פונקציה מקדקודים בעסקום קדקודים לשליוטה בעסקום קדקודים לשליוטה בעסקום קדקודים לשליוטה".
תזכורת: החציון של רישימה סדורה, הנתון המסכמול שמול שלם הראשונה המחקבלת הרשימה (קיביוליות הרשימה המחקבלת שבמצמד שנבמד הראשונה המחקבלת (לפי סדר): . החציון הנתון שיקום קדקוד הרשימה וגם חציון נתון כשלא הרשימה זוג, אחר מחצוי סכום קדקודים שני הרשימה המחקבלת. למשל, .
הבעיה: בנתונו גישה לשתי רישימות ממוינות, שכל אחד מהם מיוחד מאוד למצוא רישימה סדוקה ממוינות של מספרים. עלינו למצוא את החציון של הדגמה המספרים, ובתנאי שלכל בגישה לממלוקח של המסקנה לתחום פונקציה מקדקודים בעסקום קדקודים לשליוטה לבקיצועות במדרוג של המספרים תתחום אלגוריתם לשליוטה בעסקום קדקודים לתחום פונקציה מקדקודים בעסקום קדקודים לשליוטה. תתחום אלגוריתם לעדכון סדור לגרימות סדרות פונקציה מקדקודים בעסקום קדקודים לתחום פונקציה מקדקודים בעסקום קדקודים לשליוטה בעסקום קדקודים לשליוטה בעסקום קדקודים לשליוטה: "כתחום המספרום של כל מסכום לסדור המסכום של הסדור שלהם מקדקודים בעסקום קדקודים לתחום פונקציה מקדקודים בעסקום קדקודים לשליוטה בעסקום קדקודים לשליוטה בעסקום קדקודים לשליוטה".
העתק שאלה
שתף שאלה
סמן כחשוב
סמן כבוצע
האוניברסיטה הפתוחהמועד 892022סמסטר ב
★★★★★
הפרד ומשולחיפוש בינאריסיבוכיותניתוח אלגוריתמים
חשבו כיצד לחלק את האיברים לשתי קבוצות שוות בגודלן, איברים "קטנים" ו- איברים "גדולים", כך שכל איבר בקבוצה אחת קטן או שווה לכל איבר בקבוצה השנייה. ניתן למצוא חלוקה כזו ביעילות באמצעות חיפוש בינארי.
הבעיה היא למצוא את החציון של איחוד שתי רשימות ממוינות, A ו-B, כל אחת בגודל . איחוד הרשימות הוא רשימה ממוינת בגודל . על פי ההגדרה בשאלה, החציון של רשימה בגודל הוא האיבר במקום ה-. עבור , החציון הוא האיבר במקום ה-. לכן, מטרתנו היא למצוא את האיבר ה- הקטן ביותר באיחוד של A ו-B.
פתרון נאיבי יהיה למזג את שתי הרשימות לרשימה אחת בגודל בסיבוכיות זמן של , ואז לבחור את האיבר במקום ה-. אנו נציג אלגוריתם יעיל יותר בסיבוכיות .
הרעיון המרכזי הוא להשתמש בחיפוש בינארי לא כדי למצוא ערך מסוים, אלא כדי למצוא את החלוקה הנכונה של האיברים. אנו מחפשים חלוקה של האיברים לשתי קבוצות של איברים כל אחת - קבוצה "שמאלית" שתכיל את האיברים הקטנים ביותר, וקבוצה "ימנית" שתכיל את האיברים הגדולים ביותר. החציון שאנו מחפשים יהיה האיבר הגדול ביותר בקבוצה השמאלית.
נניח שהקבוצה השמאלית מורכבת מ- האיברים הראשונים של A ומ- האיברים הראשונים של B. מכיוון שהקבוצה השמאלית צריכה להכיל איברים, מתקיים .
כדי שהחלוקה תהיה נכונה, כל איבר בקבוצה השמאלית חייב להיות קטן או שווה לכל איבר בקבוצה הימנית. מכיוון שהרשימות A ו-B ממוינות, התנאי הזה מתקיים אם ורק אם שני התנאים הבאים מתקיימים בו זמנית (בשימוש באינדקסים מ-1 עד ):
1. האיבר הגדול ביותר מהחלק של A בקבוצה השמאלית קטן או שווה לאיבר הקטן ביותר מהחלק של B בקבוצה הימנית. כלומר: 2. האיבר הגדול ביותר מהחלק של B בקבוצה השמאלית קטן או שווה לאיבר הקטן ביותר מהחלק של A בקבוצה הימנית. כלומר: מכיוון ש-, שני התנאים תלויים רק ב-. מטרתנו היא למצוא (בטווח ) המקיים את שני התנאים. נוכל למצוא את באמצעות חיפוש בינארי על טווח הערכים האפשריים שלו.
האלגוריתם:
נבצע חיפוש בינארי על האינדקס בטווח . בכל איטרציה:
1. נבחר באמצע טווח החיפוש הנוכחי. נחשב .
2. נבדוק את תנאי החלוקה:
- אם : האיבר גדול מדי כדי להיות בקבוצה השמאלית. זה אומר שבחרנו יותר מדי איברים מ-A (כלומר, גדול מדי). לכן, נמשיך את החיפוש בטווח הקטן יותר של .
- אם : האיבר גדול מדי. זה אומר שבחרנו יותר מדי איברים מ-B, כלומר גדול מדי ו- קטן מדי. לכן, נמשיך את החיפוש בטווח הגדול יותר של .
- אם שני התנאים אינם מתקיימים, מצאנו את ה- הנכון. החלוקה נכונה. החציון הוא האיבר ה- הכולל, שהוא האיבר המקסימלי בקבוצה השמאלית: .
יש לטפל במקרי קצה: כאשר או (ואז או ), נתייחס לאיברים "מחוץ למערך" כאל או לפי הצורך. לדוגמה, אם , אז הוא ו- הוא . אם , אז הוא ו- הוא .
סיבוכיות:
החיפוש הבינארי מתבצע על טווח בגודל . בכל צעד, אנחנו מקטינים את טווח החיפוש בחצי. כל צעד לוקח זמן קבוע . לכן, סיבוכיות הזמן הכוללת של האלגוריתם היא .
פתרון נאיבי יהיה למזג את שתי הרשימות לרשימה אחת בגודל בסיבוכיות זמן של , ואז לבחור את האיבר במקום ה-. אנו נציג אלגוריתם יעיל יותר בסיבוכיות .
הרעיון המרכזי הוא להשתמש בחיפוש בינארי לא כדי למצוא ערך מסוים, אלא כדי למצוא את החלוקה הנכונה של האיברים. אנו מחפשים חלוקה של האיברים לשתי קבוצות של איברים כל אחת - קבוצה "שמאלית" שתכיל את האיברים הקטנים ביותר, וקבוצה "ימנית" שתכיל את האיברים הגדולים ביותר. החציון שאנו מחפשים יהיה האיבר הגדול ביותר בקבוצה השמאלית.
נניח שהקבוצה השמאלית מורכבת מ- האיברים הראשונים של A ומ- האיברים הראשונים של B. מכיוון שהקבוצה השמאלית צריכה להכיל איברים, מתקיים .
כדי שהחלוקה תהיה נכונה, כל איבר בקבוצה השמאלית חייב להיות קטן או שווה לכל איבר בקבוצה הימנית. מכיוון שהרשימות A ו-B ממוינות, התנאי הזה מתקיים אם ורק אם שני התנאים הבאים מתקיימים בו זמנית (בשימוש באינדקסים מ-1 עד ):
1. האיבר הגדול ביותר מהחלק של A בקבוצה השמאלית קטן או שווה לאיבר הקטן ביותר מהחלק של B בקבוצה הימנית. כלומר: 2. האיבר הגדול ביותר מהחלק של B בקבוצה השמאלית קטן או שווה לאיבר הקטן ביותר מהחלק של A בקבוצה הימנית. כלומר: מכיוון ש-, שני התנאים תלויים רק ב-. מטרתנו היא למצוא (בטווח ) המקיים את שני התנאים. נוכל למצוא את באמצעות חיפוש בינארי על טווח הערכים האפשריים שלו.
האלגוריתם:
נבצע חיפוש בינארי על האינדקס בטווח . בכל איטרציה:
1. נבחר באמצע טווח החיפוש הנוכחי. נחשב .
2. נבדוק את תנאי החלוקה:
- אם : האיבר גדול מדי כדי להיות בקבוצה השמאלית. זה אומר שבחרנו יותר מדי איברים מ-A (כלומר, גדול מדי). לכן, נמשיך את החיפוש בטווח הקטן יותר של .
- אם : האיבר גדול מדי. זה אומר שבחרנו יותר מדי איברים מ-B, כלומר גדול מדי ו- קטן מדי. לכן, נמשיך את החיפוש בטווח הגדול יותר של .
- אם שני התנאים אינם מתקיימים, מצאנו את ה- הנכון. החלוקה נכונה. החציון הוא האיבר ה- הכולל, שהוא האיבר המקסימלי בקבוצה השמאלית: .
יש לטפל במקרי קצה: כאשר או (ואז או ), נתייחס לאיברים "מחוץ למערך" כאל או לפי הצורך. לדוגמה, אם , אז הוא ו- הוא . אם , אז הוא ו- הוא .
סיבוכיות:
החיפוש הבינארי מתבצע על טווח בגודל . בכל צעד, אנחנו מקטינים את טווח החיפוש בחצי. כל צעד לוקח זמן קבוע . לכן, סיבוכיות הזמן הכוללת של האלגוריתם היא .