שאלה מעניינת

nocgod

New member
שאלה מעניינת

בהנתן רשימה מקושרת חד כיוונית, מצביע לראש הרשימה ומצביע לאיבר X ברשימה שצריך למחוק.
תן דוגמא אלגוריתם למחיקת האיבר בסיבוכיות O(1)

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

שבוע טוב :)
 

nocgod

New member
כן

סדר האיברים אחרי המחיקה אמור להשמר בדיוק כפי שהיה פשוט מינוס האיבר שמחקנו :)
 

nocgod

New member
תפרסמו את הפתרונות רק מחר

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

nocgod

New member
לא הבנתי אותך...

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

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

(לא סתם הרבה טיפוסים ב-c++ דורשים אובייקטים ניתנים להזזה)
 

nocgod

New member
למה אתה לא יכול להעתיק

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

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

Netanel w

New member
ניסיון - לא בטוח אם זו הכוונה:

// removing x from the list:

x->data = (x->next)->data;
node *tmp = x->next;
x->next = (x->next)->next;
delete tmp;

// meaning:
a -> b -> x -> d -> e
a -> b -> d -> d -> e // copying data
a -> b -> d ------> e // changing the next pointer
(old d) --> trash.
 

nocgod

New member
זאת הכוונה

חבל שפרסמת את התשובה...אולי עוד מישהו רצה לחשוב על זה? =)
 

Netanel w

New member
כמובן,

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

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

האמת העצובה היא שאם לא נתון ש-X *אינו* זנב הרשימה, הרי ש*אין* פתרון ב-(1)O לבעייה.
אנחנו מהנדסים, זה לא פורום סוציולוגיה - ופתרונות צריכים להיות נכונים.
 

Netanel w

New member
נכון, אבל גם מזה אפשר להתחמק (בגסות)

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

הדרך היחידה להתחמק ממקרים כאלה היא שימוש דומה לNull Object pattern, כלומר לא בדיקה שהפוינטר יהיה NULL, אלא שהאיבר המוחזר עצמו יהיה בתוכנו "מוגדר NULL".
 

nocgod

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

זו רשימה מקושרת מעגלית כלומר סוף הרשימה מצביע לתחילתה, יש לנו מצביע לראש ויש לנו מצביע לאיבר X שצריך למחוק, כעת זה לא משנה איפה האיבר X כל איבר ניתן למחיקה :)
 

סקרמנטה

New member
אז... אין צורך במצביע לראש הרשימה

מספיק מצביע לאיבר שצריך למחוק...
 
למעלה