כמו שאייל אמר, אתה פשוט דואג להעתיק למבנה החדש 2 איברים על כל הוספה מהמבנה הישן.תחשוב על זה בשלבים.
מקרה יותר פשוט: לעולם לא משחררים מערך קטן, רק מערכים גדולים.
כלומר יהיה לך מערך בגודל 4 בהתחלה (למשל. וממילא אין טעם להתחיל מקטן יותר)
אחרי הכנסת 2 איברים, המערך יהיה חצי מלא.
הכנסת האיבר השלישי תגרום ליצירת מערך חדש בגודל 8.
ויהיו 3 כתיבות. למערך הקטן באינדקס 3, למערך הגדול באינדקס 3,
והעתקה של האיבר הראשון מהמערך הקטן לגדול.
הכנסת האיבר הרביעי תגרום ליצירת מערך חדש בגודל 16,
ויהיו 5 כתיבות:
לאינדקס 4 ב-3 המערכים + העתקה של האיבר באינדקס 1 למערך בגודל 16 + העתקה של האיבר באינקס 2 למערך בגודל 8.
זה המקסימום פעולות שיקרו.
הכנסת 3 האיברים הבאים יהיו 3 כתיבות:
הכנסה למערך בגודל 8 ו-16 באינדקס של ההכנסה (5,6,7 בהתאמה)
והעתקה של האיברים באינדקסים 2,3,4 (בהתאמה) למערך בגודל 16.
הכנסת האיבר השמיני שוב תגרום ליצירת מערך נוסף בגודל 32, ול-5 כתיבות,
וכך הלאה.
לגבי מחיקה, כל פעם מוחקים את ה-TOP מ-2 המערכים הגדולים. ברגע שמגיעים לגודל של רבע מהמערך הגדול ביותר, אז משחררים את הקצאת הזיכרון של המערך הגדול, וממשיכים במחיקות של שני איברים מה-TOP של המערכים הגדולים שנשארו.
אגב, כבר במימוש הפשוט הזה משיגים גודל ליניארי, כי למרות ששומרים את כל המערכים עד עכשיו, זאת סדרה הנדסית.
כלומר על n איברים יהיו לי מערכים בגודל 2n,n,n/2,n/4,...,4
שזה סדרה הנדסית שמתכנסת ל- 4n
כלומר ליניארי בגודל הקלט.
המעבר לפתרון שבו שומרים רק את המערכים הרלוונטים, ומשחררים מערכים קטנים יותר הוא לא גדול.
פשוט ברגע שאתה עובר threshold מסויים (חצי מגודל המערך) את מקצה מערך בגודל חצי, ועל כל מחיקה, אתה מעתיק איבר יחיד לפי הסדר.
כשתגיע למחיקות שיורידו אותך לגודל של רבע מהמערך, יוצא שמחקת רבע מהערכים,
אבל דאגת להעתיק את רבע הערכים הראשונים מבעוד מועד למערך הקטן.
בשלב זה, אתה מקצה מערך חדש בגודל רבע, ושמינית המחיקות הבאות יהיו בדיוק אותו התהליך של הרבע מחיקות שהביאו אותך למצב הזה.