ضغط ماركوف الديناميكي

ضغط ماركوف الديناميكي ( DMC ) هو خوارزمية ضغط بيانات بدون فقدان ، طوّرها غوردون كورماك ونايجل هورسول . [ 1 ] تستخدم هذه الخوارزمية ترميزًا حسابيًا تنبؤيًا مشابهًا للتنبؤ بالمطابقة الجزئية (PPM)، إلا أنها تتنبأ بالمدخلات بتًا واحدًا في كل مرة (بدلًا من بايت واحد في كل مرة). يتميز ضغط ماركوف الديناميكي بنسبة ضغط جيدة وسرعة متوسطة، مماثلة لـ PPM، ولكنه يتطلب ذاكرة أكبر نوعًا ما، ولا يُستخدم على نطاق واسع. من بين التطبيقات الحديثة، برنامج الضغط التجريبي hook من تطوير نانيا فرانشيسكو أنطونيو، و ocamyd من تطوير فرانك شويلينجر، ونموذج فرعي في paq8l من تطوير مات ماهوني. وتستند هذه التطبيقات إلى تطبيق غوردون كورماك المكتوب بلغة C عام 1993 .

الخوارزمية

تتنبأ خوارزمية DMC وتُشفّر بتًا واحدًا في كل مرة. وهي تختلف عن خوارزمية PPM في أنها تُشفّر البتات بدلًا من البايتات، وتختلف عن خوارزميات مزج السياق مثل PAQ في وجود سياق واحد فقط لكل تنبؤ. ثم يُشفّر البت المُتنبأ به باستخدام التشفير الحسابي .

الترميز الحسابي

يتكون مُشفِّر حسابي ثنائي، مثل DMC ، من مُكوِّنَين : مُتنبئ ومُشفِّر حسابي. يستقبل المُتنبئ سلسلة إدخال مكونة من n بت، x = x₁ x₂ ... xₙ ، ويُعيِّن لها احتمالًا p ( x )، مُعبَّرًا عنه كحاصل ضرب سلسلة من التنبؤات، p ( x₁ ) p ( x₂ | x₁ ) p ( x₃ | x₁ x₂ ) ... p ( xₙ | x₁ x₂ ... xₙ - 1 ) . يحتفظ المُشفِّر الحسابي برقمين ثنائيين عاليي الدقة، pₜ و pₜ ، يُمثِّلان النطاق المُحتمل للاحتمال الكلي الذي قد يُعيِّنه النموذج لجميع السلاسل الأقل معجميًا من x ، بالنظر إلى بتات x التي تمت رؤيتها حتى الآن. الشفرة المُضغوطة لـ x هي pₜx ، وهي أقصر سلسلة بت تُمثِّل عددًا بين pₜ و pₜ . من الممكن دائمًا إيجاد عدد في هذا النطاق لا يزيد طوله عن بت واحد عن حد شانون ، log₂ 1 / p ( x ) . يمكن الحصول على أحد هذه الأرقام من p high عن طريق حذف جميع البتات اللاحقة بعد البت الأول الذي يختلف عن p low . 

تتم عملية الضغط على النحو التالي: يتم ضبط النطاق الأولي على p<sub> low</sub> = 0 و p<sub> high </sub> = 1. لكل بت، يُقدّر المُتنبئ احتمالية الحصول على 0 أو 1 على التوالي، وذلك باستخدام p <sub> 0</sub> = p ( xi = 0 | x <sub> 1 </sub> x<sub> 2</sub> ... x <sub>i - 1 </sub> ) و p <sub>1 </sub> = 1 - p <sub> 0 </sub>. ثم يقوم المُشفّر الحسابي بتقسيم النطاق الحالي ( p <sub>low</sub> , p <sub>high</sub> ) إلى جزأين بنسبة p <sub>0</sub> و p <sub>1 </sub>. بعد ذلك، يصبح النطاق الفرعي المُقابل للبت التالي xi هو النطاق الجديد.   

في عملية فك الضغط، يقوم المتنبئ بإجراء سلسلة متطابقة من التنبؤات، بناءً على البتات التي تم فك ضغطها حتى الآن. يقوم المشفر الحسابي بإجراء سلسلة متطابقة من تقسيمات النطاق، ثم يختار النطاق الذي يحتوي على p x ويُخرج البت x i المقابل لهذا النطاق الفرعي.

عمليًا، ليس من الضروري الاحتفاظ بقيمتي p المنخفضة و p العالية في الذاكرة بدقة عالية. فمع تضييق النطاق، ستكون البتات الأولى لكلا الرقمين متطابقة، ويمكن إخراجها فورًا.

نموذج DMC

