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

הבנה של בועות בועות ב Depth

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

צעדים אלגוריים

  1. התחל בתחילת המערך.
  2. השווה את שני המרכיבים הראשונים, אם הראשון גדול יותר מהשנייה, להחליף אותם.
  3. לעבור לצמד הבא (השערות 2 ו- 3) וחזר על ההשוואה וההחלפה האפשרית.
  4. המשך תהליך זה עבור כל המערך.לאחר מעבר מלא אחד, האלמנט הגדול ביותר יעבור לעמדה האחרונה.
  5. חזור על החול, אך כל מעבר לאחר מכן יכול לעצור אלמנט אחד מוקדם יותר, כי הזנב של המערך כבר ממיין.
  6. אם עובר שלם מתרחש ללא חילופים, המערך ממיין והאלגוריתם מסתיים מוקדם.

(ה) התעלמות מוקדמת זו מביצועים בסיסיים, אך היא יכולה להפחית את זמן החיוב הטוב ביותר ל-FLT:0O(n)FLT:1 כאשר הקלט כבר ממיין, במקרה הגרוע ביותר - רשימה הפוכה - אלגוריתם הופך מלא:2nFLT 3, כל אחד מהם עובר עד ל-FLT:4nFLT:5-1 ו- 5.

זמן ומרחב מורכבות

  • (ב) ,0) ,(ב) ,(n2) - מתרחש כאשר מערך זה הוא בסדר הפוך.
  • (ב) ,0) ,(ב) ,(ב) , ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇
  • (ב) ,0) מועד ה- Best-case: FLT:1 O(n) - עם אופטימיזציה מוקדמת של סיום ומערך מתואם.
  • מורכבות:0 (איור 1: 1) O(1) - היא סוג של זיכרון קבוע בלבד (משתנה זמני יחיד להחלפה).

אלגוריתם בועות הוא אלגוריתם של בועות:0 אלגוריתם 1 של אלגוריתם, כלומר אלמנטים שווים לשמור על הסדר היחסי המקורי שלהם. הנכס הזה יכול להיות חשוב עבור יישומים מסוימים, אבל יציבות היא רק לעתים רחוקות גורם מכריע בהתחשב חוסר היעילות שלו.

מתי (באופן תיאורטי) להשתמש בבועות מסוג

מחוץ להקשרים חינוכיים, בועות מין כמעט אף פעם לא הבחירה הטובה ביותר.היתרונות היחידים שלה הם פשטות קיצונית ויכולת לזהות אם הקלט כבר ממיין במעבר אחד.חלק מה-FLT:0Wikipedia מאמר על בועות מטבולית 1:1 מציין כי הוא רואה שימוש בגרפיקה ממוחשבת עבור משימות קטנות שבהן שכפול קוד הוא רב, אבל אפילו שם, לעתים קרובות קידוד החוצה עבור כמה מרכיבים גדולים יותר מ תריסר (אורד) מאשר תריסר אלמנטים גדולים יותר מ-או-או-או-או- תריסר.

הבנה של המונחים: Depth

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

צעדים אלגוריים

  1. שקול את האלמנט הראשון כפי שכבר ממיין (רשימה חד פעמית הוא טריוויאלי).
  2. קחו את האלמנט הבא מהחלק הלא-מרוצה.
  3. השוו אותו עם האלמנטים בחלק המנוי, נעים מימין לשמאל.
  4. לשנות את כל האלמנטים המדומים שהם גדולים יותר מהגורם הנוכחי, עמדה אחת ימינה.
  5. הכנס את האלמנט הנוכחי אל המקום החוסן.
  6. חזור על שלבים 2-5 עד שכל המערך מעובד.

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

זמן ומרחב מורכבות

  • (ב) [ה]: [ה], [ה]], כאשר המערך ממיין בסדר הפוך.
  • (ב) ,0) זמן של סעודה: 1FLT:1 O(n2), אך עם גורם קבוע נמוך יותר מאשר בועות בתרגול.
  • (ב) [ה]הזמן הטוב ביותר: [ה]: [ה] [=] כאשר המערך כבר ממיין את כל אחד מהאלמנטים החדשים רק פעם אחת, ואינו זקוק לשינוי.
  • מורכבות:0 (ב)5=5=5=2, ב-[[1924]], ב[[1924]], [[1924]], [[1924]]]]

הכנס הוא גם (FLT:0stableFLT:1), שמירה על סדר יחסי של מפתחות שווים.אופי הסתגלות שלה - ביצועים משתפרים ככל שהמידע הופך להיות יותר ממיין - הופך אותו לבחירה מעשית עבור נתונים קטנים וכ subroutine באלגוריתמים מתוחכמת יותר כמו טיםסורט.

