29 KiB
אלגוריתמים ומבני נתונים ב-JavaScript
מאגר זה מכיל דוגמאות מבוססות JavaScript של אלגוריתמים ומבני נתונים פופולריים רבים.
לכל אלגוריתם ומבנה נתונים יש README משלו עם הסברים קשורים וקישורים לקריאה נוספת (כולל קישורים לסרטוני YouTube).
קרא זאת בשפות אחרות: 简体中文, 繁體中文, 한국어, 日本語, Polski, Français, Español, Português, Русский, Türkçe, Italiana, Bahasa Indonesia, Українська, Arabic, Tiếng Việt, Deutsch, Uzbek
מבני נתונים
מבנה נתונים הוא דרך מסוימת לארגן ולאחסן נתונים במחשב כך שניתן לגשת אליהם ולשנות אותם ביעילות. ליתר דיוק, מבנה נתונים הוא אוסף של ערכי נתונים, היחסים ביניהם, והפונקציות או הפעולות שניתן ליישם על הנתונים.
זכור שלכל מבנה נתונים יש את היתרונות והחסרונות שלו. חשוב לשים לב יותר לסיבה שבגללה אתה בוחר מבנה נתונים מסוים מאשר לאופן היישום שלו.
B - מתחיל, A - מתקדם
Bרשימה מקושרתBרשימה מקושרת כפולהBתורBמחסניתBטבלת גיבובBערימה - גרסאות מקסימום ומינימוםBתור עדיפויותAעץ תחיליותAעץAעץ חיפוש בינאריAעץ AVLAעץ אדום-שחורAעץ מקטעים - עם דוגמאות לשאילתות מינימום/מקסימום/סכום של טווחAעץ פנוויק (עץ בינארי מאונדקס)
Aגרף (מכוון ולא מכוון)Aקבוצה מופרדת - מבנה נתונים של איחוד-מציאה או מיזוג-מציאהAמסנן בלוםAמטמון LRU - מטמון פחות שימוש לאחרונה (LRU)
אלגוריתמים
אלגוריתם הוא מפרט חד משמעי כיצד לפתור סוג של בעיות. זוהי קבוצה של כללים המגדירים במדויק רצף של פעולות.
B - מתחיל, A - מתקדם
אלגוריתמים לפי נושא
-
מתמטיקה
Bמניפולציה על ביטים - קביעה/עדכון/ניקוי ביטים, הכפלה/חילוק ב-2, הפיכה לשלילי וכו'Bנקודה צפה בינארית - ייצוג בינארי של מספרים בנקודה צפהBפקטוריאלBמספר פיבונאצ'י - גרסאות קלאסיות וסגורותBגורמים ראשוניים - מציאת גורמים ראשוניים וספירתם באמצעות משפט הארדי-רמנוג'אןBבדיקת ראשוניות (שיטת החלוקה הניסיונית)Bאלגוריתם אוקלידס - חישוב המחלק המשותף הגדול ביותר (GCD)Bהמכפיל המשותף הקטן ביותר (LCM)Bנפה של ארטוסתנס - מציאת כל המספרים הראשוניים עד לגבול כלשהוBהאם חזקה של שתיים - בדיקה אם מספר הוא חזקה של שתיים (אלגוריתמים נאיביים וביטיים)Bמשולש פסקלBמספר מרוכב - מספרים מרוכבים ופעולות בסיסיות עליהםBרדיאן ומעלות - המרה מרדיאנים למעלות ובחזרהBחזקה מהירהBשיטת הורנר - הערכת פולינוםBמטריצות - מטריצות ופעולות בסיסיות על מטריצות (כפל, טרנספוזיציה וכו')Bמרחק אוקלידי - מרחק בין שתי נקודות/וקטורים/מטריצותAחלוקת מספר שלםAשורש ריבועי - שיטת ניוטוןAאלגוריתם π של ליו הוי - חישובי π מקורבים על בסיס N-גוניםAהתמרת פורייה הבדידה - פירוק פונקציה של זמן (אות) לתדרים המרכיבים אותה
-
קבוצות
Bמכפלה קרטזית - מכפלה של מספר קבוצותBערבוב פישר-ייטס - תמורה אקראית של רצף סופיAקבוצת חזקה - כל תתי הקבוצות של קבוצה (פתרונות ביטיים, מעקב לאחור וקסקדה)Aתמורות (עם ובלי חזרות)Aצירופים (עם ובלי חזרות)Aתת-רצף משותף ארוך ביותר (LCS)Aתת-רצף עולה ארוך ביותרAעל-רצף משותף קצר ביותר (SCS)Aבעיית התרמיל - "0/1" ו"לא מוגבל"Aתת-מערך מקסימלי - "כוח ברוטלי" ו"תכנות דינמי" (Kadane) גרסאותAסכום צירוף - מציאת כל הצירופים שיוצרים סכום ספציפי
-
מחרוזות
Bמרחק המינג - מספר העמדות שבהן הסמלים שוניםBפלינדרום - בדיקה אם המחרוזת זהה בקריאה לאחורAמרחק לוונשטיין - מרחק העריכה המינימלי בין שתי רצפיםAאלגוריתם קנות'-מוריס-פראט (אלגוריתם KMP) - חיפוש תת-מחרוזת (התאמת תבנית)Aאלגוריתם Z - חיפוש תת-מחרוזת (התאמת תבנית)Aאלגוריתם רבין קארפ - חיפוש תת-מחרוזתAתת-מחרוזת משותפת ארוכה ביותרAהתאמת ביטוי רגולרי
-
חיפושים
Bחיפוש לינאריBחיפוש קפיצות (או חיפוש בלוקים) - חיפוש במערך ממויןBחיפוש בינארי - חיפוש במערך ממויןBחיפוש אינטרפולציה - חיפוש במערך ממוין עם התפלגות אחידה
-
מיון
Bמיון בועותBמיון בחירהBמיון הכנסהBמיון ערימהBמיון מיזוגBמיון מהיר - יישומים במקום ולא במקוםBמיון צדפותBמיון ספירהBמיון בסיסBמיון דלי
-
רשימות מקושרות
-
עצים
Bחיפוש לעומק (DFS)Bחיפוש לרוחב (BFS)
-
גרפים
Bחיפוש לעומק (DFS)Bחיפוש לרוחב (BFS)Bאלגוריתם קרוסקל - מציאת עץ פורש מינימלי (MST) עבור גרף לא מכוון משוקללAאלגוריתם דייקסטרה - מציאת המסלולים הקצרים ביותר לכל קודקודי הגרף מקודקוד יחידAאלגוריתם בלמן-פורד - מציאת המסלולים הקצרים ביותר לכל קודקודי הגרף מקודקוד יחידAאלגוריתם פלויד-וורשל - מציאת המסלולים הקצרים ביותר בין כל זוגות הקודקודיםAזיהוי מעגל - עבור גרפים מכוונים ולא מכוונים (גרסאות מבוססות DFS וקבוצה מופרדת)Aאלגוריתם פרים - מציאת עץ פורש מינימלי (MST) עבור גרף לא מכוון משוקללAמיון טופולוגי - שיטת DFSAנקודות חיתוך - אלגוריתם טרג'ן (מבוסס DFS)Aגשרים - אלגוריתם מבוסס DFSAמסלול ומעגל אוילר - אלגוריתם פלרי - ביקור בכל קשת בדיוק פעם אחתAמעגל המילטון - ביקור בכל קודקוד בדיוק פעם אחתAרכיבים קשירים חזק - אלגוריתם קוסרג'וAבעיית הסוכן הנוסע - המסלול הקצר ביותר האפשרי שמבקר בכל עיר וחוזר לעיר המוצא
-
הצפנה
Bגיבוב פולינומי - פונקציית גיבוב מתגלגלת המבוססת על פולינוםBצופן גדר מסילה - אלגוריתם הצפנת טרנספוזיציה להצפנת הודעותBצופן קיסר - צופן החלפה פשוטBצופן היל - צופן החלפה המבוסס על אלגברה לינארית
-
למידת מכונה
BNanoNeuron - 7 פונקציות JS פשוטות שמדגימות כיצד מכונות יכולות ללמוד באמת (תפוצה קדימה/אחורה)Bk-NN - אלגוריתם סיווג k-השכנים הקרובים ביותרBk-Means - אלגוריתם אשכול k-Means
-
עיבוד תמונה
BSeam Carving - אלגוריתם שינוי גודל תמונה מודע תוכן
-
סטטיסטיקה
Bמשקל אקראי - בחירת פריט אקראי מהרשימה על בסיס משקלי הפריטים
-
אלגוריתמים אבולוציוניים
Aאלגוריתם גנטי - דוגמה לאופן שבו ניתן ליישם אלגוריתם גנטי לאימון מכוניות בחניה עצמית
-
לא מסווג
Bמגדלי האנויBסיבוב מטריצה ריבועית - אלגוריתם במקוםBמשחק הקפיצות - דוגמאות למעקב לאחור, תכנות דינמי (מלמעלה למטה + מלמטה למעלה) וחמדניBמסלולים ייחודיים - דוגמאות למעקב לאחור, תכנות דינמי ומבוססות על משולש פסקלBמדרגות גשם - בעיית לכידת מי גשם (גרסאות תכנות דינמי וכוח ברוטלי)Bמדרגות רקורסיביות - ספירת מספר הדרכים להגיע לראש (4 פתרונות)Bהזמן הטוב ביותר לקנות ולמכור מניות - דוגמאות לחלוקה וכיבוש ומעבר אחדAבעיית N-המלכותAסיור הפרש
אלגוריתמים לפי פרדיגמה
פרדיגמה אלגוריתמית היא שיטה או גישה כללית המונחת בבסיס התכנון של מחלקת אלגוריתמים. זוהי הפשטה גבוהה יותר מהמושג של אלגוריתם, בדיוק כפי שאלגוריתם הוא הפשטה גבוהה יותר מתוכנית מחשב.
-
כוח ברוטלי - בודק את כל האפשרויות ובוחר את הפתרון הטוב ביותר
Bחיפוש לינאריBמדרגות גשם - בעיית לכידת מי גשםBמדרגות רקורסיביות - ספירת מספר הדרכים להגיע לראשAתת-מערך מקסימליAבעיית הסוכן הנוסע - המסלול הקצר ביותר האפשרי שמבקר בכל עיר וחוזר לעיר המוצאAהתמרת פורייה הבדידה - פירוק פונקציה של זמן (אות) לתדרים המרכיבים אותה
-
חמדני - בוחר את האפשרות הטובה ביותר בזמן הנוכחי, ללא כל התחשבות בעתיד
Bמשחק הקפיצותAבעיית התרמיל הלא מוגבלAאלגוריתם דייקסטרה - מציאת המסלולים הקצרים ביותר לכל קודקודי הגרףAאלגוריתם פרים - מציאת עץ פורש מינימלי (MST) עבור גרף לא מכוון משוקללAאלגוריתם קרוסקל - מציאת עץ פורש מינימלי (MST) עבור גרף לא מכוון משוקלל
-
חלוקה וכיבוש - מחלק את הבעיה לחלקים קטנים יותר ואז פותר חלקים אלה
Bחיפוש בינאריBמגדלי האנויBמשולש פסקלBאלגוריתם אוקלידס - חישוב המחלק המשותף הגדול ביותר (GCD)Bמיון מיזוגBמיון מהירBחיפוש לעומק בעץ (DFS)Bחיפוש לעומק בגרף (DFS)Bמטריצות - יצירה ומעבר על מטריצות בצורות שונותBמשחק הקפיצותBחזקה מהירהBהזמן הטוב ביותר לקנות ולמכור מניות - דוגמאות לחלוקה וכיבוש ומעבר אחדAתמורות (עם ובלי חזרות)Aצירופים (עם ובלי חזרות)Aתת-מערך מקסימלי
-
תכנות דינמי - בניית פתרון באמצעות תת-פתרונות שנמצאו קודם לכן
Bמספר פיבונאצ'יBמשחק הקפיצותBמסלולים ייחודייםBמדרגות גשם - בעיית לכידת מי גשםBמדרגות רקורסיביות - ספירת מספר הדרכים להגיע לראשBSeam Carving - אלגוריתם שינוי גודל תמונה מודע תוכןAמרחק לוונשטיין - מרחק העריכה המינימלי בין שתי רצפיםAתת-רצף משותף ארוך ביותר (LCS)Aתת-מחרוזת משותפת ארוכה ביותרAתת-רצף עולה ארוך ביותרAעל-רצף משותף קצר ביותרAבעיית התרמיל 0/1Aחלוקת מספר שלםAתת-מערך מקסימליAאלגוריתם בלמן-פורד - מציאת המסלולים הקצרים ביותר לכל קודקודי הגרףAאלגוריתם פלויד-וורשל - מציאת המסלולים הקצרים ביותר בין כל זוגות הקודקודיםAהתאמת ביטוי רגולרי
-
מעקב לאחור - בדומה לכוח ברוטלי, מנסה לייצר את כל הפתרונות האפשריים, אך בכל פעם שאתה מייצר פתרון הבא אתה בודק אם הוא עומד בכל התנאים, ורק אז ממשיך לייצר פתרונות הבאים. אחרת, חוזר אחורה, והולך בנתיב אחר של מציאת פתרון. בדרך כלל מעבר DFS של מרחב המצבים משמש.
Bמשחק הקפיצותBמסלולים ייחודייםBקבוצת חזקה - כל תתי הקבוצות של קבוצהAמעגל המילטון - ביקור בכל קודקוד בדיוק פעם אחתAבעיית N-המלכותAסיור הפרשAסכום צירוף - מציאת כל הצירופים שיוצרים סכום ספציפי
-
סניף וחסום - זוכר את הפתרון בעלות הנמוכה ביותר שנמצא בכל שלב של החיפוש המעקב לאחור, ומשתמש בעלות של הפתרון בעלות הנמוכה ביותר שנמצא עד כה כגבול תחתון על העלות של פתרון בעלות מינימלית לבעיה, על מנת לפסול פתרונות חלקיים עם עלויות גדולות יותר מהפתרון בעלות הנמוכה ביותר שנמצא עד כה. בדרך כלל מעבר BFS בשילוב עם מעבר DFS של עץ מרחב המצבים משמש.
כיצד להשתמש במאגר זה
התקנת כל התלויות
npm install
הרצת ESLint
ייתכן שתרצה להריץ אותו כדי לבדוק את איכות הקוד.
npm run lint
הרצת כל הבדיקות
npm test
הרצת בדיקות לפי שם
npm test -- 'LinkedList'
פתרון בעיות
אם הלינטינג או הבדיקות נכשלים, נסה למחוק את התיקייה node_modules ולהתקין מחדש את חבילות npm:
rm -rf ./node_modules
npm i
בנוסף, ודא שאתה משתמש בגרסת Node נכונה (>=16). אם אתה משתמש ב-nvm לניהול גרסאות Node, תוכל להריץ nvm use מתיקיית השורש של הפרויקט והגרסה הנכונה תיבחר.
שטח משחקים
אתה יכול לשחק עם מבני נתונים ואלגוריתמים בקובץ ./src/playground/playground.js ולכתוב
בדיקות עבורו ב-./src/playground/__test__/playground.test.js.
לאחר מכן פשוט הרץ את הפקודה הבאה כדי לבדוק אם קוד שטח המשחקים שלך עובד כמצופה:
npm test -- 'playground'
מידע שימושי
הפניות
סימון ה-O הגדול
סימון ה-O הגדול משמש לסיווג אלגוריתמים לפי כיצד זמן הריצה או דרישות המרחב שלהם גדלים ככל שגודל הקלט גדל. בתרשים שלהלן תוכל למצוא את הסדרים הנפוצים ביותר של צמיחת אלגוריתמים המצוינים בסימון ה-O הגדול.
מקור: Big O Cheat Sheet.
להלן רשימה של כמה מסימוני ה-O הגדול הנפוצים ביותר והשוואות הביצועים שלהם מול גדלים שונים של נתוני קלט.
| סימון ה-O הגדול | חישובים ל-10 אלמנטים | חישובים ל-100 אלמנטים | חישובים ל-1000 אלמנטים |
|---|---|---|---|
| O(1) | 1 | 1 | 1 |
| O(log N) | 3 | 6 | 9 |
| O(N) | 10 | 100 | 1000 |
| O(N log N) | 30 | 600 | 9000 |
| O(N^2) | 100 | 10000 | 1000000 |
| O(2^N) | 1024 | 1.26e+29 | 1.07e+301 |
| O(N!) | 3628800 | 9.3e+157 | 4.02e+2567 |
מורכבות פעולות מבני נתונים
| מבנה נתונים | גישה | חיפוש | הכנסה | מחיקה | הערות |
|---|---|---|---|---|---|
| מערך | 1 | n | n | n | |
| מחסנית | n | n | 1 | 1 | |
| תור | n | n | 1 | 1 | |
| רשימה מקושרת | n | n | 1 | n | |
| טבלת גיבוב | - | n | n | n | במקרה של פונקציית גיבוב מושלמת, העלויות יהיו O(1) |
| עץ חיפוש בינארי | n | n | n | n | במקרה של עץ מאוזן, העלויות יהיו O(log(n)) |
| עץ B | log(n) | log(n) | log(n) | log(n) | |
| עץ אדום-שחור | log(n) | log(n) | log(n) | log(n) | |
| עץ AVL | log(n) | log(n) | log(n) | log(n) | |
| מסנן בלום | - | 1 | 1 | - | תוצאות חיוביות שגויות אפשריות בעת חיפוש |
מורכבות אלגוריתמי מיון מערכים
| שם | הטוב ביותר | ממוצע | הגרוע ביותר | זיכרון | יציב | הערות |
|---|---|---|---|---|---|---|
| מיון בועות | n | n2 | n2 | 1 | כן | |
| מיון הכנסה | n | n2 | n2 | 1 | כן | |
| מיון בחירה | n2 | n2 | n2 | 1 | לא | |
| מיון ערימה | n log(n) | n log(n) | n log(n) | 1 | לא | |
| מיון מיזוג | n log(n) | n log(n) | n log(n) | n | כן | |
| מיון מהיר | n log(n) | n log(n) | n2 | log(n) | לא | מיון מהיר בדרך כלל מבוצע במקום עם O(log(n)) שטח מחסנית |
| מיון צדפות | n log(n) | תלוי ברצף הפער | n (log(n))2 | 1 | לא | |
| מיון ספירה | n + r | n + r | n + r | n + r | כן | r - המספר הגדול ביותר במערך |
| מיון בסיס | n * k | n * k | n * k | n + k | כן | k - אורך המפתח הארוך ביותר |
תומכי הפרויקט
אנשים שתומכים בפרויקט זה ∑ = 1
מחבר
כמה פרויקטים ומאמרים נוספים על JavaScript ואלגוריתמים ב-trekhleb.dev* B [משחק הקפיצות](src/algorithms/uncategor * B [חיפוש בינארי](src/algorithms
