ABA


"|שאלה| חיפוש בעצים בינארים."
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #11094 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 11094
Yariv-H לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 24.3.02
5856 הודעות, 1 פידבק
   19:05   28.12.12   
אל הפורום  
  |שאלה| חיפוש בעצים בינארים.  
 
   שאלה לגבי חיפוש בעץ בינארי.

נניח שעץ מכיל כתובות IP של BLACKLIST.
אני מקבל את ראש העץ ומשנה שהוא סטראטק של הודעה , שיש שם 2 משתנים של מקור ויעד.
אני צריך לבדוק שלא המקור ולא היעד נמצאים בתוך העץ , במידה והם נמצאים אני צריך לזרוק את ההודעה.

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

הינה הפסדו:

int search(node* Head,message * msg)
{
if (Head!=NULL)
{

if(msg->source == Head ->ip | msg->dest == Head ->ip) return(1)
else if(Head ->ip < msg->source ) return (search(Head ->right,msg);
else if(Head ->ip < msg->dest) return (search(Head ->right,msg);

else if(Head ->ip > msg->source ) return (search(Head ->left,msg);
else if(Head ->ip > msg->dest ) return (search(Head ->left,msg);


}else return (0)


}

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



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

  האשכול     מחבר     תאריך כתיבה     מספר  
  נראה שאתה תופס את כל המצבים, אבל אפשר לייעל Zippo  29.12.12 19:06 1
     מכתב Yariv-H 29.12.12 22:59 2
         מה קורה? יש לך את הקוד, תריץ ןתראה. לפי מה שאני מבין, יוחזר 1. Zippo  31.12.12 00:06 3
             אשמח אם תסביר לי למה .. Yariv-H 31.12.12 21:21 4
                 החזרת 0, ולכן ה-if הראשון לא התקיים. Zippo  01.01.13 05:51 5
                     בדיוק. Yariv-H 01.01.13 10:10 6
                         סליחה, טעיתי. Zippo  01.01.13 21:27 7
                             תודה. Yariv-H 02.01.13 19:43 8

       
Zippo 
חבר מתאריך 26.5.02
7921 הודעות
   19:06   29.12.12   
אל הפורום  
  1. נראה שאתה תופס את כל המצבים, אבל אפשר לייעל  
בתגובה להודעה מספר 0
 
שהתנאים יהיו:
* אם גם המקור, וגם היעד קטנים מהערך הנוכחי, תרד שמאלה בעץ.
* אם גם המקור וגם היעד גדולים מהערך הנוכחי, תרד ימינה בעץ.
* אם אחד הערכים גדול, ואחד הערכים קטן, חפש רק את הערך הקטן משמאל, ואם לא מצאת, חפש רק את הערך הגדול מימין.

ככה את תרד לזמן חיפוש (log(n
במקום (log^2(n
שזה מה שיש לך עכשיו


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Yariv-H לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 24.3.02
5856 הודעות, 1 פידבק
   22:59   29.12.12   
אל הפורום  
  2. מכתב  
בתגובה להודעה מספר 1
 
   מה קורה ונניח יש לך עץ כזה:

2
1 3

המקור שלך הוא 5 והיעד שלך הוא 1 ?



                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Zippo 
חבר מתאריך 26.5.02
7921 הודעות
   00:06   31.12.12   
אל הפורום  
  3. מה קורה? יש לך את הקוד, תריץ ןתראה. לפי מה שאני מבין, יוחזר 1.  
בתגובה להודעה מספר 2
 


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Yariv-H לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 24.3.02
5856 הודעות, 1 פידבק
   21:21   31.12.12   
אל הפורום  
  4. אשמח אם תסביר לי למה ..  
בתגובה להודעה מספר 3
 
   לפי מה שאני מבין , הוא בהתחלה ישווה את 2 עם 5 ועם 1 .
אף אחד לא שווה , 5>2 -> ילך ימינה בעץ.

ישווה את 5 ואת 1 עם 3 .
אף אחד לא שווה , 5>3 , ילך ימינה .

יחזיר 0.

או שאני מפספס משהו?



                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Zippo 
חבר מתאריך 26.5.02
7921 הודעות
   05:51   01.01.13   
אל הפורום  
  5. החזרת 0, ולכן ה-if הראשון לא התקיים.  
בתגובה להודעה מספר 4
 
אתה עובר ל-else if, ומתחיל שוב משורש העץ.
זה אגב קורה בכל תת-עץ. אני חושב שהניתוח הראשוני שלי היה לא זהיר, וזמן הריצה הוא אפילו יותר מ-((O(log^2(n , מה שבטוח, זמן הריצה הוא פולילוגריתמי כלשהוא...


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Yariv-H לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 24.3.02
5856 הודעות, 1 פידבק
   10:10   01.01.13   
אל הפורום  
  6. בדיוק.  
בתגובה להודעה מספר 5
 
   ולכן לדעתי מה שרשמתי שם לא תקין ...

הייתי אמור להחזיר 1 , כי ה dest כן נמצא בעץ.
איך היית מתקן את האלגו' ?

תודה.



                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Zippo 
חבר מתאריך 26.5.02
7921 הודעות
   21:27   01.01.13   
אל הפורום  
  7. סליחה, טעיתי.  
בתגובה להודעה מספר 6
 
תגובה בשעות שבהן הגבתי עלולה לגרום לזה.
משום מה חשבתי שאתה בודק בתוך הסוגריים של ה-if גם את הערך חזרה.

בתור תיקון רגיל, שכמו שאמרתי קודם, יהיה איטי יותר מזמן לוגריתמי,
תוכל לבדוק את הערך חזרה ב-if:


else if(Head ->ip < msg->source && search(Head ->right,msg)) return 1;

וכו' לגבי שאר התנאים...

אבל כדי לשפר ביצועים, או שתעשה מה שהצעתי למעלה, או אפילו פשוט יותר, תחפש ישירות IP, כלומר חתימת הפונקציה של החיפוש הבינארי תהיה:


private int searchHelper(node* Head, int ipToSearchFor)

ואז search יהיה:


int search(node* Head,message * msg)
{
return (searchHelper(head, msg -> source) || searchHelper(head, msg -> dest));
}


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Yariv-H לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 24.3.02
5856 הודעות, 1 פידבק
   19:43   02.01.13   
אל הפורום  
  8. תודה.  
בתגובה להודעה מספר 7
 
  



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

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

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



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