التجزئة المثالية الديناميكية

في علوم الحاسوب ، يُعدّ التجزئة المثالية الديناميكية أسلوبًا برمجيًا لحلّ التصادمات في بنية بيانات جدول التجزئة . [ 1 ] [ 2 ] [ 3 ] ورغم أنها تستهلك ذاكرة أكبر من نظيراتها في جداول التجزئة، إلا أن هذا الأسلوب مفيد في الحالات التي تتطلب إجراء استعلامات سريعة، وإدراجات، وحذف على مجموعة كبيرة من العناصر.

تفاصيل

الحالة الثابتة

مخطط FKS

حُلّت مشكلة التجزئة الثابتة المثلى لأول مرة بشكل عام على يد فريدمان وكوملوس وسزيميريدي. [ 4 ] في ورقتهم البحثية المنشورة عام 1984، [ 1 ] شرحوا بالتفصيل مخطط جدول تجزئة ثنائي الطبقات، حيث يتوافق كل خانة في جدول التجزئة (المستوى الأول) مع جدول تجزئة منفصل من المستوى الثاني. تُجزأ المفاتيح مرتين؛ تُشير قيمة التجزئة الأولى إلى خانة معينة في جدول التجزئة من المستوى الأول، بينما تُشير قيمة التجزئة الثانية إلى موضع تلك الخانة في جدول التجزئة من المستوى الثاني. يُضمن أن يكون جدول المستوى الثاني خاليًا من التصادمات (أي تجزئة مثالية ) عند إنشائه. وبالتالي، يُضمن أن تكون تكلفة البحث O(1) في أسوأ الحالات . [ 2 ]

في الحالة الثابتة، لدينا مجموعة تحتوي على x مدخلات، لكل منها مفتاح فريد، مُسبقًا. يختار فريدمان وكوملوس وسيميريدي جدول تجزئة من المستوى الأول بحجمs=2(x-1){\displaystyle s=2(x-1)}دلاء. [ 2 ]

لإنشاء هذه البيانات، يتم تقسيم x مدخلات إلى s مجموعات بواسطة دالة التجزئة ذات المستوى الأعلى، حيثs=2(x-1){\displaystyle s=2(x-1)}ثم لكل مجموعة تحتوي على k مدخلات، يتم تخصيص جدول من المستوى الثاني معك2{\displaystyle k^{2}}يتم اختيار دالة التجزئة الخاصة بكل خانة عشوائيًا من مجموعة دوال تجزئة شاملة بحيث تكون خالية من التصادمات (أي دالة تجزئة مثالية )، وتُخزّن بجانب جدول التجزئة. إذا أنتجت دالة التجزئة المختارة عشوائيًا جدولًا يحتوي على تصادمات، يتم اختيار دالة تجزئة جديدة عشوائيًا حتى يتم ضمان جدول خالٍ من التصادمات. أخيرًا، باستخدام دالة التجزئة الخالية من التصادمات، يتم تجزئة المدخلات k إلى جدول المستوى الثاني.

الحجم التربيعي لـك2{\displaystyle k^{2}}تضمن المساحة أن يكون إنشاء جدول عشوائي يحتوي على تصادمات نادرًا ومستقلًا عن حجم k ، مما يوفر وقت إنشاء خطيًا مستهلكًا. على الرغم من أن كل جدول من المستوى الثاني يتطلب مساحة تربيعية، إذا تم توزيع المفاتيح المُدخلة في جدول التجزئة من المستوى الأول بشكل منتظم ، فإن الهيكل ككل يشغل المساحة المتوقعةيا(ن){\displaystyle O(n)}المساحة، لأن أحجام الحاويات صغيرة باحتمالية عالية . [ 1 ]

يتم اختيار دالة التجزئة من المستوى الأول تحديدًا بحيث يكون إجمالي المساحة T المستخدمة بواسطة جميع جداول التجزئة من المستوى الثاني ، بالنسبة لمجموعة محددة من x من قيم المفاتيح الفريدة، هو المتوقعيا(ن){\displaystyle O(n)}الفضاء، وبشكل أكثر تحديداًتي<s+4x{\displaystyle T<s+4\cdot x}أظهر فريدمان وكوملوس وسيميريدي أنه بالنظر إلى عائلة تجزئة شاملة من دوال التجزئة، فإن نصف هذه الدوال على الأقل تمتلك تلك الخاصية. [ 2 ]

حالة ديناميكية

يقدم ديتزفيلبينجر وآخرون خوارزمية قاموس ديناميكية، حيث عند إضافة مجموعة من n عنصرًا بشكل تدريجي إلى القاموس، يتم تشغيل استعلامات العضوية دائمًا في وقت ثابت، وبالتالييا(1){\displaystyle O(1)}في أسوأ الأحوال، يكون إجمالي مساحة التخزين المطلوبة هويا(ن){\displaystyle O(n)}(خطي)، ويا(1){\displaystyle O(1)}الوقت المتوقع للإدخال والحذف المستهلك ( الوقت الثابت المستهلك ).

