ABA


"חידה שנשאלתי לאחרונה."
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #6418 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 6418
dryice

   18:12   26.06.03   
אל הפורום  
  חידה שנשאלתי לאחרונה.  
 
   (אני בעצמי לא בטוח שיש לי פתרון)
נתונים N נקודות במישור. (לכל נקודה יש רכיב בציר x ורכיב בציר y)
רוצים למצוא זוג נקודות שהמרחק ביניהם מינימלי.

רוצים לעשות את זה בN*log(N) זמן.


DRYICE


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

  האשכול     מחבר     תאריך כתיבה     מספר  
  חידה מרתקת no1 27.06.03 01:32 1
     ישבתי וחשבתי וחשבתי וחשבתי liranr 28.06.03 13:12 2
  רעיון שעלה במוחי yoash 28.06.03 14:27 3
     למיין לפי מה? liranr 28.06.03 15:18 4
         הנה רמז קטן ... no1 28.06.03 20:56 5
             אוקיי... liranr 28.06.03 21:36 6
             הגישה שלי(לא מספיק טוב) dryice 28.06.03 21:46 7
                 הגישה שלך נכונה אבל בחסם שלה קיים כופל נוסף no1 28.06.03 22:58 8
                     אכן זה פתרון. dryice 29.06.03 00:14 9
                         מהידע שלי בגאומטריה no1 29.06.03 00:27 10
                             בלמידה יש הרבה מאוד מימדים. dryice 29.06.03 00:38 11

       
no1

   01:32   27.06.03   
אל הפורום  
  1. חידה מרתקת  
בתגובה להודעה מספר 0
 
   שלחתי לך הפתרון לפרטי - יכול להיות שזה קצת מסובך .


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

   13:12   28.06.03   
אל הפורום  
  2. ישבתי וחשבתי וחשבתי וחשבתי  
בתגובה להודעה מספר 1
 
   ולא הגעתי לכלום, וגם לא נראה לי שמישהו אחר עובד על זה.
אולי תפרסם פה את הפיתרון למען כולנו?


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

   14:27   28.06.03   
אל הפורום  
  3. רעיון שעלה במוחי  
בתגובה להודעה מספר 0
 
   עבר עריכה לאחרונה בתאריך 28.06.03 בשעה 14:28
 
אם אני ימין את הרשימה ואז יעבור על כל שתי נקודות סמוכות וישמור את המרחק הקצר ביותר בינהם אז אני יקבל את המרחק המינימלי אבל אני לא בטוח לגבי הסיבוכיות של העניין זה תלוי במיון שיבוצע.
בגלל שמעבר על כל הרשימה זה הליך בסיבוכיות של N.


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

   15:18   28.06.03   
אל הפורום  
  4. למיין לפי מה?  
בתגובה להודעה מספר 3
 
   זאת בדיוק הבעיה.
ברור שאם הנקודות היו על ישר אחד, היה אפשר למיין אותם ואז לעבור על
הרשימה.
אבל בדו-מימד לפי מה בדיוק אתה מתכוון למיין, ואיך אתה מגדיר נקודות
סמוכות?


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

   20:56   28.06.03   
אל הפורום  
  5. הנה רמז קטן ...  
בתגובה להודעה מספר 4
 
   על מנת לבצע שאילתות חיפוש יעילות במרחב K מימדי נהוג לבנות KD TREE .
החסם לזמן שאילתת חיפוש תיבה חוסמת K מימדית (עבור K = 2 זהו מלבן) הוא N (מספר הנקודות בעץ) בחזקת K-1 חלקי K (עבור K = 2 זהו שורש N) ..

זה לא החסם שרוצים אבל זה רמז ...


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

   21:36   28.06.03   
אל הפורום  
  6. אוקיי...  
בתגובה להודעה מספר 5
 
   לא הבנתי מילה .
אני יעשה אבל מחקר קטן ונראה למה נגיע...


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

   21:46   28.06.03   
אל הפורום  
  7. הגישה שלי(לא מספיק טוב)  
בתגובה להודעה מספר 5
 
   (יחד עם מוטיבציה לגישה זאת)
אם בניתי KD Tree מה שהייתי רוצה, זה לבנות איזו שהיא
פונקציה רקורסיבית למציאת זוג נקודות קרוב ביותר,
אך כמובן זוג נקודות קרוב ביותר בבנים זה לא מספיק מידע
בשביל לקבוע עובר האב. מכאן יש לסחוב אחורנית ברקורסיה
עוד מידע. אבל לא את כל המידע. נקודות שמוקפות לחלוטין בנקודות
אחרות(יחד עם קצוות התחום) לא ממש מעניינות אותנו.
לכן צריך לסחוב הלאה, רק את הזוג הקרוב ביותר, וכן את הנקודות
על הקצוות. כאשר אנו פוסלים נקודות עם יש לנו ענף בעץ מכל הצדדים
שלהם, אנו למעשה נגלב שיש לנו מעט מידע בקצוות, אבל
למעשה בקצוות של ענף באורך N, יש שורש ריבוע של N נקודות,
וזה נותן לנו זמן O(N^1.5) שזה כאמור לעיל, לא מספיק טוב.

