מבנה נתונים - map

  • פותח הנושא c5po
  • פורסם בתאריך

c5po

New member
מבנה נתונים - map

שלום, אמנם אני לא חבר פעיל בפורום אבל יש לי שאלה קטנה: האם מישהו מכיר את מבנה הנתונים map? היכן ניתן למצוא עליו חומר ובמיוחד על המימוש שלו במסגרת הקופלייר xlC ב UNIX תודה,
 

DNile

New member
הרעיון עצמו מאוד פשוט:

map "ממפה" לך, בין ערכים מסוג אחד, ערכים מסוג שני. למשל: נניח שאתה רוצה לתרגם מספר לתרגום המילולי שלו. אתה תרצה איזה שהוא מבנה נתונים שיודע לעשות לך את הקישור:
1 - "six" 2 - "twelve" 3 - "seven" 4 - "ten" וכך הלאה...​
אפשר להסתכל על map כעל טבלה גדולה כזאת, כשערך האינדקס הוא הערך השמאלי. אז אם למשל אתה רוצה להדפיס במילים את המספר 2, היית ניגש לmap, מחפש איזה ערך מתאים ל2, ומוצא "twelve". כחלק מהאופן עבודה הזה, הmap מתנהג כמו פונקציה - יכולים להיות כמה ערכים שמאליים עם אותו ערך ימני, אבל הmap לא יכול יותר מרשומה אחת עבור כל ערך מצד שמאל. כלומר - אין בעיה שגם 2 וגם 13 יקושרו ל"twelve", אבל לא יכול להיות מצב שבו 2 יקושר גם ל"twelve" וגם ל"minus four". לגבי המימוש שלו - זה משתנה מכל קומפיילר לקומפיילר. חלק מהקומפיילרים יהיו נחמדים מספיק כדי להביא לך את הקוד שלהם, אחרים אולי לעולם לא יאמרו. מה שכן, המימוש קצת פחות צריך לשנות לך - מכמה סיבות: 1. STL עוצב בצורה כזאת שכל אחד יכול לממש איך שבא לו, כשהתפקוד הוא אותו התפקוד, וזה שקוף למתכנת. 2. אם תניח כל מיני הנחות על אופן המימוש, יש מצב שתרצה לקמפל על מערכת נפרדת, ואז המימוש יהיה שונה, מה שישים אותך בבעיה די גדולה.
 

ChipsMan

New member
הערה..

בכל הקומפיילרים שראיתי עד היום, map ממומש באמצעות עץ אדום שחור. הוא מבטיח הוספה, הסרה וחיפוש של איברים בזמן (O(log n.
 

annefan

New member
לא יכול להיות מימוש כזה

הסטנדרט מגדיר מגבלות סדר גודל על פעולות על מבני נתונים. כיוון שב-hash_map יתכן ב-worst-case סדר גודל של O(n), המימוש הזה איננו קביל מבחינת הסטנדרט, הדורש יעלות של O(lgn) (גם במחיר של ויתור על O)1( במקרים אופטימיים).
 

Zack DA

New member
לא תמיד מקשיבים לסטנדרט,

וזה נכון לגבי המון דברים. למשל, כמה קומפיילרים באמת מתואמים 1 ל- 1 עם ה- ANSI ? לדעתי 0. ואגב, אפשר לממש HASHMAP שבתוספת של קבועים הוא יתנהג ב- LOGn גם ב- WCS. איך, אתה יכול לגלות לבד.
 

annefan

New member
אני לא מבין

אתה מכיר מימוש כזה באיזה קומפיילר?
 

ChipsMan

New member
לא יצא לי..

הסתכלתי במימושים של בורלנד, של מיקרוסופט והמימוש שמגיע עם gcc.
 
למעלה