ABA


"שאלה מתוך מבחן ב JAVA,"
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #10661 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 10661
dvir8
חבר מתאריך 13.5.02
5929 הודעות
   10:16   16.04.12   
אל הפורום  
  שאלה מתוך מבחן ב JAVA,  
 
   ערכתי לאחרונה בתאריך 16.04.12 בשעה 10:19 בברכה, dvir8
 
היה לי מבחן בסמסטר קודם, ותודות לשאלה זו לא עברתי את המבחן :\

בכל מקרה אני מסתכל עליה עכשיו כי אני לומד למועד ב ואשמח לקבל עזרה!

השאלה היא כזו:
http://yourgalleries.net/images/3247682975.jpg

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

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

מה דעתכם? האם יש לכם דרך יותר קלאסית?


                                שתף        
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

  האשכול     מחבר     תאריך כתיבה     מספר  
  עדכון: הבנתי שצריך להשתמש ב backtracing dvir8 16.04.12 10:34 1
  אם הבנתי נכון את האלגוריתם שלך... הוא לא עובד תמיד ShocKi  16.04.12 23:16 2
     תודה על התגובה...מחר אני אנסה שוב dvir8 17.04.12 01:03 3
  בעיניי הכוונה פה לפתרון ''גן חובה'', הכי פחות תחכום ldan192  17.04.12 08:51 4
     עידן האיברים לא חייבים להיות סמוכים. dvir8 19.04.12 10:27 5
         זה בהחלט מתחשב ldan192  21.04.12 13:06 6
             אחי אני מתחנן שתלמד אותי איך מגיעים לחשיבה כזו? dvir8 21.04.12 18:56 7
                 הםםם... ldan192  21.04.12 20:29 8
                     תודה רבה אני אנסה את שיטת העץ. dvir8 22.04.12 00:05 9
                         לא זוכר תרגילים דומים, פשוט ברגע שיש לך נסיון ldan192  22.04.12 01:05 10
                             תודה עידן אני אנסה לרשום קוד ואעדכן! dvir8 22.04.12 08:17 11
                             אוקי נתקעתי בבעיתיות מסויימת. dvir8 22.04.12 09:06 12
                                 לא בטוח שהבנתי אותך ldan192  22.04.12 09:58 13
                                     עידן עדיין לא הצלחתי כל כך להבין את החשיבה dvir8 22.04.12 23:48 14
                                         עדכון מצב: dvir8 22.04.12 23:56 15
                                             שוב, אתה רוצה לחשוב על חוקיות ldan192  23.04.12 20:02 16
                                                 אני אשמח, dvir8 23.04.12 22:13 17
                                                     פתור לוח סודוקו באמצעות BT... ldan192  24.04.12 14:28 18
                                                         גם בלי תכנות אני לא יודע לפתור סודוקו :] dvir8 24.04.12 20:41 19

       
dvir8
חבר מתאריך 13.5.02
5929 הודעות
   10:34   16.04.12   
אל הפורום  
  1. עדכון: הבנתי שצריך להשתמש ב backtracing  
בתגובה להודעה מספר 0
 
   והאמת זה די פשוט. פשוט אני לא יודע איך ליישם את ה backtracing.
אני מנסה וכבר מעדכן.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ShocKi  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 19.3.02
20171 הודעות, 10 פידבק
   23:16   16.04.12   
אל הפורום  
  2. אם הבנתי נכון את האלגוריתם שלך... הוא לא עובד תמיד  
בתגובה להודעה מספר 0
 
   למשל המערך : 1,1,מינוס 2

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

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

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


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


קאש-באק ישראלי: https://www.cashback.co.il/?uref=33330
קאשבק לAsos ואמזון דרך Ebates: https://goo.gl/MX87Y7 - מקבלים 10$ לאחר שימוש ראשון.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
dvir8
חבר מתאריך 13.5.02
5929 הודעות
   01:03   17.04.12   
אל הפורום  
  3. תודה על התגובה...מחר אני אנסה שוב  
בתגובה להודעה מספר 2
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   08:51   17.04.12   
אל הפורום  
  4. בעיניי הכוונה פה לפתרון ''גן חובה'', הכי פחות תחכום  
בתגובה להודעה מספר 0
 
אלגוריתמי שנותן פתרון אלגנטי (אבל לאו דווקא עם ביצועים טובים).



