ABA


"רקורסיה"
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #15682 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 15682
Zippo 
חבר מתאריך 26.5.02
7921 הודעות
   18:58   18.01.10   
אל הפורום  
  רקורסיה  
 
התבקשנו בקורס לכתוב תוכנית שעושה מספר פעולות, וכולן באופן רקורסיבי.
עם אחת הבעיות, לא הצלחתי לחשוב על פתרון טוב.

הבעיה:

נתון גרף מהצורה:

http://stochastix.files.wordpress.com/2009/07/iou-graph-10-nodes-and-20-edges.png
http://f.hatena.ne.jp/images/fotolife/y/ymuto109/20090709/20090709193209.png
http://stochastix.files.wordpress.com/2009/07/iou-graph-10-nodes-and-15-edges.png
http://stochastix.files.wordpress.com/2009/06/iou-graph-alice-bob-and-charlie-3.png

הפונקציה הרקורסיבית צריכה להחזיר רק תשובת כן או לא, לשאלה:

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

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

אשמח לרעיונות לאלגוריתמים רקורסיביים.

אגב, אם זה משנה למישהו, אנחנו אמורים לממש את זה ב-C.
לא שזה משנה הרבה בכל מקרה...


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

  האשכול     מחבר     תאריך כתיבה     מספר  
  רעיון לפתרון - מגעיל,לא אלגנטי בעליל,וכנראה גם לא יעיל. Zippo  18.01.10 21:16 1
     יש אלגוריתם המוצא רכיבים קשירים היטב בגרפים evi  18.01.10 21:36 2
         תודה, אבל זה לא ממש עזר... Zippo  18.01.10 22:32 3
  אני חושב שלסמסטר א' מספיק בהחלט הפתרון הנאיבי. Deuce  19.01.10 13:25 4
     מכתב Zippo  19.01.10 15:59 5
         הזכרת NP שלמה, למרות שזה לא מדוייק במקרה הזה, ldan192  19.01.10 17:09 6
             בסוף פתרתי את זה בדרך המכוערת שהזכרתי בתחילת הפוסט Zippo  19.01.10 23:24 7
                 חחח שתהיה בריא, אתה משקיע בתיעוד ldan192  19.01.10 23:28 8
                     זה חשוב. Zippo  19.01.10 23:32 9
                         כשיצא לך לכתוב אלפי שורות קוד לא תחפש את התיעוד ldan192  19.01.10 23:38 10
         מכתב Deuce  22.01.10 04:08 11
             מתקדם לרמה שלי - נשמע מדויק. Zippo  22.01.10 15:59 12
                 אתה תלמד, אל תדאג (: Deuce  22.01.10 16:35 13
                     אייל אתה כזה מפלצת :P ronen333  22.01.10 17:07 14
                         לא כזה, סחתיין על zippo דווקא. Deuce  23.01.10 00:59 15
                             :) Zippo  23.01.10 18:15 16

       
Zippo 
חבר מתאריך 26.5.02
7921 הודעות
   21:16   18.01.10   
אל הפורום  
  1. רעיון לפתרון - מגעיל,לא אלגנטי בעליל,וכנראה גם לא יעיל.  
בתגובה להודעה מספר 0
 
אבל יעבוד.
פשוט לבנות את כל האפשרויות לחלוקה ל-4 קבוצות, ולבדוק כל אפשרות אם היא עובדת.

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


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
evi 
חבר מתאריך 31.3.02
635 הודעות
   21:36   18.01.10   
אל הפורום  
  2. יש אלגוריתם המוצא רכיבים קשירים היטב בגרפים  
בתגובה להודעה מספר 1
 
לאלג' קוראים DAG והוא מתבסס על DFS.

אולי זה יכול לתת לך כיוון כלשהו.

תעשה חיפוש בגוגל בטוח תמצא כמה מימושים.

אתה יכול לקרוא על זה כאן:
http://he.wikipedia.org/wiki/%D7%92%D7%A8%D7%A3_%D7%A7%D7%A9%D7%99%D7%A8


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Zippo 
חבר מתאריך 26.5.02
7921 הודעות
   22:32   18.01.10   
אל הפורום  
  3. תודה, אבל זה לא ממש עזר...  
בתגובה להודעה מספר 2
 
יש משהו שקצת יותר מתאים (וישים) לשנה א'?


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Deuce 
חבר מתאריך 1.9.08
6225 הודעות
   13:25   19.01.10   
אל הפורום  
  4. אני חושב שלסמסטר א' מספיק בהחלט הפתרון הנאיבי.  
בתגובה להודעה מספר 0
 
יש פתרונות מעניינים יותר, אני יכול להגיד לך כבר עכשיו אבל זה ממש קפיצה במדרגה. בקורס אלגוריתמים של גרפים תיחשף לכמה רעיונות מעניינים יותר.






                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Zippo 
חבר מתאריך 26.5.02
7921 הודעות
   15:59   19.01.10   
אל הפורום  
  5. מכתב  
בתגובה להודעה מספר 4
 
