@feng3d/data-structures-and-algorithms v0.1.0
جافا سكريبت خوارزميات وهياكل البيانات
تحتوي هذا مقالة على أمثلة عديدة تستند إلى الخوارزميات الشائعة وهياكل البيانات في الجافا سكريبت.
كل خوارزمية وهياكل البيانات لها برنامج README منفصل خاص بها مع التفسيرات والروابط ذات الصلة لمزيد من القراءة (بما في ذلك تلك إلى مقاطع فيديو YouTube).
اقرأ هذا في لغات أخرى: 简体中文, 繁體中文, 한국어, 日本語, Polski, Français, Español, Português, Русский, Türk, Italiana, Tiếng Việt, Deutsch
☝ ملاحضة هذا المشروع مخصص للاستخدام لأغراض التعلم والبحث فقط ، و ليست معدة للاستخدام في الإنتاج
هياكل البيانات
هياكل البيانات هي طريقة خاصة لتنظيم البيانات وتخزينها في جهاز الكمبيوتر بحيث يمكن الوصول إليها وتعديلها بكفاءة. بتعبير أدق ، هيكل البيانات هو مجموعة من البيانات القيم والعلاقات فيما بينها والوظائف أو العمليات التي يمكن تطبيقها عليها البيانات.
B - مبتدئ, A - المتقدمة
Bقائمة مرتبطةBقائمة مرتبطة بشكل مضاعفBطابور, QueueBكومةBجدول التجزئةBكومة -الحد الأقصى والحد الأدنى من إصدارات الكومةBطابور الأولويةAتريAشجرةAشجرة البحث الثنائيةAشجرة AVLAشجرة الأحمر والأسودAشجرة القطعة - مع أمثلة على استفسارات النطاق الأدنى / الأقصى / المجموعAشجرة فينويك (شجرة ثنائية مفهرسة)
AGraph (كلاهما موجه وغير موجه)Aمجموعة منفصلةAمرشح بلوم
الخوارزميات
الخوارزمية هي تحديد لا لبس فيه لكيفية حل فئة من المشاكل. أنه مجموعة من القواعد التي تحدد بدقة تسلسل العمليات.
B - مبتدئ ، A - متقدم
الخوارزميات حسب الموضوع
- رياضيات
Bمعالجة البتBعامليBرقم فيبوناتشي - الإصدارات الكلاسيكية والمغلقةBاختبار البدائية (طريقة تقسيم المحاكمة)Bالخوارزمية الإقليدية - احسب القاسم المشترك الأكبر (GCD)Bأقل مضاعف مشترك (LCM)Bمنخل إراتوستينس - إيجاد جميع الأعداد الأولية حتى أي حد معينBهي قوة اثنين - تحقق مما إذا كان الرقم هو قوة اثنين (الخوارزميات الساذجة والبتية)Bمثلث باسكالBعدد مركب - الأعداد المركبة والعمليات الأساسية معهمBراديان ودرجة - راديان لدرجة التحويل والعكسBتشغيل سريعBطريقة هورنر - تقييم متعدد الحدودAقسم صحيحAالجذر التربيعي - طريقة نيوتنAخوارزمية ليو هوي π - π حسابات تقريبية على أساس N-gonsAتحويل فورييه المنفصل - حلل وظيفة الوقت (إشارة) في الترددات التي يتكون منها
- مجموعات
Bالمنتج الديكارتي - منتج من مجموعات متعددةBفيشر ييتس شافل - التقليب العشوائي لتسلسل محدودAمجموعة الطاقة - جميع المجموعات الفرعية للمجموعة (حلول البت والتتبع التراجعي)Aالتباديل (مع وبدون التكرار)Aمجموعات (مع وبدون التكرار)Aأطول نتيجة مشتركة (LCS)Aأطول زيادة متتاليةAأقصر تسلسل فائق مشترك (SCS)Aمشكلة حقيبة الظهر - "0/1" و "غير منضم"Aالحد الأقصى من Subarray -إصدارات "القوة الغاشمة" و "البرمجة الديناميكية" (كادان)Aمجموع الجمع - ابحث عن جميع التركيبات التي تشكل مبلغًا محددًا
- سلاسل
Bمسافة هامنج - عدد المواقف التي تختلف فيها الرموزAالمسافة ليفنشتاين - الحد الأدنى لمسافة التحرير بين تسلسلينAخوارزمية كنوث - موريس - برات (خوارزمية KMP) - بحث السلسلة الفرعية (مطابقة النمط)Aخوارزمية Z - بحث سلسلة فرعية (مطابقة النمط)Aخوارزمية رابين كارب - بحث السلسلة الفرعيةAأطول سلسلة فرعية مشتركةAمطابقة التعبير العادي
عمليات البحث
Bالبحث الخطيBبحث سريع (أو حظر البحث) - ابحث في مصفوفة مرتبةBبحث ثنائي - البحث في مجموعة مرتبةBبحث الاستيفاء - البحث في مجموعة مرتبة موزعة بشكل موحد
فرز
BBubble SortBSelection SortBInsertion SortBHeap SortBMerge SortBQuicksort - عمليات التنفيذ في المكان وغير في المكانBShellsortBCounting SortBRadix Sort
- القوائم المرتبطة
- الأشجار
BDepth-First Search (DFS)BBreadth-First Search (BFS)
- الرسوم البيانية
BDepth-First Search (DFS)BBreadth-First Search (BFS)BKruskal’s Algorithm - إيجاد الحد الأدنى من شجرة الامتداد (MST) للرسم البياني الموزون غير الموجهADijkstra Algorithm -إيجاد أقصر المسارات لجميع رؤوس الرسم البياني من رأس واحدABellman-Ford Algorithm - إيجاد أقصر المسارات لجميع رؤوس الرسم البياني من رأس واحدAFloyd-Warshall Algorithm - إيجاد أقصر المسارات بين جميع أزواج الرؤوسADetect Cycle - لكل من الرسوم البيانية الموجهة وغير الموجهة (الإصدارات القائمة على DFS و Disjoint Set)APrim’s Algorithm - إيجاد الحد الأدنى من شجرة الامتداد (MST) للرسم البياني الموزون غير الموجهATopological Sorting - طريقة البحث العمق الأول (DFS)AArticulation Points - خوارزمية تارجان (تعتمد على DFS)ABridges - خوارزمية تعتمد على DFSAEulerian Path and Eulerian Circuit - خوارزمية فلوري - قم بزيارة كل حافة مرة واحدة بالضبطAHamiltonian Cycle - قم بزيارة كل قمة مرة واحدة بالضبطAStrongly Connected Components - خوارزمية KosarajuATravelling Salesman Problem - أقصر طريق ممكن يزور كل مدينة ويعود إلى المدينة الأصلية
- **التشفير
BPolynomial Hash - المتداول دالة التجزئة على أساس متعدد الحدودBCaesar Cipher - استبدال بسيط للشفرات
- التعلم الالي
BNanoNeuron - 7 وظائف JS بسيطة توضح كيف يمكن للآلات أن تتعلم بالفعل (الانتشار إلى الأمام / الخلف)
- غير مصنف
BTower of HanoiBSquare Matrix Rotation - خوارزمية في المكانBJump Game - التراجع ، البرمجة الديناميكية (من أعلى إلى أسفل + من أسفل إلى أعلى) والأمثلة الجشعةBUnique Paths - التراجع والبرمجة الديناميكية والأمثلة القائمة على مثلث باسكالBRain Terraces - محاصرة مشكلة مياه الأمطار (البرمجة الديناميكية وإصدارات القوة الغاشمة)BRecursive Staircase - احسب عدد الطرق للوصول إلى القمة (4 حلول)AN-Queens ProblemAKnight's Tour
الخوارزميات حسب النموذج
النموذج الحسابي هو طريقة أو نهج عام يكمن وراء تصميم الفصل من الخوارزميات. إنه تجريد أعلى من مفهوم الخوارزمية ، تمامًا مثل الخوارزمية هي تجريد أعلى من برنامج الكمبيوتر.
- القوة الغاشمة - انظر في جميع الاحتمالات وحدد الحل الأفضل
BLinear SearchBRain Terraces - محاصرة مشكلة مياه الأمطارBRecursive Staircase - احسب عدد الطرق للوصول إلى القمةAMaximum SubarrayATravelling Salesman Problem - أقصر طريق ممكن يزور كل مدينة ويعود إلى المدينة الأصليةADiscrete Fourier Transform - حلل وظيفة الوقت (إشارة) في الترددات التي يتكون منها
- جشع - اختر الخيار الأفضل في الوقت الحالي ، دون أي اعتبار للمستقبل
BJump GameAUnbound Knapsack ProblemADijkstra Algorithm - إيجاد أقصر مسار لجميع رؤوس الرسم البيانيAPrim’s Algorithm - إيجاد الحد الأدنى من شجرة الامتداد (MST) للرسم البياني الموزون غير الموجهAKruskal’s Algorithm - إيجاد الحد الأدنى من شجرة الامتداد (MST) للرسم البياني الموزون غير الموجه
- فرق تسد - قسّم المشكلة إلى أجزاء أصغر ثم حل تلك الأجزاء
BBinary SearchBTower of HanoiBPascal's TriangleBEuclidean Algorithm - حساب القاسم المشترك الأكبر (GCD)BMerge SortBQuicksortBTree Depth-First Search (DFS)BGraph Depth-First Search (DFS)BJump GameBFast PoweringAPermutations (مع التكرار وبدونه)ACombinations (مع التكرار وبدونه)
- البرمجة الديناميكية - بناء حل باستخدام الحلول الفرعية التي تم العثور عليها مسبقًا
BFibonacci NumberBJump GameBUnique PathsBRain Terraces - محاصرة مشكلة مياه الأمطارBRecursive Staircase - احسب عدد الطرق للوصول إلى القمةALevenshtein Distance - الحد الأدنى لمسافة التحرير بين تسلسلينALongest Common Subsequence (LCS)ALongest Common SubstringALongest Increasing SubsequenceAShortest Common SupersequenceA0/1 Knapsack ProblemAInteger PartitionAMaximum SubarrayABellman-Ford Algorithm - إيجاد أقصر مسار لجميع رؤوس الرسم البيانيAFloyd-Warshall Algorithm - إيجاد أقصر المسارات بين جميع أزواج الرؤوسARegular Expression Matching
- التراجع - على غرار القوة الغاشمة ، حاول إنشاء جميع الحلول الممكنة ، ولكن في كل مرة تقوم فيها بإنشاء الحل التالي الذي تختبره
إذا استوفت جميع الشروط ، وعندها فقط استمر في إنشاء الحلول اللاحقة. خلاف ذلك ، تراجع ، واذهب إلى
طريق مختلف لإيجاد حل. عادةً ما يتم استخدام اجتياز DFS لمساحة الدولة.
BJump GameBUnique PathsBPower Set - جميع المجموعات الفرعية للمجموعةAHamiltonian Cycle - قم بزيارة كل قمة مرة واحدة بالضبطAN-Queens ProblemAKnight's TourACombination 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