public static boolean splitEqualSum(int[] a)
{
return helper(a, 0, 0, 0);
}

public static boolean helper(int[] a, int pos, long sum1, long sum2)
{
if (a.length == pos) return (sum1 == sum2);
return helper(a, pos+1, sum1 + a[pos], sum2) || helper(a, pos+1, sum1, sum2 + a[pos]));
}


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

בהצלחה!


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
dvir8
חבר מתאריך 13.5.02
5929 הודעות
   10:27   19.04.12   
אל הפורום  
  5. עידן האיברים לא חייבים להיות סמוכים.  
בתגובה להודעה מספר 4
 
   התחשבת בזה?


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   13:06   21.04.12   
אל הפורום  
  6. זה בהחלט מתחשב  
בתגובה להודעה מספר 5
 


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
dvir8
חבר מתאריך 13.5.02
5929 הודעות
   18:56   21.04.12   
אל הפורום  
  7. אחי אני מתחנן שתלמד אותי איך מגיעים לחשיבה כזו?  
בתגובה להודעה מספר 6
 
   איך אני ניגש לסוג התרגילים האלו?

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

ובכנות כמה זמן לקח לך לחשוב על תשובה לשאלה זו?


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   20:29   21.04.12   
אל הפורום  
  8. הםםם...  
בתגובה להודעה מספר 7
 
1. באק טראק דורש 3 דברים בסיסיים:
א. תנאי עצירה (יתכנו כמה)
ב. חלק חישובי
ג. חלק שמפעפע את הצעד הבא, כאילו הייתה איטרציה
ברגע שאתה עובד לפי 3 החוקים זה יכול לעזור לך

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

באמת super obvious אחרי שצוברים טיפ טיפה נסיון...


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
dvir8
חבר מתאריך 13.5.02
5929 הודעות
   00:05   22.04.12   
אל הפורום  
  9. תודה רבה אני אנסה את שיטת העץ.  
בתגובה להודעה מספר 8
 
   אם אני אצייר את זה זה יקל על החשיבה?


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

לאחר שאצליח אותו אני אנסה לעשות עם 2 פעולות וכך הלאה - זה אימון טוב לא?


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

הרי בלולאות תוך כמה דקות אצליח להגיע לתשובה. אבל איזה Switch אני צריך לעשות במוח כדי לראות את הרקורסיה או יותר מדויק ה backtrack.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   01:05   22.04.12   
אל הפורום  
  10. לא זוכר תרגילים דומים, פשוט ברגע שיש לך נסיון  
בתגובה להודעה מספר 9
 
באלגוריתמים ובינה מלאכותית - סוג השאלות האלו נהיה מאוד פשוט.

וכמובן.

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

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

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


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
dvir8
חבר מתאריך 13.5.02
5929 הודעות
   08:17   22.04.12   
אל הפורום  
  11. תודה עידן אני אנסה לרשום קוד ואעדכן!  
בתגובה להודעה מספר 10
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
dvir8
חבר מתאריך 13.5.02
5929 הודעות
   09:06   22.04.12   
אל הפורום  
  12. אוקי נתקעתי בבעיתיות מסויימת.  
בתגובה להודעה מספר 10
 
   לקחתי לדוגמא את המערך הבא:
1 3 5 7
ואני רוצה למצוא האם יש מספרים כלשהם במערך שסכומם נותן את 8.
ניתן לראות שיש 2 כאלה: 7+1 וגם 5+3

אז בעצם אני אומר לעצמי דבר כזה, התרשים כאן נראה כמו סוג של עץ

שבפעם הראשונה השורש הוא 1 ומתפצל ל 3 או 5 או 7
במידה ונבחר 3 אז נשאר 5 או 7
במידה ונבחר 5 אז נשאר או 7
במידה ונבחר 7

או שנתחיל ישר משלוש ואז יש את 5 או 7
וכך הלאה....

ציירתי את העץ. השאלה היא כזאת:
בעקבות כך שיש לי מערך לא ידוע איך אני יכול לאפשר לחבר את כל האופציות?
כאילו יהיו לי מלא או. כלומר יותר משתי אופציות. יכולים להיות 10 אופציות גם. אז איך אני מתחשב בזה ברקורסיה?


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   09:58   22.04.12   
אל הפורום  
  13. לא בטוח שהבנתי אותך  
