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

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

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

ابدأ الدورة

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

فهم الخوارزميات وهياكل البيانات هو الأساس الذي يميز المطور المحترف عن الهاوي. إذا كنت قد بدأت للتو رحلتك في البرمجة بلغة TypeScript، ستساعدك هذه المقالة على فهم المفاهيم الأساسية. سنشرح هياكل البيانات الأساسية (المصفوفات، المكدس، الطابور) والخوارزميات البسيطة (البحث الخطي والثنائي)، وسنوضح كيفية تنفيذها بلغة TypeScript مع مراعاة التصنيف الصارم للأنواع.



1. المصفوفات والعمل معها في TypeScript

المصفوفة هي أبسط وأكثر هياكل البيانات استخداماً. في TypeScript، يمكن أن تكون المصفوفات مصنفة بشكل صارم، مما يساعد على تجنب الأخطاء في مرحلة التجميع.

// تعريف مصفوفة مصنفة من الأرقامconst numbers: number[] = [5, 12, 8, 130, 44];

// مصفوفة من السلاسل النصيةconst fruits: Array<string> = ['تفاحة', 'موز', 'كرز'];

// الوصول حسب الفهرسconsole.log(numbers[0]); // 5

// إضافة عنصر إلى النهايةnumbers.push(100);

// حذف آخر عنصرconst last = numbers.pop();

مهم: يتحقق TypeScript من الأنواع في مرحلة التجميع. إذا حاولت إضافة سلسلة نصية إلى مصفوفة أرقام، سيعطي المترجم خطأ. هذا يجعل الكود أكثر موثوقية.



2. المكدس والطابور: مبادئ LIFO و FIFO

يعمل المكدس (Stack) وفق مبدأ LIFO (Last In, First Out - آخر ما يدخل هو أول ما يخرج). يعمل الطابور (Queue) وفق مبدأ FIFO (First In, First Out - أول ما يدخل هو أول ما يخرج).



تنفيذ المكدس بلغة TypeScript

class Stack<T> {    private items: T[] = [];

push(element: T): void { this.items.push(element); }

pop(): T | undefined { return this.items.pop(); }

peek(): T | undefined { return this.items[this.items.length - 1]; }

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

// الاستخدامconst stack = new Stack<number>();stack.push(10);stack.push(20);console.log(stack.pop()); // 20console.log(stack.peek()); // 10


تنفيذ الطابور بلغة TypeScript

class Queue<T> {    private items: T[] = [];

enqueue(element: T): void { this.items.push(element); }

dequeue(): T | undefined { return this.items.shift(); }

front(): T | undefined { return this.items[0]; }

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

// الاستخدامconst queue = new Queue<string>();queue.enqueue('مهمة 1');queue.enqueue('مهمة 2');console.log(queue.dequeue()); // 'مهمة 1'

لاحظ استخدام الأدوية العامة <T>. هذا يسمح بإنشاء هياكل بيانات تعمل مع أي نوع، مع الحفاظ على التصنيف الصارم للأنواع.



3. خوارزميات البحث: الخطي والثنائي

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



البحث الخطي

يمر عبر جميع عناصر المصفوفة حتى يجد العنصر المطلوب. التعقيد: O(n).

function linearSearch<T>(arr: T[], target: T): number {    for (let i = 0; i < arr.length; i++) {        if (arr[i] === target) {            return i; // تم العثور عليه، نعيد الفهرس        }    }    return -1; // لم يتم العثور عليه}

const data = [3, 7, 1, 9, 4];console.log(linearSearch(data, 9)); // 3console.log(linearSearch(data, 10)); // -1


البحث الثنائي (للمصفوفات المرتبة فقط)

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

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

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

المدونات

توصيات الكتب