רעיון שהיה לי עוד קודם היה:
נמיין הנקודות בX ובY ונסדר אותם במטריצה דיסקרטית, כך שבכל
שורה ועמודה יש נקודה בודדת.(לצורך פשטות נניח
כי כל ערכי X ו Y שונים), וכן נשמור בכל שורה ועמודה
מי היא הנקודה באותה שורה/עמודה(למעשה לא צריך מטריצה,
זה כלי מחשבתי שעזר לי)
אז נרצה לנסות עבור כל נקודה למצוא את הנקודה הקרובה ביותר
(שזה יותר מהנדרש במקור),אנו נחפש ימינה שמאלה מעלה ולמטה,
כל פעם לכיוון בו הלכנו עד כה הכי פחות(מבחינת מרחק "אמיתי"
ולא מהחינת מספר שורות/עמודות, יש מעברי שורה שמייצגים
פער מרחק גדול ויש שקטן), אם התרחקנו בX או בY יותר מהמרחק
המינמלי שמצאנו עד כה, אפשר להפסיק להתקדם בכיוון.
קל לראות, שיש נקודות שיקח O(N) זמן למצוא עבורם הנקודה הקרובה
ביותר, השאלה היא האם יש הרבה נקודות כאלו. אני מאמין שלא.
ניתוח סיבוכיות מדויק, כמה זמן העסק לוקח עבור כל הנקודות אין
לי.

DRYICE


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

   22:58   28.06.03   
אל הפורום  
  8. הגישה שלך נכונה אבל בחסם שלה קיים כופל נוסף  
בתגובה להודעה מספר 7
 
   שהוא תלוי בדיסקרטיזציה שביצעת..
לגבי ה KD TREE קצת הטעיתי אותכם היות ואני רגיל לטפל במרחב תלת מימדי (והפתרון שאציג לא עובד בו ואילו ה KD TREE מציג חסם בתוחלת של NLOGN לדו מימד ותלת מימד).

הפתרון הוא דיאגרמת ורוני (VORONOI) : הנה PDF מצוין שמסביר מהו מבנה הנתונים
http://graphics.lcs.mit.edu/classes/6.838/F01/lectures/Voronoi/Voronoi2D.pdf

זמן הבניה של הדיאגרמה הוא O של NLOGN .מספר הצלעות בדיאגרמה הוא O של N(למעשה חסום על ידי 3N-6).
כל צלע - מרחקה שווה משתי הנקודות בינהם אהיא נמצאת .
נחשב לכל צלע המרחק הנ"ל - ונמצא המינימום .. (השלב הזה לוקח O של N).


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

   00:14   29.06.03   
אל הפורום  
  9. אכן זה פתרון.  
בתגובה להודעה מספר 8
 
   (אם מניחים שפותרים כמה מקרים מנוונים שמוזכרים שם בסוף)

אני מצאתי כמה דברים על בסיס עצי KD אבל בכולם התחבא איזה
משהוא היוריסטי. אם בונים עץ KD, אפשר להריץ עליו חיפוש A*
ולמצוא נקודה שקרובה לנקודה כלשהיא בזמן שהוא סביר להניח log(N)
אני חושב שלצורך השאלה באשכול זה, פתרון על בסיס כזה עשוי
דווקא לצאת n*log(N) גם במקרה הגרוע ביותר, אבל משום שהפתרון
שהבאת(על אף שהוא מורכב בהרבה) הוא בפרוש נכון, לא אתעמק בזה.


DRYICE

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


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

   00:27   29.06.03   
אל הפורום  
  10. מהידע שלי בגאומטריה  
בתגובה להודעה מספר 9
 
   דווקא ה KD TREES הם אלו היעילים יותר במימדים גבוהים (בכל המאמרים הרלבנטיים האחרונים עדיין ה KDTREES שולטים ל 3 ויותר מימדים ..).

בקשר למקרי קצה של דיאגרמת ורוני - בכל מבנה נתונים גאומטרי יש מקרי קצה ורובם טריוויאלים לטיפול .


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

   00:38   29.06.03   
אל הפורום  
  11. בלמידה יש הרבה מאוד מימדים.  
בתגובה להודעה מספר 10
 
   הרבה זה לצורך העניין יותר מ30, ולפעמים יש מאות ואלפים.

אם אני מסתכל על OCR פשוט, אני רוצה לסווג אות בכתב יד,
ואני לוקח תמונה של האות בגודל 8X8 יש פה 64 מימדים.

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

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

DRYICE


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

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

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



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