هذه هي تطبيقات الترميز لكتاب DSA.js والمستودع لحزمة NPM.
في هذا المستودع، يمكنك العثور على تنفيذ الخوارزميات وهياكل البيانات في JavaScript. يمكن استخدام هذه المادة كدليل مرجعي للمطورين، أو يمكنك تحديث موضوعات محددة قبل المقابلة. كما يمكنك العثور على أفكار لحل المشكلات بشكل أكثر كفاءة.
يمكنك استنساخ الريبو أو تثبيت الكود من NPM:
npm install dsa.js
وبعد ذلك يمكنك استيراده إلى برامجك أو واجهة سطر الأوامر (CLI).
const { LinkedList , Queue , Stack } = require ( 'dsa.js' ) ;
للحصول على قائمة بجميع هياكل البيانات والخوارزميات المتاحة، راجع ملف Index.js.
الخوارزميات هي مجموعة أدوات أساسية لكل مبرمج.
ستحتاج إلى مراعاة وقت تشغيل الخوارزميات عندما يتعين عليك فرز البيانات، والبحث عن قيمة في مجموعة بيانات كبيرة، وتحويل البيانات، وتوسيع نطاق التعليمات البرمجية الخاصة بك للعديد من المستخدمين، على سبيل المثال لا الحصر. الخوارزميات هي مجرد الخطوة التي تتبعها لحل مشكلة ما، في حين أن هياكل البيانات هي المكان الذي تقوم فيه بتخزين البيانات لمعالجتها لاحقًا. كلاهما يجمع بين إنشاء البرامج.
الخوارزميات + هياكل البيانات = البرامج.
توفر معظم لغات البرمجة والمكتبات بالفعل تطبيقات لهياكل البيانات والخوارزميات الأساسية. ومع ذلك، للاستفادة من هياكل البيانات بشكل صحيح، عليك أن تعرف المفاضلات لاختيار أفضل أداة للمهمة.
ستعلمك هذه المادة ما يلي:
جميع التعليمات البرمجية والشروحات متاحة في هذا الريبو. يمكنك البحث في الروابط وأمثلة التعليمات البرمجية من (مجلد src). ومع ذلك، لم يتم توسيع أمثلة التعليمات البرمجية المضمنة (بسبب قيود Github's asciidoc)، ولكن يمكنك اتباع المسار ورؤية التنفيذ.
ملاحظة: إذا كنت تفضل استهلاك المعلومات بشكل خطي أكثر، فسيكون تنسيق الكتاب أكثر ملاءمة لك.
وتنقسم المواضيع إلى أربع فئات رئيسية، كما ترون أدناه:
شذرات علوم الكمبيوتر دون كل ما هو جامبو. (انقر للتوسيع)
شذرات علوم الكمبيوتر دون كل ما هو جامبو
تعلم كيفية حساب وقت التشغيل من أمثلة التعليمات البرمجية
تعرف على كيفية مقارنة الخوارزميات باستخدام تدوين Big O. (انقر للتوسيع)
تعرف على كيفية مقارنة الخوارزميات باستخدام تدوين Big O.
مقارنة الخوارزميات باستخدام تدوين Big O
لنفترض أنك تريد العثور على التكرارات في مصفوفة. باستخدام تدوين Big O، يمكننا مقارنة الحلول المختلفة التي تحل نفس المشكلة ولكن بها فرق كبير في المدة التي يستغرقها حلها.
- الحل الأمثل باستخدام الخريطة
- البحث عن التكرارات في مصفوفة (نهج ساذج)
8 أمثلة لشرح كيفية حساب تعقيد الوقت باستخدام الكود. (انقر للتوسيع)
8 أمثلة لشرح كيفية حساب تعقيد الوقت باستخدام الكود
التعقيدات الزمنية الأكثر شيوعًا
الرسم البياني لتعقيد الوقت
فهم خصوصيات وعموميات هياكل البيانات الأكثر شيوعا. (انقر للتوسيع)
فهم خصوصيات وعموميات هياكل البيانات الأكثر شيوعا
المصفوفات: مدمجة في معظم اللغات لذا لم يتم تنفيذها هنا. تعقيد وقت المصفوفة
القائمة المرتبطة: تحتوي كل عقدة بيانات على رابط إلى العقدة التالية (والسابقة). الكود | تعقيد وقت القائمة المرتبطة
قائمة الانتظار: تتدفق البيانات بطريقة "الوارد أولاً يخرج أولاً" (FIFO). الكود | تعقيد وقت الانتظار
المكدس: تتدفق البيانات بطريقة "آخر ما يدخل يخرج أولاً" (LIFO). الكود | تعقيد وقت المكدس
متى تستخدم المصفوفة أو القائمة المرتبطة تعرف على المقايضات. (انقر للتوسيع)
متى تستخدم المصفوفة أو القائمة المرتبطة تعرف على المقايضات
استخدم المصفوفات عندما...
- تحتاج إلى الوصول إلى البيانات بترتيب عشوائي بسرعة (باستخدام فهرس).
- بياناتك متعددة الأبعاد (على سبيل المثال، المصفوفة، الموتر).
استخدم القوائم المرتبطة عندما:
- سوف تقوم بالوصول إلى بياناتك بشكل تسلسلي.
- تريد حفظ الذاكرة وتخصيص الذاكرة فقط حسب حاجتك إليها.
- تريد وقتًا ثابتًا للإزالة/الإضافة من أقصى القائمة.
- عندما تكون متطلبات الحجم غير معروفة - ميزة الحجم الديناميكي
إنشاء قائمة ومكدس وقائمة انتظار. (انقر للتوسيع)
إنشاء قائمة ومكدس وقائمة انتظار من الصفر
قم ببناء أي من هياكل البيانات هذه من البداية:
- قائمة مرتبطة
- كومة
- طابور
افهم إحدى هياكل البيانات الأكثر تنوعًا على الإطلاق: خرائط التجزئة. (انقر للتوسيع)
HashMaps
تعرف على كيفية تنفيذ أنواع مختلفة من الخرائط مثل:
- HashMap
- خريطة الشجرة
تعرف أيضًا على الفرق بين تطبيقات الخرائط المختلفة:
HashMap
أكثر كفاءة في استخدام الوقت. يعتبرTreeMap
أكثر كفاءة في استخدام المساحة.- تعقيد بحث
TreeMap
هو O(log n) بينما يكونHashMap
المحسّن هو O(1) في المتوسط.- مفاتيح
HashMap
مرتبة بترتيب الإدراج (أو عشوائية حسب التنفيذ). يتم دائمًا فرز مفاتيحTreeMap
.- يقدم
TreeMap
بعض البيانات الإحصائية مجانًا مثل: الحصول على الحد الأدنى، الحصول على الحد الأقصى، الوسيط، العثور على نطاقات المفاتيح.HashMap
لا يفعل ذلك.- يضمن
TreeMap
دائمًا O(log n) ، في حين أنHashMap
s لديه وقت مستهلك قدره O(1) ولكن في حالة إعادة الصياغة النادرة، سيستغرق الأمر O(n) .معرفة خصائص الرسوم البيانية والأشجار. (انقر للتوسيع)
معرفة خصائص الرسوم البيانية والأشجار
الرسوم البيانية
تعرف على جميع خصائص الرسوم البيانية مع العديد من الصور والرسوم التوضيحية.
الرسوم البيانية : عقد البيانات التي يمكن أن يكون لها اتصال أو حافة بصفر أو أكثر من العقد المجاورة. على عكس الأشجار، يمكن أن تحتوي العقد على عدة آباء وحلقات. الكود | تعقيد وقت الرسم البياني
الأشجار
التعرف على أنواع الأشجار المختلفة وخصائصها.
الأشجار : تحتوي عقد البيانات على صفر أو أكثر من العقد المجاورة والمعروفة أيضًا باسم الأطفال. يمكن أن تحتوي كل عقدة على عقدة أصل واحدة فقط، وإلا فهي رسم بياني وليست شجرة. الكود | المستندات
الأشجار الثنائية : مثل الشجرة ولكن يمكنها أن تنجب طفلين فقط على الأكثر. الكود | المستندات
أشجار البحث الثنائية (BST): مثل الشجرة الثنائية، لكن قيمة العقد تحافظ على هذا الترتيب
left < parent < right
. الكود | تعقيد الوقت BSTأشجار AVL : BST ذاتية التوازن لزيادة وقت البحث إلى أقصى حد. الكود | مستندات شجرة AVL | مستندات التوازن الذاتي وتدوير الأشجار
الأشجار ذات اللون الأحمر والأسود : BST ذاتية التوازن أكثر مرونة من AVL لزيادة سرعة الإدخال إلى أقصى حد. شفرة
قم بتنفيذ شجرة بحث ثنائية لإجراء عمليات بحث سريعة.
قم بتنفيذ شجرة بحث ثنائية لإجراء عمليات بحث سريعة
تعرف على كيفية إضافة/إزالة/تحديث القيم في الشجرة:
كيفية جعل الشجرة متوازنة؟
من BST غير المتوازن إلى BST المتوازن
1 2 / 2 => 1 3 3
لا تتعثر أبدًا في حل مشكلة من خلال 7 خطوات بسيطة. (انقر للتوسيع)
لا تتعثر أبدًا في حل مشكلة من خلال 8 خطوات بسيطة
- فهم المشكلة
- أنشئ مثالًا بسيطًا (لا توجد حالات حافة حتى الآن)
- حلول العصف الذهني (الخوارزمية الجشعة، فرق تسد، التراجع، القوة الغاشمة)
- اختبر إجابتك بالمثال البسيط (عقليا)
- تحسين الحل
- اكتب الكود. نعم، الآن يمكنك البرمجة.
- اختبار التعليمات البرمجية المكتوبة الخاصة بك
- قم بتحليل مدى التعقيد، سواء من حيث المكان أو الزمان، وتأكد من إجراء المزيد من التحسين.
التفاصيل الكاملة هنا
إتقان خوارزميات الفرز الأكثر شيوعًا (الفرز المدمج، الفرز السريع، وما إلى ذلك) (انقر للتوسيع)
إتقان خوارزميات الفرز الأكثر شعبية
سنستكشف ثلاث خوارزميات فرز أساسية O(n^2)، والتي لها حمل منخفض:
فرز الفقاعة. الكود | المستندات
فرز الإدراج. الكود | المستندات
فرز التحديد. الكود | المستندات
ثم ناقش خوارزميات الفرز الفعالة O(n log n) مثل:
دمج الفرز. الكود | المستندات
فرز سريع. الكود | المستندات
تعلم أساليب مختلفة لحل المشكلات مثل فرق تسد، والبرمجة الديناميكية، والخوارزميات الجشعة، والتراجع. (انقر للتوسيع)
تعلم طرقًا مختلفة لحل المشكلات الخوارزمية
سنناقش التقنيات التالية لحل مشاكل الخوارزميات:
- الخوارزميات الجشعة: تقوم باختيارات جشعة باستخدام الاستدلال للعثور على أفضل الحلول دون النظر إلى الوراء.
- البرمجة الديناميكية: تقنية لتسريع الخوارزميات العودية عندما يكون هناك العديد من المشاكل الفرعية المتداخلة . ويستخدم الحفظ لتجنب تكرار العمل.
- قسمة تسد: قم بتقسيم المشكلات إلى أجزاء أصغر، والتغلب على كل مشكلة فرعية، ثم ضم النتائج.
- التراجع: البحث في جميع (أو بعض) المسارات الممكنة. ومع ذلك، فإنه يتوقف، ويعود بمجرد ملاحظة أن الحل الحالي لا يعمل.
- القوة الغاشمة : قم بإنشاء جميع الحلول الممكنة وجربها جميعًا. (استخدمه كملاذ أخير أو كنقطة بداية).
كمبرمج، علينا أن نحل المشاكل كل يوم. إذا كنت تريد حل المشكلات بشكل جيد، فمن الجيد أن تعرف مجموعة واسعة من الحلول. في كثير من الأحيان، يكون تعلم الموارد الموجودة أكثر كفاءة من العثور على الإجابة بنفسك. كلما زاد عدد الأدوات والممارسات التي لديك، كان ذلك أفضل. يساعدك هذا الكتاب على فهم المفاضلات بين هياكل البيانات والسبب وراء أداء الخوارزميات.
لا يوجد الكثير من الكتب حول الخوارزميات في JavaScript. هذه المادة تملأ الفجوة. كما أنها ممارسة جيدة :)
نعم، افتح مشكلة أو اطرح أسئلة على [قناة Slack](https://dsajs-slackin.herokuapp.com).
هذا المشروع متاح أيضًا في كتاب. سوف تحصل على ملف PDF منسق بشكل جيد يحتوي على أكثر من 180 صفحة + إصدار ePub وMobi.
تواصل معي في أحد الأماكن التالية!
@iAmAdrianMejia
dsajs.slack.com