מאגר זה מכיל דוגמאות מבוססות 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
צופן היל - צופן החלפה המבוסס על אלגברה לינארית
-
למידת מכונה
B
NanoNeuron - 7 פונקציות JS פשוטות שמדגימות כיצד מכונות יכולות ללמוד באמת (תפוצה קדימה/אחורה)B
k-NN - אלגוריתם סיווג k-השכנים הקרובים ביותרB
k-Means - אלגוריתם אשכול k-Means
-
עיבוד תמונה
B
Seam 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
מדרגות רקורסיביות - ספירת מספר הדרכים להגיע לראשB
Seam 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 הגדול.
מקור: 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