ABA


"חידה: איך תאתחלו מערך בגודל n ביעילות (O(1?"
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #15059 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 15059
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   18:03   19.11.08   
אל הפורום  
  חידה: איך תאתחלו מערך בגודל n ביעילות (O(1?  
 
עוגן האשכול הוסר בתאריך 22.11.08 בשעה  16:24  על-ידי Nesher, (מנהל הפורום)
 
(במקום (O(n, כמובן) כך שתשמש אתכם לאחר-מכן בתור מחסנית שמישה ולא ציקלית.
אני אישית מכיר 2 דרכים.

בואו נראה מי יעלה עליהן ואף יותר


עריכה: להזכירכם מערך בגודל n מכיל בהתחלה ערכי זבל בכל התאים שלו.


בברכה,
עידן


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

  האשכול     מחבר     תאריך כתיבה     מספר  
  הפותר נכונה זוכה בוינר.. יאללה :) Nesher  19.11.08 19:46 1
     יאללה :) זה לא קל וזה טריקי, אני אומר כבר מעכשיו! ldan192  19.11.08 19:50 2
         אממ.. בעת ההצהרה לתת ערך דיפולטי? Sn00py  19.11.08 20:52 3
             זה o(n)... (בהנחה שאתה התבלבלת וניסית להגדיר מערך ולא סתם משתנה) TTAsnn 19.11.08 21:16 4
             זה כי אתה רגיל לשפות עיליות :} כשאתה עושה את זה תקבל (O(n ldan192  19.11.08 23:01 7
  די פשוט למען האמת TTAsnn 19.11.08 21:19 5
     רגע, אתה מכניס אובייקט לתא הראשון שהוא NULL ldan192  19.11.08 23:00 6
         בקשר לחלק הראשון. TTAsnn 19.11.08 23:15 8
             לא הבנתי אותך? ldan192  19.11.08 23:47 11
                 זה בדיוק מה שאמרתי TTAsnn 19.11.08 23:51 13
                     מה זאת אומרת מערך נוסף ששומר את כל האינדקסים ldan192  20.11.08 09:58 16
                         אוקיי אני אנסה להסביר את זה יותר מסודר. TTAsnn 20.11.08 11:02 17
                             מה זאת אומרת אינדקס של איבר שאותחל ברשימה? ldan192  20.11.08 18:34 19
                                 אחי, נראה לי יש לנו קצר בתקשורת TTAsnn 20.11.08 21:09 22
                                     אבל מה קורה אם אני רוצה להכניס את 4 ושוב ldan192  20.11.08 22:12 23
                                         אה, לא דיברת רק על אתחול, אלא גם על מערך שמיש וכל פעולה o(1) TTAsnn 20.11.08 22:54 26
                                             כן, תשמע אתה רוצה להיות גם יעיל ldan192  21.11.08 11:41 27
                                                 יש לי ש.ב לעשות, אז אני מעדיף לראות את הפתרון :) TTAsnn 21.11.08 13:07 28
                                                     בסיידר, אז לקראת הערב אעלה פתרון מפורט :) ldan192  21.11.08 14:30 29
  אממ, אולי... Sn00py  19.11.08 23:24 9
     ראה תגובה #8... TTAsnn 19.11.08 23:26 10
     ככה אתה מקצה עוד מערך אינטים! אבל אתה קרוב :) ldan192  19.11.08 23:49 12
         כמו שכבר אמרתי בתגובה 8, עם רשימה מקושרת בתור רשימת האינדקסים זה עובד. TTAsnn 20.11.08 00:03 14
         אממ Sn00py  20.11.08 08:43 15
             שניכם אבל חוזרים על אותה טעות! :) ldan192  20.11.08 21:02 21
  מספר פתרונות dryice 20.11.08 15:39 18
     אתה כבר מדבר ברמת שפת מכונה. אני עדיין מדבר על רמת שפת תיכנות רגילה ldan192  20.11.08 18:35 20
  עידן תאשר בבקשה שהסברתי לך פתרון נכון ומגיע לי ווינר :P Sn00py  20.11.08 22:42 24
     מאשר :P רק בוא ניתן לעוד אנשים הזדמנות ואני ואתה נעלה את הפתרון! ldan192  20.11.08 22:43 25
  פ-י-ת-ר-ו-ן!! ldan192  22.11.08 13:23 30
     תודה על החידה הנחמדה! Nesher  22.11.08 14:03 31
         אם זה מעניין אותך אשמח להסביר לך. רק תגיד לי מה לא הבנת :) ldan192  22.11.08 17:10 32
     אשמח להסבר קטן.. MiP 22.11.08 18:02 33
         כי זה לא קטע הקוד המלא. ldan192  22.11.08 20:17 35
     חח, פתרון נחמד. :) אמרת שיש לך שתי דרכים, מה השניה? TTAsnn 22.11.08 18:46 34
         הדרך השניה האמת היא פחות טובה כי היא מסתכנת ldan192  22.11.08 20:24 36
     שמע עידן זה לא בדיוק לאתחל מערך :} DLN 22.11.08 21:37 37
         מן הסתם, ולכן כולם הבינו על מה מדובר... TTAsnn 22.11.08 23:50 38
             בדיוק. ldan192  23.11.08 00:11 39
             חח זה לא עושה את השאלה נכונה... DLN 23.11.08 19:23 40
                 זה כן עושה. כי אנחנו מתייחסים לפונקציות כקופסא שחורה עם סיבוכיות נדרשת ldan192  23.11.08 20:38 41
                     אבל כל הרעיון באלגוריתמיקה זה לא להסתכל על דברים מבחוץ DLN 24.11.08 01:38 42
                         מן הסתם:) ודווקא בגלל שמדברים על אלגוריתמיקה אז כן שייך ldan192  24.11.08 17:08 43
                         אני מסכים עם עידן, בסופו של דבר קיבלת ממשק למערך מאותחל :) TTAsnn 24.11.08 21:39 44

       
