ABA


"למישהו יצא כאן להיתקל במבני נתונים יעילים מאוד? או בעיית ה-RMQ?"
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #11195 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 11195
Zvikadori
חבר מתאריך 3.8.02
5369 הודעות
   01:27   27.02.13   
אל הפורום  
  למישהו יצא כאן להיתקל במבני נתונים יעילים מאוד? או בעיית ה-RMQ?  
 
   אהלן חברים,

אנחנו כבר כמה ימים מנסים לפתור בעייה מאוד מסובכת:

הראה מבנה נתונים עם זכרון (O(n ששומר מערך A של מספרים ועונה על השאילתה הבאה:

בהינתן t קטעים זרים על המערך, החזר את k המספרים הגדולים ביותר בקטעים אלו בזמן
O(t + klogk)

עכשיו יש בעייה דומה, שעובדת על מערך ומחזירה על קטע יחיד את האיבר המינימאלי - ב-O(1)
כלומר, בהינתן מערך:
10 32 45 81 34 55 66 22

ואינדקסים i=2 ו-j=4 נקבל: (תת מערך 81 34 55 66) והאיבר המינימאלי הוא 34.
* אולי זה המקום לציין שהאיבר הראשון במערך הוא i=1 ולא i=0 כמו שאנו רגילים בד"כ.

להעביר את הבעייה הזו לבעיית מקסימום - די קל.
מה שקשה הוא להכליל אותה ל-t קטעים(שלא יודעים מהם מראש...) ועדין להגיע לזמן סביר.
חשוב לציין שלא ניתן לדעת איפה כל אחד מה-top-k יהיה, כלומר, האם כל ה-topk יהיו בתת-קטע אחד של המערך, או לא מפוזרים בכולם וכו'.

מה מותר בבעייה?
מותר לעשות preprocessing שיקח כמה זמן שאתם רוצים, אך כמו שהבעיה מתארת אסור לשמור זיכרון גדול מ-O(n).

מה שאני חושב, זה שאי אפשר לשנות באופן דינאמי את תוצאת ה-preprocessing(זה פשוט ידרוש לשנות את כל מבני הנתונים, בעלות גדולה מהעלות שנדרשת - זה כנראה יהיה פונק' של n, וזה לא טוב לנו).

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

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


תודה לכולם


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

  האשכול     מחבר     תאריך כתיבה     מספר  
  מכתב Zippo  02.03.13 20:22 1
     לא הגבתי לך... Zvikadori 05.03.13 21:16 2
         בכיף. Zippo  08.03.13 11:05 3

       
Zippo 
חבר מתאריך 26.5.02
7921 הודעות
   20:22   02.03.13   
אל הפורום  
  1. מכתב  
בתגובה להודעה מספר 0
 
אם t >= k, זה מקרה פשוט, שהרי עיבוד מקדים של RMQ נותן לך את האיבר המינימלי (או המקסימלי בשינוי האלגוריתם) בכל טווח ב- (1)O, וזה בדיוק מה שאתה צריך. למצוא את ה- k המינימלים מתוך ה- t הללו.

אם t < k, זה המקרה המורכב:
או תשמור את הערכים שאתה מוציא בעזרת שאילתות RMQ בערימת מקסימום, אז המקרה הופך להיות פשוט.
תתחיל מלהכניס את t הערכים המקסימלים לערימה ריקה.
ועכשיו, בכל שלב:

- הוצא את ראש הערימה, שהוא האיבר המקסימלי ביותר שעוד לא נשמר בצד (נסמנו X) ונשמור אותו בצד בקבוצת הפתרון.

- האינדקס של X מחלק את הטווח שבו הוא היה בצורה הבאה: ו-

- נכניס 2 אלמנטים חדשים לערימה במקום האיבר שהוצאנו, והם האיברים המינימלים בטווחים ו-

נחזור על 3 הפעולות הנ"ל בלולאה k פעמים.
הפעולות הללו עולות לנו ((O(log(k
ונחזור עליהם k פעמים, ומכאן הזמן המבוקש.

שים לב ש"אלמנט" x, הוא בעצם זוג אינדקסים (i,j) במערך A.
(value(x זה בעצם תוצאת שאילתת RMQ על האינדקסים (i,j)
ואלה האלמנטים שאנחנו שומרים בערימת המקסימום.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Zvikadori
חבר מתאריך 3.8.02
5369 הודעות
   21:16   05.03.13   
אל הפורום  
  2. לא הגבתי לך...  
בתגובה להודעה מספר 1
 
   אבל רק רציתי להגיד לך שאתה שפיץ...
זה באמת הפתרון שהגענו אליו בסוף, כמעט, הוספנו כמה דיוקים, כדי לקבל זמן ריצה טוב, וחסמי זיכרון מדויקים יותר.

ההבדלים בינינו לדוג', כאשר t<k מכניסים את כל האיברים לערימה...
כאשר t>=k, בוחרים את ה-k הגדולים ביותר על ידי partial sorting(זמן O(t)) ומכניסים אותם לערימה.
ומשהו שלא ציינת - שמרנו על גודל הערימה קבוע(בגודל k), כדי לשמור על זמן הריצה- O(klogk), כלומר הוצאנו את האיברים המינימאליים מהרשימה(לכל היותר יש 2 כאלה בכל איטרציה) - לשם כך השתמשנו במבנה double-ended priority queue(לדוג' ערימת min-max).

ואם מישהו מעיין בת'רד ושאל את עצמו מה זה partial sorting, אז זה בעצם בעיית החיפוש רק חלשה יותר.
צריך לבצע סידור של האיברים במערך כך שקיימת תת קבוצה של איברים שלאחר סידור החלקי יימצאו באותם מקומות עבור הסידור המלא(sorting), האפליקציה של זה, היא בדיוק כמו שהשתמשנו - למציאת k האיברים הכי גדולים/קטנים במערך בגודל n(עבורינו המערך היה בגודל t).


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Zippo 
חבר מתאריך 26.5.02
7921 הודעות
   11:05   08.03.13   
אל הפורום  
  3. בכיף.  
בתגובה להודעה מספר 2
 
שמחתי לעזור


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

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

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



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