2011-01-27 10 views
5

मैं "हैलो वर्ल्ड" जैसे एएससीआईआईआई पाठ की मनमानी स्ट्रिंग लेना चाहता हूं, और इसे कम वर्णों (जितना संभव हो उतना कम) वाले संस्करण में संकुचित करना चाहता हूं, लेकिन इस तरह से इसे डिकंप्रेस किया जा सकता है। संपीड़ित संस्करण केवल एसीआईआई अक्षरों से बना होना चाहिए। क्या इसे पूरा करने का कोई तरीका है, खासकर रूबी में?आप कम ASCII वर्णों में पाठ का थोड़ा सा संकुचित कैसे कर सकते हैं?

+0

आप 'ए-जेए-जेड' युक्त वर्णमाला में 'ए-जेए-जेड' युक्त वर्णमाला में टेक्स्ट को संपीड़ित करना चाहते हैं? मुझे नहीं लगता कि यह संभव है। लंबाई को कम करने के लिए, आपको उपलब्ध वर्णों को बढ़ाने की आवश्यकता है। यदि आपका इनपुट वर्णमाला सीमित है, तो कहें, 'ए-जेए-जेड' और आपके आउटपुट में सभी 255 ASCII कोडपॉइंट्स हो सकते हैं, तो आप कुछ पर हो सकते हैं ... – deceze

+0

जब आप कहते हैं कि संपीड़ित संस्करण केवल एसीआईआई से बना होना चाहिए अक्षर, क्या आपका मतलब है कि 0x00-0x19 वर्णों की अनुमति नहीं है? यदि आप ए-ज़ा-जे 0-9 में संभावित वर्ण नीचे लेते हैं, तो आप 5 वर्ण/int प्राप्त कर सकते हैं।लेकिन यह अब एएससीआई स्ट्रिंग नहीं होगा, हालांकि – Waneck

+0

@deceze अगर यह नहीं किया जा सका, बाइनरी फाइलों को संपीड़ित नहीं किया जा सका (जैसा कि पहले से ही 8 बिट्स हैं)। यह किया जा सकता है, लेकिन आपको इनपुट से केवल आउटपुट कम मिलेगा यदि आपके पास (बड़ी संख्या में) दोहराव है और इसलिए एक शब्दकोश मदद करता है। –

उत्तर

8

यदि आप जानते हैं कि केवल ASCII वर्णों का उपयोग किया जाएगा, तो यह प्रत्येक बाइट के 7 कम ऑर्डर बिट्स है। बिट हेरफेर के साथ, आप हर 8 बाइट्स को 7 (12.5% ​​बचत) में मैश कर सकते हैं। यदि आप इसे एक छोटी सी सीमा में प्राप्त कर सकते हैं (केवल 64 वैध वर्ण), तो आप एक और बाइट छोड़ सकते हैं।

हालांकि, क्योंकि आप चाहते हैं कि संकुचित रूप में भी केवल ASCII वर्ण हों, जो आपको एक बाइट खो देता है - जो तब तक स्क्वायर तक जाता है जब तक कि आपका इनपुट 64-वर्णों तक सीमित न हो (उदाहरण के लिए हानिकारक संपीड़न दूसरों के साथ कुछ वर्णों को प्रतिस्थापित करता है , केवल कम मामले में भंडारण आदि)।

यदि आपके तार बड़े (> 1k) नहीं हैं, तो हेडर के आकार की वजह से gzip/bzip2 आदि का उपयोग करने के लिए न्यूनतम बचत होती है। यदि आपके पास एक हफमैन टेबल के रूप में उपयोग करने के लिए एक पूर्वनिर्धारित शब्दकोश था, तो आपको कुछ संपीड़न मिल सकता है लेकिन अन्य मामलों में, आप मूल पाठ के विरुद्ध ब्लोट प्राप्त कर सकते हैं।

पर पहले चर्चा अतः An efficient compression algorithm for short text strings

+1

प्रश्न, जैसा कि मैंने इसे पढ़ा है, पाठ को संपीड़ित करने के बारे में है जहां आउटपुट 7-बिट भी है ASCII। उच्च बिट को हटाने से उस मामले में संपीड़न के रूप में काम नहीं किया जा रहा है। –

+0

अद्यतन नोट किया गया, जवाब दिया गया जवाब। ;) –

4

कि मानक ASCII एन्कोडिंग से कई कम बिट के साथ bitstrings में पाठ स्ट्रिंग्स को संपीड़ित करने में अच्छे हैं Huffman encoding या LZW जैसे कई अच्छे पाठ संपीड़न एल्गोरिदम रहे हैं। एक बार आपके पास ऐसा एन्कोडिंग हो जाने के बाद, आप मानक ASCII वर्णों में पैक करने के लिए हमेशा बिट्सिंग को सात बिट्स के समूहों में विभाजित कर सकते हैं। मुझे यकीन है कि वहाँ पुस्तकालय हैं जो ऐसा करते हैं, लेकिन मैं रूबी कोडर का अधिक नहीं हूं और मेरे सिर के ऊपर से किसी को भी नहीं जानता।

+1

जब तक आप एक निश्चित हफमैन तालिका का उपयोग नहीं करते हैं, तो टेबल आकार स्वयं छोटे तारों पर बड़े आकार में "संपीड़ित" होने की संभावना है। – RichardTheKiwi

1

ऐसा करने का सबसे आसान तरीका मानक एल्गोरिदम का उपयोग करके इसे संपीड़ित करना होगा, फिर बेस 64 परिणाम को एन्कोड करें। यह 'हैलो वर्ल्ड' जैसी छोटी स्ट्रिंग पर मदद करने की संभावना नहीं है, हालांकि - उस आकार में, आकार कम करने के लिए आप बहुत कम कर सकते हैं, जब तक कि आपके सभी तारों में समान प्रतिबंधित चरित्र सेट न हो, या पैटर्न जो कुछ जैसे हफमैन एन्कोडिंग का लाभ उठा सकते हैं।

0

यदि आपकी भाषा दी जाती है, तो अंग्रेजी कहें, तो यदि आपका शब्द अस्पष्ट रहता है तो आप सामान्य पात्रों को छोड़कर दूर हो सकते हैं। उदाहरण के लिए, "हैलो वर्ल्ड" "हेल wrld" बन सकता है यदि आपके शब्दकोश में केवल हेलो से मिलान करने के लिए हैलो और wrld से मेल खाने वाली दुनिया है। अरबी जैसे सेमिटिक भाषाओं में वास्तव में उनकी लिखित भाषा में कोई मुखर नहीं होता है, और लोग अभी भी उन्हें पढ़ने में कामयाब होते हैं। साथ ही, अन्य नियम जैसे कि शब्द को अपरकेस माना जाता है, चरित्र सेट को कम केस वर्णों को कम करने के लिए उपयोग किया जा सकता है (मान लीजिए कि दिया गया पाठ इन नियमों का पालन करता है)।

इसके अलावा, बाइट-वार संपीड़न ग्रंथों के लिए अच्छी तरह से काम करता है, जबकि वास्तविक शब्द भाषा पूरी तरह से संपीड़ित हो सकती है यदि आप पूरे शब्दों को एन्कोड करते हैं, क्योंकि शब्दावली का आकार बहुत सीमित है (यदि आप ग्रंथों के सीमित सेट को देखते हैं तो और भी सीमित)। लेकिन यह सवाल नहीं था, मैं यहां विषय-वस्तु प्राप्त कर रहा हूं।

संबंधित मुद्दे