ترميز مجموعة من الفهارس من مجموعة

نحن بحاجة إلى ترميز المعلومات حول وجود أو عدم وجود عناصر في قائمة المثلثات.

سنتناول هذا من خلال التركيز على المشكلة المكافئة لترميز مجموعة (حاوية تخزن عناصر غير متكررة ، محسّنة للكشف عن وجود أو عدم وجود عناصر محددة) لا يمكن أن تحتوي إلا على عناصر تنتمي إلى النطاق الصحيح: [0 ، عدد المثلثات - 1] ، أي نطاق فهرس قائمة المثلثات.


الهدف: ترميز هذه المجموعة باستخدام الحد الأدنى لعدد البتات.

الوصف

دعونا ننظر إلى النهج تافهة، والتي في كثير من الحالات يمكن أن يكون الأمثل:

فإنه سيتم تخزين:

  • عدد العناصر في النطاق (مع 31 بت ، لأن القوائم في جافا تقتصر على عناصر 2 31 - 1).
  • يتبعها 1 بت لكل فهرس ، مع الإشارة إلى ما إذا كان العنصر موجودًا في المجموعة أم لا.

هذا هو التنفيذ الذي كان الإصدار الأول من ضاغط الصورة كسورية، لتخزين البيانات من الانقسامات ودمج التثليث.

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


الهدف الآن هو تحسين هذا الترميز التافه ، لمعرفة ما إذا كان يمكن الحصول على ترميز أكثر ضغطًا من حيث عدد البتات المستخدمة.


النهج الأول عندما يكون عدد العناصر في المجموعة أصغر بكثير من حجم النطاق، يمكننا النظر في تخزين المؤشرات الحالية.

في هذه الحالة ، سيكون الاستخدام:

  • 31 بت لعدد العناصر في النطاق.
  • 31 بت لعدد العناصر الموجودة في المجموعة.
  • 31 بت * عدد العناصر الموجودة في المجموعة.


النهج الثاني . نقوم بتحسين عدد البتات لكل عنصر مخزن:

  • 31 بت لعدد العناصر في النطاق. عدد بت من أكبر عنصر في النطاق ( numBitsإليم سيتم حسابها. )
  • 5 بت للتخزين numBitsإليم .....لذلك، إذا كان عدد العناصر في النطاق 1023، فسيتم تخزين 10 في هذه البتات 5.
  • numBitsإليم بت ، لتخزين عدد العناصر في المجموعة.
  • numBitsإليم البتات * عدد العناصر الموجودة في المجموعة.

حسناً، شيئاً فشيئاً نحن نقترب من ترميز أفضل...


التقريب الثالث . نحن ندرك أنه إذا قمنا بفرز المجموعة بترتيب تصاعدي ، فمن المحتمل أن يتم ترميز الدلتا (الاختلافات بين العناصر المتتالية) بتات أقل من عنصر مطلق في النطاق:

  • 31 بت لعدد العناصر في النطاق.
  • نحسب أصغر numBitsElem لترميز عنصر.كما نقوم بحساب قائمة الدلتا (قائمة الاختلافات بين العناصر المتتالية لقائمة العناصر المصنفة في المجموعة).وأخيرًا، نحسب أيضًا numBitsدلتا
  • 5 بت للتخزين numBitsإليم .....
  • 5 بت للتخزين numBitsدلتا .....
  • numBitsإليم بت ، لتخزين عدد العناصر في المجموعة.
  • numBitsدلتا البتات * عدد العناصر في المجموعة.


حسنًا ، يبدو أننا وصلنا بالفعل إلى الترميز الأمثل ، أليس كذلك؟...

دعنا نَستمرُّ...

التقريب الرابع . ونحن نركز على حقيقة أنه يمكن أن يكون هناك عدد أكبر بكثير من الدلتا الصغيرة، وربما فقط عدد قليل من أكبر بكثير منها، التي كسر ' numBitsدلتا '..

في ظل هذه الظروف ، قد نجد numOptimumBitsدلتا ' أصغر من الحد الأقصى` numMaxBitsدلتا والذي بدوره يكون أقل من أو يساوي numBitsإليم '..

ولكن كيف نقوم بتشفير عنصر دلتا يتجاوز numOptimumBitsدلتا '؟ '؟

وبما أن الدلتا لن تكون أبدا 0 (لا توجد عناصر متكررة في مجموعة)، يمكننا استخدام القيمة 0 للإشارة إلى أنها قيمة خاصة.

وأن 0 ستتبعها قيمة الدلتا، ولكن مشفرة هذه المرة بـ numMaxBitsدلتا '..يمكن حساب إجمالي عدد البتات على النحو التالي:

  • 31 بت لعدد العناصر في النطاق. نحسب أصغر numBitsإليم لتكون قادرة على ترميز عنصر واحد. نحسب أيضًا قائمة الدلتا (قائمة الاختلافات بين العناصر المتتالية لقائمة العناصر المرتبة في المجموعة).
  • 31 بت، لتخزين عدد العناصر في المجموعة.
  • 5 بت للتخزين numOptimumBitsدلتا .....
  • 5 بت للتخزين numMaxBitsدلتا .....
  • numOptimumBitsدلتا البتات * عدد العناصر في المجموعة.
  • numMaxBitsدلتا البتات * عدد الدلتا التي تتجاوز numOptimumBitsدلتا .....


