درهم‌سازی کامل پویا

در علم کامپیوتر، درهم سازی پویای کامل، تکنیکی است برای از بین بردن تصادم در یک داده ساختار جدول درهم سازی. این تکنیک برای پرسمان‌های سریع، درج و حذف روی مقادیر زیادی از داده کاربرد دارد.

جزئیات

در این روش، ورودی‌هایی که به یک خانه از جدول نظیر می‌شوند، مانند یک جدول درهم سازی سطح دوم جدا سازماندهی می‌شوند. اگر k ورودی در مجموعه S داشته باشیم، برای جدول درهم سازی ثانویه، k² خانه اختصاص می‌دهیم و تابع درهم سازی آن، از توابع جهانی درهم سازی به صورت تصادفی به گونه‌ای انتخاب می‌شوند که عاری از تصادم باشد (برای مثال، تابع درهم سازی کامل). بنابراین هزینه جستجو مطمئناً در بدترین حالت از (1)O خواهد شد.
function Locate(x) is
       j = h(x);
       if (position hⱼ(x) of subtable Tⱼ contains x (not deleted))
          return (x is in S);
       end if
       else
          return (x is not in S);
       end elseend
با اینکه هر جدول سطح دوم، به یک فضای درجه دوم نیاز دارد، اگر کلیدهای وارد شده به جدول سطح اول دارای توزیع یکنواخت باشند، کل ساختار از فضای (O(n خواهد بود؛ زیرا سایز سطل به احتمال زیاد، کم است.
در طول درج ورودی جدید x در مکان j اُم، شمارنده جهانی دستورها، count، یک واحد افزایش می‌یابد. اگر x در j وجود داشته باشد اما به عنوان یک عضو حذف شده برچسب خورده باشد، برچسب آن برداشته می‌شود. اگر x در j یا زیرجدول Tⱼ وجود داشته باشد و به عنوان یک عضو حذف شده برجسب نخورده باشد، پس یک تصادم روی داده و خانه j اُم سطل جدول سطح دوم Tⱼ دوباره با انتخاب تصادفی تابع درهم سازی hⱼ ساخته می‌شود. زیرا ضریب بارگذاری جدول سطح دوم، کم نگه داشته می‌شود. بازسازی کم صورت گرفته و هزینه سرشکن درج‌ها، از (1)O خواهد شد.
function Insert(x) is
       count = count + 1;
       if (count> M)
          FullRehash(x);
       end if
       else
          j = h(x);
          if (Position hⱼ(x) of subtable Tⱼ contains x)
             if (x is marked deleted)
                remove the delete marker;
             end if
          end if
          else
             bⱼ = bⱼ + 1;
             if (bⱼ <= mⱼ)
                if position hⱼ(x) of Tⱼ is empty
                   store x in position hⱼ(x) of Tⱼ;
                end if
                else
                   Put all unmarked elements of Tⱼ in list Lⱼ;
                   Append x to list Lⱼ;
                   bⱼ = length of Lⱼ;
                   repeat
                      hⱼ = randomly chosen function in Hₛⱼ;
                   until hⱼ is injective on the elements of Lⱼ;
                   for all y on list Lⱼ
                      store y in position hⱼ(y) of Tⱼ;
                   end for
                end else
             end if
             else
                mⱼ = ۲ * max{1, mⱼ};
                sⱼ = ۲ * mⱼ * (mⱼ - 1);
                if the sum total of all sⱼ ≤ ۳۲ * M² / s(M) + 4 * M
                   Allocate sⱼ cells for Tⱼ;
                   Put all unmarked elements of Tⱼ in list Lⱼ;
                   Append x to list Lⱼ;
                   bⱼ = length of Lⱼ;
                   repeat
                      hⱼ = randomly chosen function in Hₛⱼ;
                   until hⱼ is injective on the elements of Lⱼ;
                   for all y on list Lⱼ
                      store y in position hⱼ(y) of Tⱼ;
                   end for
                end if
                else
                   FullRehash(x);
                end else
             end else
          end else
       end elseend
حذف عنصر xبه سادگی بدون اینکه واقعاً آن را حذف کند یا count را زیاد کند، آن را به عنوان یک عضو حذف شده علامتگذاری می‌کند. در صورت انجام هردو عمل حذف و درج، اگر count به آستانه M برسد، کل جدول بازسازی می‌شود. M در ابتدای یک فاز جدید، یک مقدار مشخص و چند برابر سایز S است. در اینجا فاز به معنای زمان بین بازسازی‌های کامل است. هزینه سرشکن حذف برابر (O(1 است. توجه کنید که در اینجا، مقدار -۱ در تابع "(Delete(x" بیانگر یک مقداری است که در مقادیر ممکن Uنیست.
function Delete(x) is
       count = count + 1;
       j = h(x);
       if position h(x) of subtable Tj contains x
          mark x as deleted;
       end if
       else
          return (x is not a member of S);
       end else
       if (count>= M)
          FullRehash(-1);
       end ifend
یک بازسازی کامل از جدولS، با پاک کردن تمام اعضای برچسب خورده شروع شده و با مقدار دهی آستانه بعدی M در یک ثابت که چند برابر سایز S است ادامه پیدا می‌کند. یک تابع درهم سازی، که S را به چند زیرمجموعه(s(M تقسیم می‌کند (که سایز زیرمجموعه j برابر sⱼ است) آنقدر به صورت تصادفی انتخاب می‌شود تا:
در نهایت، برای هر زیرجدول Tⱼ، یک تابع درهم سازی hⱼ به صورت تصادفی آنقدر از Hₛⱼ انتخاب می‌شود تا hⱼ روی Tⱼیک به یک باشد. زمان پیش‌بینی شده برای بازسازی کامل جدولS با سایزn برابر (O(n خواهد شد.
function FullRehash(x) is
       Put all unmarked elements of T in list L;
       if (x is in U)
          append x to L;
       end if
       count = length of list L;
       M = (1 + c) * max{count, 4};
       repeat
          h = randomly chosen function in Hs(M);
          for all j <s(M)
             form a list Lⱼ for h(x) = j;
             bⱼ = length of Lⱼ;
             mⱼ = ۲ * bⱼ;
             sⱼ = ۲ * mⱼ * (mⱼ - 1);
          end for
       until the sum total of all sⱼ ≤ ۳۲ * M² / s(M) + 4 * M
       for all j <s(M)
          Allocate space sⱼ for subtable Tⱼ;
          repeat
             hⱼ = randomly chosen function in Hₛⱼ;
          until hⱼ is injective on the elements of list Lⱼ;
       end for
       for all x on list Lⱼ
          store x in position hⱼ(x) of Tⱼ;
       end forend