AlgoVerse

جدول درهم‌سازی با کاوش خطی

هر کلید در خانه‌ی key mod m می‌نشیند؛ اگر پر بود، خانه‌های بعدی را یکی‌یکی امتحان می‌کند تا جای خالی پیدا شود.

جدول درهم‌سازی کلیدها را در آرایه‌ای به اندازه‌ی m نگه می‌دارد و جای هر کلید را با یک تابع درهم‌سازی حساب می‌کند؛ اینجا h(k) = k mod m. اگر آن خانه پر بود (برخورد)، در «آدرس‌دهی باز» خانه‌ی دیگری از خود جدول امتحان می‌شود. در کاوش خطی، خانه‌های h(k)+1، h(k)+2، … به ترتیب امتحان می‌شوند.

ادامه‌ی توضیح ↓
ورودی:
n=9خروجی PDF

نُه کلید در جدول ۱۱ خانه‌ای؛ چند برخورد پیش می‌آید و کلیدها کنار هم خوشه می‌سازند.

  1. def hash_insert_all(keys):
  2. m = 11
  3. table = [None] * m
  4. for key in keys:
  5. i = 0
  6. while True:
  7. j = (key + i) % m
  8. if table[j] is None:
  9. table[j] = key
  10. break
  11. i = i + 1
  12. return table

ناوردا: هر کلید در اولین خانه‌ی خالیِ دنباله‌ی h(k), h(k)+1, … (به پیمانه‌ی m) نشسته است.

شروع اجرا

10022131243154285176887598

متغیرهای محلی

نارنجی = در همین گام عوض شد

keys list

10223141528178859

Call stack

  1. hash_insert_all()خط 1
گام ۱ از ۹۶
خط سیاه = place · خط نارنجی = گام کلیدیprobe: 0/16 · place: 0/9 · collision: 0/7

    رشد تعداد عملیات با اندازه‌ی ورودی

    میانگین ۱۲ گراف تصادفی برای هر n (با seed ثابت). نشانگر توخالی = ورودی فعلی.

    • collision
    • ورودی فعلی (n=9)
    05101546810n = تعداد عضوهای آرایهcollision
    نمایش به شکل جدول
    ncollision
    40.3
    62.6
    83.9
    1011
    توضیح

    ایده

    جدول درهم‌سازی کلیدها را در آرایه‌ای به اندازه‌ی m نگه می‌دارد و جای هر کلید را با یک تابع درهم‌سازی حساب می‌کند؛ اینجا h(k) = k mod m. اگر آن خانه پر بود (برخورد)، در «آدرس‌دهی باز» خانه‌ی دیگری از خود جدول امتحان می‌شود. در کاوش خطی، خانه‌های h(k)+1، h(k)+2، … به ترتیب امتحان می‌شوند.

    خوشه‌بندی اولیه

    کاوش خطی ساده است ولی یک ضعف دارد: کلیدها پشت سر هم خوشه می‌سازند و هر کلیدی که به هر جای خوشه برسد، باید تا انتهای آن برود؛ پس خوشه‌ها بزرگ‌تر و بزرگ‌تر می‌شوند. ورودی «یک خوشه» این را نشان می‌دهد. کاوش مربعی و درهم‌سازی دوگانه این مشکل را کم می‌کنند.

    هزینه

    اگر جدول خیلی پر نباشد (ضریب بار α = n/m کمتر از حدود ۰٫۷)، هر درج به‌طور متوسط O(1) کاوش دارد. با پر شدن جدول، تعداد کاوش‌ها تند بالا می‌رود.

    در trace به چه چیزی نگاه کنی

    • خانه‌های خط‌چین خالی‌اند؛ key بالای جدول کلیدی است که درج می‌شود و فلش j خانه‌ی در حال کاوش.
    • شمار collision را در «بدون برخورد»، «مثال به سبک کتاب» و «یک خوشه» مقایسه کن.