אני אשמח לשמוע כבר עכשיו הסבר מילולי לאלגוריתם מעניין שכזה...
אומנם אנחנו לא צריכים להתחשב בזמן ריצה, אבל אני מעדיף בכל זאת משהו אלגנטי יותר...

בהתחלה חשבתי שהבעיה שקולה לבעיית מפת 4 הצבעים, שהיא NP שלמה, אבל זה לא בדיוק...
הקשירות בין האיברים היא במרחב 3 מימדי, ולא כמו מפה מישורית..

בקיצור, אני פתוח לרעיונות...


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   17:09   19.01.10   
אל הפורום  
  6. הזכרת NP שלמה, למרות שזה לא מדוייק במקרה הזה,  
בתגובה להודעה מספר 5
 
ערכתי לאחרונה בתאריך 19.01.10 בשעה 17:12 בברכה, ldan192
 
אבל בוא תתייחס לזה כבעיה NP שלמה, הרי NP מכיל את P.
תעבור על כל תתי קבוצות הצמתים האפשריים שמתחלקים ל-4 קבוצות (תברר אם קבוצה ריקה נחשבת או לא, על הדרך).
ופשוט תבצע על כולן את הבדיקה (מוודאים שכל קשת לא נוגעת משני צידיה בצמתים בקבוצה).
סך הסיבוכיות תהיה משהו כמו E*2^2^V, אבל למי אכפת, אם לא ביקשו יעילות


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Zippo 
חבר מתאריך 26.5.02
7921 הודעות
   23:24   19.01.10   
אל הפורום  
  7. בסוף פתרתי את זה בדרך המכוערת שהזכרתי בתחילת הפוסט  
בתגובה להודעה מספר 6
 
אין לי זמן להתקשקש על זה יותר מדי, וממילא עוד לא למדנו סיבוכיות,
ואני לא אמור להתחשב בזמני ריצה...
מה גם, ששבוע הבא יש מבחן באינפי, והייתי חייב לתקתק את התרגיל הזה...
שיהיה. אם זה עובד אני מבסוט.

הקוד לסקרנים:


/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
/* Map Can Segment */
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
/* PURPOSE: To determine if a certain map can be divided into 4 groups of */
/* unrelated villages. */
/* */
/* INPUT: Map type - the map */
/* */
/* OUTPUT: MapResult - enum type */
/* */
/* OPERATION: Allocates memory for an aiding array, and arranges all the */
/* nessecery arguments for the recursion. then, invoke the */
/* recursive function, and prints the results. */
/* */
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
MapResult MapCanSegment(Map map)
{
int *groupArray = NULL; //aiding array - divides to groups

//cutting back on edge cases: if there 4 or less villages
if(map->numOfVillages <= 4)
{
printf("Can Segment!\n");
return MAP_SUCCESS;
}

//memory allocation for array
groupArray = (int*) calloc (map->numOfVillages + 1, sizeof(int));
//if out of memory
if(groupArray == NULL)
{
return MAP_OUT_OF_MEMORY;
}

//assigning the last "cell" to a value that is different from 0/1/2/3
groupArray = 4;

//invoking the recursion
if(RecursiveGrouping(map->roadMatrix, map->numOfVillages, groupArray))
printf("Can Segment!\n");
else
printf("Can Not Segment!\n");

return MAP_SUCCESS;
}
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
/* Recursive Grouping */
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
/* PURPOSE: To determine if a certain map can be divided into 4 groups of */
/* unrelated villages. */
/* */
/* INPUT: an array of the roads (int*), the number of villages, and an */
/* aiding array with the group members as numbers from 0 to 3 */
/* */
/* OUTPUT: int - 1 or 0 - yes or no. */
/* */
/* OPERATION: Stoping condition, is when we reached the cell containing the */
/* value we first "planted" on the last cell. if we reached the */
/* end, we call another function that determines if the current segmentation */
/* has no connections between group members. for all other recursive levels, */
/* we invoke the recursion in a loop, while assigning new value to the array */
/* and invoke the recursion with pointer incremention. */
/* */
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
static int RecursiveGrouping(int *roadMap, int numOfVlgs, int *groupArray)
{
int iCounter = 0; //loop counter

//if we went through all the array and reached the end
if(groupArray == 4)
//check segmentation (groupArray decremented to the starting point)
return CheckSegmention(roadMap, numOfVlgs, groupArray - numOfVlgs);

//loop that controls group assignment
for(iCounter = 0; iCounter < 4; iCounter++)
{
//assigning group to current village
groupArray = iCounter;
//check recursively if it's a valid segmentation
if(RecursiveGrouping(roadMap, numOfVlgs, groupArray + 1))
return 1;
}
return 0;
}
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
/* Check Segmention */
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
/* PURPOSE: To determine if a certain segmentation of villages to groups */
/* is valid. (connection between villages in group is forbidden) */
/* */
/* INPUT: an array of the roads (int*), the number of villages, and an */
/* aiding array with the group members as numbers from 0 to 3 */
/* */
/* OUTPUT: int - 1 or 0 - yes or no. */
/* */
/* OPERATION: Through nested loops that checks for every village, if other */
/* villages in the same group are connected or not. */
/* */
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
static int CheckSegmention(int *roadMap, int numOfVlgs, int *groupArray)
{
int iCounter1 = 0; //loop counter - village 1
int iCounter2 = 0;//loop counter - village 2

for(iCounter1 = 0; iCounter1 < numOfVlgs; iCounter1++)
{
for(iCounter2 = 0; iCounter2 < numOfVlgs; iCounter2++)
{
//if villages are not in the same group, continue
if(groupArray != groupArray)
continue;

//if villages are in the same group and yet are connected, return 0
if(roadMap != 0)
return 0;
}
}
//check passed ok: return 1 (succcess!)
return 1;
}


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   23:28   19.01.10   
אל הפורום  
  8. חחח שתהיה בריא, אתה משקיע בתיעוד  
