נושאים פעיליםנושאים פעילים  הצגת רשימה של חברי הפורוםרשימת משתמשים  חיפוש בפורוםחיפוש  עזרהעזרה
  הרשמההרשמה  התחברותהתחברות RSS עדכונים
תיכנות
RSS UnderWarrior Forums : RSS תיכנות
נושא

נושא: שאלה בג’אוה-לא מצליח לפתור:(

שליחת תגובהשליחת נושא חדש
כותב
הודעה << נושא קודם | נושא הבא >>
java
אורח
אורח


הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין
הודעות: 12647
נשלח בתאריך: 11 November 2007 בשעה 20:10 | IP רשוּם
ציטוט java

הצלחתי לפתור רק בסיבוכיות של 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 חפש הודעות אחרות של java בקר בדף הבית של java
 
java
אורח
אורח


הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין
הודעות: 12647
נשלח בתאריך: 13 November 2007 בשעה 15:47 | IP רשוּם
ציטוט java

אני מנסה ומנסה ולא מצליח.
מישהו מכיר פורום שבו אוכל לקבל עזרה לגבי בניית אלוגריתם כזה?
תודה!
חזרה לתחילת העמוד הצג את כרטיס החבר של java חפש הודעות אחרות של java בקר בדף הבית של java
 
shoshan
מנהל האתר
מנהל האתר
סמל אישי

הצטרף / הצטרפה: 16 July 2005
מדינה: Israel
משתמש: מנותק/ת
הודעות: 4637
נשלח בתאריך: 13 November 2007 בשעה 16:39 | IP רשוּם
ציטוט shoshan

הממ...הפורום הזה (:

אגב, למה בשניהם 0 הוא לא בור ?

צריך להגזיר מהו n, אם הוא מספר האיברים בשורה או מספר האיברים במטריצה.

__________________
עד מתי רשעים יעלוזו?

עַל כֵּן אֶמְאַס וְנִחַמְתִּי עַל עָפָר וָאֵפֶר.
חזרה לתחילת העמוד הצג את כרטיס החבר של shoshan חפש הודעות אחרות של shoshan בקר בדף הבית של shoshan
 
java
אורח
אורח


הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין
הודעות: 12647
נשלח בתאריך: 13 November 2007 בשעה 16:51 | IP רשוּם
ציטוט java

תודה על התגובה.
רק ב-A יש בור ב-B אין בור(הבור ב-A הוא[3][3]).כדי ש-[0][0] יהיה בור  צריך שכל המספרים בשורה 0 יהיו 0 וכל המספרים בתור 0 יהיו 1 חוץ מ-[0][0] שצריך להיות ס.
n הוא הגודל פה הוא שווה ל-6-->לכן יש במטריצה 36 ריבועים
חזרה לתחילת העמוד הצג את כרטיס החבר של java חפש הודעות אחרות של java בקר בדף הבית של java
 
shoshan
מנהל האתר
מנהל האתר
סמל אישי

הצטרף / הצטרפה: 16 July 2005
מדינה: Israel
משתמש: מנותק/ת
הודעות: 4637
נשלח בתאריך: 13 November 2007 בשעה 17:31 | IP רשוּם
ציטוט shoshan

אה אוקיי, הבנתי, לא קראתי נכון את ההגדרה של בור.

שנייה, אני אחשוב על זה.

__________________
עד מתי רשעים יעלוזו?

עַל כֵּן אֶמְאַס וְנִחַמְתִּי עַל עָפָר וָאֵפֶר.
חזרה לתחילת העמוד הצג את כרטיס החבר של shoshan חפש הודעות אחרות של shoshan בקר בדף הבית של shoshan
 
shoshan
מנהל האתר
מנהל האתר
סמל אישי

הצטרף / הצטרפה: 16 July 2005
מדינה: Israel
משתמש: מנותק/ת
הודעות: 4637
נשלח בתאריך: 13 November 2007 בשעה 18:26 | IP רשוּם
ציטוט shoshan

הממ...כתבתי ב-c# אבל הדמיון מאוד מאוד גדול.

קוד:
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.

__________________
עד מתי רשעים יעלוזו?

עַל כֵּן אֶמְאַס וְנִחַמְתִּי עַל עָפָר וָאֵפֶר.
חזרה לתחילת העמוד הצג את כרטיס החבר של shoshan חפש הודעות אחרות של shoshan בקר בדף הבית של shoshan
 
java
אורח
אורח


הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין
הודעות: 12647
נשלח בתאריך: 13 November 2007 בשעה 18:46 | IP רשוּם
ציטוט java

שושן תודה על העזרה!
תרגמתי את זה ל-java והרצתי את מערך A והשיטה שכתבת מחזירה 1- במקום 3 ניסיתי על כל מיני מערכים אחר ותמיד השיטה מחזירה 1- אז לצערי היא לא עונה על השאלה.
חזרה לתחילת העמוד הצג את כרטיס החבר של java חפש הודעות אחרות של java בקר בדף הבית של java
 
shoshan
מנהל האתר
מנהל האתר
סמל אישי

הצטרף / הצטרפה: 16 July 2005
מדינה: Israel
משתמש: מנותק/ת
הודעות: 4637
נשלח בתאריך: 13 November 2007 בשעה 20:04 | IP רשוּם
ציטוט shoshan

אצלי זה עבר, כנראה לא תירגממת טוב או שלא העתקת את המערך טוב.

אתה מוזמן לדבג

__________________
עד מתי רשעים יעלוזו?

עַל כֵּן אֶמְאַס וְנִחַמְתִּי עַל עָפָר וָאֵפֶר.
חזרה לתחילת העמוד הצג את כרטיס החבר של shoshan חפש הודעות אחרות של shoshan בקר בדף הבית של shoshan
 
java
אורח
אורח


הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין
הודעות: 12647
נשלח בתאריך: 13 November 2007 בשעה 20:34 | IP רשוּם
ציטוט java

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

קוד:
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 חפש הודעות אחרות של java בקר בדף הבית של java
 
java
אורח
אורח


הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין
הודעות: 12647
נשלח בתאריך: 13 November 2007 בשעה 20:43 | IP רשוּם
ציטוט java

יש בעיה בהעתקה לאתר! העתקתי את הקוד מקובץ ה-java לאחר שנוצר ועבר קומפילציה לפה ולאחר ששלחתי אני שם לב שמשום מה הוא השמיט את הסימן של המערך.לדוגמה 
(if(check צריך להיות if ובסוגריים [check[i
יש דרך להעתיק לפה בצורה תקינה?בכל מקרה זה הקוד שתרגמתי ל-java(חוץ מהבעיות שהאתר משום מה השמיט בשליחה)והוא עבר קומפילציה .אתה יכול לראות שהקוד כמו שלך בול רק ששיניתי את הדברים ל-java למשל במקום bool שכתבת כתבתי boolean ב-java
חזרה לתחילת העמוד הצג את כרטיס החבר של java חפש הודעות אחרות של java בקר בדף הבית של java
 
shoshan
מנהל האתר
מנהל האתר
סמל אישי

הצטרף / הצטרפה: 16 July 2005
מדינה: Israel
משתמש: מנותק/ת
הודעות: 4637
נשלח בתאריך: 13 November 2007 בשעה 21:03 | IP רשוּם
ציטוט shoshan

כן, תשלח וכשאתה שולח תוריד את הבחירה מ-"אפשר שימוש ב- קודי הפורום בכדי
לכתוב את הודעותיך"

אתה מוזמן גם עם debugger לעבור שורה אחרי שורה ולראות מה הבעיה.

אתה יודע,

__________________
עד מתי רשעים יעלוזו?

עַל כֵּן אֶמְאַס וְנִחַמְתִּי עַל עָפָר וָאֵפֶר.
חזרה לתחילת העמוד הצג את כרטיס החבר של shoshan חפש הודעות אחרות של shoshan בקר בדף הבית של shoshan
 
java
אורח
אורח


הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין
הודעות: 12647
נשלח בתאריך: 13 November 2007 בשעה 21:15 | IP רשוּם
ציטוט java

עברתי עם 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;
}
  
  
}

חזרה לתחילת העמוד הצג את כרטיס החבר של java חפש הודעות אחרות של java בקר בדף הבית של java
 
shoshan
מנהל האתר
מנהל האתר
סמל אישי

הצטרף / הצטרפה: 16 July 2005
מדינה: Israel
משתמש: מנותק/ת
הודעות: 4637
נשלח בתאריך: 13 November 2007 בשעה 21:27 | IP רשוּם
ציטוט shoshan

אה אוקיי, סורי, טעות לוגית קטנה שלי, שמנעה לגמרי להאלגוריתם לעבוד.

תשנה את check[j] = false; הראשון בלבד ל:

קוד:
if ( i != j )
    check[j] = false;


my bad

הרעיון שם היה לפסול שורה אחרת, לא את הנוכחית.

__________________
עד מתי רשעים יעלוזו?

עַל כֵּן אֶמְאַס וְנִחַמְתִּי עַל עָפָר וָאֵפֶר.
חזרה לתחילת העמוד הצג את כרטיס החבר של shoshan חפש הודעות אחרות של shoshan בקר בדף הבית של shoshan
 
java
אורח
אורח


הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין
הודעות: 12647
נשלח בתאריך: 13 November 2007 בשעה 21:58 | IP רשוּם
ציטוט java

פשש כל הכבוד!תודה רבה!זה עובד רק אני מקווה שזה סיבוכיות של N ולא N בריבוע.אני אשב לנסות להבין את זה כי אני מתחיל ב-java ואין לי ממש נסיון...את כל הבסיס של java הבנתי מצויין והבעיות אצלי מתחילות מהנושאים הקשים יותר--> יעילות+רקורסיה+רשימות מקושרות- לא ממש תירגלתי את הנושאים האלו ואין לי ממש נסיון(ברקורסיה אתה גם מבין טוב?).
תודה אחי עזרת לי מאוד.
חזרה לתחילת העמוד הצג את כרטיס החבר של java חפש הודעות אחרות של java בקר בדף הבית של java
 
shoshan
מנהל האתר
מנהל האתר
סמל אישי

הצטרף / הצטרפה: 16 July 2005
מדינה: Israel
משתמש: מנותק/ת
הודעות: 4637
נשלח בתאריך: 13 November 2007 בשעה 23:28 | IP רשוּם
ציטוט shoshan

אה הא ואני אפילו אחזור בסופ"ש ונראה אם יהיה כוח לזה...

בכל מקרה, אני די בטוח שזה O של N,

והתפקיד של המורה שלך זה ללמד אותך, שי/תעשה אז העבודה שלהם.

__________________
עד מתי רשעים יעלוזו?

עַל כֵּן אֶמְאַס וְנִחַמְתִּי עַל עָפָר וָאֵפֶר.
חזרה לתחילת העמוד הצג את כרטיס החבר של shoshan חפש הודעות אחרות של shoshan בקר בדף הבית של shoshan
 
עדי
אורח
אורח


הצטרף / הצטרפה: 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
נשלח בתאריך: 12 December 2007 בשעה 23:21 | IP רשוּם
ציטוט לוק

עדי אין ספק שהסיבוכיות היא ריבועית ביחס ל-N.
אך שים לב שגודל הקלט שלך הוא 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 בריבוע. בכי במקרה הגרוע שלו הוא ירוץ כמו שעדי תיאר. לכן התשובה לא עומדת בדרישות התרגיל, מכיוון שכמות העבודה תוגדל כל פעם ביחס ריבועי לגודל המטריצה.

חזרה לתחילת העמוד הצג את כרטיס החבר של מיכאל חפש הודעות אחרות של מיכאל בקר בדף הבית של מיכאל
 

אם ברצונך להגיב לנושא זה עליך קודם להתחבר
אם אינך רשום/ה כבר עליך להרשם

  שליחת תגובהשליחת נושא חדש
גרסת הדפסה גרסת הדפסה

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