prepd.אתר תרגול לבחינות
איך ללמודצור קשר
© 2026 prepd. כל הזכויות שמורות.·אודות·תנאי שימוש·מדיניות פרטיות·נגישות

מבוא למדעי המחשב אוניברסיטת תל אביב

תכנות, רקורסיה, מערכים, מחרוזות, עצים בינאריים ורשימות מקושרות

סטטיסטיקות מבחנים
כדי לגשת למבחני סימולציה ועוד המון שאלות נוספות, פתחו גישה מלאה
רמת קושי:
(שאלת בונוס המיועדת לקבוצות חרבות ברזל B/C/G בלבד, 5 נקודות)

הקיפו בעיגול את התשובה שמתארת בצורה הנכונה את ההתנהגות האסימפטוטית של הביטוי ∑i=1n​4i:

א. Θ(4n)

ב. Θ(log(n)⋅4n)

ג. Θ(n⋅4n)

ד. Θ(n2⋅4n)
העתק שאלה
שתף שאלה
סמן כחשוב
סמן כבוצע
אוניברסיטת תל אביבמועד א · 2026 · סמסטר א
★★★★★
סיבוכיות זמן
בשאלה זו 4 סעיפים שאינם קשורים זה לזה.

סעיף א' (5 נק'):
נתון הקוד הבא:




א. עבור הקלט lst=[1,3,5,5,5,5,6,7], key=5, מה תחזיר הפונקציה?

ב. נסמן ב-n את אורך רשימת הקלט lst. ציינו את סיבוכיות זמן הריצה במקרה הגרוע כתלות ב-n.

סעיף ב' (5 נק'):
נתון האל"ב
{a,b,c,d} וכן נתונים חמישה קידודים. לכל קידוד סמנו האם הוא prefix free, uniquely decodable but not prefix free, או not uniquely decodable. סמנו ב-X את המשבצת המתאימה.

1. a=0,b=00,c=000,d=0000

2. a=00,b=01,c=10,d=11

3. a=00,b=01,c=101,d=110

4. a=10,b=101,c=1011,d=11

5. a=0,b=01,c=011,d=0111

סעיף ג' (10 נק'):
נזכר בהגדרה של hash_mod מתוך המחלקה hashtable שראינו בכיתה:

self.hash_mod = lambda key: hash_func(key) % m


נסמן ב-n את כמות האיברים שמכניסים ל-hashtable, וב-m את גודל הטבלה. נתון כי n=1024⋅m, ומכניסים את כל המספרים מ-1 עד n ל-hashtable.

עבור המימושים הבאים ל-hash_func, ציינו עבור כל מימוש האם הוא:
1. מאפשר הכנסה וחיפוש תקינים בסיבוכיות זמן ממוצעת
O(1) (כתלות ב-n).
2. מאפשר הכנסה וחיפוש תקינים, אבל סיבוכיות הזמן הממוצעת גדולה מ-
O(1) (כתלות ב-n).
3. לא מאפשר הכנסה או חיפוש תקינים.


סמנו X במשבצת הנכונה. הניחו כי פעולות אריתמטיות ופונקציות מהספרייה math ו-random רצות בזמן O(1). לזכירכם, הפונקציה math.log(x,b) מחזירה float המייצג (בקירוב) את הערך של logb​(x).

  • lambda x: x%10
  • lambda x: random.randint(x)
  • lambda x: 1
  • lambda x: -1*x
  • lambda x: int(math.log(x,2))


סעיף ד' (5 נק'):
נתונה הפונקציה הבאה המבוססת על הפונקציה page rank אשר ראינו בכיתה, אך אינה זהה לה:




עבור כל אחת מהטענות הבאות, קבעו האם היא נכונה או לא נכונה בסוף ריצת הפונקציה:

1. עבור G=[[1],[2],[0]], t=30 — הרשימה counters תכיל את אותו מספר בכל האינדקסים.
2. עבור
G=[[1],[2],[0]], t=35 — הרשימה counters תכיל את אותו מספר בכל האינדקסים.
3. עבור
G=[[1,3],[2],[0],[1]], t=30 — הרשימה counters תכיל את אותו מספר באינדקסים 0,1,2.
4. עבור
G=[[1,2],[3],[3],[0]], t=30 — הרשימה counters תכיל את אותו מספר באינדקסים 0,3.
העתק שאלה
שתף שאלה
סמן כחשוב
סמן כבוצע
אוניברסיטת תל אביבמועד א · 2026 · סמסטר א
★★★★★
חיפוש בינאריסיבוכיות זמןמעקב אחר קודקידודטבלאות גיבובPageRankגרפיםהסתברות
השאלה הבאה עוסקת בעצי חיפוש בינאריים עם מפתחות מטיפוס מספרים שלמים, כאשר נרצה להוסיף שדה נוסף לכל צומת — טווח המפתחות בתת העץ. לכל צומת node בעץ נוסיף את השדה key_range שהוא list המכיל זוג מספרים שלמים, אשר מייצגים את טווח המפתחות בתת העץ שלו. זאת אומרת, key_range[0] יהיה שווה למפתח המינימלי בתת העץ של הצומת ו-key_range[1] יהיה שווה למפתח המקסימלי בתת העץ של הצומת.

המחלקות TreeNode ו-BinarySearchTree יכילו את השדות הבאים (השינוי מהכיתה מסומן בקו תחתון):



לדוגמה, בעץ המצורף tree מוצמדים לכמה צמתים ערכי ה-key_range התקינים שלהם. העץ מכיל: שורש 18 עם key_range [6,38], ילד שמאלי 13 עם key_range [6,11], ילד ימני 29. תת-העץ השמאלי של 13: צומת 11, וילד שמאלי שלו 6. תת-העץ של 29: ילד שמאלי 24 (עם ילדים 19, 25), ילד ימני 38. לצומת 25 key_range [25,25].

הקוד הבא, בהינתן העץ tree מהדוגמה, ידפיס את הטווח עבור הבן הימני של השורש:
>>> print(tree.root.right.key_range) → (19, 38)


הערה: לאורך כל השאלה, אלא אם כן מצוין במפורש, אין להניח כי השדה key_range בצמתים בעץ מכיל ערכים תקינים טרם הקריאה למימושים השונים. בפרט, ייתכן שחלקם מכילים את הערך ההתחלתי [None,None].

