| כותב |  | 
      
        | java אורח
 
  
 
 הצטרף / הצטרפה: 01 October 2003
 משתמש: אונליין
 הודעות: 12647
 | 
          
           | | נשלח בתאריך: 11 November 2007 בשעה 20:10 | | IP רשוּם | 
 |   |  
           | 
 |  הצלחתי לפתור רק בסיבוכיות של n בריבוע וצריך לפתור בסיבוכיות של n     נתאר את בעיית מציאת "בור" במערך דו-ממדי ריבועי: קלט: מערך דו-ממדי ריבועי בגודל n´n המלא באפסים ואחדים בלבד.           נגדיר ש- k הוא בור (sink) אם בשורה ה- k - ית כל הערכים הם 0, ובעמודה ה- k -ית כל הערכים הם 1 (חוץ מהאיבר [k][k] עצמו שהוא 0). פלט: האם קיים מספר k המהווה בור במערך? אם כן, הדפס את ערכו.   לדוגמא: במערך A  3 הוא "בור", ובמערך B אין בור. 
|   |   | A |   |   |   |   |   |   |   | B |   |   |   |  
| 0 | 1 | 1 | 0 | 1 | 0 |   |   | 1 | 0 | 0 | 0 | 1 | 0 |  
| 0 | 0 | 1 | 1 | 0 | 1 |   |   | 1 | 1 | 1 | 0 | 0 | 1 |  
| 1 | 0 | 1 | 0 | 0 | 0 |   |   | 0 | 0 | 0 | 0 | 0 | 0 |  
| 0 | 0 | 0 | 0 | 0 | 0 |   |   | 1 | 1 | 1 | 1 | 1 | 1 |  
| 0 | 0 | 1 | 1 | 0 | 1 |   |   | 1 | 0 | 1 | 0 | 1 | 0 |  
| 1 | 1 | 1 | 0 | 1 | 0 |   |   | 0 | 1 | 0 | 0 | 0 | 1 |       כתבו שיטה יעילה הפותרת את הבעיה. חתימת השיטה תהיה: public static int isSink (int [][] mat)   השיטה תחזיר את המספר k המהווה בור במערך, אם קיים אחד כזה, ו- -1 אם לא קיים בור במערך. | 
       
        | חזרה לתחילת העמוד |       | 
       
       
        |  | 
        | java אורח
 
  
 
 הצטרף / הצטרפה: 01 October 2003
 משתמש: אונליין
 הודעות: 12647
 | 
          
           | | נשלח בתאריך: 13 November 2007 בשעה 15:47 | | IP רשוּם | 
 |   |  
           | 
 |  אני מנסה ומנסה ולא מצליח. מישהו מכיר פורום שבו אוכל לקבל עזרה לגבי בניית אלוגריתם כזה? תודה! | 
       
        | חזרה לתחילת העמוד |       | 
       
       
        |  | 
        | shoshan מנהל האתר
 
  
  
 הצטרף / הצטרפה: 16 July 2005
 מדינה: Israel
 משתמש: מנותק/ת
 הודעות: 4637
 | 
          הממ...הפורום הזה (:
           | | נשלח בתאריך: 13 November 2007 בשעה 16:39 | | IP רשוּם | 
 |   |  
           | 
 |  
 אגב, למה בשניהם 0 הוא לא בור ?
 
 צריך להגזיר מהו n, אם הוא מספר האיברים בשורה או מספר האיברים במטריצה.
 
 __________________
 עד מתי רשעים יעלוזו?
 
 עַל כֵּן אֶמְאַס וְנִחַמְתִּי עַל עָפָר וָאֵפֶר.
 | 
       
        | חזרה לתחילת העמוד |       | 
       
       
        |  | 
        | java אורח
 
  
 
 הצטרף / הצטרפה: 01 October 2003
 משתמש: אונליין
 הודעות: 12647
 | 
          
           | | נשלח בתאריך: 13 November 2007 בשעה 16:51 | | IP רשוּם | 
 |   |  
           | 
 |  תודה על התגובה. רק ב-A יש בור ב-B אין בור(הבור ב-A הוא[3][3]).כדי ש-[0][0] יהיה בור  צריך שכל המספרים בשורה 0 יהיו 0 וכל המספרים בתור 0 יהיו 1 חוץ מ-[0][0] שצריך להיות ס. n הוא הגודל פה הוא שווה ל-6-->לכן יש במטריצה 36 ריבועים | 
       
        | חזרה לתחילת העמוד |       | 
       
       
        |  | 
        | shoshan מנהל האתר
 
  
  
 הצטרף / הצטרפה: 16 July 2005
 מדינה: Israel
 משתמש: מנותק/ת
 הודעות: 4637
 | 
          אה אוקיי, הבנתי, לא קראתי נכון את ההגדרה של בור.
           | | נשלח בתאריך: 13 November 2007 בשעה 17:31 | | IP רשוּם | 
 |   |  
           | 
 |  
 שנייה, אני אחשוב על זה.
 
 __________________
 עד מתי רשעים יעלוזו?
 
 עַל כֵּן אֶמְאַס וְנִחַמְתִּי עַל עָפָר וָאֵפֶר.
 | 
       
        | חזרה לתחילת העמוד |       | 
       
       
        |  | 
        | shoshan מנהל האתר
 
  
  
 הצטרף / הצטרפה: 16 July 2005
 מדינה: Israel
 משתמש: מנותק/ת
 הודעות: 4637
 | 
          הממ...כתבתי ב-c# אבל הדמיון מאוד מאוד גדול.
           | | נשלח בתאריך: 13 November 2007 בשעה 18:26 | | IP רשוּם | 
 |   |  
           | 
 |  
 
 
| קוד: 
 
    
    | 
      
       | private static int isSink(int[,] arr) {
 int n = arr.GetLength(0);
 bool[ ] check = new bool[n];
 for ( int i = 0 ; i < n ; i++ )
 check[i] = true;
 for ( int i = 0 ; i < n ; i++ )
 if ( check[i] )
 {
 for ( int j = 0 ; j < n ; j++ )
 {
 if ( arr[i, j] == 0 )
 check[j] = false;
 else
 {
 check[i] = false;
 break;
 }
 if ( i == j )
 continue;
 if ( arr[j, i] == 1 )
 check[j] = false;
 else
 {
 check[i] = false;
 break;
 }
 }
 if ( check[i] )
 return i;
 }
 return -1;
 }
 |  |  |  
 נכון זה נראה, לולאה דו מימדית שבסה"כ מבצעת n^2 פעולות.
 
 אבל שם לב שכל פעם שאנחנו לא מבטלים את האינדקס של i אז זה מבטל את
 האינדקס של j, ולהפך, למעט מאקסימום פעם אחת, ולכן אנחנו מבטלים n-1
 פעמים n צעדים ונשאר לנו n בדיקות.
 
 סה"כ יהיו לנו N בדיקות ולא n^2.
 
 __________________
 עד מתי רשעים יעלוזו?
 
 עַל כֵּן אֶמְאַס וְנִחַמְתִּי עַל עָפָר וָאֵפֶר.
 | 
       
        | חזרה לתחילת העמוד |       | 
       
       
        |  | 
        | java אורח
 
  
 
 הצטרף / הצטרפה: 01 October 2003
 משתמש: אונליין
 הודעות: 12647
 | 
          
           | | נשלח בתאריך: 13 November 2007 בשעה 18:46 | | IP רשוּם | 
 |   |  
           | 
 |  שושן תודה על העזרה! תרגמתי את זה ל-java והרצתי את מערך A והשיטה שכתבת מחזירה 1- במקום 3 ניסיתי על כל מיני מערכים אחר ותמיד השיטה מחזירה 1- אז לצערי היא לא עונה על השאלה. | 
       
        | חזרה לתחילת העמוד |       | 
       
       
        |  | 
        | shoshan מנהל האתר
 
  
  
 הצטרף / הצטרפה: 16 July 2005
 מדינה: Israel
 משתמש: מנותק/ת
 הודעות: 4637
 | 
          אצלי זה עבר, כנראה לא תירגממת טוב או שלא העתקת את המערך טוב.
           | | נשלח בתאריך: 13 November 2007 בשעה 20:04 | | IP רשוּם | 
 |   |  
           | 
 |  
 אתה מוזמן לדבג
 
 __________________
 עד מתי רשעים יעלוזו?
 
 עַל כֵּן אֶמְאַס וְנִחַמְתִּי עַל עָפָר וָאֵפֶר.
 | 
       
        | חזרה לתחילת העמוד |       | 
       
       
        |  | 
        | java אורח
 
  
 
 הצטרף / הצטרפה: 01 October 2003
 משתמש: אונליין
 הודעות: 12647
 | 
          דיבגתי את הקוד בעזרת מהדר והוא עבר קומפילציה אבל שוב הבעיה שהתשובה
           | | נשלח בתאריך: 13 November 2007 בשעה 20:34 | | IP רשוּם | 
 |   |  
           | 
 |  שהוא נותן לא נכונה.
 
 
 
| קוד: 
 
    
    | 
      
       | public static int isSink(int[][] arr) {
 int n = arr[0].length;
 boolean[ ] check = new boolean[n];
 for ( int i = 0 ; i < n ; i++ )
 check[i] = true;
 for ( int i = 0 ; i < n ; i++ )
 if ( check[i] )
 {
 for ( int j = 0 ; j < n ; j++ )
 {
 if ( arr[i][j] == 0 )
 check[j] = false;
 else
 {
 check[i] = false;
 break;
 }
 if ( i == j )
 continue;
 if ( arr[j][i] == 1 )
 check[j] = false;
 else
 {
 check[i] = false;
 break;
 }
 }
 if ( check[i] )
 return i;
 }
 return -1;
 }
 |  |  |  | 
       
        | חזרה לתחילת העמוד |       | 
       
       
        |  | 
        | java אורח
 
  
 
 הצטרף / הצטרפה: 01 October 2003
 משתמש: אונליין
 הודעות: 12647
 | 
          
           | | נשלח בתאריך: 13 November 2007 בשעה 20:43 | | IP רשוּם | 
 |   |  
           | 
 |  יש בעיה בהעתקה לאתר! העתקתי את הקוד מקובץ ה-java לאחר שנוצר ועבר קומפילציה לפה ולאחר ששלחתי אני שם לב שמשום מה הוא השמיט את הסימן של המערך.לדוגמה  (if(check צריך להיות if ובסוגריים [check[i יש דרך להעתיק לפה בצורה תקינה?בכל מקרה זה הקוד שתרגמתי ל-java(חוץ מהבעיות שהאתר משום מה השמיט בשליחה)והוא עבר קומפילציה .אתה יכול לראות שהקוד כמו שלך בול רק ששיניתי את הדברים ל-java למשל במקום bool שכתבת כתבתי boolean ב-java | 
       
        | חזרה לתחילת העמוד |       | 
       
       
        |  | 
        | shoshan מנהל האתר
 
  
  
 הצטרף / הצטרפה: 16 July 2005
 מדינה: Israel
 משתמש: מנותק/ת
 הודעות: 4637
 | 
          כן, תשלח וכשאתה שולח תוריד את הבחירה מ-"אפשר שימוש ב- קודי הפורום בכדי
           | | נשלח בתאריך: 13 November 2007 בשעה 21:03 | | IP רשוּם | 
 |   |  
           | 
 |  לכתוב את הודעותיך"
 
 אתה מוזמן גם עם debugger לעבור שורה אחרי שורה ולראות מה הבעיה.
 
 אתה יודע,
 
 __________________
 עד מתי רשעים יעלוזו?
 
 עַל כֵּן אֶמְאַס וְנִחַמְתִּי עַל עָפָר וָאֵפֶר.
 | 
       
        | חזרה לתחילת העמוד |       | 
       
       
        |  | 
        | java אורח
 
  
 
 הצטרף / הצטרפה: 01 October 2003
 משתמש: אונליין
 הודעות: 12647
 | 
          
           | | נשלח בתאריך: 13 November 2007 בשעה 21:15 | | IP רשוּם | 
 |   |  
           | 
 |  עברתי עם debugger והכל תקין רק שהשיטה לא עושה את מה שהיא צריכה לעשות לפי התרגיל.                                                                                                 
public static int isSink(int[][] arr) {
 int n = arr[0].length;
 boolean[ ] check = new boolean[n];
 for ( int i = 0 ; i < n ; i++ )
 check[i] = true;
 for ( int i = 0 ; i < n ; i++ )
 if ( check[i] )
 {
 for ( int j = 0 ; j < n ; j++ )
 {
 if ( arr[i][ j] == 0 )
 check[j] = false;
 else
 {
 check[i] = false;
 break;
 }
 if ( i == j )
 continue;
 if ( arr[j][ i] == 1 )
 check[j] = false;
 else
 {
 check[i] = false;
 break;
 }
 }
 if ( check[i] )
 return i;
 }
 return -1;
 }
 
 
 }
 
 | 
       
        | חזרה לתחילת העמוד |       | 
       
       
        |  | 
        | shoshan מנהל האתר
 
  
  
 הצטרף / הצטרפה: 16 July 2005
 מדינה: Israel
 משתמש: מנותק/ת
 הודעות: 4637
 | 
          אה אוקיי, סורי, טעות לוגית קטנה שלי, שמנעה לגמרי להאלגוריתם לעבוד.
           | | נשלח בתאריך: 13 November 2007 בשעה 21:27 | | IP רשוּם | 
 |   |  
           | 
 |  
 תשנה את check[j] = false; הראשון בלבד ל:
 
 
 
| קוד: 
 
    
    | 
      
       | if ( i != j ) check[j] = false;
 |  |  |  
 my bad
 
 הרעיון שם היה לפסול שורה אחרת, לא את הנוכחית.
 
 __________________
 עד מתי רשעים יעלוזו?
 
 עַל כֵּן אֶמְאַס וְנִחַמְתִּי עַל עָפָר וָאֵפֶר.
 | 
       
        | חזרה לתחילת העמוד |       | 
       
       
        |  | 
        | java אורח
 
  
 
 הצטרף / הצטרפה: 01 October 2003
 משתמש: אונליין
 הודעות: 12647
 | 
          
           | | נשלח בתאריך: 13 November 2007 בשעה 21:58 | | IP רשוּם | 
 |   |  
           | 
 |  פשש כל הכבוד!תודה רבה!זה עובד רק אני מקווה שזה סיבוכיות של N ולא N בריבוע.אני אשב לנסות להבין את זה כי אני מתחיל ב-java ואין לי ממש נסיון...את כל הבסיס של java הבנתי מצויין והבעיות אצלי מתחילות מהנושאים הקשים יותר--> יעילות+רקורסיה+רשימות מקושרות- לא ממש תירגלתי את הנושאים האלו ואין לי ממש נסיון(ברקורסיה אתה גם מבין טוב?). תודה אחי עזרת לי מאוד. | 
       
        | חזרה לתחילת העמוד |       | 
       
       
        |  | 
        | shoshan מנהל האתר
 
  
  
 הצטרף / הצטרפה: 16 July 2005
 מדינה: Israel
 משתמש: מנותק/ת
 הודעות: 4637
 | 
          אה הא ואני אפילו אחזור בסופ"ש ונראה אם יהיה כוח לזה...
           | | נשלח בתאריך: 13 November 2007 בשעה 23:28 | | IP רשוּם | 
 |   |  
           | 
 |  
 בכל מקרה, אני די בטוח שזה O של N,
 
 והתפקיד של המורה שלך זה ללמד אותך, שי/תעשה אז העבודה שלהם.
 
 __________________
 עד מתי רשעים יעלוזו?
 
 עַל כֵּן אֶמְאַס וְנִחַמְתִּי עַל עָפָר וָאֵפֶר.
 | 
       
        | חזרה לתחילת העמוד |       | 
       
       
        |  | 
        | עדי אורח
 
  
 
 הצטרף / הצטרפה: 01 October 2003
 משתמש: אונליין
 הודעות: 12647
 | 
          אל תהיה בטוח,
           | | נשלח בתאריך: 11 December 2007 בשעה 02:07 | | IP רשוּם | 
 |   |  
           | 
 |  
 הקוד הזה הוא בסיבוכיות O של N בריבוע, ואני יכול להראות את זה אם תבקשו.
 | 
       
        | חזרה לתחילת העמוד |       | 
       
       
        |  | 
        | מיכאל אורח
 
  
 
 הצטרף / הצטרפה: 01 October 2003
 משתמש: אונליין
 הודעות: 12647
 | 
          
           | | נשלח בתאריך: 11 December 2007 בשעה 03:55 | | IP רשוּם | 
 |   |  
           | 
 |  אכן... מסכים עם הצדיק מעליי... הסיבוכיות במקרה הגרוע היא ריבועית. | 
       
        | חזרה לתחילת העמוד |       | 
       
       
        |  | 
        | לוק אורח
 
  
 
 הצטרף / הצטרפה: 01 October 2003
 משתמש: אונליין
 הודעות: 12647
 | 
          
           | | נשלח בתאריך: 11 December 2007 בשעה 13:06 | | IP רשוּם | 
 |   |  
           | 
 |  לא מדוייק. למרות שהניתוח של שושן לסיבוכיות איננו נכון, עדין הסיבוכיות היא לינארית כפונקציהשל הקלט.
 
 | 
       
        | חזרה לתחילת העמוד |       | 
       
       
        |  | 
        | עדי אורח
 
  
 
 הצטרף / הצטרפה: 01 October 2003
 משתמש: אונליין
 הודעות: 12647
 | 
          הסיבוכיות היא לא לינארית,
           | | נשלח בתאריך: 11 December 2007 בשעה 14:57 | | IP רשוּם | 
 |   |  
           | 
 |  
 הנה הדוגמא:
 
 ניתן מקרה גרוע לדוגמא:
 
 01111
 00111
 00011
 00001
 
 במקרה הבדיקות נעשות ע"פ כל שורה... שורה ראשונה בדיקה של 2 שורה שניה בדיקה של 3 שורה שלישית בדיקה של 3 וכן הלאה עד שורה n-1.
 
 2+3+4+5+5 (שורה אחרונה אותה מספר של בדיקות כמו לפני אחרונה)
 
 = 19 בדיקות למקרה הזה
 
 עכשיו,
 
 הנוסחא הכללית,
 
   4+3+2 ... n + n =   
 n+1 * n--------- -1  + n
 2
 
 הנוסחא שהראיתי פה היא כבר O של N בריבוע אם מצמצמים את כל המקדמים.
 
 
 
 | 
       
        | חזרה לתחילת העמוד |       | 
       
       
        |  | 
        | לוק אורח
 
  
 
 הצטרף / הצטרפה: 01 October 2003
 משתמש: אונליין
 הודעות: 12647
 | 
          עדי אין ספק שהסיבוכיות היא ריבועית ביחס ל-N.
           | | נשלח בתאריך: 12 December 2007 בשעה 23:21 | | IP רשוּם | 
 |   |  
           | 
 |  אך שים לב שגודל הקלט שלך הוא N^2 כלומר מטריצה מגודל NxN
 כיוון שעוברים לכל היותר על כל איבר פעם אחת הסיבוכיות היא לינארית ביחס לגודל הקלט.
 לדוגמה:
 סיבוכיות מציאת איבר מקסימלי במערך שגודלו N היא לינארית כפונקציה של הקלט ולינארית ביחס ל-N.
 סיבוכיות מציאת איבר מקסימלי במטריצה שגודלה NxN גם היא לינארית כפונקציה של הקלט,
 אך ריבועית ביחס ל-N.
 
 | 
       
        | חזרה לתחילת העמוד |       | 
       
       
        |  | 
        | מיכאל אורח
 
  
 
 הצטרף / הצטרפה: 01 October 2003
 משתמש: אונליין
 הודעות: 12647
 | 
          
           | | נשלח בתאריך: 16 December 2007 בשעה 02:47 | | IP רשוּם | 
 |   |  
           | 
 |  חחח אז זאת לא חוכמה נכון? הכוונה היתה סיבוכיות N ביחס לקלט של N בריבוע. | 
       
        | חזרה לתחילת העמוד |       | 
       
       
        |  | 
        | מיכאל אורח
 
  
 
 הצטרף / הצטרפה: 01 October 2003
 משתמש: אונליין
 הודעות: 12647
 | 
          
           | | נשלח בתאריך: 16 December 2007 בשעה 02:51 | | IP רשוּם | 
 |   |  
           | 
 |  למען בהירות, בוא ניתן למערך גודל של MXM.  הסיבוכיות של האלגוריתם הנ"ל יהיה N בריבוע. בכי במקרה הגרוע שלו הוא ירוץ כמו שעדי תיאר. לכן התשובה לא עומדת בדרישות התרגיל, מכיוון שכמות העבודה תוגדל כל פעם ביחס ריבועי לגודל המטריצה. | 
       
        | חזרה לתחילת העמוד |       | 
       
       
        |  |