حل المشكلات والخوارزميات
تعلم كيفية التفكير مثل المبرمجين المحترفين. ستتقن حل المشكلات، هياكل البيانات، والخوارزميات خطوة بخطوة. هذا المسار أساسي للمقابلات التقنية في كبرى الشركات.
مقدمة في Problem Solving & Complexity (Big-O)
ما هذا؟
تحليل التعقيد (Complexity Analysis) هو طريقة لقياس كفاءة الخوارزميات من حيث الوقت (Time Complexity) والمساحة (Space Complexity). نستخدم تدوين Big-O لوصف كيفية نمو وقت التنفيذ مع زيادة حجم المدخلات.
لماذا هو مهم؟
فهم Big-O يساعدك على اختيار الخوارزمية المناسبة للمشكلة. في المقابلات التقنية، هذا هو أول ما يُسأل عنه. شركات مثل Google و Facebook تبحث عن مهندسين يفهمون كفاءة الخوارزميات.
متى تستخدمه؟
عند مقارنة خوارزميتين لحل نفس المشكلة، أو عندما تحتاج إلى تحسين أداء تطبيقك، أو في أي مقابلة تقنية.
Arrays
ما هذا؟
المصفوفات (Arrays) هي هياكل بيانات تخزن مجموعة من العناصر من نفس النوع في موقع متصل بالذاكرة. سنتعلم كيفية حل المشكلات على المصفوفات باستخدام خوارزميات مثل Linear Search، Prefix Sum، و Two Pointers.
لماذا هو مهم؟
المصفوفات هي أكثر هياكل البيانات استخداماً. معظم أسئلة المقابلات تبدأ بالمصفوفات. إتقان خوارزميات المصفوفات هو أساس لحل المشكلات الأكثر تعقيداً.
الخوارزميات
• Linear Search: البحث الخطي O(n)
• Prefix Sum: الجمع المسبق O(1) للاستعلامات
• Two Pointers: مؤشران لحل مشكلات الزوج والفرز
Strings
ما هذا؟
النصوص (Strings) هي سلاسل من الحروف. سنتعلم كيفية حل المشكلات على النصوص باستخدام خوارزميات مثل Sliding Window و Frequency Count.
لماذا هو مهم؟
معالجة النصوص تستخدم في كل تطبيق تقريباً: البحث، التحقق من صحة المدخلات، معالجة البيانات النصية. أسئلة النصوص شائعة جداً في المقابلات.
الخوارزميات
• Sliding Window: نافذة متحركة لحل مشكلات السلاسل الفرعية
• Frequency Count: حساب تكرار الأحرف باستخدام Hash Map
Recursion (التفكير التراجعي)
ما هذا؟
العودية (Recursion) هي تقنية تقوم فيها الدالة باستدعاء نفسها لحل مشكلة مقسمة إلى مشكلات فرعية أصغر. Backtracking هي تقنية لحل المشكلات التي تتطلب تجربة جميع الاحتمالات.
لماذا هو مهم؟
العودية هي أساس العديد من الخوارزميات المتقدمة (Trees, Graphs, DP). فهمها يفتح لك أبواباً جديدة في البرمجة وحل المشكلات.
متى تستخدمه؟
في حل مشكلات مثل متتالية فيبوناتشي، اجتياز الأشجار، Backtracking (N-Queens, Sudoku، Subsets).
Linked List
ما هذا؟
القوائم المرتبطة (Linked List) هي هياكل بيانات خطية حيث كل عنصر (Node) يحتوي على قيمة ومؤشر للعنصر التالي. على عكس المصفوفات، العناصر غير متصلة في الذاكرة، مما يسمح بإضافة وحذف العناصر بكفاءة.
لماذا هو مهم؟
القوائم المرتبطة هي أساس هياكل بيانات أخرى مثل Stacks و Queues. كما أنها سؤال شائع جداً في المقابلات التقنية (عكس قائمة، اكتشاف الحلقة، العقدة الوسطى).
الخوارزميات
• Fast & Slow Pointers: مؤشر سريع ومؤشر بطيء لاكتشاف الحلقات وإيجاد العقدة
الوسطى
• Reverse Linked List: عكس القائمة المرتبطة
• Detect Cycle: اكتشاف الحلقات في القائمة
Stack
ما هذا؟
الـ Stack (المكدس) هو هيكل بيانات يتبع مبدأ LIFO (Last In, First Out) - آخر عنصر يدخل هو أول عنصر يخرج. العمليات الأساسية: push (إضافة)، pop (إزالة)، و top/peek (اطلاع على آخر عنصر).
لماذا هو مهم؟
الـ Stack يستخدم في العديد من التطبيقات: استدعاء الدوال (Call Stack)، التحقق من الأقواس المتوازنة، الـ Undo/Redo، وتقييم التعبيرات الحسابية.
الخوارزميات
• Balanced Parentheses: التحقق من صحة ترتيب الأقواس
• Monotonic Stack: مكدس متزايد أو متناقص لحل مشكلات Next Greater Element
• Evaluate Expression: تقييم التعبيرات الحسابية
Queue
ما هذا؟
الـ Queue (الطابور) هو هيكل بيانات يتبع مبدأ FIFO (First In, First Out) - أول عنصر يدخل هو أول عنصر يخرج. العمليات الأساسية: enqueue (إضافة)، dequeue (إزالة)، و front (اطلاع على أول عنصر).
لماذا هو مهم؟
الـ Queue يستخدم في جدولة المهام، معالجة الطلبات، وخوارزميات BFS (Breadth-First Search) في الأشجار والرسوم البيانية.
الخوارزميات
• BFS Basics: خوارزمية البحث بالعرض باستخدام Queue
• Sliding Window Maximum: إيجاد أكبر عنصر في نافذة متحركة
• Task Scheduling: جدولة المهام
Hash Table (Map / Set)
ما هذا؟
جدول التجزئة (Hash Table) هو هيكل بيانات يخزن أزواج (مفتاح، قيمة) ويوفر وصولاً سريعاً جداً (O(1) للبحث والإضافة والحذف. في C++، نستخدم `unordered_map` و `unordered_set`.
لماذا هو مهم؟
جداول التجزئة هي من أكثر هياكل البيانات استخداماً لحل المشكلات بسرعة. أي مشكلة تحتاج إلى بحث سريع أو عدّ التكرارات، الحل الأمثل هو Hash Table.
الخوارزميات
• Frequency Map: حساب تكرار العناصر
• Lookup Optimization: تحسين البحث باستخدام Hash Set
• Two Sum Problem: مشكلة مجموع رقمين
Trees (Binary Tree)
ما هذا؟
الأشجار (Trees) هي هياكل بيانات غير خطية تتكون من عقد (Nodes) مرتبة بشكل هرمي. العقدة الجذر (Root) هي البداية، وكل عقدة يمكن أن تحتوي على أبناء (Children). الشجرة الثنائية (Binary Tree) هي شجرة كل عقدة فيها لها ابنين كحد أقصى.
لماذا هو مهم؟
الأشجار تستخدم في قواعد البيانات (B-Trees)، أنظمة الملفات، محركات البحث، والعديد من التطبيقات. كما أنها من أكثر المواضيع طلباً في المقابلات التقنية.
الخوارزميات
• DFS (Depth-First Search): Inorder, Preorder, Postorder
• BFS (Breadth-First Search): Level Order Traversal
• Tree Traversals: اجتياز الشجرة بطرق مختلفة
Binary Search
ما هذا؟
البحث الثنائي (Binary Search) هو خوارزمية بحث فعالة تستخدم في المصفوفات المرتبة. تعمل على تقسيم المصفوفة إلى نصفين باستمرار حتى تجد العنصر المطلوب، بتعقيد زمني O(log n).
لماذا هو مهم؟
البحث الثنائي هو من أسرع خوارزميات البحث وأكثرها كفاءة. يعتبر سؤالاً أساسياً في أي مقابلة تقنية، كما أنه أساس للعديد من الخوارزميات المتقدمة.
الخوارزميات
• Binary Search: البحث الثنائي الكلاسيكي
• Search Space Reduction: تقليل مساحة البحث
• Lower Bound / Upper Bound: إيجاد الحدود
Heap / Priority Queue
ما هذا؟
الـ Heap (الكومة) هو هيكل بيانات شجري يحافظ على ترتيب العناصر بحيث يكون العنصر الأصغر (Min-Heap) أو الأكبر (Max-Heap) في الجذر. Priority Queue هي تجريد للـ Heap تسمح بالوصول إلى العنصر ذو الأولوية القصوى.
لماذا هو مهم؟
الـ Heap يستخدم في خوارزميات الجدولة، Dijkstra's Shortest Path، وإيجاد أكبر أو أصغر العناصر بكفاءة.
الخوارزميات
• Top K Elements: إيجاد أكبر أو أصغر K عنصر
• Heap Sort: ترتيب البيانات باستخدام Heap
• Merge K Sorted Lists: دمج قوائم مرتبة
Graphs
ما هذا؟
الرسوم البيانية (Graphs) هي هياكل بيانات تمثل العلاقات بين الكائنات. تتكون من عقد (Vertices) وحواف (Edges) تربط بينها. يمكن أن تكون موجهة (Directed) أو غير موجهة (Undirected).
لماذا هو مهم؟
الرسوم البيانية تستخدم في شبكات التواصل الاجتماعي، خرائط Google، أنظمة التوصيات، والذكاء الاصطناعي. فهمها يفتح لك أبواباً واسعة في البرمجة المتقدمة.
الخوارزميات
• BFS (Breadth-First Search): البحث بالعرض
• DFS (Depth-First Search): البحث بالعمق
• Shortest Path Basics: أقصر مسار (Dijkstra)
Dynamic Programming (مقدمة)
ما هذا؟
البرمجة الديناميكية (Dynamic Programming) هي تقنية لحل المشكلات التي يمكن تقسيمها إلى مشكلات فرعية متداخلة. تعتمد على مبدأ التخزين المؤقت (Memoization) لحل المشكلات الفرعية مرة واحدة فقط وإعادة استخدام النتائج.
لماذا هو مهم؟
البرمجة الديناميكية تظهر في أصعب أسئلة المقابلات التقنية (Google, Facebook, Amazon). إتقانها يضعك في مستوى متقدم جداً ويحسن قدرتك على حل المشكلات المعقدة.
الخوارزميات
• Memoization (Top-Down): حل تعاودي مع تخزين مؤقت
• Tabulation (Bottom-Up): حل تكرارى بناءً على جدول
• Fibonacci, Climbing Stairs, Knapsack
مصادر التعلم
Advanced Problem Solving
ما هذا؟
في هذه المرحلة، ستقوم بحل مشكلات متقدمة تدمج بين جميع هياكل البيانات والخوارزميات التي تعلمتها. هذه المشكلات تحاكي أسئلة المقابلات التقنية الحقيقية في كبرى الشركات.
لماذا هو مهم؟
حل المشكلات المتقدمة يطور مهاراتك في التفكير النقدي والتحليل. كما يجهزك للمقابلات التقنية في شركات مثل Google، Amazon، Microsoft، و Meta.
المجالات المغطاة
• مصفوفات + Two Pointers + Binary Search
• أشجار + BFS/DFS + برمجة ديناميكية
• رسوم بيانية + أقصر مسار + Union-Find
• مشكلات تصميم الخوارزميات
مصادر التعلم
Contest / Real Practice
ما هذا؟
الآن حان وقت التطبيق العملي! ستشارك في مسابقات برمجية (Coding Contests) على منصات مثل LeetCode و Codeforces و HackerRank، وتحل مسائل حقيقية تحت ضغط الوقت.
لماذا هو مهم؟
المشاركة في المسابقات تحسن سرعتك ودقتك في حل المشكلات. كما تعطيك خبرة عملية في التعامل مع أسئلة المقابلات التقنية وتجهزك لسوق العمل.
المنصات الموصى بها
• LeetCode (أفضل منصة للمقابلات)
• Codeforces (مسابقات تنافسية)
• HackerRank (تحديات متنوعة)
• CodeChef (مسابقات شهرية)