الطريقة الأكثر فعالية لتشفير موضعين بين 0 و64؟

StackOverflow https://stackoverflow.com/questions/1420887

  •  07-07-2019
  •  | 
  •  

سؤال

لدي قيم 64 بت وأريد ضغطها من خلال استغلال حقيقة أن جزءًا فقط في مكان ما في المنتصف يحتوي على بيانات وقبل ذلك وبعده يكون أصفارًا.

لنفترض أن البيانات الفعلية طولها بتات l ومبطنة بـ n 0s في المقدمة وm 0s في النهاية بحيث يكون n + l + m = 64.بدلاً من نقل / تخزين 64 بت، يمكنني إرسال بتات بالإضافة إلى كل ما أحتاجه لتشفير موضع البيانات في الفاصل الزمني 64 بت.

على سبيل المثال، لنفترض أنني كنت أقوم بتخزين l وm وبتات البيانات، ثم سأستعيد نمط 64 بت الأصلي من خلال قراءة l وقراءة l بتات من البيانات وقراءة m ونقل بتات البيانات m إلى اليسار.

أصغر حمل يمكن أن أتوصل إليه هو مرتين في 6 بتات لتخزين اثنين من l وn وm (يمكن أن يكون كل منهما بين 0 و64).فهل من الممكن تقليل هذا العدد؟

هل كانت مفيدة؟

المحلول

ول يمكن أن يكون 0-64، لذلك لا ترسل ل، وإرسال ن وم، لأنها يمكن أن يكون كل من الصفر، ولست بحاجة إلى أن ترتفع إلى 64 (أنها ببساطة الحاجة لتكون قادرة على إضافة ل 64).

وبت ل يجب أن تبدأ وتنتهي مع 1، حتى أنها لا تحتاج إلى أن ينتقل.

وترسل 6 بت ل n
ارسال ما يصل الى 6 بت لم (انظر أدناه)
حساب ل = 64 - (ن + م)
إذا ل = 0، والرقم هو 0، لا ترسل أي شيء آخر
إذا لتر = 1، العدد 1 * 2 ^ م، لا ترسل أي شيء آخر
إذا ل = 2، العدد 3 * 2 ^ م، لا ترسل أي شيء آخر
إرسال لتر الأوسط - 2 بت.

وفوق الحد الأقصى = 10 بت.

والانخفاض في بت لم لأن
إذا كان n> 32 ثم تعلمون م <32، لذلك يحتاج فقط 5 بت <ر> إذا كان n> 48 ثم تعلمون م <16، لذلك يحتاج فقط 4 بت <ر> إذا كان n> 56 ثم تعلمون م <8، لذلك يحتاج فقط 3 بت <ر> إذا كان n> 60 ثم تعلمون م <4، لذلك يحتاج فقط 2 بت <ر> إذا كان n = 63 ثم تعلمون م <2، لذلك يحتاج فقط 1 قليلا

نصائح أخرى

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

كما ذكرت المشكلة، لا، لا يمكنك أن تفعل أفضل من الحل الذي اقترحته.

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

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

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

وانها ليست صعبة للغاية لتنفيذ ذلك، ولكن قد تكون ساحقة إذا لم يكن لديك الكثير من البيانات لنقل.

وو64 هناك ممكن المناصب بداية n من التسلسل من الآحاد وطول تسلسل l يمكن أن يكون هناك أطول ثم 64 - n. لذلك هناك

r = sum(n = 0..63, 64 - n) + 1

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

r = 64 * 64 - (63 * 64) / 2 + 1
  = 2081

وتمثيل القيم الممكنة 2081 يتطلب بت log2(2081) = 11.023. اقتراحكم لترميز المعلومات باستخدام رقمين قليلا 6 تتطلب بت 12 في مجموعه هو بالتالي الأمثل (على افتراض توزيعات المتساوية لجميع القيم الممكنة).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top