ما هي بعض الاستراتيجيات الجيدة لتحديد حجم الكتلة في خوارزمية يدحض؟

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

سؤال

وأنا أكتب مكتبة ضغط كمشروع الجانب قليلا، وأنا بعيدا بما فيه الكفاية على طول (مكتبتي يمكن استخراج أي ملف zip القياسية، فضلا عن إنتاج متوافقة (ولكن بالتأكيد ليس الأمثل بعد) الناتج غزيب) أنه الوقت لمعرفة استراتيجية هادفة إنهاء كتلة. حاليا، أنا مجرد قطع كتل من بعد كل 32K من المدخلات (LZ77 حجم نافذة) لأنه كان conveinent وسريعة لتنفيذ - الآن أنا ذاهب إلى الوراء ومحاولة لتحسين الواقع كفاءة ضغط

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

وأنا فرزها من خلال رمز SharpZipLib (وأنا أحسب أنه سيكون تنفيذ مفتوحة المصدر mosteasily مقروء)، وجدت أنه ينهي كتلة كل 16K الحرفية من الناتج، وتجاهل الإدخال. هذا من السهل بما فيه الكفاية لتنفيذ، ولكن يبدو يجب أن يكون هناك نهج أكثر مستهدفة، وخصوصا اللغة في المواصفات "قررت أن تبدأ كتلة جديدة مع أشجار جديدة سيكون من المفيد".

وهكذا هل لديها أي أفكار عن استراتيجيات جديدة، أو أمثلة من تلك القائمة؟

ويرجع الفضل في ذلك مسبقا!

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

المحلول

وكاقتراح لتحصل على الذهاب.

ونظرة المضاربة قدما في مخزن مؤقت حجم كاف للإشارة ضغط متفوقة على أن يكون يستحق التغيير.

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

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

وببساطة تقييدها إلى الحد الأدنى من 8K الحرفية الانتاج ولكن منع أكثر من 32K الحرفية في كتلة من شأنه أن يؤدي في أساس لين العريكة نسبيا لمحاولة خوارزميات المضاربة. استدعاء 8K كتلة الفرعي.

وأبسط من الذي سيكون (رمز زائف):

create empty sub block called definite
create empty sub block called specChange
create empty sub block called specKeep
target = definite
While (incomingData)
{
  compress data into target(s)    
  if (definite.length % SUB_BLOCK_SIZ) == 0)
  {
    if (targets is definite)
    {
      targets becomes 
        specChange assuming new block 
        specKeep assuming same block as definite
    }        
    else
    {
      if (compression specChange - OVERHEAD better than specKeep)
      {
        flush definite as a block.
        definite = specChange
        specKeep,specChange = empty
        // target remains specKeep,specChange as before 
        but update the meta data associated with specChange to be fresh
      }
      else 
      {
        definite += specKeep
        specKeep,specChange = empty
        // again update the block meta data
        if (definite is MAX_BLOCK_SIZE)
        {
          flush definite
          target becomes definite 
        }
      }
    }
  }
}
take best of specChange/specKeep if non empty and append to definite
flush definite.

وOVERHEAD بعض ثابت لحساب تكلفة التحول على كتل

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

وهذا يمكن أن يؤدي إلى بناء specChange يجري القيام به فقط عندما يكون الكشف عن مجريات الأمور تعتبر من المعقول. إذا كان الكشف عن مجريات الأمور تبين أن يكون مؤشرا قويا يمكن بعد ذلك الاستغناء عن طبيعة المضاربة وببساطة تقرر مبادلة عند نقطة مهما كانت.

نصائح أخرى

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

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

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

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