ما معنى Boolean في الخوارزميات وهياكل البيانات؟ شرح عملي مبسّط
Boolean (يُنطق «بوليان» ويُترجَم أحيانًا إلى «القيمة المنطقية») هو أبسط نوع بيانات في البرمجة: متغيّر لا يحمل سوى قيمة واحدة من قيمتين فقط، إمّا true (صحيح) أو false (خطأ). سُمِّي بهذا الاسم نسبةً إلى عالِم الرياضيات جورج بول الذي وضع أساس «الجبر المنطقي». وفي مجال الخوارزميات وهياكل البيانات، تكمن أهميته في أنه اللبنة التي تبني عليها البرامج قراراتها: هل ننفّذ هذه الخطوة أم لا؟ هل نكمل الحلقة أم نتوقّف؟ هل وُجد العنصر أم لا؟ كل هذه أسئلة إجابتها Boolean.
من أين تأتي القيمة المنطقية؟
نادرًا ما تكتب true أو false بيدك مباشرة. في الغالب تنتج القيمة المنطقية عن عملية مقارنة أو اختبار شرط. أشهر المعامِلات التي تُرجِع Boolean:
- معامِلات المقارنة:
==(يساوي)،!=(لا يساوي)،>،<،>=،<=. - معامِلات المنطق:
&&(و)،||(أو)،!(النفي). - دوال الفحص مثل
isEmpty()أوcontains()التي تُعيد نعم/لا.
مثال: التعبير age >= 18 ليس رقمًا، بل قيمة منطقية تصبح true إذا كان العمر 18 فأكثر، وfalse فيما عدا ذلك.
دور Boolean في اتخاذ القرار داخل الخوارزميات
جوهر أي خوارزمية هو التحكّم في «مسار التنفيذ»، وهذا التحكّم يعتمد كلّيًا على القيم المنطقية:
- الجُمَل الشرطية (
if / else): تختار بين مسارين بناءً على شرط قيمته Boolean. - الحلقات (
while,for): تستمر في التكرار ما دام الشرطtrue، وتتوقّف لحظة أن يصبحfalse. أي خطأ في هذا الشرط قد يُنتج «حلقة لا نهائية». - رايات الحالة (Flags): متغيّر منطقي واحد مثل
found = falseنضبطه إلىtrueبمجرّد تحقّق هدف معيّن، فيصبح ذاكرةً مختصرة لِما حدث أثناء التنفيذ.
في خوارزميات البحث مثلًا، البحث الخطّي يمرّ على العناصر ويسأل في كل خطوة سؤالًا منطقيًا: «هل هذا العنصر يساوي المطلوب؟». وفي خوارزميات الفرز، تقرّر المقارنة المنطقية a > b ما إذا كان يجب تبديل عنصرين أم لا.
Boolean داخل هياكل البيانات
القيمة المنطقية ليست مجرّد أداة تحكّم، بل تُخزَّن أحيانًا داخل الهيكل نفسه:
- المصفوفة المنطقية (Boolean array / bitset): تُستخدم لتعليم الحالات، كأن تحتفظ بمصفوفة
visited[]أثناء اجتياز رسم بياني (Graph) لتتذكّر العُقَد التي زرتها وتتجنّب الدوران في حلقة مفرغة. - الأشجار والقوائم: عند البحث عن قيمة في شجرة بحث ثنائية، تُعيد الدالة قيمة منطقية تدل على وجود العنصر من عدمه.
- الجداول الاحتمالية مثل Bloom Filter: بنية تعتمد على بتّات منطقية للإجابة السريعة عن سؤال «هل رأيتُ هذا العنصر من قبل؟».
لماذا يُعدّ Boolean فعّالًا جدًا؟
لأنه أرخص شيء يمكن تخزينه ومعالجته. نظريًا يحتاج إلى بِت واحد فقط (0 أو 1)، ما يجعله مثاليًا للعمليات الضخمة. كما أن المعالجات تنفّذ العمليات المنطقية بسرعة فائقة، لذا فإن بناء الشروط على قيم منطقية بدل العمليات الحسابية المعقّدة يجعل الخوارزمية أسرع وأوضح.
جدول: القيمة المنطقية أم القيمة العددية؟
| الجانب | Boolean (منطقي) | Integer (عددي) |
|---|---|---|
| القيم الممكنة | قيمتان فقط: true / false | نطاق واسع من الأرقام |
| الاستخدام النموذجي | قرار، شرط، راية حالة | عدّ، حساب، فهرسة |
| الحجم في الذاكرة | صغير جدًا (بِت/بايت) | أكبر عادةً (4–8 بايت) |
| مثال | isSorted = true | count = 42 |
ملاحظة مهمّة: بعض اللغات مثل C القديمة لم تكن تملك نوعًا منطقيًا صريحًا، فكانت تعتبر الرقم 0 بمعنى false وأي رقم آخر بمعنى true. أمّا اللغات الحديثة (Java، Python، JavaScript، C#) فتوفّر نوعًا منطقيًا مستقلًا، ويُفضَّل استخدامه صراحةً لأنه أوضح وأقل عرضة للأخطاء.
خطأ شائع يقع فيه المبتدئون
الخلط بين معامِل الإسناد = ومعامِل المقارنة ==. كتابة if (x = 5) بدل if (x == 5) تُسنِد القيمة بدل أن تقارنها، وقد تُنتج نتيجة منطقية غير متوقّعة أو خطأً في الترجمة. النصيحة العملية: عند كتابة شرط، اقرأه بصوت عالٍ كسؤال إجابته نعم أو لا؛ إن لم يكن كذلك فغالبًا ما ارتكبت خطأً منطقيًا.
الأسئلة الشائعة
هل Boolean نوع بيانات أم معامِل؟
هو نوع بيانات (Data Type) قيمه true وfalse. أمّا && و|| و! فهي معامِلات منطقية تعمل على قيم من هذا النوع وتُنتج قيمة منطقية جديدة.
كم يحتاج المتغيّر المنطقي من الذاكرة؟ نظريًا بِت واحد، لكن معظم اللغات تخصّص له بايتًا كاملًا (8 بتّات) لأسباب تتعلّق بمحاذاة الذاكرة. عند الحاجة إلى ملايين القيم يُستخدَم هيكل bitset لتوفير المساحة.
ما الفرق بين true وبين الرقم 1؟
منطقيًا قد يتصرّفان بشكل متشابه في بعض اللغات، لكنهما مفهومان مختلفان: true قيمة منطقية تعبّر عن «صحيح»، بينما 1 قيمة عددية. الاعتماد على تساويهما يجعل الشِفرة غامضة، والأفضل استخدام النوع المنطقي صراحةً.
هل يوجد أكثر من قيمتين في المنطق؟
النوع المنطقي الكلاسيكي قيمتان فقط. لكن بعض اللغات وقواعد البيانات تضيف حالة ثالثة هي null أو «غير معروف» للتعبير عن غياب القيمة، وهو ما يُعرف بالمنطق الثلاثي (Three-valued logic) ويجب الانتباه له عند التعامل مع البيانات الناقصة.