עזרה באלגוריתם הבא

thebalu

New member
עזרה באלגוריתם הבא

נתון מערך ממויין של מספרים שלמים a[1….n] כאשר כל מספר אינו מופיע יותר מפעם אחת במערך כיצד נבצע את הפעולות הבאות : 1. בזמן (1)O ענה האם קיים K כך שa[1]<K<a[n] ושאינו מופיע במערך 2. בזמן o(logN) במידה ולא מופיע במערך מספר שלם K שמקיים a[1]<K<a[n] החזר מספר כזה
 

yair24

Member
תשובה:

ככה: 1) גודל המערך ידוע כלומר ידוע כמה איברים יש בו וכמו כן ידוע שכולם מספרים שלמים עכשיו אני אתן לך דוגמא: נגיד שגודל המערך הוא 10 אתה בודק את האיבר הראשון והאחרון ההפרש חייב להיות שווה ל10 או גדול מ-10 אם נגיד שהמספר הראשון הוא 10 והמספר האחרון הוא 19 (שזה בדיוק 10 מספרים) אז אתה יודע שאין מספר כזה (כי ידוע שהמספרים לא חוזרים על עצמם). אם למשל המספר הראשון היה 10 והאחרון היה 21 (סתם דוגמא) אז בטוח שיש מספר שמקיים את התנאי. אני מקווה שהבנת אם לא אז תשאל מה לא הבנת ואני אסביר. 2) בקשר לשאלה השניה שלך אם לא מופיע מספר שמקיים את התנאי ואתה רוצה למצוא אותו תוכל לעשות זאת בסיבוכיות של LOG N אם תבנה תוכנית שמבוססת על שיטת החציה. אני מקווה שאתה מכיר את השיטה הזאת אין לי זמן כרגע לחשוב על איך להסביר אותה סורי. מקווה שעזרתי. יאיר
 

yair24

Member
נראה לי שלא הסברתי את עצמי טוב...

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

yair24

Member
קיבינימאט גם עכשיו זה לא ברור...

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

אלדד26

New member
או שאני מפספס פה משהו,

או שממש הצלחתם לבלבל אותי. איפה כתוב שהמספרים במערך עוקבים?! זה לא כתוב בשום מקום. זה יכול להיות מערך של 5 מספרים - 1, 5, 87, 123, 789. זה מערך ממויין של מספרים שלמים, כאשר כל מספר אינו מופיע יותר מפעם אחת במערך. עכשיו, איך נגלה האם המספר 7 קיים במערך? זו שאלה לא קלה. השאלה השניה היא דווקא יותר פשוטה. בודקים באמת כמו שיאיר הציע, את ההפרש בין האיבר הראשון לאיבר האחרון. נניח שגודל המערך הוא N, אז יש שתי אפשרויות: ההפרש הוא N - ואז אין "מקום פנוי" במערך; או ההפרש גדול מ-N - ואז נניח שהוא N+1, בלי הגבלת הכלליות, ועכשיו עלינו למצוא את המקום הפנוי בתוך המערך. האלגוריתם הוא: (מערך "מלא" - ההפרש בין האחרון לבין הראשון + 1 שווה לגודל המערך) חלק את המערך לשני חלקים. בדוק האם המספר שאמור להיות המספר הנוכחי אכן במיקום הנוכחי (ראה הערה בהמשך) אם לא - החזר את המספר הנוכחי אם המערך הימני אינו "מלא", חלק אותו לשניים והמשך בתהליך. אחרת חלק את המערך השמאלי לשני חלקים והמשך בתהליך דוגמה: נניח שלפנינו המערך 1,2,4,5,6,7,8,9,10,11 - בן 10 איברים. המספר הפנוי הוא 3. נחלק את המערך לשני חלקים: (1,2,4,5,6) ו - (7,8,9,10,11). המערך הימני - 11..7 - מלא. המערך השמאלי לא מלא - נחלק אותו לשני חלקים, (1,2) ו - (4,5,6). אבל עכשיו חסר לנו בעצם ה - 3, וזיהינו אותו, כי במקום ה - 4 היה צריך להיות 3. נחזור לשאלה הראשונה. הימור שלי - כדי שזה יעבוד ב - (O(1, צריך לייצג את כל משתני המערך בבת אחת ביחד כך שפעולה חשבונית אחת תוכל לזהות אם האיבר קיים במערך... אבל פה נתקעתי
 

yair24

Member
אני אענה לך על 6 השורות הראשונות

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

yair24

Member
המשך:

כמה זה 789 פחות 1 ? זה 788. 788 גדול מ5 (שזה גודל המערך) ולכן אני מסיק שקיים מספר שהוא בין 1 ל789 ואינו מופיע במערך... הבנת? יאיר
 

yair24

Member
אל תתבלבל:

הנה ציטוט של מה שכתבת: "עכשיו, איך נגלה האם המספר 7 קיים במערך? זו שאלה לא קלה" שאלה קלה או לא קלה זה לא משנה כי זו לא השאלה שנשאלה פה!! השאלה שנשאלה פה היא האם קיים מספר כלשהו ולא שואלים לגבי מספר ספציפי (בסעיף 1 של השאלה לפחות) התשובה שאתה צריך לתת לשאלה היא כן או לא ולא איזה מספר זה... יותר ברור?
 

yair24

Member
ההדגשה היתה צריכה להיות רק

על המילה "כלשהו" ולא על כל המשפט...
 

yair24

Member
עוד ציטוט:

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

אלדד26

New member
השאלה לא ברורה לי

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

yair24

Member
זה ממש לא נכון...

השאלה לא יכולה להישתמע לשני פנים היא כתובה בצורה הברורה והנכונה ביותר... אם לא הבנת אותה תקרא שוב ותראה שאין לה דו משמעות כתוב שם בפרוש להגיד אם קיים K לא כתוב כלום על למצוא אותו. יאיר
 

אלדד26

New member
לא הבנת אותי.

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

yair24

Member
תקן אותי אם אני טועה...

אתה טוען שאי אפשר לענות כן או לא על סעיף 1 בזמן (O(1 אני צודק? ואתה טוען שאפשר לעשות אז זה רק בLOG N נכון? אבל מה דעתך על התשובה שאני נתתי? בדוק את האיבר הראשון ואת האיבר האחרון ותדע אם קיים או לא קיים. זה סיבוכיות (O(1 אז למה אי אפשר? יאיר
 

אלדד26

New member
כן, ברור,

התשובה שלך נכונה לחלוטין, לא טענתי אחרת. אמרתי רק שהשאלה עצמה היא שבלבלה אותי
אני חושב שהיא בהחלט משתמעת לשתי פנים. אתה הבנת אותה (כנראה...
) נכון, וענית תשובה נכונה.
 

yair24

Member
כשאומרים "האם קיים K"

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

אלדד26

New member
אני באמת נורא נורא מצטער

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