AlgoVerse

جدول درهم‌سازی با زنجیره

هر خانه‌ی جدول یک لیست است و کلیدهایی که به یک خانه درهم می‌شوند پشت هم در همان لیست می‌روند؛ برخورد هیچ‌وقت جا را پر نمی‌کند.

تابع درهم‌سازی h(key) = key mod m هر کلید را به یکی از m خانه می‌برد. دو کلید ممکن است به یک خانه بروند (برخورد). در روش زنجیره‌ای هر خانه یک لیست است و همه‌ی کلیدهای آن خانه در همان لیست قرار می‌گیرند.

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

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

  1. def hash_chaining(keys):
  2. m = 7
  3. table = [[] for _ in range(m)]
  4. for key in keys:
  5. slot = key % m
  6. table[slot].append(key)
  7. longest = max(len(chain) for chain in table)
  8. return table

ناوردا: هر کلید در لیست خانه‌ی h(key) است؛ پس برای جست‌وجو فقط همان یک لیست را باید گشت.

شروع اجرا

key—
slot—

جدول هنوز خالی است.

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

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

keys list

102231415281788593

Call stack

  1. hash_chaining()خط 1
گام ۱ از ۳۶
خط سیاه = insert · خط نارنجی = گام کلیدیhash: 0/10 · insert: 0/10 · longest: 0/1
    توضیح

    ایده

    تابع درهم‌سازی h(key) = key mod m هر کلید را به یکی از m خانه می‌برد. دو کلید ممکن است به یک خانه بروند (برخورد). در روش زنجیره‌ای هر خانه یک لیست است و همه‌ی کلیدهای آن خانه در همان لیست قرار می‌گیرند.

    هزینه

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

    مقایسه با آدرس‌دهی باز

    در کاوش خطی کلیدها در خود جدول می‌نشینند و جدول ممکن است پر شود؛ اینجا جدول هیچ‌وقت پر نمی‌شود، ولی برای لیست‌ها حافظه‌ی اضافه لازم است.

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

    • هر سطر جدول یک خانه است؛ سطری که همین الان کلید گرفت رنگی می‌شود.