א. (6 נק') השלימו את מימוש המתודה update_key_range() למחלקה TreeNode, שתעדכן את השדה key_range של הצומת לערכיו התקינים לפי ההגדרה שצוינה.
הנחיה: על המימוש להיות יעיל ככל שניתן מבחינת סיבוכיות זמן אסימפטוטית כתלות בעומק העץ.


ב. (7 נק') כעת, נרצה להוסיף למחלקה BinarySearchTree את המתודה update_all_key_range(self) אשר מעדכנת את טווחי המפתחות בכל הצמתים בעץ, תוך שימוש במתודה שמומשה בסעיף א'. הקוד הבא מציע מימוש:



נתחו את סיבוכיות זמן הריצה של הקוד במקרה הגרוע כתלות בכמות הצמתים (n).
בנוסף, ציינו האם הקוד נכון, ואם אינו נכון הציעו תיקון (בקצרה).


ג. (5 נק') ממשו מחדש את המתודה update_key_range של המחלקה TreeNode. השם של המימוש החדש יהיה update_key_range_2.
הנחה שתקפה לסעיף זה בלבד: הילדים הישירים של הצומת אותו מעדכנים, כבר מכילים ערכים תקינים בשדה key_range.

הנחיה: על המימוש להיות יעיל ככל שניתן מבחינת סיבוכיות זמן אסימפטוטית כתלות במספר הצמתים בעץ.


ד. (7 נק') כעת נשנה את הקוד של update_all_key_range, אך ורק על ידי החלפת הקריאה ל-update_key_range בקריאה ל-update_key_range_2.

ציינו מה סיבוכיות זמן הריצה של המתודה המעודכנת update_all_key_range במקרה הגרוע כתלות בכמות הצמתים (n). בנוסף, ציינו האם הקוד נכון, ואם אינו נכון הציעו תיקון (בקצרה).
העתק שאלה
שתף שאלה
סמן כחשוב
סמן כבוצע
אוניברסיטת תל אביבמועד א · 2026 · סמסטר א
★★★★★
עצים בינארייםעץ חיפוש בינארימחלקותסיבוכיות זמןרקורסיה
תזכורת: באלגוריתם למפל זיו לדחיסת טקסט שראינו בהרצאה, אנחנו מייצגים חזרה כזוג מספרים [m,k], כאשר m הוא ההיסט לאחור ו-k מייצג את אורך החזרה.

המחרוזת הנדחסת היא רצף של תווים, כאשר כל תו מיוצג ב-7 ביטים (קוד ASCII ועוד ביט מפריד). נכניס את השינוי הבא: בעת חיפוש חזרות בטקסט נאפשר גם חיפוש חזרות "לאחור". כלומר, בדומה לפונקציה maxmatch מהכיתה שמחפשת חזרה "קדימה" (התאמה), כעת יש גם הפונקציה maxmatch_back שמחפשת חזרה "אחורה".

הוסיפו עוד ביט לקידוד: במקום [m,k], החזרה תהיה [m,k,b], כאשר b=0 עבור חזרה רגילה ו-b=1 עבור חזרה לאחור. ערכי ברירת המחדל: W=212−1, L=25−1. באלגוריתם הישן חזרה דרשה 1+12+5=18 ביטים, ובחדש 2+12+5=19 ביטים.

סעיף א' (10 נק'):

א. מהו אורך חזרה מינימלי שמשתלם לדחוס?

ב. נסמן ב-n את אורך המחרוזות. נתונות 3 מחרוזות בייצוג כדלהלן:
1. את המחרוזת "abcdeabcde" נדחוס בייצוג הביניים
[′a′,′b′,′c′,′d′,′e′,[5,5,0]].
2. את המחרוזת "abcdeedcba" נדחוס בייצוג הביניים
[′a′,′b′,′c′,′d′,′e′,[1,5,1]].
3. את המחרוזת "aaaalxbxaaaa" נדחוס בייצוג הביניים שהאלגוריתם החדש יייצר.


ג. לכל אחת מהמחרוזות הבאות, ציינו את כמות הביטים לאחר הדחיסה באלגוריתם הישן ובאלגוריתם החדש המוצג בשאלה:
  • "aaaa"
  • "abccba"


סעיף ב' (10 נק'):
עליכם להשלים את מימוש הפונקציה LZW_compress_new בשורות הריקות בהתאם לשינוי המתואר בשאלה. הניחו שמומשה לכם הפונקציה:

maxmatch_back(text, p, W=2**12-1, L=2**5-1)

שמחפשת חזרות "לאחור". בדומה ל-maxmatch, מקבלת אותם פרמטרים ומחזירה זוג
[m,k] המקיים text[p:p+k]=text[p−m:p−m+k:−1] כאשר k מקסימלי.

לנוחותכם, מצורף המימוש המקורי של הפונקציה LZW_compress שראינו בכיתה:

העתק שאלה
שתף שאלה
סמן כחשוב
סמן כבוצע
אוניברסיטת תל אביבמועד א · 2026 · סמסטר א
★★★★★
קידודמחרוזותמעקב אחר קודסיבוכיות זמן
בהינתן מחרוזת st=s0​s1​…sn−1​ בעלת n תווים, תת מחרוזת של st מוגדרת להיות מילה w=si1​​si2​​…sik​​ כך ש-0≤i1​<i2​<⋯<ik​≤n−1.

לדוגמה, קבוצת תתי המחרוזות של המחרוזת abc היא: {ϵ,a,b,c,ab,ac,bc,abc}, וקבוצת תתי המחרוזות של המחרוזת aa היא {ϵ,a,aa}, כאשר הסימון ϵ מייצג את המחרוזת הריקה, שהיא תת מחרוזת חוקית של כל מחרוזת (המחרוזת הריקה היא תת מחרוזת חוקית גם של המחרוזת הריקה).

שימו לב שעל פי ההגדרה תת מחרוזת אינה בהכרח רציפה, וכן יש חשיבות לסדר התווים. למשל עבור st=abcd המילה ac היא תת מחרוזת של st, אבל ca היא לא תת מחרוזת של st.

בשאלה זו נפתור את בעיית תת המחרוזת המשותפת הארוכה ביותר (Longest Common Subsequence, LCS). בבעיה זו נתונות שתי מחרוזות st1​,st2​ ועלינו למצוא את האורך המקסימלי של מילה w אשר מהווה תת מחרוזת גם של st1​ וגם של st2​.

דוגמאות:
  • LCS(bxcg,abcdefg)=3 (כאן המחרוזת המשותפת הארוכה ביותר היא bcg ואורכה 3).
  • LCS(aaa,aba)=2 (כאן המחרוזת המשותפת הארוכה ביותר היא aa ואורכה 2).
  • LCS(ax,xa)=1 (כאן מחרוזת משותפת ארוכה ביותר היא למשל a ואורכה 1).
  • LCS(binary,computer)=1 (כאן המחרוזת המשותפת הארוכה ביותר היא r ואורכה 1).
  • LCS(aaaa,xyz)=0 (כאן המחרוזת המשותפת הארוכה ביותר היא המחרוזת הריקה ואורכה 0).


לאורך השאלה ניתן להניח כי שני הקלטים st1​,st2​ לפונקציה הם משתנים חוקיים מטיפוס str (ייתכן כי מדובר במחרוזת ריקה).

א. (10 נק') נתון פתרון רקורסיבי לבעיית LCS. השלימו את הקוד המטפל במקרי הקצה ובמקרה הכללי בשורות החסרות.
הנחיה: אסור להשתמש ב-slicing.




ב. (10 נק') נסמן m=len(st1​), n=len(st2​) ונניח לצורך פשטות כי m=n. נסמן ב-S(n) את גודל עץ הרקורסיה, אשר מוגדר להיות מספר הצמתים בעץ, כלומר, מספר הקריאות לפונקציה lcs_rec.

(i) הקיפו בעיגול את התשובה המתארת את גודל עץ הרקורסיה במקרה הטוב ביותר עבור האלגוריתם שהוצג בסעיף א' כתלות ב-n.

האפשרויות: S(n)=O(1), S(n)=Θ(logn), S(n)=Θ(n), S(n)=Θ(nlogn), S(n)=Θ(n2), S(n)=Θ(nc) עבור קבוע c≥3 כלשהו, c1​⋅2n≤S(n)≤c2​⋅4n עבור קבועים c1​,c2​ חיוביים כלשהם, S(n)=Θ(n!).

(ii) הקיפו בעיגול את התשובה המתארת את גודל עץ הרקורסיה במקרה הגרוע ביותר עבור האלגוריתם שהוצג בסעיף א' כתלות ב-n.

ג. (5 נק') בסעיף זה נוסיף ממואיזציה למימוש הרקורסיבי משעיף א'. השלימו את הקוד של הפונקציה lcs_mem למטה. הפונקציה מקבלת מחרוזת st המורכבת מאותיות קטנות באנגלית.
הנחיות: (1) אסור להשתמש ב-slicing. (2) והפתרון צריך לרוץ בסיבוכיות זמן פולינומית בממוצע.


ד. (5 נק') נאמר שמחרוזת st היא מונוטונית עולה, אם התווים שלה מסודרים בסדר לקסיקוגרפי מהקטן לגדול.
לדוגמה: המחרוזת
aez היא מונוטונית עולה, גם aabbc היא מונוטונית עולה, אבל adxc היא לא מונוטונית עולה (מכיוון ש-c קטן למשל מ-d אבל מופיע אחריו).

השלימו את הקוד של הפונקציה longest_monotone למטה. הפונקציה מקבלת מחרוזת st המורכבת מאותיות קטנות באנגלית ('a','b','c',...,'z'), ומחזירה את האורך המקסימלי של תת מחרוזת מונוטונית עולה של st. דוגמאות:
  • longest_monotone(axbyczd)=4 (המחרוזת המונוטונית עולה הארוכה ביותר היא abcd).
  • longest_monotone(aabaa)=4 (המחרוזת המונוטונית עולה הארוכה ביותר היא aaaa).
  • longest_monotone(xa)=1 (מחרוזת מונוטונית עולה ארוכה ביותר היא למשל a).


הנחיות: (1) על הפונקציה להשתמש בפונקציה lcs_mem מהסעיף הקודם (גם אם לא מימשתם אותה). (2) על הפתרון שלכם להיות בעל סיבוכיות זמן ריצה פולינומית (אבל לא משנה מה דרגת הפולינום).
העתק שאלה
שתף שאלה
סמן כחשוב
סמן כבוצע
אוניברסיטת תל אביבמועד א · 2026 · סמסטר א
★★★★★
רקורסיהמחרוזותתת-סדרהסיבוכיות זמןmemoization
נתון דקדוק חסר-הקשר הבא, כאשר S הוא משתנה ההתחלה, ובדומה לכיתה — אותיות גדולות הן משתנים, אותיות קטנות מייצגות טרמינלים, ו-ϵ המחרוזת הריקה.

תזכורת: כלל גרירה מהצורה X→Y∣Z משמעו שניתן לגזור מ-X את המשתנים Y או Z.

S→ABS∣cC∣cA→aA∣aB→bB∣bC→cC∣c

הקיפו, לכל אחת מהמחרוזות הבאות, האם ניתן לגזור אותה מהדקדוק הנתון או לא:

1. ϵ

2. aaabbbc

3. ab

4. abaabbcc

5. abcaabbcc
העתק שאלה
שתף שאלה
סמן כחשוב
סמן כבוצע
אוניברסיטת תל אביבמועד א · 2025 · סמסטר ב
★★★★★
דקדוק חסר-הקשר
בכיתה ראינו מימוש של hash table (המשתמש ב-chaining לטיפול בהתנגשויות) אשר בממוצע מספקת זמן ריצה קבוע עבור הכנסה ושליפה. הבעיה הייתה במקרה הגרוע. נסמן ב-n כמות האיברים בהם נדרשים לטפל, m כמות התאים במילון. נניח כי m=n.

א. מה סיבוכיות זמן השליפה במקרה הגרוע?

ב. מה סיבוכיות זמן ההכנסה במקרה הגרוע?

דרור הציע להחליף את הרשימות בכל תא, בעצים בינאריים מאוזנים (הניחו כי אנחנו יודעים לשמור את העצים מאוזנים).

תזכורת: נקרא לעץ בינארי "מאוזן" אם מתקיים שעומקו לוגריתמי בכמות הצמתים שלו.

ג. מה תהיה כעת סיבוכיות זמן השליפה הממוצעת?

ד. מה תהיה סיבוכיות זמן השליפה במקרה הגרוע?
העתק שאלה
שתף שאלה
סמן כחשוב
סמן כבוצע
אוניברסיטת תל אביבמועד א · 2025 · סמסטר ב
★★★★★
טבלאות גיבובסיבוכיות זמןעצים בינאריים
עבור כל אחת מהטענות הבאות, הקיפו בעיגול האם היא מתקיימת או לא מתקיימת.

1. 12+22+32+⋯+n2=O(n3.5)

2. 9nlog3​n=Θ(n2n)

3. nlog2​n=O(nlog3​n)
העתק שאלה
שתף שאלה
סמן כחשוב
סמן כבוצע
אוניברסיטת תל אביבמועד א · 2025 · סמסטר ב
★★★★★
סיבוכיות זמן
הקיפו את התשובה הנכונה ביותר מבין האופציות הבאות, עבור מה שיודפס בהרצת הקוד משמאל:



אפשרויות:

1. יודפס False, ולאחר מכן יודפס True.
2. יודפס True, ולאחר מכן יודפס True.

3. יודפס False ולאחר מכן תזרק שגיאה.

4. יודפס True ולאחר מכן תזרק שגיאה.

5. תוחזר שגיאה לפני שיודפס ערך כלשהו.
העתק שאלה
שתף שאלה
סמן כחשוב
סמן כבוצע
אוניברסיטת תל אביבמועד א · 2025 · סמסטר ב
★★★★★
מעקב אחר קודמערכים
נתונים שני מימושים לפונקציות מיון המבוססים על selection-sort. לנוחיותכם, מסומן ההבדל ביניהם.



השלימו בטבלה את סיבוכיות זמן הריצה האסימפטוטית במקרה הנתון (במונחי O(⋅)), כפונקציה של n, במקרים הבאים:

1. lst=[i for i in range(n)]

2. lst=[(imod100) for i in range(n)]

3. lst=[(imodint(n0.5)) for i in range(n)]
העתק שאלה
שתף שאלה
סמן כחשוב
סמן כבוצע
אוניברסיטת תל אביבמועד א · 2025 · סמסטר ב
★★★★★
מיוןסיבוכיות זמןמעקב אחר קוד

שאלות מבוא למדעי המחשב באוניברסיטת תל אביב עם פתרונות

מאגר מבחנים במבוא למדעי המחשב מאוניברסיטת תל אביב (תל אביב) - 969 שאלות ממוינות לפי נושא ורמת קושי, עם פתרונות מלאים לבדיקה עצמית. השאלות מכסות מועדים לאורך השנים, כולל מבחנים מ-2023, 2024, 2025 ו-2026. נושאים מרכזיים: רקורסיה, מערכים, מחרוזות, יעילות, עצים בינאריים. ניתן לסנן שאלות חוזרות, להתאמן על נושא ספציפי או להריץ סימולציית מבחן לפני הבחינה. הכנה למבוא למדעי המחשב מתמקדת בתרגול רקורסיה, מערכים ועצים בינאריים - הנושאים הנפוצים ביותר במבחנים. לימוד עצמי עם שאלות ממבחנים, בדגש על מעקב אחר קוד, מכין ביעילות לבחינה.

prepd›מבוא למדעי המחשב›תל אביב