في الحالة الديناميكية، عند إدخال مفتاح في جدول التجزئة، إذا كان مدخله في الجدول الفرعي المقابل مشغولاً، يُقال إن تصادمًا قد حدث، ويُعاد بناء الجدول الفرعي بناءً على إجمالي عدد المدخلات الجديد ودالة التجزئة المختارة عشوائيًا. وذلك لأن عامل التحميل لجدول المستوى الثاني يبقى منخفضًا.1/ك{\displaystyle 1/k}إعادة البناء نادرة، والتكلفة المتوقعة المستهلكة لعمليات الإدخال هييا(1){\displaystyle O(1)}[ 2 ] وبالمثل ، فإن التكلفة المتوقعة المستهلكة لعمليات الحذف هييا(1){\displaystyle O(1)}[ 2 ]

بالإضافة إلى ذلك، فإن الأحجام النهائية للجدول الرئيسي أو أي من الجداول الفرعية غير معروفة في الحالة الديناميكية. إحدى طرق الحفاظ على الأحجام المتوقعةيا(ن){\displaystyle O(n)}يُستخدم فراغ الجدول لحثّ المستخدم على إعادة بناء الجدول بالكامل عند حدوث عدد كافٍ من عمليات الإضافة والحذف. ووفقًا لنتائج ديتزفيلبينجر وآخرون [ 2 ] ، طالما أن العدد الإجمالي لعمليات الإضافة أو الحذف يتجاوز عدد العناصر وقت آخر عملية بناء، فإن التكلفة المتوقعة المُستهلكة للإضافة والحذف تظل ثابتة.يا(1){\displaystyle O(1)}مع الأخذ في الاعتبار إعادة الصياغة الكاملة.

يستخدم تطبيق التجزئة المثالية الديناميكية بواسطة Dietzfelbinger et al. هذه المفاهيم، بالإضافة إلى الحذف الكسول ، ويتم عرضه في الشفرة الزائفة أدناه.

تنفيذ الشفرة الزائفة

تحديد الموقع

دالة Locate( x ) هي j := h( x ) إذا (الموضع hj ( x ) من الجدول الفرعي Tj يحتوي على x (غير محذوف)) أرجع ( x موجود في S ) نهاية إذا وإلا أرجع ( x غير موجود في S ) نهاية وإلا نهاية

أدخل

أثناء إدخال مدخل جديد x في j ، يتم زيادة عداد العمليات العامة، count .

إذا كان x موجودًا في j ، ولكن تم وضع علامة عليه بأنه محذوف، فسيتم إزالة العلامة.

إذا كان x موجودًا في j أو في الجدول الفرعي T j ، ولم يتم وضع علامة عليه بأنه محذوف، فإنه يقال إن تصادمًا قد حدث ويتم إعادة بناء الجدول T j من المستوى الثاني للخزان j باستخدام دالة تجزئة مختلفة مختارة عشوائيًا h j .

