शब्दकोश के लिए: लघु सबस्ट्रिंग के हिस्टोग्राम बनाने के लिए, प्रकार अदायगी से (घटनाओं बार बिट्स की संख्या की संख्या बचाया जब संकुचित) और डाल शब्दकोश में सबसे ज्यादा भुगतान substrings। उदाहरण के लिए, यदि के सबसे छोटी सबस्ट्रिंग की लंबाई है जिसे संपीड़ित किया जा सकता है (आमतौर पर 3 == के या 2 == के), तो लम्बाई के सभी सबस्ट्रिंग्स का एक हिस्टोग्राम बनाएं, 1 + के, 2 + के, और 3 + K। बेशक वहाँ शब्दकोश में उन सबस्ट्रिंग रखने, सबस्ट्रिंग उच्च पते अंत के अतिव्यापी, लघु तार नजदीक का लाभ लेने, आदि के लिए कुछ कला है
लिनक्स कर्नेल एक ऐसी ही तकनीक के नाम संपीड़ित करने के लिए उपयोग करता है प्रतीक जो subroutine कॉलिंग स्टैक के बैकट्रैस प्रिंट करने के लिए उपयोग किया जाता है। फ़ाइल स्क्रिप्ट/kallsyms.c देखें। उदाहरण के लिए, https://code.woboq.org/linux/linux/scripts/kallsyms.c.html
zlib manual recommends शब्दकोश के अंत में सबसे आम आवृत्तियों जगह।
शब्दकोश में तारों (बाइट अनुक्रम) शामिल होना चाहिए जो बाद में संपीड़ित होने के लिए डेटा में सामने आने की संभावना है, सबसे अधिक इस्तेमाल किए जाने वाले तारों को अधिमानतः शब्दकोश के अंत में रखा जाता है। एक शब्दकोश का उपयोग करना सबसे उपयोगी होता है जब डेटा संपीड़ित किया जाता है और कम सटीकता के साथ भविष्यवाणी की जा सकती है; डेटा को डिफ़ॉल्ट खाली शब्दकोश के मुकाबले बेहतर संपीड़ित किया जा सकता है।
ऐसा इसलिए है क्योंकि एलजेड 77 में एक स्लाइडिंग विंडो एल्गोरिदम है, इसलिए बाद के सबस्ट्रिंग पहले कुछ की तुलना में डेटा की आपकी स्ट्रीम पर पहुंच योग्य होंगे।
मैं तारों के अच्छे समर्थन के साथ उच्च स्तर की भाषा के साथ शब्दकोश उत्पन्न करने के साथ खेलूँगा। एक कच्चे जावास्क्रिप्ट उदाहरण:
var str = "The dictionary should consist of strings (byte sequences) that"
+ " are likely to be encountered later in the data to be compressed,"
+ " with the most commonly used strings preferably put towards the "
+ "end of the dictionary. Using a dictionary is most useful when the"
+ " data to be compressed is short and can be predicted with good"
+ " accuracy; the data can then be compressed better than with the "
+ "default empty dictionary.";
// Extract words, remove punctuation (extra: replace(/\s/g, " "))
var words = str.replace(/[,\;.:\(\)]/g, "").split(" ").sort();
var wcnt = [], w = "", cnt = 0; // pairs, current word, current word count
for (var i = 0, cnt = 0, w = ""; i < words.length; i++) {
if (words[i] === w) {
cnt++; // another match
} else {
if (w !== "")
wcnt.push([cnt, w]); // Push a pair (count, word)
cnt = 1; // Start counting for this word
w = words[i]; // Start counting again
}
}
if (w !== "")
wcnt.push([cnt, w]); // Push last word
wcnt.sort(); // Greater matches at the end
for (var i in wcnt)
wcnt[i] = wcnt[i][1]; // Just take the words
var dict = wcnt.join("").slice(-70); // Join the words, take last 70 chars
फिर dict के साथ 70 वर्ण की एक श्रृंखला है:
rdsusedusefulwhencanismostofstringscompresseddatatowithdictionarybethe
आप इसे कॉपी-पेस्ट रन कोशिश here कर सकते हैं (जोड़ें: "प्रिंट (dict)")
यह सिर्फ पूरे शब्द है, सबस्ट्रिंग नहीं। शब्दकोश पर स्थान बचाने के लिए सामान्य सबस्ट्रिंग को ओवरलैप करने के तरीके भी हैं।
सॉर्ट पूर्णांक के साथ काम नहीं कर रहा है, http://stackoverflow.com/questions/1063007/sort-not-working-with-integers – Fabien
फ़ाइल को संपीड़ित करके बनाए गए शब्दकोश को "निर्यात" करने का कोई तरीका है ताकि इसे बाद की फ़ाइलों के लिए लागू किया जा सके, यानी स्वचालित रूप से शब्दकोश को "ट्रेन" करने के लिए? – rustyx
@RustyX, आप अपने संपीड़ित डेटा की संरचना को देखने के लिए [infgen] (https://github.com/madler/infgen) का उपयोग कर सकते हैं और इससे देख सकते हैं कि आपके डेटा में कौन से शाब्दिक संदर्भित होते हैं। एक कस्टम शब्दकोश के साथ आप यह सुनिश्चित कर सकते हैं कि लंबे समय से मेल खाने वाले उपस्थितियां मौजूद हों और बेहतर संपीड़न अनुपात प्राप्त करें। –