ماذا تعرف عن الخوارزميات في البرمجة Algorithms؟

كثيرًا ما نسمع مصطلح الخوارزميات البرمجية، وأنها أصبحت المحرك الرئيس للعمليات التنفيذية في أي نظام أو منتج رقمي نستخدمه. تبعًا لذلك، أصبحت الخوارزميات Algorithms أمرًا ضروريًا ينبغي لكل مبرمج أن يكون مُلمًّا بها. فما المقصود بالخوارزميات في البرمجة؟ وما أهميتها؟

جدول المحتويات:

ما هي الخوارزميات البرمجية؟

تُعرَف الخوارزميات Algorithms بمفهومها العام على أنها مجموعة خطوات منطقية لحل مشكلة معينة، تختلف باختلاف تفكير من يتولّى مهمة حل المشكلة. يمكن تشبيهها إلى حدٍ كبير بلوحة إشارات المرور، إذ تُوضَع مجموعة من الخطوات والقواعد لكيفية التحكُّم باللوحة وصولًا إلى المرحلة التي يظهر فيها الضوء المناسب وفق الشرط المُحقَّق.

أما عن الخوارزميات في البرمجة فتُعدّ مجموعة من التعليمات المحددة التي يجب اتباعها لبناء البرامج والعمليات الحاسوبية وتصميمها. جديرٌ بالذكر أن الخوارزميات جزء من التعاليم البرمجية، صياغتها تختلف حَسَبَ اللغة البرمجية، والناتج سيكون مماثلًا في جميع الحالات.

كما تُعرَّف الخوارزميات البرمجية على أنها بناء برمجي ذو طابع أمري، بمعنى أنها تعليمات حاسوبية على شكل أفعال أمر بصيغة جمل شرطية: “إذا ____؛ افعل ____”. فإذا أردت من الحاسب تنفيذ عملية معينة، يجب أن تُخبره طريقة التنفيذ بخطواتٍ مفصلةٍ ليُنفّذ ما تريده وفق المسار المُحدَّد.

يرجع تاريخ استخدام علم الخوارزميات في البرمجة إلى عام 1936، عندما حدَّد “آلان تورينج” مفهومًا تأسيسيًا لعلماء الحاسوب في ورقته البحثية على آلة تورينج، وأوضح أنه يمكن تفكيك المشكلات وحلها بسرعة، بواسطة الآلات التي تنفذ الخوارزميات لإجراء العمليات التسلسلية وصولًا إلى إجابة محددة.

مثال ذلك عندما نكتب برنامج بسيط لحساب معادلة 2×9 ÷8:

  1. نبدأ الخطوة الأولى بالتحقُّق أن المقام لا يساوي صفر، إن كان كذلك؛
  2. نجد في الخطوة التالية ناتج ضرب 9×2.
  3. أخيرًا نحسب ناتج القسمة.

كيف تعمل الخوارزميات Algorithms؟

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

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

إذا أردنا حل هذه المسألة البسيطة بطريقةٍ اعتياديةٍ، فإننا سنعتمد على أسلوب التجربة والخطأ واستهلاك جميع المحاولات -والتي تُمثّل النطاق الذي يقع ضمنه العدد المُحدَّد- إلى حين إيجاد التخمين الصحيح. هذه الطريقة لا بأس بها، لكنها غير مجدية وتستهلك وقتًا غير ضروريًا في حين يمكن حلها بطرق أبسط.

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

لقد قلصت بذلك عدد المحاولات للوصول إلى الإجابة الصحيحة إلى الثُلث تقريبًا وزدت حظوظك بالإجابة الصحيحة والسريعة.

ما أهمية الخوارزميات في البرمجة؟

أحدثت الخوارزميات طفرة كبيرة في مجال البرمجيات وساهمت كثيرًا بتطوّره، وعلى الرغم من كون الخوارزميات علمًا مستقلاً بذاته نشأ قبل الحاسب بكثير، إلّا أنها تُستخدَم في كل أجزاء الحاسوب تقريبًا. فيما يلي نوضح أبرز استخدامات الخوارزميات في البرمجة:

1. ترتيب المعلومات وفرزها

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

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

2. نُظم التوصية

