المستوى: مبتدئ. المقال ده موجّه لحد لسه في بداية طريقه مع البرمجة وهياكل البيانات. مفيش شرط مسبق غير إنك تقدر تقرأ كود بسيط. في الآخر هتبقى فاهم إيه هو Hash Table، وليه بيلاقي أي قيمة في خطوة واحدة.
لو بتدوّر على قيمة جوّه مليون سجل، قدامك طريقتين. الأولى بتلفّ على السجلات واحد واحد لحد ما تلاقي اللي انت عايزه. التانية بتوصّلك للقيمة في خطوة واحدة، مهما كبر الحجم. التانية اسمها Hash Table (جدول الهاش)، وهي السبب الحقيقي إن dict في Python و Map في JavaScript بيبانوا كأنهم سحر.
Hash Table: السر وراء البحث في خطوة واحدة
الفكرة كلها بتتلخّص في جملة واحدة: بدل ما تدوّر على المكان، احسب المكان. تعالَ نوصل للجملة دي بالتفاصيل — بمثال بسيط الأول، وبعدين بالتعريف الدقيق وكود Python شغّال.
المشكلة باختصار
تخيّل متجر إلكتروني فيه 800 ألف منتج. كل ما زائر يفتح صفحة منتج، الكود بيدوّر على المنتج بالكود بتاعه (الـ SKU). لو المنتجات متخزّنة في قائمة (list) عادية، الكمبيوتر بيبدأ من أول عنصر ويقارن واحد واحد. في أسوأ حالة بيقارن 800 ألف مرة عشان يجيب منتج واحد.
ده اسمه البحث الخطي (Linear Search). تكلفته بتكبر مع البيانات: ضِعف البيانات يعني ضِعف الوقت. الـ Hash Table بيكسر العلاقة دي: وقت البحث بيفضل ثابت تقريبًا، سواء عندك ألف سجل أو عشرة ملايين. الافتراض هنا إنك بتدوّر بمفتاح محدّد (key) — مش بمدى ولا بترتيب. النقطة دي مهمة، وهنرجعلها في آخر المقال.
اشرحها بمثال: موظف الأمانات في صالة الأفراح
تخيّل صالة أفراح فيها مكتب أمانات. لما توصل، بتدّي شنطتك للموظف. الموظف ما بيحطّهاش في أول مكان فاضي يلاقيه. عنده 100 عمود مرقّمين من 0 لـ 99. بياخد اسمك، بيعمل عليه حسبة بسيطة بتطلّع رقم بين 0 و 99، والرقم ده هو العمود اللي هيعلّق عليه الشنطة.
لما ترجع تستلم، الموظف مش بيلفّ على المية عمود. بيعيد نفس الحسبة على اسمك، يطلعله نفس الرقم، يروح للعمود ده مباشرة. مية ضيف ولا ضيف واحد، نفس عدد الخطوات: حسبة واحدة ومشية واحدة.
الموظف ده بالظبط هو الـ Hash Table. القاعدة اللي بيحوّل بيها الاسم لرقم عمود اسمها دالة الهاش. والأعمدة المرقّمة هي مصفوفة (Array) بتتخزّن فيها البيانات. خلاص كده الصورة وضحت؟ يبقى نعرّفها بدقة.
التعريف العلمي: يعني إيه Hash Table
الـ Hash Table هيكل بيانات بيخزّن أزواج من النوع (مفتاح، قيمة). بيستخدم دالة هاش عشان تحسب — انطلاقًا من المفتاح — مكان (index) جوّه مصفوفة داخلية. بدل ما تدوّر على المفتاح، انت بتحسب مكانه على طول.
العمليات التلاتة الأساسية — الإضافة، البحث، الحذف — بتاخد في المتوسط زمنًا ثابتًا، يعني O(1): مش بيتأثر بعدد العناصر. ده مذكور في الفصل 11 من كتاب Introduction to Algorithms لـ Cormen وزملائه، تحت فرضية إن دالة الهاش بتوزّع المفاتيح بشكل منتظم على الخانات.