ABA


"מעניין - הורדת כפולים ממערך בסיבוכיות ליניארית."
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #15219 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 15219
Deuce 
חבר מתאריך 1.9.08
6225 הודעות
   18:00   10.03.09   
אל הפורום  
  מעניין - הורדת כפולים ממערך בסיבוכיות ליניארית.  
 
ערכתי לאחרונה בתאריך 10.03.09 בשעה 18:05 בברכה, Deuce
 
לפני כמה שבועות אחד המשתמשים ביקש לכתוב שגרה שמקבלת מערך בו מופיעים מספרים, חלקם יותר מפעם אחת, ולהחזיר מערך בו כל מספר מופיע פעם אחת בלבד.

אפשרויות טריוויאליות:
1. לאפס מערך חדש, לרוץ על המערך הקיים, להכניס אליו איברים במידה והוא לא מופיע במערך - O(n^2) זמן ו-O(n) מקום.
2. אם כבר עולה לנו n^2 אז בוא נמיין אותו בסיבוכיות של n^2 בעזרת מיון פשוט כמו bubble sort, נרוץ עליו ונמחק איברים כפולים ע"י השמה למערך חדש. החזרנו ככה מערך ממויין בלי כפולים ב-n^2.
3. בוא נמיין ב-nlog n (בעזרת מיון מיזוג, בעזרת מיון מהיר, בעזרת מיון ערימה - יש עוד אפשרויות) ונבצע כמו 2. נו טוב, זה עדיין nlog n זמן.

אני ידוע כאחד שלא מחפש את האפשרות הטריוויאלית:
כבר אז רציתי לפתור את זה בסיבוכיות זמן ליניארית (תוך כדי שימוש ליניארי במקום בזכרון, לא רוצה לחרוג מכך). אני מניח שזה כן אפשרי, אבל אני רוצה לנסות לשתף גם אתכם כי זאת נראית לי בעייה מענייינת.
שימו לב מה למשל לא טוב:
לאתחל מערך בגודל האיבר המקסימלי במערך הקלט ולהכניס אליו איברים בצורה של A[Ar[2]] = 1 - זה בעצם יסמל שהאיבר Ar[2] נמצא בקבוצת הקלט. למה זה לא טוב? כי אם למשל max term = n^4 (למשל אם המערך 1,2,3,256). הקצאתי סיבוכיות מקום של n^4 - נכון שזה לזמן קצר, אבל זה לא כצורך !

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






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

  האשכול     מחבר     תאריך כתיבה     מספר  
  אז ככה: TTAsnn 10.03.09 20:06 1
     כן, אני יודע. Deuce  10.03.09 22:09 3
  ב-nlogn אין שום בעיה לעשות את זה ldan192  10.03.09 20:12 2
     לוג סטאר? זה הרבה יותר טוב מליניארי. Deuce  10.03.09 22:10 4
         רגע, מה זה השטויות האלה ldan192  10.03.09 22:51 5
             הממ אולי אני לא מבין אותך אבל ... Deuce  10.03.09 23:09 6
                 לא חובה להקצות מערך חדש. קיצור, שבוע ldan192  10.03.09 23:59 7
  ידידי הרשה לי לתקן אותך ואף להשפיל אותך במידה akoka 11.03.09 20:22 8
     WTF? Deuce  11.03.09 20:24 9
         חחח תכלססססס RbD  11.03.09 20:28 10

       
TTAsnn

   20:06   10.03.09   
אל הפורום  
  1. אז ככה:  
בתגובה להודעה מספר 0
 
   כתבת:
"לאתחל מערך בגודל האיבר המקסימלי במערך הקלט ולהכניס אליו איברים בצורה של A] = 1 - זה בעצם יסמל שהאיבר Ar נמצא בקבוצת הקלט. למה זה לא טוב? כי אם למשל max term = n^4 (למשל אם המערך 1,2,3,256). הקצאתי סיבוכיות מקום של n^4 - נכון שזה לזמן קצר, אבל זה לא כצורך !"

אתה מתאר פה (חוץ משינוי קל) מיון מניה, וכמו שאמרת, יש לו בעיה.

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

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


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Deuce 
חבר מתאריך 1.9.08
6225 הודעות
   22:09   10.03.09   
אל הפורום  
  3. כן, אני יודע.  
בתגובה להודעה מספר 1
 
אבל רק רציתי להדגיש שזה נניח פתרון באמת לא תקין.
יכול להיות שלא, אבל שוב - זאת אינטואיציה בלבד.






                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   20:12   10.03.09   
אל הפורום  
  2. ב-nlogn אין שום בעיה לעשות את זה  