Nesher  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 2.7.02
2 הודעות, 24 פידבק
   19:46   19.11.08   
אל הפורום  
  1. הפותר נכונה זוכה בוינר.. יאללה :)  
בתגובה להודעה מספר 0
 


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   19:50   19.11.08   
אל הפורום  
  2. יאללה :) זה לא קל וזה טריקי, אני אומר כבר מעכשיו!  
בתגובה להודעה מספר 1
 


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Sn00py 
חבר מתאריך 1.8.02
2954 הודעות
   20:52   19.11.08   
אל הפורום  
  3. אממ.. בעת ההצהרה לתת ערך דיפולטי?  
בתגובה להודעה מספר 2
 
   ערכתי לאחרונה בתאריך 19.11.08 בשעה 21:34 בברכה, Sn00py
 

int something[10] = {0};

?

\x6C\x65\x65\x74\x68\x61\x78\x30
\x72\x3A\x2D\x29
tresp4sser


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

   21:16   19.11.08   
אל הפורום  
  4. זה o(n)... (בהנחה שאתה התבלבלת וניסית להגדיר מערך ולא סתם משתנה)  
בתגובה להודעה מספר 3
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   23:01   19.11.08   
אל הפורום  
  7. זה כי אתה רגיל לשפות עיליות :} כשאתה עושה את זה תקבל (O(n  
בתגובה להודעה מספר 3
 


בברכה,
עידן


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

   21:19   19.11.08   
אל הפורום  
  5. די פשוט למען האמת  
בתגובה להודעה מספר 0
 
   הייתי שם null בתא הראשון, והמחסנית תהיה מחסנית של מצביעים לאובייקטים שלי.
הכנסת אובייקט תהיה שינוי הערך מ null לכתובת האובייקט שאליו אתה רוצה להצביע, והוצאת אובייקט תהיה החלפת התא האחרון ב null.

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

זה סתם מה שקפץ לי לראש, יש לך עוד דרכים?


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   23:00   19.11.08   
אל הפורום  
  6. רגע, אתה מכניס אובייקט לתא הראשון שהוא NULL  
בתגובה להודעה מספר 5
 
ואז מה?
מאיפה לך שהאיבר הבא בתור הוא כתובת של זכרון או זבל?

השאלה תקפה גם ללא מחסנית (אם שכחתי לרשום), ככה שהחלק השני נכון למחסנית, אך לא נכון תמיד!

(אבל אתה קרוב )


בברכה,
עידן


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

   23:15   19.11.08   
אל הפורום  
  8. בקשר לחלק הראשון.  
בתגובה להודעה מספר 6
 
   ערכתי לאחרונה בתאריך 19.11.08 בשעה 23:19 בברכה, TTAsnn
 
אני מכניס null לאיבר הראשון.
וכל פעם אני מסתכל על האיברים מההתחלה עד שאני מוצא את האיבר שהוא null ואז הוא החוצץ בין המחסנית לזבל. אני לא יודע שום דבר לגבי ה"הבא בתור" אבל אני כן יודע לגבי הקודם לו שהוא אמין, שרק זה רלוונטי לי.

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


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   23:47   19.11.08   
אל הפורום  
  11. לא הבנתי אותך?  
בתגובה להודעה מספר 8
 
תראה, שאהיה ברור, עבור n=5:
יש לי ;.
אין לך אולי פה NULL (ואולי זבל כן יכול להיות NULL? לא יודע), בכל מקרה - אני רוצה להוסיף את האלמנט ה-i, מה נעשה?


בברכה,
עידן


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

   23:51   19.11.08   
אל הפורום  
  13. זה בדיוק מה שאמרתי  
בתגובה להודעה מספר 11
 
   בפתרון הראשון (כבר לא זוכר איזה זה מהם) אני מניח שאם אני מכניס ערך לאיבר במקום החמישי, אז זה אומר שאני מניח שכל האיברים עד אליו מלאים, שזה מתאים בשביל מחסנית, לא בשביל מערך.

ד"א, אני מניח שאחד הפתרונות שאתה מתכוון אליהם הוא מה שנתתי ב #8, שזה מערך נוסף ששומר את כל האינדקסים שאותחלו ומשתנה שסופר כמה כבר אותחלו, או רשימה מקושרת.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   09:58   20.11.08   
אל הפורום  
  16. מה זאת אומרת מערך נוסף ששומר את כל האינדקסים  
בתגובה להודעה מספר 13
 
ערכתי לאחרונה בתאריך 20.11.08 בשעה 09:59 בברכה, ldan192
 
שאותחלו? אז אתה מאתחל עוד מערך בשביל לאתחל מערך? זה יוצא יותר מ-(O(n בסופו של דבר.

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


בברכה,
עידן


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

   11:02   20.11.08   
אל הפורום  
  17. אוקיי אני אנסה להסביר את זה יותר מסודר.  
בתגובה להודעה מספר 16
 
   יש שתי אפשרויות, הראשונה היא רשימה מקושרת אשר כל איבר בה מכיל אינדקס של איבר שאותחל במערך. הרשימה מתחילה ריקה ולכן האיתחול שלה הוא o(1) וכמובן לא צריך לגעת במערך אז זה בסה"כ o(1)...

האפשרות השנייה:
מערך נוסף (לא צריך לאתחל...) ומשתנה (x) המכיל את האינדקס של האיבר האחרון שמאותחל במערך הנוסף. כך שערך זה בעצם מאותחל ל -1 (כי אף ערך לא אותחל במערך העזר). מערך העזר מכיל אינדקסים לאיברים שאותחלו, ולכן בגלל שהמשתנה עזר מצביע על האיבר ה -1 (כלומר, שהמערך ריק מאינדקסים) לא צריך לאתחל גם את המערך הזה ובסה"כ זה o(1).
בשביל להכניס ערך למערך הראשוני בתא i. אתה מכניס לתא x+1 במערך העזר את הערך i ומגדיל את x ב 1. מקווה שעכשיו הבנת...


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   18:34   20.11.08   
אל הפורום  
  19. מה זאת אומרת אינדקס של איבר שאותחל ברשימה?  
בתגובה להודעה מספר 17
 
יש לך 2 רשימות, האחת שאתה משתמש בה ועוד אחת כעזר
ואתה אומר שבמערך השני יהיו האינדקסים של מה שאותחל בראשון?
לא טוב - כי יתכנו "אינדקסי" זבל במערך השני שהם נראים כאילו הם עובדים כמו שצריך.

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


שוב, תחשוב שכשיש לך זבל - יש לך נתונים! אתה יכול להסתכל על רשימה אחת שתראה ככה: ורשימה שניה שתראה ככה: (עם אידקס ראשון 1 או לא 1 - זה לא משנה) - אתה יכול לומר לי בודאות מה ברשימה השניה הוא זבל ומה אתחלת כדי להראות ערכים אמיתיים במערך הראשון? התשובה היא לא


בברכה,
עידן


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

   21:09   20.11.08   
אל הפורום  
  22. אחי, נראה לי יש לנו קצר בתקשורת  
בתגובה להודעה מספר 19
 
   ערכתי לאחרונה בתאריך 20.11.08 בשעה 21:10 בברכה, TTAsnn
 
אתה פשוט לא מצליח להבין מה שאני אומר (כנראה אני מסביר חרא)...

הנה דוגמא לפעולה:
אני אסביר את זה עבור השיטה עם המערך הנוסף ולא עבור השיטה עם הרשימה הנוספת כי זה קצת יותר מסובך עם המערך וזה די מסביר את כוונתי לגבי שתי השיטות.
המערך שצריך לאתחל A, המערך עזר help והמונה עזר: count
נדגים את זה עבור len(A) == 6 אבל השיטה תקפה לכל אורך.
A
ו help מתחילים לא מאותחלים (מן הסתם) והם באותו האורך (6)
last מאותחל ל -1 (מינוס אחד)
ברגע ש last == -1 אני יודע ש A ריק.
נגיד ואני רוצה להכניס את המספר 12 ל A בתא בעל האינדקס 4.
אני עושה:


A[4] = 12
last++
help[last] = 4


ובשביל להוציא את האיבר באינדקס 4 מהמערך:


help[find(help,4)] = help[last]
last--

find מחפשת ערך בתוך מערך ומחזירה את האינדקס שלו.
הקוד הראשון מניח שלא הכניסו עדיין כלום למקום באינדקס 4 (if פשוט יסדר את זה) והקוד השני מניח שקיים משהו באינדקס 4 (if פשוט יסדר את זה)
לא התעסקתי בקטנות כי זה לא רלוונטי לפתרון.

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


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   22:12   20.11.08   
אל הפורום  
  23. אבל מה קורה אם אני רוצה להכניס את 4 ושוב  
בתגובה להודעה מספר 22
 
ערכתי לאחרונה בתאריך 20.11.08 בשעה 22:13 בברכה, ldan192
 
את 4 אחרי זה?
אתה תצטרך לעבור כל פעם מחדש על כל המערך (עד last) כדי שיוודא שלא עברת על התא ה-4 כבר, ואם כן לעדכן את התא הקודם, אם לא - אז לעשות באמת last++ ולהמשיך את הקוד.
אבל המעבר על המחסנית כל פעם מחדש תסתכם בהרבה מעבר ל-O(n)

שלא לדבר על מחיקה - אתה עובר על כל המערך כל פעם מחדש ב-O(n).


אני רוצה - כל מספר שתתן לי שאני אבצע מספר קבוע של פעולות! 1/2/3 כדי לקבל את החסם הקבוע המבוקש.


בברכה,
עידן


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

   22:54   20.11.08   
אל הפורום  
  26. אה, לא דיברת רק על אתחול, אלא גם על מערך שמיש וכל פעולה o(1)  
בתגובה להודעה מספר 23
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   11:41   21.11.08   
אל הפורום  
  27. כן, תשמע אתה רוצה להיות גם יעיל  
בתגובה להודעה מספר 26
 
זה שאתה מקצה זכרון בשביל למנוע פעולות זה לא כזה מייעל.
אני רוצה קוד מיועל שיעשה את העבודה בצורה אופטימלית עם רמז בכך שהאתחול הראשוני הוא O(1).

אבל רואים שיש לך ראש ואתה ממש ממש בכיוון.
תמשיך לנסות, תנו לי אות ואני אפרסם פה את הפתרון הרשמי!


בברכה,
עידן


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

   13:07   21.11.08   
אל הפורום  
  28. יש לי ש.ב לעשות, אז אני מעדיף לראות את הפתרון :)  
בתגובה להודעה מספר 27
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   14:30   21.11.08   
אל הפורום  
  29. בסיידר, אז לקראת הערב אעלה פתרון מפורט :)  
בתגובה להודעה מספר 28
 


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Sn00py 
חבר מתאריך 1.8.02
2954 הודעות
   23:24   19.11.08   
אל הפורום  
  9. אממ, אולי...  
בתגובה להודעה מספר 0
 
   צריך בעצם לא לאתחל את המערך אלא למצוא דרך לדעת אילו תאים הוקצו ואיזה תאים מכילים 'זבל'...

אפשר להקצות מערך נוסף של intים ומשתנה intי כלשהו של מספר האיברים שאתחלנו(נניח cnt)... וכל פעם שנאתחל איבר כלשהו נשמור במערך intים הזה בתא מספר cnt את האינדקס של האיבר שאתחלנו.... ואז אם אחד מהתאים מ 0 עד cnt מכיל את האינדקס (של המערך הראשי, זה שלא אתחלנו ואנחנו בודקים) סימן שהוא אותחל כבר...

\x6C\x65\x65\x74\x68\x61\x78\x30
\x72\x3A\x2D\x29
tresp4sser


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

   23:26   19.11.08   
אל הפורום  
  10. ראה תגובה #8...  
בתגובה להודעה מספר 9
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   23:49   19.11.08   
אל הפורום  
  12. ככה אתה מקצה עוד מערך אינטים! אבל אתה קרוב :)  
בתגובה להודעה מספר 9
 
ערכתי לאחרונה בתאריך 19.11.08 בשעה 23:49 בברכה, ldan192
 


בברכה,
עידן


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

   00:03   20.11.08   
אל הפורום  
  14. כמו שכבר אמרתי בתגובה 8, עם רשימה מקושרת בתור רשימת האינדקסים זה עובד.  
בתגובה להודעה מספר 12
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Sn00py 
חבר מתאריך 1.8.02
2954 הודעות
   08:43   20.11.08   
אל הפורום  
  15. אממ  
בתגובה להודעה מספר 12
 
   ערכתי לאחרונה בתאריך 20.11.08 בשעה 08:44 בברכה, Sn00py
 
המערך אינטים לא מוקצה, אנחנו נצטרך לעבור מ 0 עד cnt - הם בטוח מוקצים... השאר לא מוקצים אז אין בעיה. הבעיה ששמתי לב אליה עכשיו היא שבשביל לעבור מ 0 עד cnt אנחנו שוב מגיעים ל o(n) אז הפתרון (הלא מי יודע מה יפה) שחשבתי זה לעשות עוד מערך(), התא X במערך הזה יכול להכיל או אינדקס במערך הintים הקודם(נניח arr) שאומר שהתא X הזה במערך הראשון מאותחל, או זבל... ואז לא צריך לסרוק את המערך השני(arr)

זהו, עכשיו אני סגור על עצמי שזה o(1) חח

\x6C\x65\x65\x74\x68\x61\x78\x30
\x72\x3A\x2D\x29
tresp4sser


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   21:02   20.11.08   
אל הפורום  
  21. שניכם אבל חוזרים על אותה טעות! :)  
