שלום! ההרצאה היום תהיה קצת שונה מהשאר. זה יהיה שונה בכך שהוא קשור רק בעקיפין לג'אווה. עם זאת, נושא זה חשוב מאוד עבור כל מתכנת. נדבר על אלגוריתמים . מהו אלגוריתם? במילים פשוטות, זהו רצף מסוים של פעולות שיש לבצע כדי להשיג את התוצאה הרצויה . לעתים קרובות אנו משתמשים באלגוריתמים בחיי היומיום. לדוגמה, כל בוקר עומדת בפניך משימה: להגיע לבית הספר או לעבודה, ובו בזמן להיות:
- לָבוּשׁ
- לְנַקוֹת
- ניזון היטב
- להתעורר לשעון מעורר.
- תתקלח, תשטוף פנים.
- להכין ארוחת בוקר, להכין קפה/תה.
- לאכול.
- אם לא גיהצת את הבגדים שלך מאז הערב, גהץ אותם.
- להתלבש.
- עזוב את הבית.
- קנה או הורד באינטרנט "מילון שמות אישיים רוסיים" מהדורת 1966.
- מצא כל שם ברשימה שלנו במילון זה.
- רשום על פיסת נייר באיזה עמוד במילון מופיע השם.
- סדר את השמות באמצעות ההערות על פיסת נייר.
for
שמבצעת את המשימה הזו
int[] numbers = new int[100];
// ..заполняем массив числами
for (int i: numbers) {
System.out.println(i);
}
מהי המורכבות של האלגוריתם הכתוב? ליניארי, O(N). מספר הפעולות שעל התוכנית לבצע תלוי בדיוק בכמה מספרים הועברו אליה. אם יש 100 מספרים במערך, יהיו 100 פעולות (פלטים על המסך). אם יש 10,000 מספרים במערך, יהיה צורך לבצע 10,000 פעולות. האם ניתן לשפר את האלגוריתם שלנו? לא. בכל מקרה, נצטרך לבצע N מעברים דרך המערך ולבצע N פלטים לקונסולה. בואו נסתכל על דוגמה נוספת.
public static void main(String[] args) {
LinkedList<Integer> numbers = new LinkedList<>();
numbers.add(0, 20202);
numbers.add(0, 123);
numbers.add(0, 8283);
}
יש לנו אחד ריק LinkedList
שלתוכו נכניס כמה מספרים. עלינו להעריך את המורכבות של האלגוריתם להכנסת מספר בודד לדוגמא LinkedList
שלנו, וכיצד זה תלוי במספר האלמנטים ברשימה. התשובה היא O(1) - מורכבות קבועה . למה? שימו לב: בכל פעם אנו מכניסים מספר בתחילת הרשימה. בנוסף, כזכור, בעת הכנסת מספרים לאלמנטים LinkedList
, הם לא מוזזים לשום מקום - קישורים מוגדרים מחדש (אם שכחתם פתאום איך LinkedList עובד, תסתכל באחת ההרצאות הישנות שלנו ). אם כעת המספר הראשון ברשימה שלנו הוא המספר х
, ונכניס את המספר y בתחילת הרשימה, כל מה שצריך הוא:
x.previous = y;
y.previous = null;
y.next = x;
להגדרה מחדש של התייחסות זו, זה לא משנה לנו כמה מספרים יש עכשיוLinkedList
- לפחות אחד, לפחות מיליארד. מורכבות האלגוריתם תהיה קבועה - O(1).
GO TO FULL VERSION