רלוונטיות עולמית

(ב) ,השפה המודרנית של התכנות היא רחוקה מיושנת.רבים משתמשים בה מבפנים עבור ערכים קטנים.לדוגמה, Python'sFLT:0 משתמשת ב- Timsort, אשר ממנפיקת את הכנס לריצה קטנה.

המונחים: Head-to-Head Efficiency

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

מספר המבצעים

(ב) [17] , ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇

(ב) כרך ראשון (ב[[1924]]]], [[1924]]]]]], [[1924]]]]]], [[1924]]]]]], [[1924]]]]]]]]]]]], [[1924]]]]]]]]]], [[1924]]]]]]]]]]]]]], [[1924]]]]]]]]]]]]]]]], [[1924]]]]]]]]]]]]]]]]]]]]]]]]]]]], [[1924]]]]]]]]]]]]]]]]]]]]]]]]]]]], [[1924]]]]]]]]]]]]]]]]]]]]]]]]]]]] [[1924]]]]]]]]]]]] [[1924]], [[1924]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] [[1924]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]], [[[[1924]]]] [[[[1924]]]]]]]]]] [[1924]]]]]]]] [[1924]]]]]]]] [[1924]]]]]]]] [[[[1924]]]]]]]] [[1924]]]]]]]]]] [[[[[[1924]] [[19

התנהגות הסתגלות

(ב) ,ההתאמת היא: אם המערך כבר ממיין, הוא מבצע רק את ה-FLT:0 ânb1 השוואות ואפס שינויים; אם המערך כמעט ממיין, רק כמה אלמנטים צריכים להיות מוכנסים, והכניסות האלה בדרך כלל כרוכות בשינויים קצרים יותר.

זיכרון מקומי וCaching

אדריכלות מודרנית CPU נהנה התנהגות מטמון טובה.כנסת סוג נוטה לגשת לזיכרון באופן משמעותי, במיוחד כאשר שינוי אלמנטים בולטים. בועות בועות, עם זאת, לעתים קרובות חילופי אלמנטים סמוכים, אשר גם מציג מקומי טוב, אבל המספר העצום של חילופי גורמים יותר זיכרון להוסיף בועות ראייה, כגון אלה המתועדים על FLT:0 Galles's אתר הדמיה של גלאזס, אך מציג באופן עקבי גודל זיכרון אחר, בועות, ו-זמנית.

שימוש במקרים הטובים ביותר

בחירת האלגוריתמים תלויה במגבלות הבעיה:

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

  • (ב) פשטותו של [[המאה ה-1]], היא עוזרת למתחילים להבין מושגים.
  • (ב) ⁇ 10:0) נתונים קטנים באופן קיצוני ( ⁇ 10 אלמנטים) שבהם הבדלים בביצועים הם רשלנים.
  • [ה]היציבות וההוויה במקום נדרשים] ל"הפשטות הקוד" ו"הפשטות" מקלקלת את יעילותה.
  • (ב) ,0) יישום חומרה (FLT:1), שבו ניתן לבצע את פעולת החלפת ההחלפה במקביל (למשל, מערך סינתי).

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

המונחים: sort Shines

  • (ב) ⁇ ⁇ 0) ⁇ ⁇ ( ⁇ 50 אלמנטים) - ספריות סטנדרטיות רבות מתחלפות להזנת סוג של גודל קטן בשל העודף הנמוך שלו.
  • (ב) [15] ,(ה) ,(ה) ,הזמן של ה-O(n) הוא זמן של הזנת מעוות או כמעט מחוספס, מה שהופך אותו אידיאלי לשמירה על הסדר לאחר כמה מוטציות.
  • (ב) ,0) ,ב"התורה" (ב) - כאשר אלמנטים מגיעים באופן מצטבר ויש להכניס לרשימה מובנת, הכנסת סוג הוא טבעי.
  • (ב) כמחסן בנייה (FLT:1) - באלגוריתמים היברידיים כמו טיםסורט, הכנסת סוג של קיטור מטפל בריצה קטנה ביעילות.
  • (FLT:0) מערכות Embeddrated SystemsFLT:1 - שבו הזיכרון חזק והנתונים מופיעים ב- cache, הכנס מספק ביצועים טובים עם גודל קוד מינימלי.

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

ביצועים אמפיריים: A Simple Benchmark

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

  • בועות בועות - 2.5 שניות
  • המונחים: 0.9 seconds

עם 50,000 אלמנטים, בועות מין הופכת לא מעשי לחלוטין ( דקות), בעוד ש-Taverion עדיין להשלים בתוך כמה שניות. על נתונים כמעט ממוזנים (למשל, רק 0.1% מהאלמנטים מתוך סדר), הכנס יכול לסיים בזמן ליניארי, בעוד בועות מין עדיין דורשות מספר רב של מעברים ולבצע השוואות ממושכות.

ניתוח מורכבות Beyond Big O

בעוד שהצתה הגדולה מספקת גבולות אסימפטוטיים, היא מטשטשת גורמים קבועים ומאפייני ביצועים מעשיים.חשב בנקודות החיוב הבאות:

מספר ההשוואה

במקרה הגרוע ביותר, שני האלגוריתמים עושים את ההשוואה:0 â € ¢ â ¢ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇

מספר ההתפטרות

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

  • בועות: (ב) (ב) ⁇ (ב) ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇
  • (ב) ויקרא י"ד): "וַיְּהִיא אִתָּבְתָּבְתָּבְתָּבְתָּבְתָּבָה:" (בראשית כ"ד, כ"ד)

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

השפעה של הפצת נתונים

[הכנסה של ⁇ ] נתונים מדומים באופן חלקי, כי מספר ההסרות - זוגות של אלמנטים שאינם בסדר - ישירות תואמים עם הזמן המרוץ שלו.מספר ההסתה הוא מספר השינויים ש- Enterion יבצעו, לכן עבור נתונים אקראיים, יש בערך על פי נתונים:0nFLT:12/4versions בממוצע.

טביעת רגל זיכרון ויציבות

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

שינויים ואופטימיזציה

שני האלגוריתמים כבר ננעלו במהלך השנים:

בועות בועות

  • (ב) כרך 1:0) ,Kocktail Shaker sortFLT:1 , הידוע גם בשם בועות דו-כיוניות.It עובר מעלה ולמטה ברשימה, אשר יכול להפחית מעט את מספר העוברים כאשר האלמנט הקטן ביותר הוא קרוב לסוף.
  • (FLT:0)CombמייןFLT:1) מציג פער בין אלמנטים בהשוואה, הופך אותו למעשה לגרסה פשוטה יותר של Shellמיין.זה משפר את הביצועים הממוצעים אבל עדיין נופל קצר של הכנס לגדלים קטנים.

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

