الخوارزميات وهياكل البيانات بلغة JavaScript للمبتدئين

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

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

ابدأ الدورة

مقدمة: لماذا نتعلم الخوارزميات وهياكل البيانات بلغة JavaScript؟



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



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



هياكل البيانات الأساسية في JavaScript (Node.js)



تحتوي JavaScript على العديد من هياكل البيانات المضمنة، ولكن للفهم العميق، تحتاج إلى معرفة كيفية تنفيذها يدويًا. وهذا يمنحك التحكم في الذاكرة وسرعة التنفيذ.



المصفوفات (Array)

المصفوفات في JS هي قوائم ديناميكية. وهي مثالية لتخزين البيانات المرتبة. ومع ذلك، من المهم أن تتذكر أن إدراج أو حذف عنصر في بداية المصفوفة (unshift/shift) هي عملية O(n)، لأنها تتطلب إزاحة جميع العناصر.



// إنشاء مصفوفةconst fruits = ['apple', 'banana', 'cherry'];

// إضافة إلى النهاية (O(1))fruits.push('orange');

// حذف من النهاية (O(1))fruits.pop();

// البحث عن عنصر (O(n))const index = fruits.indexOf('banana');console.log(index); // 1


المكدس (Stack)

يعمل المكدس وفقًا لمبدأ LIFO (Last In, First Out). هذا هيكل لا غنى عنه لمعالجة استدعاءات الدوال، أو التراجع عن الإجراءات (undo)، أو التحقق من الأقواس في الكود.



class Stack {    constructor() {        this.items = [];    }

push(element) { this.items.push(element); }

pop() { if (this.isEmpty()) return null; return this.items.pop(); }

peek() { return this.items[this.items.length - 1]; }

isEmpty() { return this.items.length === 0; }}

// مثال على الاستخدام: التحقق من الأقواسconst stack = new Stack();const str = '({[]})';let isValid = true;

for (let char of str) { if (char === '(' || char === '{' || char === '[') { stack.push(char); } else { const last = stack.pop(); if ( (char === ')' && last !== '(') || (char === '}' && last !== '{') || (char === ']' && last !== '[') ) { isValid = false; break; } }}

console.log(isValid && stack.isEmpty()); // true


قائمة الانتظار (Queue)

تعمل قائمة الانتظار وفقًا لمبدأ FIFO (First In, First Out). تُستخدم لإدارة المهام، ومعالجة الطلبات في خوادم الويب على Node.js، أو لتنفيذ المخازن المؤقتة.



class Queue {    constructor() {        this.items = {};        this.front = 0;        this.rear = 0;    }

enqueue(element) { this.items[this.rear] = element; this.rear++; }

dequeue() { if (this.isEmpty()) return null; const item = this.items[this.front]; delete this.items[this.front]; this.front++; return item; }

isEmpty() { return this.front === this.rear; }

size() { return this.rear - this.front; }}

// مثال: معالجة المهامconst taskQueue = new Queue();taskQueue.enqueue('المهمة 1');taskQueue.enqueue('المهمة 2');console.log(taskQueue.dequeue()); // المهمة 1


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



البحث عن البيانات هو أحد أكثر العمليات شيوعًا. سننظر في خوارزميتين أساسيتين: البحث الخطي والبحث الثنائي.



البحث الخطي (Linear Search)

يمر عبر

المدونات

توصيات الكتب