WEEK 3 • هياكل بيانات متقدمة

Hash Table

جدول التجزئة

إيه هو الـ Hash Table؟

🗂️ الفكرة الأساسية

📖 تشبيه دليل التليفون

تخيل عندك دليل تليفون:

  • • بتدور على اسم الشخص (Key)
  • • بتلاقي رقم تليفونه (Value)
  • • مش محتاج تقلب كل الصفحات - بتروح للحرف الأول مباشرة!

الـ Hash Table نفس الفكرة: بيحول الـ Key لـ index مباشرة!

⚙️ الـ Hash Function

الـ Hash Function هي اللي بتحول الـ Key لـ index:

"apple"hash()index 3
"banana"hash()index 7

مثال بسيط: hash(key) = مجموع ASCII values % حجم الـ array

⚡ السرعة

Insert

O(1)*

Search

O(1)*

Delete

O(1)*

* Average case - في حالة عدم وجود collisions كتير

Collisions

التصادمات - المشكلة الكبيرة!

⚠️ إيه هو الـ Collision؟

لما key مختلفة يجيلها نفس الـ index!

"apple" → hash() → index 3
"papel" → hash() → index 3Collision! 💥

Chaining (سلسلة)

كل bucket فيها linked list من العناصر

لو حصل collision، ضيف العنصر في الـ list

[0]
cat5
[1]
[2]
apple3
papel7

Open Addressing (العنونة المفتوحة)

لو المكان مشغول، دور على مكان فاضي

Linear Probing: جرب المكان التالي

[0]
cat5
[1]
[2]
apple3
[3]
papel7
← moved!

Load Factor

📊 إيه هو الـ Load Factor؟

Load Factor = عدد العناصر ÷ حجم الـ array

λ = n / m

n = عدد العناصر، m = حجم الـ table

λ < 0.5

ممتاز! 🚀

0.5 ≤ λ ≤ 0.7

مقبول ⚠️

λ > 0.7

محتاج resize! 🔴

💡 ليه مهم؟

كل ما الـ Load Factor زاد، كل ما الـ collisions زادت!
عشان كده لما يوصل لـ 0.7، بنعمل resize (نضاعف الحجم).

INTERACTIVE

Hash Table Demo

Load Factor: 0.00

Enter a key and value, then insert.

Implementation

HashTable.js
class HashTable {
  constructor(size = 10) {
    this.buckets = new Array(size).fill(null).map(() => []);
    this.size = size;
    this.count = 0;
  }

  // Hash Function
  hash(key) {
    let hash = 0;
    for (let char of String(key)) {
      hash = (hash + char.charCodeAt(0)) % this.size;
    }
    return hash;
  }

  // Insert O(1)
  set(key, value) {
    const idx = this.hash(key);
    const bucket = this.buckets[idx];
    const existing = bucket.find(p => p[0] === key);
    if (existing) existing[1] = value;
    else { bucket.push([key, value]); this.count++; }
  }

  // Search O(1)
  get(key) {
    const idx = this.hash(key);
    const pair = this.buckets[idx].find(p => p[0] === key);
    return pair ? pair[1] : undefined;
  }
}

شرح الكود 📖

constructor: بنعمل array من buckets فاضية
hash(): بنحول الـ key لـ index (مجموع ASCII % size)
set(): نحسب الـ index، نضيف في الـ bucket (chaining)
get(): نحسب الـ index، ندور على الـ key في الـ bucket

استخدامات Hash Table

Real-World Examples

  • 📚Dictionary / قاموس
  • 📞Phone Book / دليل تليفون
  • 🔐Password Storage / حفظ كلمات السر
  • 💾Caching / التخزين المؤقت
  • 🔗URL Shortener / تقصير الروابط

In Programming

  • JS:Object, Map, Set
  • Python:dict, set
  • Java:HashMap, HashSet
  • C++:unordered_map, unordered_set