🔍 الجداول التجزئة (Hash Tables): سرعة البحث السحري في بايثون
هل تساءلت يوماً كيف يمكن لتطبيق مثل محرك البحث أن يجد النتائج بسرعة خيالية؟ أو كيف يحفظ قاموس بايثون (Dictionary) القيم ويسترجعها فوراً؟ السر وراء هذه السرعة غالباً ما يكون جدول التجزئة (Hash Table). هياكل البيانات هذه هي من أهم الأدوات في عالم البرمجة لتحقيق كفاءة عالية في عمليات البحث والإدراج والحذف. في هذا الدرس، سنتعرف عليها من الصفر في بايثون.
🤔 ما هو جدول التجزئة (Hash Table)؟
ببساطة، جدول التجزئة هو بنية بيانات تخزن المعلومات على شكل أزواج "مفتاح-قيمة" (Key-Value Pairs). تخيله كخزانة ذات أدراج مرقمة. عندما تريد حفظ كتاب (القيمة)، تحسب رقم الدرج المناسب له بناءً على عنوانه (المفتاح) باستخدام قاعدة حسابية بسيطة. لاحقاً، عندما تريد استرجاع نفس الكتاب، تستخدم نفس العنوان (المفتاح) ونفس القاعدة الحسابية لتعرف بالضبط أي درج تفتح! هذا يجعل عملية البحث سريعة جداً.
الهدف الأساسي من جدول التجزئة هو توفير وقت وصول ثابت (O(1)) تقريباً للبحث عن قيمة معطاة مفتاحها، وهو ما يجعله أسرع بكثير من البحث في قائمة (List) عادية.
🧮 كيف يعمل جدول التجزئة؟ خطوتان بسيطتان
يعمل جدول التجزئة من خلال خطوتين رئيسيتين:
- التجزئة (Hashing): تأخذ دالة خاصة تسمى "دالة التجزئة" (Hash Function) المفتاح (مثلاً، اسم طالب) وتحوله إلى رقم فهرس (Index) داخل الجدول. هذا الرقم يخبرنا أين سنخزن القيمة المرتبطة بهذا المفتاح.
- التخزين والاسترجاع: نستخدم الفهرس المُحسَّن لتخزين القيمة (مثلاً، درجة الطالب) أو للعثور عليها بسرعة لاحقاً.
لنرى مثالاً بسيطاً جداً على فكرة دالة تجزئة:
# مثال مبسط لفكرة دالة تجزئة: حساب طول الاسم
def simple_hash(key):
# دالتنا البسيطة: الفهرس = عدد أحرف المفتاح
return len(key)
# لنحسب الفهرس لبعض المفاتيح
student_name = "أحمد"
index = simple_hash(student_name)
print(f"مفتاح '{student_name}' سيتم تخزينه تقريباً في الفهرس: {index}")
# المخرجات: مفتاح 'أحمد' سيتم تخزينه تقريباً في الفهرس: 4
ملاحظة: هذه دالة مبسطة للشرح فقط، ودوال التجزئة الحقيقية في بايثون معقدة أكثر.
🐍 القاموس (Dictionary) في بايثون: تطبيق عملي لجدول التجزئة
الحمد لله، لست مضطراً لبناء جدول تجزئة من الصفر في بايثون! اللغة توفر لك القاموس (dict)، وهو تطبيق فعّال وجاهز لجدول التجزئة. كل ما تفعله مع القاموس من إضافة وعرض وحذف، يتم داخلياً باستخدام جداول التجزئة.
# إنشاء قاموس (جدول تجزئة) لتخزين درجات الطلاب
# المفتاح (Key): اسم الطالب
# القيمة (Value): الدرجة
grades = {
"أحمد": 95,
"فاطمة": 88,
"خالد": 72
}
# الاسترجاع السريع باستخدام المفتاح (O(1) تقريباً)
print(grades["فاطمة"]) # المخرجات: 88
# الإضافة السريعة لمفتاح وقيمة جديدين
grades["سارة"] = 90
print(grades)
# المخرجات: {'أحمد': 95, 'فاطمة': 88, 'خالد': 72, 'سارة': 90}
⚠️ مشكلة التصادم (Collision) في جداول التجزئة
ماذا لو أعطت دالة التجزئة نفس الفهرس لمفتاحين مختلفين؟ مثلاً، في دالتنا البسيطة simple_hash، المفتاح "أحمد" والمفتاح "وسام" سيعطيان نفس الفهرس (4). هذا الموقف يسمى "تصادم" (Collision).
التصادم مشكلة شبه حتمية في جداول التجزئة، لأن عدد الفهارس محدود بينما المفاتيح المحتملة غير محدودة. لحسن الحظ، هناك طرق ذكية لحلها، مثل:
- السلاسل (Chaining): جعل كل خانة في الجدول تحتوي على قائمة صغيرة، فنخزن جميع القيم المتصادمة في نفس الفهرس ولكن داخل قائمة.
- التنقيح الخطي (Linear Probing): البحث عن خانة فارغة تالية في الجدول لتخزين القيمة الجديدة.
المهم: بايثون تتعامل مع هذه المشاكل تلقائياً داخلياً عند استخدام القواميس، فلا داعي للقلق بشأنها كمبتدئ.
✅ مميزات وعيوب جداول التجزئة
المميزات 🎯:
- سرعة فائقة في البحث والإدراج والحذف (وقت ثابت تقريباً O(1)).
- مرنة، يمكن استخدام أنواع مختلفة من البيانات كمفاتيح (شريطة أن تكون "قابلة للتجزئة" في بايثون).
العيوب ⚠️:
- لا تحفظ ترتيب الإدراج في الإصدارات القديمة من بايثون (إصدار 3.7 فما فوق يحفظ الترتيب).
- تستهلك ذاكرة أكثر من بعض هياكل البيانات الأخرى مثل القوائم أو المجموعات.
- غير مناسبة للبحث عن قيمة دون معرفة مفتاحها، أو للتنقل عبر العناصر بترتيب معين (مثل الترتيب التصاعدي).
🎯 خلاصة الدرس
تعلمنا اليوم أن جداول التجزئة (Hash Tables) هي هياكل بيانات عبقرية تمكننا من الوصول إلى البيانات بسرعة خيالية باستخدام المفتاح (Key). في بايثون، نستخدم القاموس (Dictionary) كتطبيق عملي وجاهز لها. تعمل عن طريق تحويل المفتاح إلى رقم فهرس باستخدام دالة التجزئة، وقد تواجه مشكلة التصادم التي تحلها اللغة تلقائياً. تذكر قوتها في السرعة وضعفها في استهلاك الذاكرة وعدم الترتيب (في بعض الحالات).
🎓 اختبر نفسك
التعليقات
شاركنا رأيك أو أسئلتك حول هذا المقال