המונחים: differentants

  • (FLT:0) הכנסת הכנסת סוג של ההרחבה 1 (FLT:1) - משתמש בחיפוש בינארי כדי למצוא את נקודת ההכנסה, צמצום מספר ההשוואה מ- O(n) ל- O(log n) לשילוב.עם זאת, מספר השינויים נשאר O(n), כך גם מורכבות הזמן הכוללת נשארת O(n2).זה יכול להיות מועיל כאשר השוואות הן יקרות (למשל, השוואת מחרוזת).
  • (FLT:0) ShellמייןFLT:1 - הכללת הכנסת סוג על ידי מתן השוואות של אלמנטים מרוחקים.יש ביצועים יותר אסימפטוטיים (O(n log n) בחלק מהרצףים) והוא אלגוריתם מעשי עבור מערך בינוני בגודל בינוני.

למרות הבדלים אלה, סוג הכנס הבסיסי נשאר את ה-Go-to עבור נתונים קטנים או כמעט ממוינים.

מתי להימנע משתי

עבור כל אלגוריתמים גדולים יותר מכמה מאות אלמנטים, לא בועות בועות או הכנסת סוג מתאים. בקנה מידה זה, O(n log n) אלגוריתמים כמו Quicksort, Merge מון, או Heap לשלוט ב-MINO, גם בגודל 100, ההבדל בין O(n2) ו- O(n log n) יכול להיות סדר גודל.

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

מסקנה: הכנסון מיני מנצח כמעט בכל פעם

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

מפתחים המבקשים ליישם סוג של מאפס לבעיה קטנה צריכים ברירת מחדל ל- Enterionמיין.אלה הזקוקים לסוג אמין ובעל ביצועים גבוהים עבור נתונים שרירותיים צריכים להסתמך על פונקציות הספרייה כמו FLT:4 ב- JavaScript או FLT:5 ב Python, אשר משתמש פנימי באלגוריתמים אופטימיזציה של בועות קצה.

לקריאה נוספת, ייעוץ (FLT:0Khan Academy's Algorithms קורס: 1Feloph עבור מבוא ידידותי למתחילים למיין מורכבות.