נתונה השיטה הסטטית what, המקבלת כפרמטר מערך חד־ממדי המלא במספרים שלמים:

public static int what(int[] a) {
    if ((a == null) || (a.length == 0))
        return 0;
    int m = 0;
    for (int i = 0; i < a.length; i++)
        for (int j = i + 1; j < a.length; j++)
            if (a[j] - a[i] > m)
                m = a[j] - a[i];
    return m;
}

סעיף א (4 נקודות)

מה מבצעת השיטה what כאשר היא מקבלת מערך a כלשהו המלא במספרים שלמים?

הסבירו בקצרה מה השיטה עושה ולא כיצד היא מבצעת זאת.
שימו לב: עליכם לתת תיאור ממצה של מה עושה השיטה באופן כללי, ולא תיאור של כל שורה בשיטה או כיצד היא עובדת.
יש לציין את המשמעות של הערך המוחזר, כולל מקרה קצה.


סעיף ב (2 נקודות)

מה סיבוכיות הזמן ומה סיבוכיות המקום של השיטה what?
נמקו את תשובתכם.


סעיף ג (17 נקודות)

כתבו שיטה סטטית בשם whatEff, שתבצע את מה שביצעה השיטה what אך בצורה יעילה יותר.

שימו לב:
השיטה שתכתבו צריכה להיות יעילה ככל הניתן, גם מבחינת סיבוכיות הזמן וגם מבחינת סיבוכיות המקום.
תשובה שאינה יעילה מספיק (כלומר, סיבוכיות גבוהה מהנדרש) תקבל מעט נקודות בלבד.


סעיף ד (2 נקודות)

מה סיבוכיות הזמן ומה סיבוכיות המקום של השיטה whatEff שכתבתם?
נמקו את תשובתכם.

סעיף א – מה עושה השיטה?

  • עיינו היטב בלולאות המקוננות.
  • שימו לב: j תמיד מתחיל מ־i+1 – כלומר משווים רק בין איברים כך שהשני מופיע אחרי הראשון.
  • חשבו: מה בודקת השורה if (a[j] - a[i] > m)?
  • נסו להריץ את הקוד ידנית על מערך קטן, לדוגמה: [4, 1, 7].

סעיף ב – סיבוכיות זמן ומקום

  • סיבוכיות זמן: כמה פעמים מתבצע החישוב a[j] - a[i]?
  • האם הלולאות תלויות אחת בשנייה?
  • סיבוכיות מקום: האם נוצר מערך חדש או נעשה שימוש במשתנים בלבד?

סעיף ג – כתיבת שיטה יעילה יותר (whatEff)

  • נסו לשפר את הביצועים על ידי מעבר יחיד על המערך.
  • זכרו: אנחנו רוצים למצוא את ההפרש המקסימלי בין שני איברים כך שהשני מופיע אחרי הראשון.
  • נסו לשמור את האיבר הקטן ביותר שנתקלתם בו עד כה, ולעדכן בעזרתו את ההפרש המקסימלי.
  • ניתן לפתור זאת בסיבוכיות זמן ליניארית (O(n)) ובמקום קבוע (O(1)).

סעיף ד – סיבוכיות של הפתרון היעיל

  • השוו את הפתרון היעיל שלכם לקוד המקורי.
  • האם אתם מבצעים לולאה אחת בלבד?
  • האם אתם שומרים רק משתנים פשוטים (כמו מספרים), או משתמשים במבנה נתונים נוסף?