هش رولینگ (Rabin-Karp)

الگوریتم Rabin-Karp: جستجو با هش رولینگ — محاسبه هش پنجره بعدی در O(1) و مقایسه با KMP

ایده: هش به‌جای مقایسه

به‌جای مقایسه کاراکتر به کاراکتر، هش الگو و هر پنجره از متن را مقایسه کنیم — اعداد سریع‌تر از رشته مقایسه می‌شوند!

هش رولینگ — جادوی O(1)

هش پنجره بعدی را از قبلی بساز (مثل پنجره لغزان!):

هش جدید = (هش قبلی − کاراکتر_خروجی × base^(m-1)) × base + کاراکتر_ورودی

مثل عدد: «123» ← «234» = (123 − 1×100) × 10 + 4. هر پنجره فقط O(1)!

الگوریتم

  1. هش الگو و پنجره اول متن را حساب کن
  2. پنجره را لغزان بده؛ هش را O(1) به‌روزرسانی کن
  3. هش برابر؟ مقایسه واقعی کن (ضد برخورد!)

چرا مقایسه واقعی لازم است؟

هش‌های متفاوت = قطعاً متفاوت؛ اما هش برابر ≠ قطعاً برابر (برخورد!). پس بعد از تطابق هش، کاراکترها را چک می‌کنیم. با هش خوب، برخورد نادر و میانگین O(n+m).

مدیریت اعداد بزرگ: mod

هش رشته بلند خیلی بزرگ می‌شود؛ با mod عدد اول بزرگ (مثل 10⁹+7) کوچک نگه می‌داریم — و برخورد را نادر.

KMP یا Rabin-Karp؟

ویژگیKMPRabin-Karp
بدترین حالتO(n+m) تضمینی ✓O(n×m) (برخورد زیاد)
میانگینO(n+m)O(n+m) ✓
پیاده‌سازیپیچیده‌تر (LPS)ساده‌تر ✓
جستجوی چند الگوسختعالی ✓ (هش مجموعه)
تشخیص سرقت ادبی—✓✓ (تقسیم به پنجره‌ها)

کاربرد ویژه: چند الگو هم‌زمان

وقتی چند الگو دارید (مثل فیلتر کلمات)، هش همه را در مجموعه بگذارید و پنجره‌ها را یک‌بار چک کنید — جایی که KMP باید جدا برای هر الگو اجرا شود!

نکته: Rabin-Karp پایه ایده «اثر انگشت» در تشخیص سرقت ادبی و ابزار diff است — تقسیم سند به پنجره‌های k-تایی و مقایسه هش‌ها!

جمع‌بندی

این مبحث بخشی از دوره آموزش کامل الگوریتم‌ها است.

ابزارهای مرتبط