سؤال

أنا أعمل على Scala مع قوائم larg جدا من int (يمكن كبير) وأحتاج إلى ضغطها وعقدها في الذاكرة.

الشرط الوحيد هو أنه يمكنني سحب (وإلغاء الضغط) الرقم الأول في القائمة للعمل معه ، حيث لمس بقية القائمة.

لدي العديد من الأفكار الجيدة ولكن معظمهم يترجمون الأرقام إلى أجزاء. مثال:

يمكنك كتابة أي رقم x كما tuple | log (x) | ، x- | log (x) | العنصر الأول الذي نحققه كسلسلة من 1 و 0 في النهاية (رمز أحادي) والثاني في الثنائي. على سبيل المثال:

1 -> 0,1 -> 0 1

...

5 -> 2,1 -> 110 01

...

8 -> 3,0 -> 1110 000

9 -> 3,1 -> 1110 001

...

في حين أن INT يأخذ 32 بتات من الذاكرة وطول 64 ، مع هذا الضغط x يستوجب 2log (x) بتات للتخزين ويمكن أن تنمو بشكل غير محدد. هذا الضغط لا يقلل في معظم الحالات.

كيف يمكنك التعامل مع هذا النوع من البيانات؟ هل هناك شيء مثل Bitarray أو شيء من هذا القبيل؟

أي طريقة أخرى لضغط هذه البيانات في Scala؟

شكرًا

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

المحلول

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

على سبيل المثال ، إذا كان لديك Int أرقام ولكن اعلم أنها لن تكون أكثر من مجرد (تم توقيعها) Byte بصرف النظر ، يمكنك أن تفعل شيئًا مثل قائمة البايتات هذه:

-1           // Use -1 to imply the next number cannot be computed as a byte delta
0, 0, 4, 0   // 1024 encoded as bytes
1            // 1025 as a delta
-5           // 1020 as a delta
-1           // Next number can't be computed as a byte delta
0, 0, -1, -1 // 65535 encoded as bytes -- -1 doesn't have special meaning here
10           // 65545 as a delta

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

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

ولا ، لا يوجد لدى سكالا مكتبة للتعامل مع البيانات الثنائية ، لسوء الحظ. على الرغم من أن Paulp ربما لديه شيء من هذا القبيل في المترجم نفسه.

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