You are on page 1of 5

‫אוהד רווה‬

‫שיעור פרטי יעילות‬


‫סל הכלים‪:‬‬
‫החלפת משתנים עם משתנה עזר‬ ‫‪.1‬‬
‫כלי עזר עבור מיון רשימה‪.‬‬
‫חשוב לא להגדיר את משתנה העזר בתוך לולאה מפאת יעילות מקום‪.‬‬

‫;‪int temp‬‬

‫;]‪temp = arr[curr‬‬
‫;]‪arr[curr] = arr[j‬‬
‫‪arr[j] = temp; ‬‬

‫מעבר לינארי אינדקס אחד‬ ‫‪.2‬‬


‫השיטה הכי פשוטה – מעבר יחיד על מערך‪ ,‬בדרך כלל לא יהיה השיטה של התרגיל אלא כחלק‬
‫מהתרגיל‪.‬‬
‫השימוש נעשה על ידי מצביע אחד‪ ,‬בדרך כלל בלולאת ‪ ,for‬בתוך הלולאה נעשה את הדרוש עלינו‬
‫(נסכום‪ ,‬נחליף וכו')‪.‬‬
‫בשיטה זו יכול להיות שנצטרך לשמור מידע על מקומות במערך ולכן יידרשו עוד משתנים‪.‬‬
‫צריך לזכור שכמה מעברים סופיים על המערך שומר על אותה יעילות‪.‬‬
‫)‪O(3n)=O(n‬‬
‫דוגמא ‪ :‬סכימת כל הערכים במערך‪.‬‬
‫יעילות – ‪n‬‬

‫{‪for (int i = 0; i < arr.length; i++) ‬‬
‫)‪     if (arr[i] == 1‬‬
‫;‪        cnt++‬‬
‫}‬

‫מעבר לינארי שני אינדקסים ‪ -‬מאזניים‬ ‫‪.3‬‬


‫אוהד רווה‬

‫ריצה עם שני אינדקסים אך עם לולאת ‪ while‬יחידה (כדי שנוכל לעלות ולהוריד את הערכים‬
‫כרצוננו)‪ ,‬שיטה מסובכת שמצריכה חשיבה מחוץ לקופסא אך נותנת לנו יעילות טובה עם טכניקה‬
‫גבוהה‪ .‬בדרך כלל משמש במערך ממויין‪.‬‬
‫אינדקס בהתחלה ואינדקס בסוף‪ ,‬מורידים את הסוף ומעלים את ההתחלה כל פעם לפי תנאי עד שהם‬
‫נפגשים‪.‬‬
‫דוגמא ‪ :‬מציאת תת מערך שסכומו ‪ 3‬במערך ממוין עולה ממש‪.‬‬
‫יעילות – ‪n‬‬
‫;‪        int sum = 0‬‬
‫{‪        for (int i = 0; i < arr.length; i++) ‬‬
‫;]‪            sum += arr[i‬‬
‫}‪        ‬‬
‫;‪        int i = 0‬‬
‫;‪        int j = arr.length -1‬‬
‫)‪        while(i<j‬‬
‫{‪        ‬‬
‫)‪            if(sum == 3‬‬
‫;‪                break‬‬
‫)‪            else if (sum < 3‬‬
‫{‪            ‬‬
‫;]‪                sum -= arr[i‬‬
‫;‪                i++‬‬
‫}‪            ‬‬
‫{‪            else‬‬
‫;]‪                sum -= arr[j‬‬
‫;‪                j--‬‬
‫}‪            ‬‬
‫}‪        ‬‬
‫;)‪        System.out.println(i + " " + j‬‬

‫מעבר לינארי שני אינדקסים ‪ -‬חלונות‬ ‫‪.4‬‬


‫ריצה עם שני אינדקסים אך עם לולאת ‪ while‬יחידה (כדי שנוכל לעלות ולהוריד את הערכים‬
‫כרצוננו)‪ ,‬שיטה מסובכת שמצריכה חשיבה מחוץ לקופסא אך נותנת לנו יעילות טובה עם טכניקה‬
‫גבוהה‪ .‬בדרך כלל משמש במערך ממויין‪.‬‬
‫אוהד רווה‬

‫אינדקס ‪ i‬בהתחלה ואינדקס ‪ j‬מקום אחריו‪ ,‬מעלים את ‪ j‬ומעלים את ‪ i‬לפי תנאי מסוים‪ .‬התת מערך‬
‫שאנחו יוצרים בין שני האינדקסים גדל כשמגדילים את ‪ j‬וקטן שמגדילים את מי שרודף אחריו – ‪.i‬‬
‫דוגמא ‪ :‬מציאת תת מערך שסכומו ‪ 3‬במערך ממוין עולה ממש‪.‬‬
‫יעילות – ‪n‬‬

‫;‪        int i = 0‬‬
‫;‪        int j = 1‬‬
‫;‪int sum = 0‬‬
‫)‪        while(j<arr.len‬‬
‫{‪        ‬‬
‫)‪            if(i == j‬‬
‫;‪                j++‬‬

‫)‪if(sum == 3‬‬
‫;‪                break‬‬
‫)‪            else if (sum < 3‬‬
‫{‪            ‬‬
‫;]‪                sum += arr[j‬‬
‫;‪                j++‬‬
‫}‪            ‬‬
‫{‪            else‬‬
‫;]‪                sum -= arr[i‬‬
‫;‪                i++‬‬
‫}‪            ‬‬
‫}‪        ‬‬
‫;)‪        System.out.println(i + " " + j‬‬

‫מעבר ריבועי עם שני אינדקסים‬ ‫‪.5‬‬


‫נרצה להימנע מיישום זה עקב היעילות הנמוכה אך שיטה זו רלוונטית לתרגילים שפעם הראשונה‬
‫נחשוב שהם צריכים להיעשות ב‪.n^3‬‬
‫השימוש נעשה בדר"כ ע"י שני מצביעים ושני לולאות ‪ for‬אחת בתוך השנייה‪ ,‬כאשר עבור כל מספר‬
‫במערך אנחנו נעבור על כל הערכים האחרים‪.‬‬
‫דוגמא ‪ :‬הדפסת כל הזוגות האפשריים במערך‪.‬‬
‫יעילות – ‪n^2‬‬
‫אוהד רווה‬

‫‪            int j ‬‬
‫{‪for (int i = 0;  i < arr.length; i++) ‬‬
‫‪                for (j = i; j < arr.length; j++) ‬‬
‫{‪                ‬‬
‫;)]‪                    System.out.println(arr[i] + " " + arr[j‬‬
‫}‪                ‬‬
‫}‪            ‬‬

‫מיון מהיר‬ ‫‪.6‬‬


‫שיטה למיון מערך בזמן יעיל יותר משאר המיונים‪.‬‬
‫ניתן להשתמש במבחן רק ע"י קריאה של הפונקציה ‪ quickSort‬עם המערך‪.‬‬
‫הסבר כללי – עבור כל מספר במערך‪ ,‬נמצא עבורו את כל המספרים שגדולים ממנו וקטנים ממנו‬
‫ונחלק אותם לשני מערכים שונים‪ ,‬נחזור על כך ברקורסיה עד המערך ממוין‪.‬‬
‫יעילות ‪n log(n) -‬‬

‫חיפוש בינארי‬ ‫‪.7‬‬


‫בדרך כלל ריצה על מערך ממויין‪ ,‬יש אפשרות למיין ואז להשתמש בסוג זה‪.‬‬
‫השימוש נעשה בדר"כ ע"י שלושה מצביעים – ‪low, high, mid‬‬
‫כאשר ‪ mid‬הוא האמצע בין ה‪ low‬וה‪.high‬‬
‫דוגמא ‪ :‬מציאת המספר הקרוב לשבע‪.‬‬
‫יעילות – )‪log(n‬‬
‫אוהד רווה‬

‫‪:‬סדר לפי יעילות‬


‫כמעט תמיד ביעילות מקום‪ ,‬לא ישמש ביעילות זמן )‪O(1‬‬
‫חיפוש בינארי)‪O(logn‬‬
‫מעבר לינארי כמה פעמים‪ ,‬חלונות‪ ,‬מאזניים )‪O(n‬‬
‫מיון מהיר )‪O(nlogn‬‬
‫לולאה קנונית )‪O(n^2‬‬

You might also like