שאלה במבני נתונים.

gil levi

New member
שאלה במבני נתונים.

התרגיל בתמונה. בגלל שדורשים שהאלגוריתמים יהיה יעילים ככל שניתן, חשבתי לכתוב אותם כאן כדי שתוכלו להעיר לי אם הם לא הכי יעילים שניתן או שהם לא נכונים. לפונ' הראשונה (isStrictlyMonotonicDownUpArray) 1. מחלקים את המערך לשני חצאים. 2. בודקים אם החלק הימני מונוטוני עולה (הבדיקה על ידי פונקציה אחרת, רקורסיבית, שכל פעם חוצה את המערך לשני חצאים ובודקת אם שניהם מונוטונים עולים). 3. בודקים אם החלק השמאלי מונוטוני יורד. 4. אם החלק הימני לא מונוטוני יורד אזי: 4.1. מפעילים את isStrictlyMonotonicDownUpArray על החלק הימני. 4.2. אם החלק הימני הוא מערך Down-Up (ז"אstricrly monotonic downup array ) וגם החלק השמאלי לא מונוטוני יורד אזי 4.2.1 החזר שקר. 4.3 אם החלק הימני הוא מערך Down-Up וגם שמאל מונוטוני יורד אזי 4.3.1 החזר אמת. 5. אם החלק השמאלי לא מונוטוני יורד אזי 5.1 מפעילים את isStrictlyMonotonicDownUpArray על החלק השמאלי. 5.2 אם החלק השמאלי הוא מערך Down-Up וגם החלק הימני לא מונוטוני עולה אזי 5.2.1 החזר שקר. 5.3 אם החלק השמאלי הוא מערך Down-Up וגם החלק הימני מונוטוני עולה אזי 5.3.1 החזר אמת. 6. אם החלק הימני מונוטוני עולה וגם החלק השמאלי מונוטוני יורד אזי 6.1 החזר אמת. 7. החזר שקר. תנאי העצירה הוא בעצם 6, כי כשבודקים אם מערך הוא Down-Up אז מתישהו כשנחצה נגיע למצב שבו החצי הימני מונוטוני עולה והחצי השמאלי מונוטוני יורד. לפונ' השניה: נראה לי שפשוט בודקים מי יותר גדול, האיבר הראשון או האחרון (הפונ' findMax מקבלת גם את האורך של המערך). תודה מראש.
 

ahab

New member
נסחפת קצת

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

gil levi

New member
כמו שכתבתי לכרובית הפלא

חשבתי לעבור על כל המערך בלולאה עם משתנה בוליאני שיגיד לי אם אני לפני השינוי מירידה לעליה או אחריו, אבל הייתי בטוח שיש אלגוריתם יעיל יותר.
 
סעיף 2 נשמע לי נכון

סכיף 1: מה הסיבוכיות של מה שכתבת? זה לא יוצא יותר מ-N? הרי אפשר לבדוק את זה פשוט במעבר אחד על המערך...
 

gil levi

New member
יוצא n*lgn נכון?

כי לבדוק אם החצאים הם מונוטונים זה n ואז אני מקבל את נוסחת הרקורסיה:
T(n) = 2*T(n/2) + c*n​
והפתרון הוא n*lgn. זה נכון? חשבתי שאם אני אחצה אם המערך ל2 בכל פעם אני אקבל סיבוכיות של lgn. למען האמת הפתרון הראשון נראה לי לעבור על כל המערך בלולאת for אבל הייתי בטוח שיש פתרון יעיל יותר. אני אעבוד על זה עוד קצת...
 
אני עדיין חושבת שהדרך היעילה ביותר

היא לעבור על המערך בלולאת for פשוטה. הסיבוכיות של זה היא N, ובכל מקרה בשביל לוודא שהמערך מקיים את התנאי אתה חייב לסרוק את כל האיברים, ולא יכול לוותר או לדלג על אף איבר ולכן צריך לפחות N פעולות.
 

DadleFish

New member
נסחפת לא קצת...

בוא תענה על השאלות הבאות קודם (בראש) - 1. אם אתה מקבל מערך, איך אתה יודע אם הוא עולה ממש מונוטונית? 2. אם אתה מקבל מערך, איך אתה יודע אם הוא יורד ממש מונוטונית? עכשיו תניח שהמערך שלך עולה-יורד-ממש-מונוטונית. מה אתה מצפה שיקרה במהלך המעבר שלך על המערך, ומה יגרום לכשלון (ולהחזרת false)?
 

gil levi

New member
בשביל לא לכתוב שוב את אותה תגובה

תסתכל מה כתבתי בתגובות לכרובית הפלא ולahab. אני מצפה שברגע שהמערך יעבור מירידה לעליה הפונ' שבודקת אם הוא מונוטונית יורד תחזיר false.
 

gil levi

New member
ושכחתי ../images/Emo51.gif לכולכם.

מזל טוב על הפורום החדש ותודה על התשובות המהירות.
 

gil levi

New member
מבקש המלצות לספרים

אני צריך המלצות לספרי תרגילים עם פתרונות (כמו קופרמן בחדו"א להבדיל ממייזלר) לקורסים: 1. מבני נתונים. 2. מודלים חישוביים. תודה מראש.
 

vinney

Well-known member
איפה אתה לומד?

יש את אלה, למבני נתונים הם בטוח טובים (השניים הראשונים, לפחות)
 

BugoK

New member
תגובה

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

gil levi

New member
תודה רבה.

כבר לקחתי מספרות זולה את קורמן באנגלית ואת סיפסר.
 

gil levi

New member
שאלות באוטומטים ושפות פורמליות

בכיתה הגדרנו את היחס ~ על קבוצת המילים מעל א"ב סופי:
w ~ v ⇔ (∀y∈Σ* wy∈L ⇔ vy∈L )​
כאן (שזה באתר הזה. ויני, לתשומת ליבך, אולי שווה להוסיף לקישורים?) מצאתי תרגילים בנושא מחלקות שקילות. בתרגיל 3 אני לא מבין למה מופיע התו a בS. אין שום סיפא שניתן להוסיף לו כך שהוא יהיה בL. אז גם אם נניח שהוא מקיים את היחס באופן ריק (אם יש כזה דבר) עם עצמו, הוא גם מקיים את היחס באופן ריק עם aa, אז מדוע יש לו מחלקת שקילות לעצמו? תודה מראש.
 

vinney

Well-known member
תסתכל באותו אתר (תודה, אגב)

אני בהחלט אוסיף לקישורים. תסתכל בתיאוריה, בפרק המדבר על משפט נרון (זה שקובע בעצם מה זה מחלקות שקילות). תהי L שפה. נאמר ש-x שקולה ל-y ב-L, כאשר לכל מחרוזת w מתקיים XW בL אם ורק אם YW בL . לשאלתך - שתי מחרוזות יהיו באותה מחלקת שקילות אמ"מ שתיהן עם סיפא זהה יהיו בשפה, או שתיהן אם סיפא זהה לא יהיו בשפה. עונה לך על השאלה?
 

gil levi

New member
תודה.

עדיין לא עונה לי על השאלה. אז לפי ההגדרה a ו aa באותה מחלקת שקילות כי שתיהן עם כל סיפא זהה לא יהיו בשפה, אז מדוע a מופיע במחלקת שקילות משלו?
 
למעלה