בתגובה להודעה מספר 15
 
זה שאתם לוקחים מערך נוסף ומאתחלים אותו בסיבוכיות זכרון נוסף של (O(n לא בדיוק עוזר.

רמז: פ-ו-י-י-נ-ט-ר-י-ם!


בברכה,
עידן


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

   15:39   20.11.08   
אל הפורום  
  18. מספר פתרונות  
בתגובה להודעה מספר 0
 
   הפתרון שאני מנחש שאתה מכוון אליו הוא למעשה לא לאתחל את המערך עצמו,
אלא רק להחזיק מונה של כמה איברים יש במחסנית.
בשביל להשתמש במערך בתור מחסנית אין שום צורך לאתחל את המערך, כי בתחילה
המחסנית מכילה 0 איברים, כאשר נכניס איבר למחסנית אנו נקדם את מונה
מספר האיברים.

אם רוצים באמת לאתחל מערך ביעילות, ולמלא את כל הזכרון שבו באפסים למשל,
יש לזה מספר פתרונות המנצלים תכסיסים של חומרה+מערכת הפעלה.
אם אנו מקצים מערך מאוד גודל המתפרס על פני מספר דפים בזכרון,
אפשר שהמערך יוקצה בזכרון וירטואלי בלבד וזה במקום מיפוי לזכרון פיזי
ימופה לדף זכרון בודד שכולו אפסים אבל עם הדגל Copy on write
שמשמעו שיש להעתיק דף זכרון זה לדף אמיתי ברגע שמנסים לכתוב אליו.
ההקצאה של הזכרון מתבצעת באותו שנדרש להצות זכרון ולא לאפס אותו
זה בתיאוריה O(n) אבל משום שהקבוע הוא גדול מספיק(כי דף הוא לרוב 4KB)
אנו יכולים להתעלם מכך. ובלאו הכי הזמן הנוסף לאתחול המערך באפסים
הוא בקירוב טוב 0 ועל כן וודאי שהוא O(1).
כמובן שזה מעט קצת את הגישות למערך הזה, שכן בפעם הראשונה שכותבים
לכל אחד מהדפים הדף יועתק, אבל משום שגודל הדף סופי, הגישה
לזכרון היא עדיין O(1). וזאת הצורה המקובלת לאתחל מערך באמת לאפסים
ביעילות.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   18:35   20.11.08   
אל הפורום  
  20. אתה כבר מדבר ברמת שפת מכונה. אני עדיין מדבר על רמת שפת תיכנות רגילה  
בתגובה להודעה מספר 18
 


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Sn00py 
חבר מתאריך 1.8.02
2954 הודעות
   22:42   20.11.08   
אל הפורום  
  24. עידן תאשר בבקשה שהסברתי לך פתרון נכון ומגיע לי ווינר :P  
בתגובה להודעה מספר 0
 
  

\x6C\x65\x65\x74\x68\x61\x78\x30
\x72\x3A\x2D\x29
tresp4sser


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   22:43   20.11.08   
אל הפורום  
  25. מאשר :P רק בוא ניתן לעוד אנשים הזדמנות ואני ואתה נעלה את הפתרון!  
בתגובה להודעה מספר 24
 


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   13:23   22.11.08   
אל הפורום  
  30. פ-י-ת-ר-ו-ן!!  
בתגובה להודעה מספר 0
 
כפי שאתה תראו, הפתרון מאוד מאוד דומה לזה של TTAsnn, אבל היה חסר לו משהו אחד. איך נבטיח שאתחלנו כבר את כל המערך (A) מבלי לסרוק כל פעם מחדש את המערך C (ש-TTAsnn הציע) לראות שהערך לא קיים (ואז להעלות את הסיבוכיות מ-O של קבוע ל-O של n)!
לכן, זהו הפתרון שמבטיח שמילאנו את כל המערך בערכים חוקיים בלי פחד.
יש לנו את A - שזה המערך המבוקש, B - שזה מערך מצביעים למיקומים במערך ו-C - שזה מערך נוסף בפתרון הנ"ל, אך באותה מידה יכולנו להשתמש במערך מצביעים גם כן ולהבטיח 0 שימוש בזכרון נוסף!




בעיניי TTAsnn נתן פתרון ממש ממש קרוב, רק שהוא שכח את מקרה הקצה הנ"ל שציינתי, וגם Sn00py נתן לי פתרון ממש ממש דומה בפרטי ככה שמצידי שניכם זוכים


מקווה שנהנתם


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Nesher  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 2.7.02
2 הודעות, 24 פידבק
   14:03   22.11.08   
אל הפורום  
  31. תודה על החידה הנחמדה!  
בתגובה להודעה מספר 30
 
האמת שלא הכי הבנתי את הפתרון חח... אני כבר זקן וישיש


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   17:10   22.11.08   
אל הפורום  
  32. אם זה מעניין אותך אשמח להסביר לך. רק תגיד לי מה לא הבנת :)  
בתגובה להודעה מספר 31
 


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
MiP
חבר מתאריך 24.5.05
782 הודעות
   18:02   22.11.08   
אל הפורום  
  33. אשמח להסבר קטן..  
בתגובה להודעה מספר 30
 
   איפה הקשר בין המערך A לבין המערכים B ו- C
סבבה יש קשר בין B ו- C
אבל איך הם מצביעים בסוף לזיכרון של מערך A
ומאמתים שאכן אין בו זבל ?



                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   20:17   22.11.08   
אל הפורום  
  35. כי זה לא קטע הקוד המלא.  
בתגובה להודעה מספר 33
 
במערך C יש לך את התאים שאין בהם זבל.
אני רוצה להכניס תוכן ל-[A[3, נניח,
אז אני בודק במערך [B[3 לאיזה תא הוא מצביע ב-[[C[B[3.
אם הוא מצביע לערך ל-3 משמע שהתא אין בו זבל.

תעבור על זה כמה פעמים ותראה שאין סיכוי לטעויות!


בברכה,
עידן


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

   18:46   22.11.08   
אל הפורום  
  34. חח, פתרון נחמד. :) אמרת שיש לך שתי דרכים, מה השניה?  
בתגובה להודעה מספר 30
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   20:24   22.11.08   
אל הפורום  
  36. הדרך השניה האמת היא פחות טובה כי היא מסתכנת  
בתגובה להודעה מספר 34
 
בכך שתא עם זבל בפוקס יהיה תא במערך.
הרעיון דומה רק ששם כל תא שרוצים לאתחל (נגיד תא [A[4) שיצביע לתא [B[++top ובוא יהיה הערך המבוקש.
אם התא מכיל טווח זכרון חוקי אז משמע שהוא אותחל כבר.

הבעיה היא שזבל יכול להיות 1238034 וגם תא בזכרון יכול להיות 1238034 ובגלל זה זו שיטה הרבה פחות טובה (אבל תתפלאו שהיא עדיין מאוד נפוצה!)


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
DLN
חבר מתאריך 20.4.07
15884 הודעות
   21:37   22.11.08   
אל הפורום  
  37. שמע עידן זה לא בדיוק לאתחל מערך :}  
בתגובה להודעה מספר 30
 
   השאלה שלך לא מכוונת טוב לדעתי...
הפתרון הזה הוא הפתרון לשאלה איך להשתמש במערך בלי לאתחל אותו.
אתה לא מאתחל את המערך ככה, אתה מאתחל כל איבר בנפרד מתי שאתה צריך אותו...
פיזית, זה לא אפשרי לאתחל מערך בזמן קבוע.


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

   23:50   22.11.08   
אל הפורום  
  38. מן הסתם, ולכן כולם הבינו על מה מדובר...  
בתגובה להודעה מספר 37
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   00:11   23.11.08   
אל הפורום  
  39. בדיוק.  
בתגובה להודעה מספר 38
 


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
DLN
חבר מתאריך 20.4.07
15884 הודעות
   19:23   23.11.08   
אל הפורום  
  40. חח זה לא עושה את השאלה נכונה...  
בתגובה להודעה מספר 38
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   20:38   23.11.08   
אל הפורום  
  41. זה כן עושה. כי אנחנו מתייחסים לפונקציות כקופסא שחורה עם סיבוכיות נדרשת  
בתגובה להודעה מספר 40
 


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
DLN
חבר מתאריך 20.4.07
15884 הודעות
   01:38   24.11.08   
אל הפורום  
  42. אבל כל הרעיון באלגוריתמיקה זה לא להסתכל על דברים מבחוץ  
בתגובה להודעה מספר 41
 
   זה כמו שבתרגיל תיכוני לבנות אלגוריתם שמאתחל מערך בזמן לינארי היו נותנים את התחביר אתחול של C כתשובה...
אם אתה רוצה להסתכל על הפתרון כקופסא שחורה שפשוט מבצעת מה שאתה רוצה, אז סבבה, זה אחלה פתרון, אבל פתרון אמיתי לשאלה שנתת לא קיים :|


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   17:08   24.11.08   
אל הפורום  
  43. מן הסתם:) ודווקא בגלל שמדברים על אלגוריתמיקה אז כן שייך  
בתגובה להודעה מספר 42
 


בברכה,
עידן


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

   21:39   24.11.08   
אל הפורום  
  44. אני מסכים עם עידן, בסופו של דבר קיבלת ממשק למערך מאותחל :)  
בתגובה להודעה מספר 42
 
  


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

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

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



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