मैं छोटे पाठ स्ट्रिंग्स को संपीड़ित करने के लिए एक एल्गोरिथ्म की खोज कर रहा हूं: 50-1000 बाइट्स (यानी यूआरएल)। इसके लिए कौन सा एल्गोरिदम सबसे अच्छा काम करता है?
tinyurls
स्टोरेज स्पेस के साथ कुछ करने जा रहा है?
मैं छोटे पाठ स्ट्रिंग्स को संपीड़ित करने के लिए एक एल्गोरिथ्म की खोज कर रहा हूं: 50-1000 बाइट्स (यानी यूआरएल)। इसके लिए कौन सा एल्गोरिदम सबसे अच्छा काम करता है?
tinyurls
स्टोरेज स्पेस के साथ कुछ करने जा रहा है?
जवाबों:
की जाँच करें Smaz :
स्माज़ एक सरल संपीड़न पुस्तकालय है जो बहुत कम तारों को संपीड़ित करने के लिए उपयुक्त है।
string:orig_size:compr_size:space_savings
:) This is the very end of it.:27:13:52%
, Lorem ipsum dolor sit amet:26:19:27%
, Llanfairpwllgwyngyll:20:17:15%
, aaaaaaaaaaaaa:13:13:0%
, 2BTWm6WcK9AqTU:14:20:-43%
,XXX:3:5:-67%
हफ़मैन की एक स्थिर लागत है, हफ़मैन तालिका, इसलिए मैं असहमत हूं यह एक अच्छा विकल्प है।
अनुकूली संस्करण हैं जो इस के साथ दूर करते हैं, लेकिन संपीड़न दर पीड़ित हो सकती है। दरअसल, आपको जो प्रश्न पूछना चाहिए वह यह है कि "इन विशेषताओं के साथ पाठ स्ट्रिंग को संपीड़ित करने के लिए क्या एल्गोरिदम है"। उदाहरण के लिए, यदि लंबे दोहराव की उम्मीद है, तो सरल रन-लेनघ एन्कोडिंग पर्याप्त हो सकता है। यदि आप गारंटी दे सकते हैं कि केवल अंग्रेजी शब्द, स्थान, विराम चिह्न और सामयिक अंक मौजूद होंगे, तो हफ़मैन एक पूर्व-परिभाषित हफ़मैन तालिका के साथ अच्छे परिणाम दे सकता है।
आम तौर पर, लेम्पेल-ज़िव परिवार के एल्गोरिदम में बहुत अच्छा संपीड़न और प्रदर्शन होता है, और उनके लिए पुस्तकालय लाजिमी है। मैं उसके साथ जाऊँगा।
इस जानकारी के साथ कि क्या संकुचित किया जा रहा है URL हैं, तो मैं सुझाव दूंगा कि, संपीड़ित करने से पहले (जो भी एल्गोरिथ्म आसानी से उपलब्ध है), आप उन्हें कॉडी दें। यूआरएल अच्छी तरह से परिभाषित पैटर्न का पालन करते हैं, और इसके कुछ हिस्से अत्यधिक अनुमानित हैं। इस ज्ञान का उपयोग करके, आप URL को कुछ छोटे से शुरू करने के लिए संहिताबद्ध कर सकते हैं, और हफ़मैन एन्कोडिंग के पीछे के विचार यहाँ आपकी मदद कर सकते हैं।
उदाहरण के लिए, URL को एक बिट स्ट्रीम में अनुवाद करते हुए, आप "http" को बिट 1 से बदल सकते हैं, और बिट के साथ कुछ और "0" और उसके बाद वास्तविक प्रोटोटल (या किसी अन्य सामान्य प्रोटोकॉल को प्राप्त करने के लिए तालिका का उपयोग कर सकते हैं, जैसे https,) ftp, फ़ाइल)। ": //" को पूरी तरह से छोड़ा जा सकता है, जब तक आप प्रोटोकॉल के अंत को चिह्नित कर सकते हैं। आदि URL प्रारूप के बारे में पढ़ें, और सोचें कि कम स्थान लेने के लिए उन्हें कैसे कोडित किया जा सकता है।
मेरे हाथ में कोड नहीं है, लेकिन मुझे हमेशा आकार के 2 डी लुकअप टेबल 256 * 256 चार्ट ( आरएफसी 1978 , पीपीपी प्रिडिक्टर संपीड़न प्रोटोकॉल ) के निर्माण का दृष्टिकोण पसंद आया । एक स्ट्रिंग को संपीड़ित करने के लिए आप प्रत्येक चार पर लूप करते हैं और तालिका में अनुक्रमित के रूप में वर्तमान और पिछले चार का उपयोग करके 'पूर्वानुमानित' अगला चार्ट प्राप्त करने के लिए लुकअप तालिका का उपयोग करते हैं। यदि कोई मैच है तो आप एक सिंगल बिट लिखेंगे, अन्यथा 0 लिखें, चार और वर्तमान चार्ट के साथ लुकअप टेबल को अपडेट करें। यह दृष्टिकोण मूल रूप से डेटा स्ट्रीम में सबसे संभावित अगले चरित्र की एक गतिशील (और क्रूड) लुकअप तालिका को बनाए रखता है।
आप एक शून्य लुकअप तालिका के साथ शुरू कर सकते हैं, लेकिन यह बहुत छोटा तार पर सबसे अच्छा काम करता है यदि यह प्रत्येक चरित्र जोड़ी के लिए सबसे अधिक संभावित चरित्र के साथ आरम्भ किया जाता है, उदाहरण के लिए, अंग्रेजी भाषा के लिए। जब तक प्रारंभिक लुकअप तालिका संपीड़न और विघटन के लिए समान है, तो आपको इसे संपीड़ित डेटा में फेंकने की आवश्यकता नहीं है।
यह एल्गोरिथ्म एक शानदार संपीड़न अनुपात नहीं देता है, लेकिन यह मेमोरी और सीपीयू संसाधनों के साथ अविश्वसनीय रूप से मितव्ययी है और डेटा की एक सतत स्ट्रीम पर भी काम कर सकता है - डिकम्प्रेसर लुकअप तालिका की अपनी प्रति बनाए रखता है क्योंकि यह डिकंप्रेस होता है, इस प्रकार लुकअप तालिका डेटा के प्रकार को समायोजित किया जा रहा है।
कोई भी एल्गोरिथ्म / पुस्तकालय जो एक पूर्व निर्धारित शब्दकोश का समर्थन करता है, जैसे zlib ।
इस तरह आप कंप्रेसर को उसी तरह के टेक्स्ट के साथ प्राइम कर सकते हैं जो इनपुट में दिखाई देने की संभावना है। यदि फाइलें किसी तरह से समान हैं (जैसे सभी URL, सभी C प्रोग्राम, सभी StackOverflow पोस्ट, सभी ASCII- आर्ट ड्रॉइंग) तो कुछ सब्सक्रिप्शन सबसे या सभी इनपुट फ़ाइलों में दिखाई देंगे।
प्रत्येक संपीड़न एल्गोरिथ्म अंतरिक्ष को बचाएगा यदि एक ही फाइलिंग में एक ही विकल्प में कई बार दोहराया जाता है (जैसे "अंग्रेजी पाठ में" या "सी कोड में" इंट "।)
लेकिन URL के मामले में कुछ तार (जैसे " http: // www ।", ".Com", "html", ", .aspx" आमतौर पर प्रत्येक इनपुट फ़ाइल में एक बार दिखाई देंगे। इसलिए आपको उन्हें फ़ाइलों के बीच साझा करने की आवश्यकता है। प्रति फ़ाइल एक संपीड़ित घटना होने के बजाय किसी भी तरह एक पूर्व निर्धारित शब्दकोश में रखने से यह प्राप्त होगा।
हफ़मैन कोडिंग आम तौर पर इसके लिए ठीक काम करती है।
यदि आप वास्तव में पाठ को संक्षिप्त करने के बारे में बात कर रहे हैं तो न केवल छोटा / छोटा करें (gzip के आसपास आवरण), ज़िप छोटी फ़ाइलों और पाठ के लिए अच्छी तरह से काम करें। अन्य एल्गोरिदम बड़ी फ़ाइलों जैसे bzip2 आदि के लिए अत्यधिक कुशल हैं।
विकिपीडिया में संपीड़न समय की एक सूची है। (दक्षता की तुलना के लिए देखें)
Name | Text | Binaries | Raw images
-----------+--------------+---------------+-------------
7-zip | 19% in 18.8s | 27% in 59.6s | 50% in 36.4s
bzip2 | 20% in 4.7s | 37% in 32.8s | 51% in 20.0s
rar (2.01) | 23% in 30.0s | 36% in 275.4s | 58% in 52.7s
advzip | 24% in 21.1s | 37% in 70.6s | 57& in 41.6s
gzip | 25% in 4.2s | 39% in 23.1s | 60% in 5.4s
zip | 25% in 4.3s | 39% in 23.3s | 60% in 5.7s
आप यूनिकोड के लिए मानक संपीड़न योजना पर एक नज़र रखना चाहते हैं ।
SQL Server 2008 R2 इसे आंतरिक रूप से उपयोग करते हैं और 50% तक संपीड़न प्राप्त कर सकते हैं।