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

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

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

ابدأ الدورة

مقدمة: لماذا الخوارزميات وهياكل البيانات هي أساس الإتقان في C#



أي مطور يريد كتابة كود فعال وقابل للتوسع بلغة C#، سيواجه عاجلاً أم آجلاً ضرورة فهم كيفية عمل الخوارزميات وهياكل البيانات. هذه ليست مجرد نظرية أكاديمية - بل هي أداة تسمح باختيار الحل الصحيح لمهمة محددة: سواء كان البحث عن عنصر بين ملايين السجلات، أو فرز قائمة الطلبات، أو معالجة البيانات في الوقت الفعلي.



في هذه المقالة، سنشرح المفاهيم الأساسية من خلال أمثلة عملية بلغة C# (.NET). ستتعرف على ما هو تعقيد الخوارزميات (Big O)، وما هي هياكل البيانات المضمنة في .NET، وكيفية استخدامها. المادة موجهة للمبتدئين: سنبدأ من البسيط ونتعمق تدريجياً في التفاصيل.



1. الأساسيات: ما هي هياكل البيانات والخوارزميات في C#



1.1 مفهوم هيكل البيانات

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



1.2 مفهوم الخوارزمية

الخوارزمية هي سلسلة من الخطوات لحل مشكلة ما. على سبيل المثال، خوارزمية الفرز الفقاعي أو البحث الثنائي. من المهم ليس فقط معرفة كيفية كتابة الكود، بل فهم أي خوارزمية تختار لحجم بيانات معين.



1.3 تقييم التعقيد (Big O Notation)

Big O تصف كيف ينمو وقت تنفيذ الخوارزمية مع زيادة بيانات الإدخال. الرموز الأساسية:

  • O(1) — وقت ثابت (الوصول إلى عنصر مصفوفة بواسطة الفهرس)
  • O(n) — وقت خطي (البحث في قائمة غير مرتبة)
  • O(log n) — وقت لوغاريتمي (البحث الثنائي)
  • O(n²) — وقت تربيعي (الفرز الفقاعي)

في C#، لقياس وقت التنفيذ يمكن استخدام System.Diagnostics.Stopwatch.



using System.Diagnostics;

int[] data = { 5, 3, 8, 1, 9 };Stopwatch sw = Stopwatch.StartNew();Array.Sort(data); // فرز مدمج O(n log n)sw.Stop();Console.WriteLine($"استغرق الفرز: {sw.ElapsedMilliseconds} مللي ثانية");


2. هياكل البيانات الأساسية في C# (.NET)



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

المصفوفة هي مجموعة ثابتة من العناصر من نفس النوع. في C#، يتم فهرسة المصفوفات بدءًا من الصفر. مثالية عندما يكون عدد العناصر معروفًا مسبقًا.



int[] numbers = new int[5] { 10, 20, 30, 40, 50 };Console.WriteLine(numbers[2]); // الإخراج: 30// محاولة تجاوز الحدود ستؤدي إلى IndexOutOfRangeException


متى تستخدم: للوصول السريع بواسطة الفهرس (O(1)). غير مناسبة للإضافة/الحذف المتكرر للعناصر.



2.2 القائمة (List<T>)

مصفوفة ديناميكية من مساحة الأسماء System.Collections.Generic. تتوسع تلقائيًا عند إضافة العناصر. هذا أحد أكثر الهياكل شيوعًا في C#.



List<string> fruits = new List<string>();fruits.Add("تفاح");fruits.Add("موز");fruits.Insert(1, "برتقال"); // إدراج في الموضع 1Console.WriteLine(fruits.Count); // الإخراج: 3


متى تستخدم: عندما تحتاج إلى إضافة عناصر بشكل متكرر إلى نهاية القائمة (O(1) معدلة). الإدراج في المنتصف هو O(n).



2.3 القاموس (Dictionary<TKey, TValue>)

مجموعة "مفتاح-قيمة"، تعتمد على جدول التجزئة. تسمح بالبحث السريع عن القيمة بواسطة المفتاح.



Dictionary<string, int> ages = new Dictionary<string, int>();ages["آنا"] = 25;ages["بوريس"] = 30;

if (ages.ContainsKey("آنا")){ Console.WriteLine($"عمر آنا: {ages["آنا"]}"); // الإخراج: 25}


متى تستخدم: للبحث

المدونات

توصيات الكتب