مُتنبئ DMC عبارة عن جدول يربط السياقات (على مستوى البت) بزوج من القيم، n₀ و n₁ ، يُمثلان عدد الأصفار والآحاد التي لوحظت سابقًا في هذا السياق. وبالتالي، يتنبأ بأن البت التالي سيكون 0 باحتمالية p₀ = n₀ / n = n₀ / ( n₀ + n₁ ) ، و 1 باحتمالية p₁ = 1 − p₀ = n₁ / n . بالإضافة إلى ذلك ، يحتوي كل مدخل في الجدول على زوج من المؤشرات إلى السياقات التي تم الحصول عليها بإضافة إما 0 أو 1 إلى يمين السياق الحالي (مع إمكانية حذف بتات من اليسار). لذا ، ليس من الضروري أبدًا البحث عن السياق الحالي في الجدول؛ يكفي الاحتفاظ بمؤشر إلى السياق الحالي واتباع الروابط.    

في تطبيق DMC الأصلي، يُمثل الجدول الأولي مجموعة جميع السياقات التي يتراوح طولها بين 8 و15 بتًا والتي تبدأ عند حد بايت. الحالة الأولية هي أي من سياقات الـ 8 بتات. أما العدّات فهي أعداد عشرية مُهيأة بقيمة ثابتة صغيرة غير صفرية، مثل 0.2. لا تُهيأ العدّات إلى الصفر للسماح بترميز القيم حتى لو لم يسبق رؤيتها في السياق الحالي.

عملية النمذجة هي نفسها بالنسبة للضغط وفك الضغط. لكل بت، يتم حساب p 0 و p 1 ، ويتم ترميز أو فك ترميز البت x i ، ويتم تحديث النموذج بإضافة 1 إلى العدد المقابل لـ x i ، ويتم العثور على السياق التالي من خلال اجتياز الرابط المقابل لـ x i .

إضافة سياقات جديدة

تُعادل خوارزمية DMC الموصوفة أعلاه نموذج سياق من الرتبة الأولى. مع ذلك، من المعتاد إضافة سياقات أطول لتحسين الضغط. إذا كان السياق الحالي هو A، وكان السياق التالي B سيحذف بتات من اليسار، فقد تُضيف خوارزمية DMC (تستنسخ) سياقًا جديدًا C من B. يُمثل C نفس سياق A بعد إضافة بت واحد إلى اليمين كما هو الحال مع B، ولكن دون حذف أي بتات من اليسار. وبالتالي، سينتقل الرابط من A من B ليشير إلى C. سيُقدم كل من B وC نفس التنبؤ، وسيشير كلاهما إلى نفس زوج الحالات التالية. سيكون العدد الإجمالي، n = n₀ + n₁، لـ C مساويًا للعدد nₓ لـ A ( للبت المدخل x ) ، وسيتم طرح هذا العدد من B.   

على سبيل المثال، لنفترض أن الحالة A تمثل السياق 11111. عند إدخال البت 0، تنتقل الحالة A إلى الحالة B التي تمثل السياق 110، والذي يتم الحصول عليه بحذف 3 بتات من اليسار. في السياق A، كانت هناك 4 بتات صفرية وعدد من البتات الآحادية. في السياق B، كانت هناك 3 بتات صفرية و7 بتات آحادية ( n  =  10)، مما يشير إلى أن p1 = 0.7.

ولايةن ٠ن 1التالي 0التالي 1
أ = 111114ب
ب = 11037هـF

تم استنساخ C من B. وهو يمثل السياق 111110. يتوقع كل من B وC أن تكون قيمة p 1 = 0.7، وينتقل كلاهما إلى نفس الحالات التالية، E وF. عدد مرات تكرار C هو n = 4، وهو يساوي n 0 بالنسبة لـ A. وهذا يترك n = 6 بالنسبة لـ B.

ولايةن ٠ن 1التالي 0التالي 1
أ = 111114ج
ب = 1101.84.2هـF
ج = 1111101.22.8هـF

تُستنسخ الحالات قبل الانتقال إليها مباشرةً. في خوارزمية DMC الأصلية، يُشترط لاستنساخ حالة ما أن يكون الانتقال من الحالة A إلى الحالة B على الأقل 2، وأن يكون عدد مرات الانتقال إلى الحالة B أكبر من ذلك بمقدار 2 على الأقل. (عندما يكون الحد الثاني أكبر من 0، يضمن ذلك أن الحالات الأخرى ستنتقل إلى الحالة B بعد الاستنساخ). تسمح بعض التطبيقات، مثل hook، بتحديد هذه الحدود كمعاملات. في paq8l، تزداد هذه الحدود مع استهلاك الذاكرة لإبطاء معدل نمو الحالات الجديدة. في معظم التطبيقات، عند استنفاد الذاكرة، يُهمل النموذج ويُعاد تهيئته إلى النموذج الأصلي ذي الترتيب البايتي 1.

مراجع

  1. جوردون كورماك ونايجل هورسبول، "ضغط البيانات باستخدام نمذجة ماركوف الديناميكية"، مجلة الكمبيوتر 30:6 (ديسمبر 1987)