هل وصلنا بالفعل إلى الترميز الأمثل؟

التقريب الخامس حسناً... بما أننا قمنا بالفعل ببرمجة كل هذا...يمكننا أن نفكر في الوضع التكميلي...هل من الممكن أن يؤدي ترميز مكمل المجموعة بنفس الخوارزمية إلى نتائج أكثر ضغطًا؟

يُفهم مكمل المجموعة على أنه مجموعة أخرى ، منفصلة عن المجموعة الأصلية ، التي يكون اتحادها مع المجموعة الأصلية هو النطاق بأكمله.

أي أن المجموعة التكميلية ستحتوي على جميع عناصر النطاق غائبة في المجموعة الأصلية ، ولا شيء من تلك الموجودة في المجموعة الأصلية.

الجمال هو أنه من مجموعة ، من السهل جدًا الحصول على المجموعة التكميلية ، وبالتالي يمكننا الحصول على المجموعة الأصلية ، بعد ترميز المجموعة التكميلية.

التطبيق الواضح هو مجموعة تحتوي على جميع عناصر النطاق باستثناء عنصر واحد أو عدد قليل من العناصر.

حسنًا... إذا قمنا بتخزين الغائبين فقط (المجموعة التكميلية) ، فيمكن تخزينها بحجم أصغر بكثير ، أليس كذلك؟

الترميز في هذه الحالة يمكن أن يكون مثل هذا:

  • 31 بت لعدد العناصر في النطاق. نحسب أصغر numBitsإليم لتشفير عنصر. نحسب أيضًا قائمة الدلتا (قائمة الاختلافات بين العناصر المتتالية لقائمة العناصر المرتبة في المجموعة).
  • 1 بت ، لتخزين ما إذا كنا نخزن المجموعة الأصلية ، أو المكمل.هذا هو الجزء الإضافي.
  • 31 بت، لتخزين عدد العناصر في المجموعة.
  • 5 بت للتخزين numOptimumBitsدلتا .....
  • 5 بت للتخزين numMaxBitsدلتا .....
  • numOptimumBitsدلتا البتات * عدد العناصر في المجموعة.
  • numMaxBitsدلتا البتات * عدد الدلتا التي تتجاوز numOptimumBitsدلتا في المواقع التي تظهر فيها.

حسنا... الآن نحن نتحدث.

ولكن أنا أدرك أنه إذا كان كل تلك العجائب يمكن القيام به، ما لا يمكن القيام به من خلال البحث عن أنماط أخرى، أو ببساطة باستخدام ضاغط ضياع، مثل الرمز البريدي أو 7Z...


هذا يجب أن ينتظر، على الموقد الخلفي في المرة القادمة...

وصف الكود

فك التشفير تافه... تحتاج فقط إلى قراءة معلمات دفق البت وتطبيق الإجراءات اللازمة للحصول على المجموعة الأصلية.


سأركز على خوارزمية التشفير، في محاولة لتحسين عدد العمليات.

والفكرة هي حساب عدد البتات التي ستشغلها مع كل نوع من أنواع الترميز والحفاظ على الأمثل.

وبما أنه لن يكون من المنطقي استخدام ترميز دلتا إذا انتهى به الأمر إلى احتلال أكثر من الترميز التافه.

إذاً... نحسب ما سيشغله الترميز التافه.

وأيضًا... نحسب المعلمات المثلى للترميز الأكثر تفصيلًا من نوع دلتا الذي شرحناه في القسم السابق.


يتم ذلك عن طريق حساب عدد البتات التي يشغلها الترميز لمجموعات المعلمات:

  • numOptimumBitsدلتا
  • numMaxBitsدلتا تم إصلاح هذا.
  • استخدم المجموعة الأصلية أو التكميلية.


لتجنب التعقيد الحسابي المفرط في العثور على المعلمات المثلى (التي يمكن معاقبتها باستخدام نطاقات كبيرة) ، نقوم بما يلي:

يتم حساب المجموعة التكميلية مرة واحدة فقط وتخزينها.

يتم حساب قوائم دلتا للمجموعة الأصلية والمجموعة التكميلية مرة واحدة فقط وتخزينها.

لحساب عدد البتات التي تنتجها مجموعات المعلمات المختلفة:

نحسب الرسم البياني لعدد البتات في قوائم الدلتا مرة واحدة فقط. استنادًا إلى هذا الرسم البياني ، يكون حساب العدد الإجمالي للبتات أمرًا سهلاً والتعقيد الحسابي لهذه الحسابات أقل بكثير مما لو كنا "محاكيًا" ترميز عنصر عنصر عنصر.


بمجرد الحصول على تركيبة المعلمة المثلى لترميز دلتا ، تتم مقارنة حجمها مع الترميز التافه ، ويتم اختيار أفضل الاثنين.

التنزيلات