تلعب الخوارزميات في البرمجة على سبيل المثال لا الحصر دورًا كبيرًا في كيفية عمل وسائل التواصل الاجتماعي وتتحكَّم في ظهور المحتويات والإعلانات المناسبة وفقًا لبيانات المستخدم وشخصيته، إذ تُتَخَذ جميع هذه القرارات وتقودها الخوارزميات من خلف الستار.

كما تستخدم مواقع مثل Amazon وNetflix خوارزميات التصفية التعاونية Collaborative filtering التي تبحث في الاستخدامات وبيانات المستخدمين لمعرفة اهتماماتهم وأذواقهم وتقدم بعد ذلك اقتراحات وتوصيات لعمليات الشراء والعروض التلفزيونية التي قد يحبونها.

3. معالجة البيانات بسرعة

تساعد الخوارزميات البرمجية البرامج في معالجة مليارات المعلومات بسرعةٍ ودقةٍ كبيرتين وغير مسبوقة. مثلًا، تحتاج تطبيقات كخرائط جوجل إلى حساب الطرقات عبر المدن، مع مراعاة المسافة وحركة المرور والحوادث؛ لتحديد أفضل المسارات التي يجب أن يسلكها المستخدم. ولحل هذه المشكلة، غالبًا تلجأ تلك التطبيقات إلى استخدام خوارزمية ديكسترا Dijkstra’s التي تُعنى بحل مسألة إيجاد المسار الأقصر بين مسافتين.

طرق تمثيل الخوارزميات

الخوارزمية ما هي إلا نهج تفكير وتمثيل منطقي للخطوات حتى تصل إلى النتيجة، لذلك توجد عدة طرائق مُستخدّمة في كتابة الخوارزميات ونمذجتها لتُصبِح قابلة للقراءة والفهم والمشاركة، نذكر بعضها كما يلي:

1. المخططات الانسيابية Flowchart

تُستخدَم المخططات الانسيابية Flowchart أو كما تُعرَف مخططات سير العمليات، لتمثيل الخوارزميات عبر أشكال مُتفق عليها مسبقًا، كشكل الدائرة التي تُمثّل بداية مخطط العلميات (البرنامج) ونهايته، وشكل المُعيَّن الهندسي الذي يُمثّل خطوة اتخاذ قرار، وشكل الخطوط التي تُمثّل اتجاه سير العمليات المنطقي.

الصورة التالية تُوضّح مثال بسيط عن كيفية التعبير عن خوارزمية تحدد إشارة العدد بالمخططات الانسيابية:

المخططات الانسيابية Flowchart

2. الرمز الشكلي أو الزائف Pseudocode

تُستخدَم الرموز الشكلية أو الشيفرة الزائفة لوصف الخوارزميات وتمثيلها من خلال تحديد شكل المدخلات الواردة والمخرجات الناتجة بمجموعة خطوات مكتوبة بلغةٍ بشريةٍ سلسة يفهمها أي شخص، وهذا سبب تسميتها بهذا الاسم، إذ إن أسلوب كتابتها وتفصيلها بالخطوات يُكتب بطريقة تمكّن أي قارئ من فهمها بصياغة جمل بسيطة غير برمجية. الهدف منها توثيق البرنامج وتسهيل تبادل المعلومات.

مثال ذلك إذا أردنا الحصول على أفضل مسار لخطوط رحلات من مدينة جُدَّة إلى الرياض مع أخذ التكلفة بالحسبان، فإن التعبير عنها بالرموز الشكلية سيكون كالآتي:

الرمز الشكلي أو الزائف Pseudocode

ما هي أنواع الخوارزميات واستخداماتها؟

نظرًا لاختلاف المشكلات وتعدُّد طرق حلها، يوجد أنواع كثيرة ومختلفة من الخوارزميات تُصنَّف وفق عدة عوامل، كتصنيفها حسب طريقة التنفيذ أو أسلوب التحسين أو درجة التعقيد، فيما يلي نذكر بعض أنواع الخوارزميات مصنفةً حسب طريقة التصميم ومبدأ البناء:

1. خوارزميات القوة الغاشمة Brute Force Algorithms

تُعدّ أبسط أنواع الخوارزميات البرمجية، وهي طريقة مباشرة لحل المشكلات لا تهتم بسرعة الأداء، إنما تعتمد على القوة الحسابية وتجربة كل الحلول الممكنة وصولًا إلى الإجابة بغض النظر عن التكاليف، وهي الوقت والمساحة في حالة البرمجة. تُستخدم خوارزميات القوة الغاشمة مثلًا لإيجاد أصغر رقم في مصفوفة معينة؛ فتمرّ الخوارزمية على جميع الأرقام بالترتيب، ثم تصل في نهايتها للرقم الأصغر.

