דוגמה לשיפור סיבוכיות בסדר גודל עבור פתרון בעיה במערך דו-ממדי

‫‪- 40 -‬‬
‫ד"ר נוע רגוניס‬
‫מכללת בית ברל‬
‫יתרונות הצגת הבעיה ופתרונה‬
‫מבוא‬
‫•‬
‫בהוראת סיבוכיות של אלגוריתמים אנחנו מדברים על‬
‫בדרך כלל איננו עוסקים בבעיות של מערכים דו‪-‬‬
‫שיפור בסדר גודל‪ ,‬אך לא מציגים דוגמאות רבות‬
‫מימדיים בתחום הערכת הסיבוכיות‪ ,‬פרט מן‬
‫המעידות על שיפורים מסוג זה‪.‬‬
‫העובדה הבסיסית שסריקת מערך דו‪-‬מימדי‬
‫הבעיות הקלאסיות אותן אנו מציגים בדרך כלל‬
‫היא בסיבוכיות של )‪.O(n2‬‬
‫מופיעות בטבלה המצורפת למטה‪.‬‬
‫•‬
‫מאמר זה מציג בעיה המתייחסת למערך דו‪-‬מימדי וידון‬
‫מערך דו‪-‬מימדי‪.‬‬
‫בשני פתרונות המראים שיפור בסיבוכיות בסדר גודל‪.‬‬
‫הבעיה‬
‫במערך הגדולים מכל הערכים הנמצאים בשורה שלהם‬
‫ובעמודה שלהם‪.‬‬
‫הבעיה‬
‫חיפוש מחלק של מספר‬
‫•‬
‫הפתרונות המוצגים מראים שיפור בסדר גודל‪.‬‬
‫•‬
‫הייצוג הגראפי של ניתוח הסיבוכיות‪ ,‬יכול‬
‫לשמש דגם לניתוח סיבוכיות של אלגוריתמים‪.‬‬
‫כתוב אלגוריתם המקבל מערך ‪ A‬דו‪-‬מימדי של‬
‫מספרים בגודל ‪ ,N*M‬ומחזיר את מספר הערכים‬
‫הבעיה דורשת מיומנויות טיפול באינדקסים של‬
‫בהמשך נציג שני פתרונות‪ .‬בפתרון ‪ ,1‬עבור כל תא‬
‫במערך ייבדק התנאי‪ :‬האם הערך שבו גדול מכל‬
‫הערכים שבשורה שלו‪ ,‬וגם גדול מכל הערכים‬
‫שבעמודה שלו‪ .‬אם התנאי מתקיים יקודם המונה‪.‬‬
‫בפתרון ‪ ,2‬עבור כל שורה במערך ימצא הערך‬
‫המקסימאלי בשורה ותישמר בהתאמה גם העמודה‬
‫שלו‪ .‬עבור המקסימאלי שנמצא בשורה‪ ,‬תיסרק כל‬
‫העמודה שלו וייבדק התנאי‪ :‬האם הוא גדול מכל‬
‫הערכים בעמודה זו‪ .‬אם התנאי מתקיים יקודם המונה‪.‬‬
‫הפתרון‬
‫די לחפש עד לשורש של המספר‬
‫שיפור בסיבוכיות‬
‫מ‪O(n) -‬‬
‫ל‪O(√n) -‬‬
‫למשל‪ ,‬בבדיקה האם מספר הוא‬
‫ראשוני‬
‫חיפוש ערך במערך ממוין‬
‫שימוש בחיפוש בינארי במקום‬
‫חיפוש לינארי‬
‫מ‪O(n) -‬‬
‫מיון מערך‬
‫מיון בשיטה של מיון‪-‬מיזוג במקום‬
‫שיטות המיון הקלאסיות‬
‫מ‪ O(n2) -‬ל‪O(nlog2n) -‬‬
‫הבטים בהוראת מדעי המחשב – ינואר ‪2006‬‬
‫ל‪O(log2n) -‬‬
‫‪- 41 -‬‬
‫פתרון ‪1‬‬
‫הרעיון לפתרון‬
‫עבור כל תא במערך ייבדק התנאי‪ :‬האם הערך שבו גדול מכל הערכים שבשורה שלו‪ ,‬וגם גדול מכל הערכים שבעמודה‬
‫שלו‪ .‬אם התנאי מתקיים יקודם המונה‪.‬‬
‫האלגוריתם לפתרון‬
‫מספר‪-‬גדולים‪-‬בשורה‪-‬ובעמודה )‪(A, N, M‬‬
‫} הפעולה מקבלת מערך ‪ A‬דו‪-‬מימדי של מספרים‪ ,‬ובו ‪ N‬שורות ו‪ M -‬עמודות‪.‬‬
‫{‬
‫} הפעולה מחזירה את מספר הערכים במערך הגדולים מכל הערכים בשורה שלהם‬
‫{‬
‫} ומכל הערכים בעמודה שלהם‪.‬‬
‫{‬
‫} ‪ – Counter‬מונה מספר הערכים המקיימים את התנאי‬
‫{‬
‫} ‪ – Ok‬דגל‪ ,‬ערכו ‪ true‬אם האיבר התורן מקיים את התנאי‪ ,‬וערכו ‪ false‬אחרת‬
‫{‬
‫} ‪ – I‬מציין שורה‪ – J ,‬מציין עמודה‪ – k ,‬מציין סריקה לעמודה ואח"כ לשורה‬
‫{‬
‫‪Counter ³ 0 (1‬‬
‫‪ (2‬עבור ‪ I‬מ‪ 1 -‬עד ‪ N‬בצע‬
‫סריקת המערך הדו‪-‬מימדי‪,‬‬
‫האיבר לבדיקה ]‪A [I, J‬‬
‫‪ (2.1‬עבור ‪ J‬מ‪ 1 -‬עד ‪ M‬בצע‬
‫‪(2.1.1‬‬
‫‪(2.1.2‬‬
‫‪Ok ³ true‬‬
‫‪K ³ 1‬‬
‫‪(2.1.3‬‬
‫כל עוד )‪ (K ≤M‬וגם )‪ (Ok‬בצע‬
‫‪ (2.1.3.1‬אם ]‪ A[I, J] < A[I, K‬אזי‬
‫‪Ok ³ false (2.1.3.1.1‬‬
‫בדיקה על פני‬
‫השורה ‪I‬‬
‫‪ (2.1.3.2‬אחרת‬
‫‪K ³ K + 1 (2.1.3.2.1‬‬
‫‪K ³ 1 (2.1.4‬‬
‫‪ (2.1.5‬כל עוד )‪ (K ≤N‬וגם )‪ (Ok‬בצע‬
‫‪ (2.1.5.1‬אם ]‪ A[I, J] < A[K, J‬אזי‬
‫בדיקה על פני‬
‫העמודה ‪J‬‬
‫‪Ok ³ false (2.1.5.1.1‬‬
‫‪ (2.1.5.2‬אחרת‬
‫‪K ³ K + 1 (2.1.5.2.1‬‬
‫‪ (2.1.6‬אם ‪ Ok‬אזי‬
‫‪Counter ³ Counter + 1 (2.1.6.1‬‬
‫‪ (3‬החזר ‪Counter‬‬
‫הבטים בהוראת מדעי המחשב – ינואר ‪2006‬‬
‫‪- 42 -‬‬
‫הערכת סיבוכיות הפתרון‬
‫על מנת להעריך את סיבוכיות האלגוריתם‪ ,‬נוריד ממנו את כל הפעולות שהן בסדר גודל )‪ ,O(1‬ונשאר עם מבנה‬
‫הלולאות‪ .‬יש לשים דגש כמובן על קינון הלולאות‪.‬‬
‫לולאה על ‪N‬‬
‫שורות‬
‫)‪O(n‬‬
‫‪ (2‬עבור ‪ I‬מ‪ 1 -‬עד ‪ N‬בצע‬
‫לולאה על ‪M‬‬
‫עמודות‬
‫)‪O(n‬‬
‫‪ (2.1‬עבור ‪ J‬מ‪ 1 -‬עד ‪ M‬בצע‬
‫לולאה על‬
‫השורה ‪I‬‬
‫‪ M‬עמודות‬
‫)‪O(n‬‬
‫לולאה על‬
‫העמודה ‪J‬‬
‫‪ N‬שורות‬
‫)‪O(n‬‬
‫‪(2.1.2‬‬
‫‪K ³ 1‬‬
‫‪(2.1.3‬‬
‫כל עוד )‪ (K ≤M‬וגם )‪ (Ok‬בצע‬
‫‪K ³ 1 (2.1.4‬‬
‫‪ (2.1.5‬כל עוד )‪ (K ≤N‬וגם )‪ (Ok‬בצע‬
‫כלומר‪:‬‬
‫)‪O(n‬‬
‫)‪O(n‬‬
‫)‪O(n‬‬
‫⇐‬
‫)‪O(n‬‬
‫ולכן הסיבוכיות היא )‪o(n3‬‬
‫‪(n + n) * n * n‬‬
‫הבטים בהוראת מדעי המחשב – ינואר ‪2006‬‬
‫‪- 43 -‬‬
‫פתרון ‪2‬‬
‫הרעיון לפתרון‬
‫עבור כל שורה במערך ימצא הערך המקסימאלי בשורה ותישמר בהתאמה גם העמודה שלו‪ .‬עבור המקסימאלי‬
‫שנמצא בשורה‪ ,‬תיסרק כל העמודה שלו וייבדק התנאי‪ :‬האם הוא גדול מכל הערכים בעמודה זו‪ .‬אם התנאי מתקיים‬
‫יקודם המונה‪.‬‬
‫האלגוריתם לפתרון‬
‫מספר‪-‬גדולים‪-‬בשורה‪-‬ובעמודה )‪(A, N, M‬‬
‫} הפעולה מקבלת מערך ‪ A‬דו‪-‬מימדי של מספרים‪ ,‬ובו ‪ N‬שורות ו‪ M -‬עמודות‪.‬‬
‫{‬
‫} הפעולה מחזירה את מספר הערכים במערך הגדולים מכל הערכים בשורה שלהם‬
‫{‬
‫} ומכל הערכים בעמודה שלהם‪.‬‬
‫{‬
‫} ‪ – Counter‬מונה מספר הערכים המקיימים את התנאי‬
‫{‬
‫} ‪ – Ok‬דגל‪ ,‬ערכו ‪ true‬אם נערכים בעמודה מקיימים את התנאי‪ ,‬וערכו ‪ false‬אחרת‬
‫{‬
‫} ‪ – Max‬ערך מקסימלי בשורה ה‪ – colMax ,I -‬העמודה של הערך המקסימלי בשורה ‪I‬‬
‫{‬
‫} ‪ – I‬מציין שורה‪ – J ,‬מציין עמודה‪ – k ,‬מציין סריקה לשורות‬
‫{‬
‫‪Counter ³ 0 (1‬‬
‫סריקת שורות המערך הדו‪-‬מימדי‬
‫‪ (2‬עבור ‪ I‬מ‪ 1 -‬עד ‪ N‬בצע‬
‫‪ColMax ³ 1 (2.1‬‬
‫‪Max ³ A[I, 1] (2.2‬‬
‫‪ (2.3‬עבור ‪ J‬מ‪ 2 -‬עד ‪ M‬בצע‬
‫‪ (2.3.1‬אם ]‪ Max < A[I, J‬אזי‬
‫‪ColMax ³ J (2.3.1.1‬‬
‫‪Max ³ A[I, J] (2.3.1.2‬‬
‫סריקת השורה ‪I‬‬
‫למציאת הערך המקסימלי‪,‬‬
‫שיושם ב‪,Max -‬‬
‫ומספר העמודה שלו‬
‫יושם ב‪ColMax -‬‬
‫‪Ok ³ true (2.4‬‬
‫‪K ³ 1 (2.5‬‬
‫‪ (2.6‬כל עוד )‪ (K≤N‬וגם )‪ (Ok‬בצע‬
‫‪ (2.6.1‬אם ]‪ Max < A[K, colMax‬אזי‬
‫‪Ok ³ false (2.6.1.1‬‬
‫‪ (2.6.2‬אחרת‬
‫‪K ³ K + 1 (2.6.2.1‬‬
‫‪ (2.7‬אם ‪ Ok‬אזי‬
‫‪Counter ³ Counter + 1 (2.7.1‬‬
‫‪ (3‬החזר ‪Counter‬‬
‫הבטים בהוראת מדעי המחשב – ינואר ‪2006‬‬
‫סריקת העמודה ‪ColMax‬‬
‫לבדיקה האם אין ערך גדול‬
‫מ‪ Max -‬בעמודה זו‬
‫‪- 44 -‬‬
‫הערכת סיבוכיות הפתרון‬
‫על מנת להעריך את סיבוכיות האלגוריתם‪ ,‬נוריד ממנו את כל הפעולות שהן בסדר גודל )‪ ,O(1‬ונשאר עם מבנה‬
‫הלולאות‪ .‬יש לשים דגש כמובן על קינון הלולאות‪.‬‬
‫לולאה על ‪N‬‬
‫שורות‬
‫)‪O(n‬‬
‫‪ (2‬עבור ‪ I‬מ‪ 1 -‬עד ‪ N‬בצע‬
‫לולאה על השורה ‪I‬‬
‫)‪ (M-1‬עמודות‬
‫)‪O(n‬‬
‫‪ (2.3‬עבור ‪ J‬מ‪ 2 -‬עד ‪ M‬בצע‬
‫לולאה על העמודה‬
‫‪ColMax‬‬
‫‪ N‬שורות‬
‫)‪O(n‬‬
‫‪K ³ 1 (2.5‬‬
‫‪ (2.6‬כל עוד )‪ (K≤N‬וגם )‪ (Ok‬בצע‬
‫כלומר‪:‬‬
‫)‪O(n‬‬
‫)‪O(n‬‬
‫⇐‬
‫)‪O(n‬‬
‫ולכן הסיבוכיות היא )‪o(n2‬‬
‫‪(n + n) * n‬‬
‫הראנו שיפור בסיבוכיות מ‪ O(n3) -‬ל‪O(n2) -‬‬
‫הבטים בהוראת מדעי המחשב – ינואר ‪2006‬‬