ההבדל בין רשימת המערכים והרשימה המקושרת ההבדל בין

Anonim

איך נתונים מאוחסנים?

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

-> ->

מערך דינמי ורשימה מקושרת

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

-> ->

שימוש בזיכרון

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

- <->

גודל רשימת מערכים ראשוניים ורשימה מקושרת

עם רשימת המערכים, אפילו רשימה ריקה דורשת גודל של 10, אך עם רשימה מקושרת, איננו זקוקים למרחב ענקי. אנחנו יכולים ליצור רשימה מקושרת ריקה עם גודל של 0. מאוחר יותר, אנחנו יכולים להגדיל את הגודל לפי הצורך.

אחזור נתונים

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

סוף הנתונים

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

מעבר הפוך

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

תחביר

תן לנו להסתכל על תחביר ג 'אווה של שני מנגנוני אחסון.

מערך רשימה:

רשימה arraylistsample = חדש ArrayList ();

הוספת אובייקטים לרשימת המערכים:

Arraylistsample. הוסף ("name1");

דוגמה. הוסף ("name2");

כך תיראה רשימת המערכים המתקבלת - [name1, name2].

יצירת רשימה מקושרת:

רשימה linkedlistsample = new linkedist ();

הוספת אובייקטים לרשימה המקושרת:

Linkedlistsample. הוסף ("שם 3");

Linkedlistsample. הוסף ("name4");

כך תיראה הרשימה המקושרת כתוצאה - [name3, name4].

מה טוב יותר עבור מבצע החיפוש או החיפוש?

רשימת המערכים לוקחת את O (1) זמן להפעלת חיפוש נתונים, ואילו הרשימה המקושרת לוקחת את U (n) עבור n לחיפוש נתונים. לכן, רשימת מערכים תמיד משתמשת זמן קבוע עבור כל חיפוש נתונים, אבל ברשימה מקושר, הזמן נלקח תלוי במיקום הנתונים. לכן, רשימות מערך תמיד בחירה טובה יותר עבור פעולות קבל או חיפוש.

מהו טוב יותר עבור פעולת הוספה או תוספת?

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

מה עדיף למבצע הסרה?

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

מהו מהיר יותר?

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

מתי להשתמש ברשימת מערכים וברשימה מקושרת?

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

הבה נבחן את ההבדלים בצורת טבלאות.

S. לא מושגים הבדלים
רשימת מערכים רשימת מקושרים
1 אחסון נתונים אופנה משתמש אחסון נתונים רציף משתמש אחסון נתונים לא רציף
2 < ערכת אחסון פנימית שומרת על מערך דינמי פנימי שמירה על רשימה מקושרת 3
שימוש בזיכרון דורש שטח זיכרון רק עבור הנתונים נדרש שטח זיכרון עבור נתונים, כמו גם עבור מצבים 4
גודל הרשימה הראשונית צריך מקום עבור לפחות 10 פריטים לא צריך שטח ואנחנו יכולים אפילו ליצור רשימה ריקה של גודל 0. 5
אחזור נתונים חישוב כמו מיקום הנתונים הראשון + 'n', כאשר 'n' הוא סדר הנתונים ברשימת המערכים מחצית מהראשון או האחרון עד לקבלת הנתונים הנדרשים 6 < סוף נתונים
ערכי ה- Null מסמנים את הסוף מצביע ה- n מציין את הסיום 7 מעבר הפוך
אינו מאפשר זאת מאפשר זאת בעזרת descendingiterator () 8 רשימה יצירת תחביר
רשימה arraylistsample = new Array רשימה (); רשימה linkedlistsample = linkList חדש (); 9

הוספת אובייקטים

Arraylistsample. הוסף ("name1"); Linkedlistsample. הוסף ("שם 3"); 10

חפש או חפש

לוקח זמן O (1) וטוב יותר בביצועים לוקח זמן (o) n וביצועים תלוי במיקום הנתונים 11 הוספה או תוספת
צורכת את O (1) אלא כאשר המערך מלא זמן O (1) בכל המקרים 12 מחיקה או הסרה
לוקח זמן O (n) לוקח O (n) זמן 13 מתי להשתמש? כאשר יש הרבה פעולות חיפוש או חיפוש מעורב; זמינות הזיכרון צריכה להיות גבוהה עוד יותר בתחילת
כאשר יש פעולות רבות של הוספה או מחיקה וזמינות הזיכרון אינה צריכה להיות רציפה