בתגובה להודעה מספר 0
 
ערכתי לאחרונה בתאריך 10.03.09 בשעה 20:35 בברכה, ldan192
 
הכי פשוט יהיה להשתמש בעץ AVL.

אני בספק שאפשר לעשות את זה ב-(O(n בלי שום הנחות כי אי אפשר למיין מערך בפחות מ-(O(nlogn בלי הנחות כלשהן.
עם הנחות (למשל חסם על המספרים) אז אפשר בקלות לממש

ואגב, שיגרה מול פונקציה? ב-JAVA אני מאמין שתעדיף פונקציה. 

עריכה: יש מצב באמת כמו שאמרת עם Hash Table, אבל אז זה בסיבוכיות (O(log*n שהאומנם זה קרוב מאוד ללהיות לינארי אבל זה לא, במיוחד בגלל כשיש לך הרבה אינפורמציה להחזיק בנודים.


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Deuce 
חבר מתאריך 1.9.08
6225 הודעות
   22:10   10.03.09   
אל הפורום  
  4. לוג סטאר? זה הרבה יותר טוב מליניארי.  
בתגובה להודעה מספר 2
 
איך הגעת אבל ללוג סטאר?
ושגרה התכוונתי להליך, לא לאיזה משמעות מעבר.

וכמובן שאי אפשר בעזרת מודל השוואות למיין מערך בפחות מ-nlog n אבל אנחנו בסה"כ לא צריכים מיון.






                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   22:51   10.03.09   
אל הפורום  
  5. רגע, מה זה השטויות האלה  
בתגובה להודעה מספר 4
 
אם תקצה מערך חדש ותעבור תו תו, אם האינדקס הנוכחי גדול מהחדש שהוסף למערך תוסיף אותו ותקדם את שני האינדקסים, אחרת תקדם רק את האינדקס של המערך הישן ותמשיך.
זה אמור לעבור על כל המערך פעם אחת ב-(O(n. או שאיבדתי אותך?

ברגע שזה ממויין החיים דיי קלים..


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Deuce 
חבר מתאריך 1.9.08
6225 הודעות
   23:09   10.03.09   
אל הפורום  
  6. הממ אולי אני לא מבין אותך אבל ...  
בתגובה להודעה מספר 5
 
אולי אני לא מבין אותך, על פניו נשמע שהפיתרון שלך עולה פשוט הרבה לסיבוכיות מקום.






                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   23:59   10.03.09   
אל הפורום  
  7. לא חובה להקצות מערך חדש. קיצור, שבוע  
בתגובה להודעה מספר 6
 
הבא אני אהיה פנוי סוף סוף ואני אבנה לך קוד פועל שמבצע את מה שרצית ב-O(n)


בברכה,
עידן


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

   20:22   11.03.09   
אל הפורום  
  8. ידידי הרשה לי לתקן אותך ואף להשפיל אותך במידה  
בתגובה להודעה מספר 0
 
   מסויימת, אין לי ספק שאתה טועה, ואף אראה לך את טעותך אם רק תתן לי זמן לדבר שניה, אדוני תסלח לי אתה מעוניין שאגיד לך מה טעותך? אוקי תן לי לדבר, לא זה לא יילך ככה, אתה לא יכול להתפרץ לדברים שלי כול שניה, לא אמרתי לך שלא, אוייש נו זאת ירידה לפסים אישיים, אמא שלי לא התחפשה לעורב בפורים, מה אתה טוען שראית אותה עפה בין המגדלים של עזריאלי? אוקי איך זה קשור אבל למה שאמרתי בנוגע לאשכול עצמו? אה אתה טוען שהיא עפה בסיבוכיות לינארית? ואוו ממש יעילה, אתה ממליץ לה לעבוד בדואר?
אוקי אין לי כוח לזה יותר, אתה לא מוכן לשמוע את דעתי בנוגע לאשכול, אז אני אשתוק וזהו.

יום טוב נתראה בשמחות, בן עוולת המרדות.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Deuce 
חבר מתאריך 1.9.08
6225 הודעות
   20:24   11.03.09   
אל הפורום  
  9. WTF?  
בתגובה להודעה מספר 8
 






                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
RbD 
חבר מתאריך 24.11.07
23282 הודעות, דרג אמינות חבר זה
   20:28   11.03.09   
אל הפורום  
  10. חחח תכלססססס  
בתגובה להודעה מספר 9
 
  

מוסך ניר - תיקון ואחזקת רכב
שמוטקין 18 אזור תעשיה הישן
ראשון לציון
https://www.facebook.com/home.php?sk=group_216251688397163


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

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

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



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