היי! השיעור של היום יהיה מעט שונה מהשאר. זה יהיה שונה בכך שהוא קשור רק בעקיפין לג'אווה. עם זאת, נושא זה חשוב מאוד לכל מתכנת. אנחנו הולכים לדבר על אלגוריתמים . מהו אלגוריתם? במילים פשוטות, זה רצף של פעולות שיש להשלים כדי להשיג תוצאה רצויה . אנו משתמשים באלגוריתמים לעתים קרובות בחיי היומיום. לדוגמה, בכל בוקר יש לך משימה ספציפית: ללכת לבית הספר או לעבודה, ובו זמנית להיות:
- לָבוּשׁ
- לְנַקוֹת
- האכיל
- להתעורר באמצעות שעון מעורר.
- תתקלח ותשטוף את עצמך.
- הכינו ארוחת בוקר וקצת קפה או תה.
- לאכול.
- אם לא גיהצת את הבגדים שלך בערב הקודם, אז גיהץ אותם.
- להתלבש.
- עזוב את הבית.
- קנה או הורד את מהדורת 1961 של מילון וובסטר החדש הבינלאומי השלישי.
- מצא כל שם מהרשימה שלנו במילון זה.
- כתבו על פיסת נייר את עמוד המילון עליו נמצא השם.
- השתמש בפיסות הנייר כדי למיין את השמות.
for
שמבצעת את המשימה הזו
int[] numbers = new int[100];
// ...fill the array with numbers
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), כלומר מורכבות קבועה . למה? שימו לב שאנו מכניסים כל מספר בתחילת הרשימה. בנוסף, תזכרו שכאשר אתם מכניסים מספר ל-a LinkedList
, האלמנטים לא זזים לשום מקום. הקישורים (או ההפניות) מתעדכנים (אם שכחת איך LinkedList עובד, עיין באחד השיעורים הישנים
שלנו ). אם המספר הראשון ברשימה שלנו הוא x
, ואנו מכניסים את המספר y בקדמת הרשימה, כל שעלינו לעשות הוא כך:
x.previous = y;
y.previous = null;
y.next = x;
כשאנחנו מעדכנים את הקישורים, לא אכפת לנו כמה מספרים כבר יש ב-LinkedList
, אם אחד או מיליארד אחד. המורכבות של האלגוריתם קבועה, כלומר O(1).
GO TO FULL VERSION