دالة Insert( x ) هي count = count + 1؛ إذا كان ( count > M ) FullRehash( x ); end if else j := h( x ); if (Position h j (x) of subtable T j contains x ) if ( x is marked deleted) قم بإزالة علامة الحذف؛ end if end if else b j = b j + 1; if ( b j <= m j ) if the position h j ( x ) of T j is empty قم بتخزين x في الموضع h j ( x ) من T j ؛ نهاية الشرط وإلا ضع جميع العناصر غير المميزة من T j في القائمة L j ؛ أضف x إلى القائمة Lj ؛ bj = طول Lj ؛ كرر hj = دالة مختارة عشوائيًا في H sj؛ حتى تصبح hj أحادية على عناصر Lj ؛ لكل y في القائمة Lj ، خزّن y في الموضع hj ( y ) من Tj ؛ نهاية الحلقة نهاية الشرط وإلا نهاية الشرط وإلا mj = 2 * max{1, mj } ؛ sj = 2 * mj * ( mj - 1إذا كان المجموع الكلي لجميع sj  32 * / s ( M ) + 4 * M ، فخصص sj خلية لـ Tj ؛ ضع جميع العناصر غير المميزة من T j في القائمة L j ؛ أضف x إلى القائمة L j ؛ b j = طول L j ؛ كرر h j = دالة مختارة عشوائيًا في H sj ؛ حتى تصبح h j أحادية على عناصر L j ؛ لكل y في القائمة L  خزّن y في الموضع h j ( y ) من T j ؛ نهاية الحلقة نهاية إذا وإلا FullRehash( xنهاية وإلا نهاية وإلا نهاية وإلا نهاية نهاية

يمسح

يؤدي حذف العنصر x إلى وضع علامة عليه كمحذوف دون إزالته، ويزيد قيمة العداد . في حالة الإضافة والحذف، إذا وصل العداد إلى عتبة يُعاد بناء الجدول بالكامل، حيث M هو مضاعف ثابت لحجم S عند بدء مرحلة جديدة . تشير المرحلة هنا إلى الفترة الزمنية بين عمليات إعادة البناء الكاملة. لاحظ أن -1 في "Delete( x )" يُمثل عنصرًا غير موجود في مجموعة جميع العناصر الممكنة U.

دالة الحذف ( x ) هي: count = count + 1؛ j = h( xإذا كان الموضع hj ( x ) في الجدول الفرعي Tj يحتوي على x ، فضع علامة على x كمحذوف؛ وإلا فأرجع (x ليس عضوًا في S)؛ وإلا إذا كان ( count >= M ) إعادة التجزئة الكاملة(-1)؛ نهاية الشرط نهاية

إعادة بناء كاملة

تبدأ عملية إعادة بناء جدول S بالكامل بإزالة جميع العناصر التي تم وضع علامة عليها بأنها محذوفة، ثم يتم تعيين قيمة العتبة التالية M إلى مضاعف ثابت لحجم S. يتم اختيار دالة تجزئة، تقسم S إلى s ( M ) مجموعة فرعية، حيث يكون حجم المجموعة الفرعية j هو sj ، بشكل عشوائي متكرر حتى:

0جs(م)sج32م2s(م)+4م.{\displaystyle \sum _{0\leq j\leq s(M)}s_{j}\leq {\frac {32M^{2}}{s(M)}}+4M.}

أخيرًا، لكل جدول فرعي T<sub> j</sub> ، يتم اختيار دالة تجزئة h <sub> j</sub> عشوائيًا بشكل متكرر من H<sub> sj</sub> حتى تصبح h <sub> j </sub> دالة أحادية على عناصر T <sub> j </sub>. الوقت المتوقع لإعادة بناء جدول S بالكامل بحجم n هو O( n ). [ 2 ]

دالة FullRehash( x ) هي: ضع جميع العناصر غير المميزة من T في القائمة L ؛ إذا كان ( x موجودًا في U ) أضف x إلى L ؛ انتهى الشرط. عدد العناصر = طول القائمة L ؛ M = (1 + c ) * max{ عدد العناصر ، 4 }؛ كرر h = دالة مختارة عشوائيًا في H s(M) ؛ لكل j < s ( M ) كوّن قائمة L <sub>j</sub> لكل h( x ) = j ؛ b<sub> j </sub> = طول L<sub> j </sub>؛ m<sub> j</sub> = 2 * b <sub> j </sub> ؛ s <sub>j</sub> = 2 * m <sub>j </sub> * ( m <sub>j</sub> - 1)؛ انتهى التكرار حتى يصبح مجموع جميع s <sub>j </sub> ≤ 32 * M <sup>2</sup> / s ( M ) + 4 * M لكل j < s ( M ). خصص مساحة sj للجدول الفرعي Tj ؛ كرر hj = دالة مختارة عشوائيًا في H sj ؛ حتى تصبح hj أحادية على عناصر القائمة Lj ؛ نهاية الحلقة ؛ لكل x في القائمة Lj ، خزّن x في الموضع hj ( x ) من Tj ؛ نهاية الحلقة .

انظر أيضاً

مراجع

  1. 1 2 3 Fredman, ML, Komlós, J., and Szemerédi, E. 1984. تخزين جدول متفرق مع 0(1) وقت الوصول لأسوأ حالة. J. ACM 31, 3 (يونيو 1984)، 538-544 http://portal.acm.org/citization.cfm?id=1884#
  2. 1 2 3 4 5 6 7 8 ديتزفيلبينجر، م.، كارلين، أ.، ميلهورن، ك.، ماير أوف دير هايد، ف.، رونيرت، هـ.، وتارجان، ر. إي. 1994. "التجزئة المثالية الديناميكية: الحدود العليا والسفلى". مؤرشف في 4 مارس 2016 على موقع Wayback Machine . مجلة SIAM للحوسبة، 23، 4 (أغسطس 1994)، 738-761. http://portal.acm.org/citation.cfm?id=182370 doi : 10.1137/S0097539791194094
  3. إريك ديمين، جيف ليند. 6.897: هياكل البيانات المتقدمة . مختبر علوم الحاسوب والذكاء الاصطناعي بمعهد ماساتشوستس للتكنولوجيا. ربيع 2003.
  4. ياب، تشي. "التصميم الشامل لمخطط FKS" . جامعة نيويورك ( FTP ) . تم الاطلاع عليه بتاريخ 15 فبراير 2015 .(للاطلاع على المستندات، انظر صفحة المساعدة: FTP )