الخوارزميات وهياكل البيانات في JavaScript: دليل شامل لـ Node.js

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

الخوارزميات وهياكل البيانات في JavaScript (Node.js): من الأساسيات إلى التقنيات المتقدمة



فهم الخوارزميات وهياكل البيانات هو مهارة أساسية لأي مطور يعمل مع JavaScript، خاصة في بيئة Node.js. بدون هذه المعرفة، من المستحيل إنشاء تطبيقات فعالة وقابلة للتوسع وسريعة. في هذه المقالة، سنشرح المفاهيم الأساسية التي ستساعدك على كتابة كود محسن واجتياز المقابلات التقنية بنجاح.



لماذا تعتبر الخوارزميات وهياكل البيانات مهمة لـ Node.js؟



Node.js، المبني على محرك V8، يسمح بتنفيذ JavaScript على الخادم. هنا، على عكس المتصفح، الأداء له أهمية حاسمة: الخادم يعالج آلاف الطلبات في وقت واحد. الاختيار الخاطئ لهيكل البيانات يمكن أن يؤدي إلى إبطاء العمل بمئات المرات. على سبيل المثال، البحث عن عنصر في مصفوفة تحتوي على 10,000 سجل قد يستغرق 0.1 مللي ثانية، بينما في قائمة مرتبطة قد يستغرق 10 مللي ثانية. الفرق واضح.



هياكل البيانات الأساسية التي ستستخدمها:



  • المصفوفات (Array) — أداة أساسية لكنها قوية. وصول سريع حسب الفهرس (O(1))، لكن إدخال/حذف بطيء في البداية (O(n)).
  • جداول التجزئة (Object, Map) — مثالية لتخزين أزواج "مفتاح-قيمة". متوسط تعقيد العمليات هو O(1).
  • القوائم المرتبطة (LinkedList) — فعالة للإدخالات والحذف المتكرر في منتصف القائمة.
  • الأكوام والطوابير (Stack, Queue) — لا غنى عنها عند معالجة تدفقات البيانات (مثل المهام في event loop).
  • الأشجار (Binary Tree, BST) — للبيانات الهرمية والبحث السريع.
  • الرسوم البيانية (Graph) — لنمذجة العلاقات (الشبكات الاجتماعية، المسارات).


خوارزميات الفرز والبحث الأساسية في JavaScript



لننظر في مشكلتين كلاسيكيتين: فرز مصفوفة والبحث الثنائي. في Node.js، يتم تنفيذ هذه الخوارزميات مباشرة، دون مكتبات خارجية.



الفرز السريع (Quick Sort)



هذه واحدة من أكثر الخوارزميات فعالية بمتوسط تعقيد O(n log n). تعمل على مبدأ "فرق تسد".



function quickSort(arr) {  if (arr.length <= 1) return arr;

const pivot = arr[arr.length - 1]; const left = []; const right = [];

for (let i = 0; i < arr.length - 1; i++) { if (arr[i] < pivot) { left.push(arr[i]); } else { right.push(arr[i]); } }

return [...quickSort(left), pivot, ...quickSort(right)];}

// مثال على الاستخدامconst numbers = [34, 7, 23, 32, 5, 62];console.log(quickSort(numbers)); // [5, 7, 23, 32, 34, 62]


البحث الثنائي (Binary Search)



خوارزمية للمصفوفات المرتبة. التعقيد O(log n) — أسرع بكثير من البحث الخطي.



function binarySearch(arr, target) {  let left = 0;  let right = arr.length - 1;

while (left <= right) { const mid = Math.floor((left + right) / 2);

if (arr[mid] === target) return mid; if (arr[mid] < target) left = mid + 1; else right = mid - 1; }

return -1; // العنصر غير موجود}

const sortedArray = [1, 3, 5, 7, 9, 11, 13];console.log(binarySearch(sortedArray, 7)); // 3


جداول التجزئة: عندما يكون الأداء مهمًا



في Node.js، يتم تنفيذ جداول التجزئة من خلال الكائنات المدمجة Map و Object. توفر وصولاً إلى البيانات في متوسط O(1). ومع ذلك، من المهم فهم كيفية تجنب التصادمات وفقدان الأداء.



مثال: حساب تردد الكلمات باستخدام Map



function countWords(text) {  const wordMap = new Map();  const words = text.toLowerCase().split(/\\W+/);

for (const word of words) { if (word) { wordMap.set(word, (wordMap.get(word) || 0) + 1); } }

return wordMap;}

const text = "JavaScript و Node.js. JavaScript هي لغة برمجة";

المدونات

توصيات الكتب