בתגובה להודעה מספר 7
 


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Zippo 
חבר מתאריך 26.5.02
7921 הודעות
   23:32   19.01.10   
אל הפורום  
  9. זה חשוב.  
בתגובה להודעה מספר 8
 
וחוץ מזה, אחרי שהתרגיל עובר בדיקה אוטומטית, הוא עובר בדיקה ידנית.
ויש הנחיות ברורות לכתיבה.
תוכנית שלא כתובה לפי ה-Coding style - ירדו נקודות מהציון.
אז אני משתדל להקפיד על קלה כבחמורה.

גם ככה הבודקים נתפסים לקטנות ושוחטים ציונים...


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


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Deuce 
חבר מתאריך 1.9.08
6225 הודעות
   04:08   22.01.10   
אל הפורום  
  11. מכתב  
בתגובה להודעה מספר 5
 
אין לי כל כך הרבה זמן, אבל קצת התעמקתי. אם השאלה הייתה לחלק ל-4 קבוצות כך שבכל קבוצה אין קשרים בין הקודקודים אז מדובר כמעט בבעיית NPC הקרוייה IS - INDEPENDENT SET שבהנתן גרף G צ"ל למצוא האם קיימת קבוצה בלתי תלוייה בגודל k, קרי קבוצה בגודל k בלי קשת המחברת בין אף זוג. קל מאוד לעשות רדוקציה ממנה לבעייה שלך, על ידי למשל הוספת 3 צמתים מנוונים לגרף G (בלי אף קשת) ושליחה לקופסה השחורה שבנית. לכן גם הבעייה שלך היא NPC.

כיצד מוכיחים? זה ממש מתקדם לרמה שלך, אבל ח"ח על ההתעניינות. בעקרון יש בעייה שנקראת Clique שהיא הפוכה ל-IS. מוכיחים שהיא ב-NPC על ידי רדוקציה מ-3CNF - זה הכי נוח לפחות.

בכל אופן, יש עוד הרבה מידע על זה אבל זה מאוד בכלליות






                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Zippo 
חבר מתאריך 26.5.02
7921 הודעות
   15:59   22.01.10   
אל הפורום  
  12. מתקדם לרמה שלי - נשמע מדויק.  
בתגובה להודעה מספר 11
 
הבנתי על מה אתה מדבר, בלי להבין את מה שאתה מדבר עליו...
אני מניח שאני עוד אלמד את זה מתישהוא ב-3 שנים הקרובות.

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

בכל אופן, אם אכן הבעיה שקולה ל-NPC, אז אין לי יותר מדי סיכוי למצוא אלגוריתם יעיל יותר...

אני אצטרך להסתפק ב: (O(4^n


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Deuce 
חבר מתאריך 1.9.08
6225 הודעות
   16:35   22.01.10   
אל הפורום  
  13. אתה תלמד, אל תדאג (:  
בתגובה להודעה מספר 12
 
ביני לבינך, אחד הנושאים שאני ממש אוהב במדעי המחשב זה את כל התחום של החישוביות לרבות כריעות של שפות, מחלקות שונות, חישוביות ופונקציות חישוביות וכו'.

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

בכל מקרה, אתה תלמד על זה - אל דאגה.






                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות
   17:07   22.01.10   
אל הפורום  
  14. אייל אתה כזה מפלצת :P  
בתגובה להודעה מספר 13
 
   ;)


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Deuce 
חבר מתאריך 1.9.08
6225 הודעות
   00:59   23.01.10   
אל הפורום  
  15. לא כזה, סחתיין על zippo דווקא.  
בתגובה להודעה מספר 14
 
יחסית לסמסטר א' הוא מגלה התעניינות ומגדיל ראש, אני אוהב את הגישה שלו.
אני סה"כ למדתי על התחום, גם אני הרחבתי אופקים וקראתי ספר או שניים שלמים סתם כדי לגלות יותר - אבל זה תחום ענק.






                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Zippo 
חבר מתאריך 26.5.02
7921 הודעות
   18:15   23.01.10   
אל הפורום  
  16. :)  
בתגובה להודעה מספר 15
 


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

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

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



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