לחץ ▶ Run כדי להדר ולהריץ את הקובץ. אם התוכנית תבקש קלט, תוכל להקליד אותו כאן למטה.
לכל סעיף ציינו סיבוכיות זמן וסיבוכיות מקום נוסף, בסימון Θ, כפונקציה של n.
חובה לפשט את הביטוי ככל שניתן. הניחו כי סיבוכיות הזמן והמקום של printf ו-free היא Θ(1),
וכי סיבוכיות הזמן של malloc(n) היא Θ(1) וסיבוכיות המקום שלה היא Θ(n).
הניחו כי sqrt פועלת בזמן Θ(1).
שימו לב: אין הבטחה ששלושת הסעיפים מקבלים תשובות שונות.
חשבו כל סעיף מחדש — ובפרט שימו לב לערכי חזרה של פונקציות עזר, למשתנים שמשתנים בין איטרציות,
ולמיקום של free ביחס לקריאה הרקורסיבית.
א.
void f1(int n) {
int m = n;
for (int i = 1; i < n; i *= 2) {
for (int j = 0; j < m; j++)
printf("*");
m /= 2;
}
}
ב.
void f2(int n) {
for (int i = n; i > 0; i /= 2) {
int* p = (int*) malloc(i * sizeof(int));
if (p == NULL) return;
for (int j = 0; j < i; j++)
printf("*");
free(p);
}
}
ג.
int f3(int n) {
if (n <= 1) return 1;
for (int i = 0; i < n; i++)
printf("*");
return f3(n / 2);
}
נתון מערך arr של מספרים שלמים, ממוין בסדר לא-יורד,
שאורכו אינו נתון לכם. סוף הנתונים מסומן על ידי הערך המיוחד
EMPTY (המוגדר בשלד כ-INT_MIN): כל תא מהאינדקס
n והלאה מכיל EMPTY, ואף איבר אמיתי אינו שווה ל-EMPTY.
ניתן לקרוא בבטחה מכל אינדקס שהוא חזקה של 2, וכן מכל אינדקס קטן ממנו.
על הפונקציה להחזיר את האינדקס שבו מופיע x, או -1 אם x אינו במערך.
אם x מופיע יותר מפעם אחת, ניתן להחזיר כל אחד מהאינדקסים שלו.
| קלט | פלט | הסבר |
|---|---|---|
| arr = {1,3,5,7,9,11,13,EMPTY,...}, x = 7 | 3 | arr[3] = 7 |
| arr = {1,3,5,7,9,11,13,EMPTY,...}, x = 8 | -1 | 8 אינו במערך |
| arr = {5,EMPTY,...}, x = 5 | 0 | מערך באורך 1 |
| arr = {EMPTY,...}, x = 1 | -1 | מערך ריק |
p את האינדקס שבו נמצא x (או את מספר האיברים האמיתיים, אם x אינו במערך).
הסיבוכיות נמדדת כפונקציה של p, לא של אורך המערך — זהו כל היתרון של החיפוש הדוהר:
הכפלת הגבול מגיעה ל-p ב-log p צעדים, ולכן איבר שנמצא בתחילת המערך נמצא מהר יותר.נתונה מחרוזת s באורך n המכילה אותיות אנגליות קטנות בלבד.
לכל i, נגדיר את האות השלטת בקידומת s[0..i] כאות
המופיעה בה הכי הרבה פעמים. במקרה של שוויון בין כמה אותיות, השלטת היא הקטנה ביותר
לקסיקוגרפית מביניהן.
על הפונקציה להחזיר את מספר האינדקסים i (כאשר 1 ≤ i < n)
שבהם האות השלטת ב-s[0..i] שונה מזו שב-s[0..i-1] —
כלומר, כמה פעמים מתחלפת האות השלטת לאורך המחרוזת.
| קלט | פלט | הסבר |
|---|---|---|
| s = "aabbb" | 1 | 'a' שולטת עד i=3, ומ-i=4 'b' |
| s = "abcabc" | 0 | 'a' שולטת לכל אורך המחרוזת (שוויון נשבר לטובתה) |
| s = "xyzzy" | 2 | — |
| s = "mississippi" | 5 | — |
s, אפילו לא באופן זמני.s אינה ריקה.נתונות שתי מחרוזות a ו-b המכילות אותיות אנגליות קטנות בלבד.
הופעה של a כתת-סדרה של b היא בחירה של אינדקסים
עולים ממש ב-b שהתווים בהם, לפי הסדר, מרכיבים בדיוק את a.
שתי בחירות אינדקסים שונות נחשבות שתי הופעות שונות, גם אם התווים זהים.
על הפונקציה להחזיר את מספר ההופעות של a כתת-סדרה של b.
| קלט | פלט | הסבר |
|---|---|---|
| a = "ab", b = "abab" | 3 | אינדקסים (0,1), (0,3), (2,3) |
| a = "a", b = "aaa" | 3 | כל אחת מהאותיות |
| a = "aa", b = "aaaa" | 6 | כל זוג אינדקסים |
| a = "ab", b = "ba" | 0 | הסדר אינו מתאים |
רמז: הסתכלו על התו הראשון של b. אם הוא מתאים לתו הראשון של
a, יש שתי אפשרויות נפרדות — לצרוך אותו, או לדלג עליו —
ויש לסכום את שתיהן. אם אינו מתאים, נותרה אפשרות אחת בלבד.
examT_q4 עצמה חייבת לקרוא לעצמה.main./grade.