בתגובה להודעה מספר 12
 
אבל קח את האינטואיציה הבאה, יש לך משתנה משתנים:
int sum = 0

עלה ימני: [sum += arr[i
עלה שמאלי: פעולה ריקה
הדרגה הבאה: i++

כלומר, העץ (מתחיל להראות) ככה:


i=0 {sum=0}
/ \
i=1 {sum=7} {sum=0}
/ \ / \
i=2 {sum=12} {sum=7} {sum=5} {sum=0}
/ \
i=3 {גיזום} {sum=12} ....


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
dvir8
חבר מתאריך 13.5.02
5929 הודעות
   23:48   22.04.12   
אל הפורום  
  14. עידן עדיין לא הצלחתי כל כך להבין את החשיבה  
בתגובה להודעה מספר 13
 
   איך העץ בא לידי ביטוי בקוד?

החשיבה שלי היא כזו: הייתי מצייר אבל אין מספיק מקום בדף!

נניח שנתחיל בסכימה הראשונה שזה האיבר הראשון כלומר sum=1.
עכשיו יש לו 3 אופציות לסכום את: 3 או 5 או 7

כלומר n-1 אפשרויות

לאחר מכן נמשיך עם 3 לדוגמה ונקבל sum=4
עכשיו יש 2 אופציות 5 או 7

וכך הלאה... עד שהוא מגיע לאיבר האחרון כשורש! כלומר כש 7 שורש אני יודע שסיימתי לבדוק הכל.

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


return helper(a,sum+a,pos+1) || helper(a,sum+a,pos+2)

אתה מבין את הכוונה שלי אני לא יודע איך לממש את האלגוריתם לקוד.
מה הדרך בעצם לתכנן אלגוריתם ל backtracking אולי זו השאלה הנכונה?


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
dvir8
חבר מתאריך 13.5.02
5929 הודעות
   23:56   22.04.12   
אל הפורום  
  15. עדכון מצב:  
בתגובה להודעה מספר 14
 
   ערכתי לאחרונה בתאריך 23.04.12 בשעה 00:35 בברכה, dvir8
 
עשיתי את הדבר הבא:

public static boolean splitEqualSum(int a)
{
return helper(a,0,0,0);
}
public static boolean helper(int a, int sum, int pos, int count)
{
if(count == a.length) return (sum==8);

return helper(a,sum+a|pos|,pos+1,count+1) || helper(a,sum,pos+1,count+1);
}
}

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

אממ אשמח אם תעזור לי לגבי הבנת בניית האלגוריתם שוב.
אני לאט לאט מתחיל להבין אבל עדין לא נפל האסימון לגמרי!


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   20:02   23.04.12   
אל הפורום  
  16. שוב, אתה רוצה לחשוב על חוקיות  
בתגובה להודעה מספר 15
 
במקרה השני שנתת החוקיות היא כזו:
(הספרה ה-i נכנסת לסכום) || (הספרה ה-i לא נכנסת לסכום)
ככה בעצם אפשר ליצור מרחב דו-מימדי של כל הקומבינציות של i-ים באמת כן ולא נכנסים לסכום.
מספיק שיש "משבצת" אחת לפחות במרחב הזה שנותנת sum == 8 - שאתה מסודר.

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


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
dvir8
חבר מתאריך 13.5.02
5929 הודעות
   22:13   23.04.12   
אל הפורום  
  17. אני אשמח,  
בתגובה להודעה מספר 16
 
   אני אשמח שתתן לי מספר תרגילים! תודה עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   14:28   24.04.12   
אל הפורום  
  18. פתור לוח סודוקו באמצעות BT...  
בתגובה להודעה מספר 17
 


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
dvir8
חבר מתאריך 13.5.02
5929 הודעות
   20:41   24.04.12   
אל הפורום  
  19. גם בלי תכנות אני לא יודע לפתור סודוקו :]  
בתגובה להודעה מספר 18
 
   אני אנסה!


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

תגובה מהירה  למכתב מספר: 
 
___________________________________________________________________

___________________________________________________________________
למנהלים:  נעל | תייק בארכיון | מחק | העבר לפורום אחר | מחק תגובות | עגן אשכול
       



© כל הזכויות שמורות ל-רוטר.נט בע"מ rotter.net