26 KiB
جافا سكريبت خوارزميات وهياكل البيانات
تحتوي هذه المقالة على أمثلة عديدة تستند إلى الخوارزميات الشائعة وهياكل البيانات في الجافا سكريبت.
كل خوارزمية وهياكل البيانات لها برنامج README منفصل خاص بها مع التفسيرات والروابط ذات الصلة لمزيد من القراءة (بما في ذلك تلك إلى مقاطع فيديو YouTube).
اقرأ هذا في لغات أخرى: 简体中文, 繁體中文, 한국어, 日本語, Polski, Français, Español, Português, Русский, Türk, Italiana, Tiếng Việt, Deutsch, Uzbek
☝ ملاحضة هذا المشروع مخصص للاستخدام لأغراض التعلم والبحث فقط ، و ** ليست ** معدة للاستخدام في الإنتاج
هياكل البيانات
هياكل البيانات هي طريقة خاصة لتنظيم البيانات وتخزينها في جهاز الحاسوب بحيث يمكن الوصول إليها وتعديلها بكفاءة بتعبير أدق، هيكل البيانات هو مجموعة من البيانات القيم والعلاقات فيما بينها والوظائف أو العمليات التي يمكن تطبيقها عليها البيانات.
ب
- مبتدئ, ت
- المتقدمة
ب
قائمة مرتبطةب
قائمة مرتبطة بشكل مضاعفب
طابور, Queueب
كومةب
جدول التجزئةب
كومة -الحد الأقصى والحد الأدنى من إصدارات الكومةب
طابور الأولويةت
تريت
شجرةت
شجرة البحث الثنائيةت
شجرة AVLت
شجرة الأحمر والأسودت
شجرة القطعة - مع أمثلة على استفسارات النطاق الأدنى / الأقصى / المجموعت
شجرة فينويك (شجرة ثنائية مفهرسة)
ت
Graph (كلاهما موجه وغير موجه)ت
مجموعة منفصلةت
مرشح بلوم
الخوارزميات
الخوارزمية هي تحديد لا لبس فيه لكيفية حل فئة من المشاكل. أنه مجموعة من القواعد التي تحدد بدقة تسلسل العمليات.
ب
- مبتدئ ، ت
- متقدم
الخوارزميات حسب الموضوع
-
رياضيات
ب
معالجة البتب
عامليب
رقم فيبوناتشي - الإصدارات الكلاسيكية والمغلقةب
اختبار البدائية (طريقة تقسيم المحاكمة)ب
الخوارزمية الإقليدية - احسب القاسم المشترك الأكبر (GCD)ب
أقل مضاعف مشترك (LCM)ب
منخل إراتوستينس - إيجاد جميع الأعداد الأولية حتى أي حد معينب
هي قوة اثنين - تحقق مما إذا كان الرقم هو قوة اثنين (الخوارزميات الساذجة والبتية)ب
مثلث باسكالب
عدد مركب - الأعداد المركبة والعمليات الأساسية معهمب
راديان ودرجة - راديان لدرجة التحويل والعكسب
تشغيل سريعب
طريقة هورنر - تقييم متعدد الحدودت
قسم صحيحت
الجذر التربيعي - طريقة نيوتنت
خوارزمية ليو هوي π - π حسابات تقريبية على أساس N-gonsت
تحويل فورييه المنفصل - حلل وظيفة الوقت (إشارة) في الترددات التي يتكون منها
-
مجموعات
ب
المنتج الديكارتي - منتج من مجموعات متعددةب
فيشر ييتس شافل - التقليب العشوائي لتسلسل محدودت
مجموعة الطاقة - جميع المجموعات الفرعية للمجموعة (حلول البت والتتبع التراجعي)ت
التباديل (مع وبدون التكرار)ت
مجموعات (مع وبدون التكرار)ت
أطول نتيجة مشتركة (LCS)ت
أطول زيادة متتاليةت
أقصر تسلسل فائق مشترك (SCS)ت
مشكلة حقيبة الظهر - "0/1" و "غير منضم"ت
الحد الأقصى من Subarray -إصدارات "القوة الغاشمة" و "البرمجة الديناميكية" (كادان)ت
مجموع الجمع - ابحث عن جميع التركيبات التي تشكل مبلغًا محددًا
-
سلاسل
ب
مسافة هامنج - عدد المواقف التي تختلف فيها الرموزت
المسافة ليفنشتاين - الحد الأدنى لمسافة التحرير بين تسلسلينت
خوارزمية كنوث - موريس - برات (خوارزمية KMP) - بحث السلسلة الفرعية (مطابقة النمط)ت
خوارزمية Z - بحث سلسلة فرعية (مطابقة النمط)ت
خوارزمية رابين كارب - بحث السلسلة الفرعيةت
أطول سلسلة فرعية مشتركةت
مطابقة التعبير العادي
-
عمليات البحث
ب
البحث الخطيب
بحث سريع (أو حظر البحث) - ابحث في مصفوفة مرتبةب
بحث ثنائي - البحث في مجموعة مرتبةب
بحث الاستيفاء - البحث في مجموعة مرتبة موزعة بشكل موحد
-
فرز
ب
Bubble Sortب
Selection Sortب
Insertion Sortب
Heap Sortب
Merge Sortب
Quicksort - عمليات التنفيذ في المكان وغير في المكانب
Shellsortب
Counting Sortب
Radix Sort
-
القوائم المرتبطة
-
الأشجار
ب
Depth-First Search (DFS)ب
Breadth-First Search (BFS)
-
الرسوم البيانية
ب
Depth-First Search (DFS)ب
Breadth-First Search (BFS)ب
Kruskal’s Algorithm - إيجاد الحد الأدنى من شجرة الامتداد (MST) للرسم البياني الموزون غير الموجهت
Dijkstra Algorithm -إيجاد أقصر المسارات لجميع رؤوس الرسم البياني من رأس واحدت
Bellman-Ford Algorithm - إيجاد أقصر المسارات لجميع رؤوس الرسم البياني من رأس واحدت
Floyd-Warshall Algorithm - إيجاد أقصر المسارات بين جميع أزواج الرؤوست
Detect Cycle - لكل من الرسوم البيانية الموجهة وغير الموجهة (الإصدارات القائمة على DFS و Disjoint Set)ت
Prim’s Algorithm - إيجاد الحد الأدنى من شجرة الامتداد (MST) للرسم البياني الموزون غير الموجهت
Topological Sorting - طريقة البحث العمق الأول (DFS)ت
Articulation Points - خوارزمية تارجان (تعتمد على DFS)ت
Bridges - خوارزمية تعتمد على DFSت
Eulerian Path and Eulerian Circuit - خوارزمية فلوري - قم بزيارة كل حافة مرة واحدة بالضبطت
Hamiltonian Cycle - قم بزيارة كل قمة مرة واحدة بالضبطت
Strongly Connected Components - خوارزمية Kosarajuت
Travelling Salesman Problem - أقصر طريق ممكن يزور كل مدينة ويعود إلى المدينة الأصلية
-
**التشفير
ب
Polynomial Hash - المتداول دالة التجزئة على أساس متعدد الحدودب
Caesar Cipher - استبدال بسيط للشفرات
-
التعلم الالي
ب
NanoNeuron - 7 وظائف JS بسيطة توضح كيف يمكن للآلات أن تتعلم بالفعل (الانتشار إلى الأمام / الخلف)
-
غير مصنف
ب
Tower of Hanoiب
Square Matrix Rotation - خوارزمية في المكانب
Jump Game - التراجع ، البرمجة الديناميكية (من أعلى إلى أسفل + من أسفل إلى أعلى) والأمثلة الجشعةب
Unique Paths - التراجع والبرمجة الديناميكية والأمثلة القائمة على مثلث باسكالب
Rain Terraces - محاصرة مشكلة مياه الأمطار (البرمجة الديناميكية وإصدارات القوة الغاشمة)ب
Recursive Staircase - احسب عدد الطرق للوصول إلى القمة (4 حلول)ت
N-Queens Problemت
Knight's Tour
الخوارزميات حسب النموذج
النموذج الحسابي هو طريقة أو نهج عام يكمن وراء تصميم الفصل من الخوارزميات. إنه تجريد أعلى من مفهوم الخوارزمية ، تمامًا مثل الخوارزمية هي تجريد أعلى من برنامج الكمبيوتر.
-
القوة الغاشمة - انظر في جميع الاحتمالات وحدد الحل الأفضل
ب
Linear Searchب
Rain Terraces - محاصرة مشكلة مياه الأمطارب
Recursive Staircase - احسب عدد الطرق للوصول إلى القمةت
Maximum Subarrayت
Travelling Salesman Problem - أقصر طريق ممكن يزور كل مدينة ويعود إلى المدينة الأصليةت
Discrete Fourier Transform - حلل وظيفة الوقت (إشارة) في الترددات التي يتكون منها
-
جشع - اختر الخيار الأفضل في الوقت الحالي ، دون أي اعتبار للمستقبل
ب
Jump Gameت
Unbound Knapsack Problemت
Dijkstra Algorithm - إيجاد أقصر مسار لجميع رؤوس الرسم البيانيت
Prim’s Algorithm - إيجاد الحد الأدنى من شجرة الامتداد (MST) للرسم البياني الموزون غير الموجهت
Kruskal’s Algorithm - إيجاد الحد الأدنى من شجرة الامتداد (MST) للرسم البياني الموزون غير الموجه
-
فرق تسد - قسّم المشكلة إلى أجزاء أصغر ثم حل تلك الأجزاء
ب
Binary Searchب
Tower of Hanoiب
Pascal's Triangleب
Euclidean Algorithm - حساب القاسم المشترك الأكبر (GCD)ب
Merge Sortب
Quicksortب
Tree Depth-First Search (DFS)ب
Graph Depth-First Search (DFS)ب
Jump Gameب
Fast Poweringت
Permutations (مع التكرار وبدونه)ت
Combinations (مع التكرار وبدونه)
-
البرمجة الديناميكية - بناء حل باستخدام الحلول الفرعية التي تم العثور عليها مسبقًا
ب
Fibonacci Numberب
Jump Gameب
Unique Pathsب
Rain Terraces - محاصرة مشكلة مياه الأمطارب
Recursive Staircase - احسب عدد الطرق للوصول إلى القمةت
Levenshtein Distance - الحد الأدنى لمسافة التحرير بين تسلسلينت
Longest Common Subsequence (LCS)ت
Longest Common Substringت
Longest Increasing Subsequenceت
Shortest Common Supersequenceت
0/1 Knapsack Problemت
Integer Partitionت
Maximum Subarrayت
Bellman-Ford Algorithm - إيجاد أقصر مسار لجميع رؤوس الرسم البيانيت
Floyd-Warshall Algorithm - إيجاد أقصر المسارات بين جميع أزواج الرؤوست
Regular Expression Matching
-
التراجع - على غرار القوة الغاشمة ، حاول إنشاء جميع الحلول الممكنة ، ولكن في كل مرة تقوم فيها بإنشاء الحل التالي الذي تختبره إذا استوفت جميع الشروط ، وعندها فقط استمر في إنشاء الحلول اللاحقة. خلاف ذلك ، تراجع ، واذهب إلى طريق مختلف لإيجاد حل. عادةً ما يتم استخدام اجتياز DFS لمساحة الدولة.
ب
Jump Gameب
Unique Pathsب
Power Set - جميع المجموعات الفرعية للمجموعةت
Hamiltonian Cycle - قم بزيارة كل قمة مرة واحدة بالضبطت
N-Queens Problemت
Knight's Tourت
Combination Sum - ابحث عن جميع التركيبات التي تشكل مبلغًا محددًا
-
** Branch & Bound ** - تذكر الحل الأقل تكلفة الموجود في كل مرحلة من مراحل التراجع البحث ، واستخدام تكلفة الحل الأقل تكلفة الموجود حتى الآن بحد أدنى لتكلفة الحل الأقل تكلفة للمشكلة ، من أجل تجاهل الحلول الجزئية بتكاليف أكبر من تم العثور على حل بأقل تكلفة حتى الآن. اجتياز BFS عادةً بالاشتراك مع اجتياز DFS لمساحة الحالة يتم استخدام الشجرة.
كيفية استخدام هذا المستودع
تثبيت كل التبعيات
npm install
قم بتشغيل ESLint
قد ترغب في تشغيله للتحقق من جودة الكود.
npm run lint
قم بإجراء جميع الاختبارات
npm test
قم بإجراء الاختبارات بالاسم
npm test -- 'LinkedList'
ملعب
يمكنك اللعب بهياكل البيانات والخوارزميات في ملف . /src/playground/playground.js
والكتابة
اختبارات لها في ./src/playground/__test__/playground.test.js
.
ثم قم ببساطة بتشغيل الأمر التالي لاختبار ما إذا كان كود الملعب الخاص بك يعمل كما هو متوقع:
npm test -- 'playground'
معلومات مفيدة
المراجع
▶ هياكل البيانات والخوارزميات على موقع يوتيوب
Big O Notation
- يتم استخدام Big O notation لتصنيف الخوارزميات وفقًا لكيفية نمو متطلبات وقت التشغيل أو المساحة مع نمو حجم الإدخال. قد تجد في الرسم البياني أدناه الأوامر الأكثر شيوعًا لنمو الخوارزميات المحددة في تBig O notation.
مصدر: Big O Cheat Sheet.
فيما يلي قائمة ببعض رموز Big O notation الأكثر استخدامًا ومقارنات أدائها مقابل أحجام مختلفة من بيانات الإدخال.
Big O Notation | Computations for 10 elements | Computations for 100 elements | Computations for 1000 elements |
---|---|---|---|
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 |
تعقيد عمليات بنية البيانات
Data Structure | Access | Search | Insertion | Deletion | Comments |
---|---|---|---|---|---|
Array | 1 | n | n | n | |
Stack | n | n | 1 | 1 | |
Queue | n | n | 1 | 1 | |
Linked List | n | n | 1 | n | |
Hash Table | - | n | n | n | في حالة وجود تكاليف دالة تجزئة مثالية ستكون O (1) |
Binary Search Tree | n | n | n | n | في حالة توازن تكاليف الشجرة ستكون O (log (n)) |
B-Tree | log(n) | log(n) | log(n) | log(n) | |
Red-Black Tree | log(n) | log(n) | log(n) | log(n) | |
AVL Tree | log(n) | log(n) | log(n) | log(n) | |
Bloom Filter | - | 1 | 1 | - | الإيجابيات الكاذبة ممكنة أثناء البحث |
تعقيد خوارزميات فرز الصفيف
Name | Best | Average | Worst | Memory | Stable | Comments |
---|---|---|---|---|---|---|
Bubble sort | n | n2 | n2 | 1 | نعم | |
Insertion sort | n | n2 | n2 | 1 | نعم | |
Selection sort | n2 | n2 | n2 | 1 | لا | |
Heap sort | n log(n) | n log(n) | n log(n) | 1 | لا | |
Merge sort | n log(n) | n log(n) | n log(n) | n | نعم | |
Quick sort | n log(n) | n log(n) | n2 | log(n) | No | عادةً ما يتم إجراء الفرز السريع في مكانه مع مساحة مكدس O (log (n)) |
Shell sort | n log(n) | depends on gap sequence | n (log(n))2 | 1 | لا | |
Counting sort | n + r | n + r | n + r | n + r | Yes | r - أكبر رقم في المجموعة |
Radix sort | n * k | n * k | n * k | n + k | Yes | ك - طول أطول مفتاح |
دعم المشروع
الناس الذين يدعمون هذا المشروع ∑ = 0
ℹ️ A few more projects and articles about JavaScript and algorithms on trekhleb.dev