2. خوارزميات فرِّق تسُد Divide And Conquer Algorithms

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

أبرز الأمثلة على هذا النوع خوارزمية البحث الثنائي Binary Search، إذ تبدأ عملية البحث بالتحقق من قيمة منتصف المصفوفة لتحديد مسار عملية البحث الصحيح، فإذا كانت تلك القيمة تساوي ما نبحث عنه؛ تتوقف عملية البحث مباشرةً. أما إذا كانت قيمة المنتصف أكبر من قيمة ما نبحث عنه؛ حينها نستبعد النصف العلوي من المصفوفة في عملية البحث التالية. بذلك تُقسّم المشكلة إلى مشكلات أصغر حتى تجد حلًا.

3. الخوارزميات العشوائية Randomized Algorithms

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

تُستخدم الخوارزميات العشوائية عادةً في الحالات التي تتطلَّب تقليل التعقيد الزمني، مثل مسائل اقتراح كلمات المرور وتوليد رموز كابتشا CAPTCHA.

4. الخوارزميات الجشعة Greedy Algorithms

هذا الأسلوب يهتم بإيجاد أفضل حل متواجد حاليًا، دون تكبد عناء البحث والتصنيف للوصول للخيار الأمثل. يسهل إعداد هذا النوع من الخوارزميات، ويأخذ وقت أقل عادةً في عمله. ومع ذلك، تُستخدَم في حالات محددة، مثل معالجة بروتوكولات شبكة الإنترنت لتقليل وقت الانتظار المستغرق، وترميز هوفمان Huffman Coding.

5. الخوارزمية التراجعية أو Backtracking Algorithm

يُستخدَم نموذج خوارزمية التعقب الخلفي لحل المسائل بطريقة تعاودية محاولًا بناء الحلّ تصاعديًا قطعة تلو الأخرى، وحذف الحلول التي لا تلبي متطلبات المشكلة، فتصغر الخيارات باستمرار حتى نصل إلى الخيار الأمثل. وأفضل مثال على استخدام هذا الأسلوب هو حل مشكلة لعبة سودوكو Sudoku التي تحتاج إلى ملء الأرقام في الجدول تواليًا، وإذا اكتشفت بأن الرقم الحالي لا يؤدي إلى الحل؛ تحذفه وتجرّب العدد التالي.

6. خوارزميات البحث والترتيب Searching And Sorting Algorithms

تعتمد خوارزميات البحث والترتيب على اختبار جميع الاحتمالات والتحقّق ما إذا كان أي من الاحتمالات يوفر حلًا للمشكلة، وتعتمد بصورة أساسية على خوارزميتين، الأولى لترتيب العناصر تصاعديًا، ثم مباشرة البحث في كل عنصر ضمن الخوارزمية. ويندرج تحتها العديد من الأنواع، مثل: البحث الخطّي Linear Search والبحث الأسّي Exponential Search، وغير ذلك.

كيف يمكنك تعلم الخوارزميات؟

البرمجة ما هي إلا أداة أو نظام تنفيذ لخوارزميات عبر تعليماتٍ مكتوبة وفق قواعد وشروط محددة. لذا فإن تعلُّم الخوارزميات وكيفية عملها سيساعدك في تنمية مهارات التفكير التحليلي وحل المشكلات Problem Solving.

إذا درَّبت عقلك على فهم المنطق الخوارزمي؛ ستُصبِح البرمجة بنظرك أسهل وسترى كل مشكلة على أنها مجموعة مسائل أصغر تستخدم الخوارزميات لتبسيطها.

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

ختامًا، يمكننا القول أن الخوارزميات أصبحت شيئًا ضروريًا في كل مناحي الحياة حتى غدى عصرنا الحالي يُوصَف بـ”عصر الخوارزميات”، وننوّه أخيرًا أنه من المهم على أي شخص يسعى إلى دخول مجال البرمجيات؛ الإلمام بعلم الخوارزميات وفهم طريقة عملها لتنمية تفكيره المنطقي في حل المشكلات التي ستواجهه حتمًا.

تم النشر في: تعلم البرمجة