הנדסה אזרחית & הנדסה מבנית
כיצד לספור אופטימיזציה של סוג של ספקטרום קטן
Table of Contents
מבוא ל Counting
ספירה של סוג היא אלגוריתם מבוסס לא-שותף שהצטיין כאשר מיון טטגרס על טווח קטן, ידוע.בניגוד לסוגים המבוססים על השוואה כגון Quicksort או Mergesort, אשר מסתמכ על השוואת אלמנטים מעודכנים, ספירה מון קובע את ההזמנה המנומנת על ידי ספירת תדירות של כל ערך ייחודי.
האלגוריתם תואר לראשונה על ידי הרולד סיוורד בשנת 1954 ו נשאר טכניקה בסיסית במדעי המחשב.פשטות ויעילות שלו להפוך אותו אידיאלי עבור משימות כמו מיון גילי סטודנטים, ציונים, או כל מידע integer עם התפשטות צנועה. על ידי מינוף של מידת אחסון עזר למגוון, ספירה להימנע ממינון O(n log n) נמוך מהשוואה, השגת O(n) + k) שבו טווח קלט של ערכים.
איך לספור עבודות מין
המנגנון המרכזי של ספירת סוג הוא פשוט: הוא נחשב כמה פעמים כל ערך מופיע במערך קלט, ואז משתמש ספירה כדי למקם את המיקום הסופי של כל אלמנט.
- (ב) ,0) ,Edve: ⁇ 1) יוצר מערך ספירה של גודל k (טווח ערכי קלט), שהוחזר ל- אפס.התחילה באמצעות מערך הקלט והרחבת הספירה לכל ערך.
- (FLT:0) חישובים:FLT:1 Transform the Count index into a prefix sum, שבו כל אלמנט באינדקס אני מחזיק את הספירה המצטברת של אלמנטים פחות או שווה ל- i. שלב זה קובע את עמדות ההתחלה לכל ערך ייחודי בפלט המתואם.
- (ב) ⁇ :0 (ה) ⁇ :0) ,(FLT:1) , הפוך את מערך הקלט מימין לשמאל (ליציבות), השתמש במערך הספירה כדי למצוא את המדד הנכון במערך הפלט, להציב את האלמנט שם, ולהשמיד את הספירה.
האלגוריתם מחזיר מערך חדש, מה שהשאיר את המקורי ללא שינוי. A וגרסה בשם "FLT:0in-place Counting" (בקיצור: 0in-place CountingמייןFLT:1), קיים אך רק לעתים רחוקות הוא משמש כי הוא פוגע ביציבות או ביעילות חלל.
שלב-בי-Step
⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇
- (FLT:0) ,00:Esver 1 (המספר 9 (0–8) [0,1,2,1,0,0,0,0,0,0,1] (Index 1 מופיע פעם, index 2, 3 פעמיים, index 4 פעם אחת, אינדקס 8 פעם אחת).
- (ב) ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇
- (FLT:0Output: Fig:FLT:1 ; איור מקורי של Traverse מקצה: הראשון לקרוא הוא 1 ⁇ = ספירה[1] 1=0) תפוקה [=1, decrement ספירה[1] ל-0.Next הוא 3 , נצ'ה=1=4 תפוקה[4]=3=3===4.המשך עד כל האלמנטים שהונחו.
דוגמה זו מראה כיצד ספירת מין להימנע מהשוואה לחלוטין, תוך התבססות רק על פעולות סיבולת.
מורכבות
זמן מורכב
- (FLT:0) הטוב ביותר, הממוצע והגרוע ביותר: LT:1 (n + k), שבו n הוא מספר המרכיבים ו k הוא טווח ערכי קלט.כאשר k הוא קטן יחסית ל- n, האלגוריתם פועל בזמן ליניארי.
- (FLT:0)Comparison toהשוואה בין סוגים:FLT:1 Quicksort ו- Mergesort יש מורכבות ממוצעת של O(n log n) עבור n=106 ו k= 1000, Countingמיין ( ⁇ 1,00 פעולות) הוא בערך 13 פעמים מהר יותר מאשר יומן טיפוסי O(n) n.
מורכבות חלל
- (ב) למערך הספירה, בתוספת O(n) למערך הפלט.
- (ב) ,0) ,Stable version: FLT:1 דורש מערך תפוקה עזר של גודל n; ב-מיקומים גרסאות להקריב יציבות או להשתמש במניפולציה מורכבת של אינדקס.
מתי להשתמש Counting
ספירת המיון יעילה ביותר בתנאים הבאים:
- הקלט מורכב מ- integers (או נתונים שניתן למפות למגוון קטן של Integer, כגון דמויות או קטגוריות דיסקרטיות).
- טווח k אינו גדול משמעותית מ- n. כלל אצבע נפוץ הוא k ⁇ O(n).
- הזיכרון אינו מוגבל בחומרה, כי מערך הספירה והפלט דורש שטח נוסף.
- יציבות נדרשת (למשל, מיון של מספר מפתחות) יישום סטנדרטי יציב כאשר אלמנטים ממוקמים מימין לשמאל.
מקרים של שימוש טוב כוללים ציון (0 עד 100), גילים (0 עד20), קטגוריות מוצר (עד כמה מאות SKUs), או כ subroutine in FLT:0Radix ממייןFLT:1.
הגבלות ושיקולים
למרות המהירות, ספירת מין יש חסרונות המגדירים את אמינותה:
- (ב) ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇
- (ב) אורכו של [[המאה ה-1]]: [[1924]], אם ה[[1924]]]], למשל, 100 מספרים בעלי ערכים בין 1 ל-107 – מערך הספירה צור זיכרון עצום תוך מיון מספר אלמנטים בלבד.
- (ב) ,0) לא-אדפטי: סעיף 1 של 1FLT תמיד דורש סריקה של כל הקלט ובניית מערך הספירה, גם אם הנתונים כבר מכוונים או כמעט מדומים.
- (הערכים השליליים:0) ערכים: FLT:1 רגיל ספירת סוג לוקח לא שליליים.
מגבלות אלה משמעות ספירת מין היא כלי מיוחד, לא תחליף אוניברסלי לאלגוריתמים למטרות כלליות.
השוואה עם מינוף קשורים
Counting Medium vs. Radix
Radix מאריך את הרעיון על ידי מיון ספרות לפחות משמעותי ביותר, באמצעות סוג יציב (לעתים קרובות ספירת סוג) בכל ספריה. בעוד ספירת סוג פועל על מעבר אחד בטווח המלא k, Radix מבצע מספר עובר על טווח ספרות קטן יותר (למשל, בסיס 256), צמצום השימוש בזיכרון עבור k גדול, כלומר 32 סיביות ב Counts עם ספירת מונים דורש ספירה של 8 232x, בעוד שצריכה רק ערכים של 4 232x.
ספירת מין לעומת Bucketמיין
Bucket מפיץ אלמנטים לתוך מספר דליים וסוגים כל דלי בנפרד (לעתים קרובות עם סוג של החדרה) ספירה סוג של סוג מסוים ניתן לראות כמקרה מיוחד של Bucket, שבו כל דלי מתאים לערך ייחודי יחיד. Bucket עובד היטב על נתונים צף אחיד, אבל ספירה של מון הוא מוגבל לתחומים integers.
יישום סוג של ספירה Stable Counting
יציבות היא חשובה כאשר ממיין מפתח אחד תוך שמירה על הסדר היחסי של אלמנטים שווים ממפתח אחר.אלגוריתם רגיל ספירה סוג הוא יציב מטבעו כאשר לולאת מיקום הפלט חוצה את הקלט מימין לשמאל.כאן הוא מתווה טקסטואלי של הגירסה היציבה:
- מערך ספירה בולט כפי שתואר.
- המרת סכומים מראש (התראות של כל ערך בפלט המתואם).
- לזרז את מערך הקלט בסדר הפוך.עבור כל אלמנט, להציב אותו במיקום שצוין על ידי ספירת שלו, ולאחר מכן לפענוח ספירה.
מכיוון שאנו מעבדים אלמנטים מן הסוף, האירוע האחרון של ערך נתון נכנס לאינדקס הגבוה ביותר האפשרי, שמירה על הסדר היחסי.גרסה יציבה זו חיונית עבור רדקס מיון לתפקד כראוי על כל ספריה.
יישומים מעשיים
- (ב) ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇
- (ב) ויקרא י"א: ויקרא י"א (ב) ויקרא ויקרא כ"ד) או תדרי DNA k-mer כאשר גודל האלפבית קטן (A, C, G, T).
- (ב) ⁇ :0) תחזוקת אינדקס נתונים: 1FLT 1 ממיין מזהה ייחודי באטרונים בטווח קטן מספיק כדי להתאים לזיכרון.
- (ב) עיבוד תמונה:0) עיבוד תמונה: FigFLT:1 (ממיין את היסטמוגרפיה או את עוצמת הצבע (0–255) כאשר בניית שולחנות מבט.
- (FLT:0) ,הופנה על ידי מפתח משני:FLT:1 בשימוש בתוך רדינקס מון, שהוא סוס העבודה עבור מיון יעיל בספריות ובשפות רבות (למשל, .NET פועל זמן תוך שימוש בתערובת הסתגלות של אלגוריתמים כולל ספירת סוג למגוון קטן).
(ב) יותר על התיאוריה והגרסאות, מומלץ להתייעץ עם אזכורים סמכותיים כגון:0Wikipedia: Counting sortsFLT:1 ו-FLT:2GeeksforGeeks: Counting sortFLT 3: 3 מעשי השוואה עם אלגוריתמים אחרים ניתן למצוא במאמר מסובייקט:5brilliant's Counting:55
אופטימיזציה של Counting Light for Large Ranges
כאשר k גדול אבל n הוא גם גדול, ספירה טהורה הופכת לזיכרון-אינסטנסיבי.יש כמה אופטימיזציה קיימים:
- (FLT:0) דיכוי של ספורדות: FLT:1 השתמש במפה של hash במקום מערך מתפתל כאשר טווח הערכים המשמשים הוא גדול, אך מספר הערכים השונים הוא קטן.
- (ב) [13] גישות:0)Hybrid:FLT:1reaשלב סוג עם אלגוריתמים אחרים.לדוגמה, אם הטווח עולה על 106, השתמש ברדקס עם בסיס שמחזיק את הספרות נע קטן.
- (FLT:0) ב-place גרסאות: FLT:1, כמה אופטימיזציה להפחית את החלל הנוסף ל- O(k) ללא מערך פלט, אך הם בדרך כלל מקריבים יציבות או דורשים מחזורים לאתר עמדות.
מסקנה
ספירה של מינוס היא אלגוריתם יעיל להפליא עבור מיון integers כאשר טווח הערך הוא קטן יחסית למספר אלמנטים.ה O(n + k) מורכבות זמן וביצועים ליניאריים לעשות את זה הכרחי בתרחישים כגון ציון 3, Radix מסובלרנס, ויישומים עם מפתחות קונסולה מוגבלת.