מערך (מבנה נתונים) – הבדלי גרסאות

תוכן שנמחק תוכן שנוסף
הגהה, ויקישיתוף בשורה
שורה 23:
למערך שני חסרונות בולטים שקשורים למבנה הסטאטי שלו:
#הראשון שבהם הוא חוסר הגמישות שבו: קשה למחוק איברים ממערך תוך שמשאירים את האיברים הנותרים סמוכים זה לזה, שכן אם נמחוק את אחד האיברים נצטרך להעביר את כל האיברים שאחריו מקום אחד אחורה בזיכרון, פעולה שהיא בסיבוכיות <math>\ O(n)</math>, כאשר <math>\ n</math> הוא מספר התאים שיש להזיז.
#כמו כן, אין זה פשוט להוסיף למערך איברים חדשים. ייתכן שתאי הזיכרון שאחרי המקום האחרון במערך כבר נתפסו למטרה אחרת, ולפיכך כדי להגדיל את המערך יש להעתיק את כולו מחדש לרצף תאים פנויים במספר הנדרש. אומנם, ניתן להראות ש[[ניתוח לשיעורין|העלות המשוערכת]] של הוספת תאים חדשים בדרך חכמה (על פי רוב, הכפלת המערך פי שניים בכל פעם שנדרשים להגדיל אותו) לא תעלה על <math>\ O(1)</math>.
 
==מימוש בתכנות==
שורה 41:
כאן אנו מציגים דרך סטנדרטית לגישה למערכים: שם המערך נכתב ראשון, ואחריו, בסוגריים מרובעים, נכתב האינדקס של האיבר שאת ערכו אנו רוצים לשנות. נשים לב כי במקרה זה, לאיבר הראשון במערך יש את האינדקס 0. זוהי בחירה שרירותית - ב[[שפת תכנות|שפות תכנות]] מסוימות (דוגמת [[c (שפת תכנות)|C]]) זה כך, ובשפות אחרות זה אחרת.
 
דרך גישה מסורבלת יותר למערכים, שב[[אסמבלר]] היא היחידה האפשרית, היא באמצעות שימוש במצביעים לתאי זיכרון. אין הבדל של ממש בין השיטות: הביטוי <math>\ square[0]</math> מתורגם בפועל לכתובת הזיכרון בה מאוכסןמאוחסן הנתון. עם זאת ב[[#מטריצות|מטריצות]] שימוש כזה עשוי להיות יעיל משמעותית.
 
==תכונות המערך בשפות תכנות==
 
למערך ישנם כמה חסרונות שדורשות התייחסות בעבודה עם המבנה במהלך [[תכנות]]:
* במידהאם ומספרמספר האיברים אשר יוכנסו למערך לא ידוע מראש, יכול להווצר מצב שמערך שהוגדר יהיה קטן מדי ותהיה דרישה להגדילו. פעילות כזאת תדרוש, לעתים, העתקת כל הנתונים הקיימים למקום אחר שממנו אפשר להגדיל את הרצף בזיכרון, דבר שמכביד מבחינת ביצועי התוכנה. שפות תכנות מסוימות מאפשרות טיפוסים מובנים שמבצעים את ההגדלה הדינאמית (כמו למשל [[Visual Basic]], הטיפוס הפרימטיבי list ב[[Python]], וכדומה), שפות אחרות דורשות מהמתכנת לבצע את הפעולה בפירוש, תוך הגדרה של גודל החדש.
* במקרים שבהם זקוקים למערך דליל (מערך בעל טווח ערכים גדול במיוחד, אף שרוב תאיו לא ינוצלו), אין זה מן הנמנע שבזיכרון הפנוי במחשב לא יימצא כלל מקום לרצף התאים שנתבקש, והקצאת המערך לא תתאפשר, וגם אם תתאפשר הקצאת המערך תגרום לבזבוז רב של זיכרון. למשל: אם משתמשים במערך כדי לייצג את כל תושבי מדינת ישראל, כך שהאינדקס של כל איבר במערך יהיה מספר תעודת הזהות של התושב, יהיה מספר עצום של תאים (<math>\ 10^9</math>) שרק חלק זעום מהם יהיה תפוס. לבעיות מטיפוס כזה מתאימים מבני נתונים אחרים, כדוגמת [[טבלת גיבוב]] או [[מטריצה דלילה]].
 
שורה 55:
 
באמצעות מערך רב ממדי ניתן לייצג [[טנזור]] כללי, בעל מספר ממדים כלשהו.
 
 
==שימושים עיקריים==
שורה 64 ⟵ 63:
 
אלטרנטיבה מקובלת למערך במקרה של מספר נתונים משתנה היא [[רשימה מקושרת]], המאופיינת בגמישות בהוספה ובמחיקה של איברים.
 
==קישורים פנימיים==
{{ויקישיתוף בשורה}}
 
== הערות שוליים ==