संपीड़न के लिए अनुकूलित करने के लिए डेटा (स्ट्रिंग्स का सेट) को फिर से व्यवस्थित करना?


12

क्या संपीड़न के लिए अनुकूलन करने के लिए डेटा को पुनः व्यवस्थित करने के लिए कोई एल्गोरिदम हैं? मैं समझता हूं कि यह डेटा और संपीड़न एल्गोरिदम के लिए विशिष्ट है, लेकिन क्या इस विषय के लिए एक शब्द है? मुझे इस क्षेत्र में अनुसंधान कहां मिल सकता है?

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


1
वैकल्पिक रूप से gzip संपीड़न (एक छोटी स्लाइडिंग विंडो के साथ LZ77) के लिए स्ट्रिंग्स को फिर से व्यवस्थित करना एक एनपी-हार्ड समस्या की तरह लगता है। आप शायद कम से कम सामान्य सुपरस्ट्रिंग समस्या से कमी के साथ आ सकते हैं।
जौनी साइरन

@ JouniSirén मुझे लगता है कि सबसे लंबा कॉमन स्ट्रिंग एक बेहतर तरीका है क्योंकि कम से कम कॉमन सुपरस्ट्रिंग मुझे कॉमन पार्ट बैक-टू-बैक करने के लिए सीमित करता है, है ना? जब तक यह सुपाच्य है (जैसे कि एक आधुनिक मशीन पर चलने के लिए एक दिन लगता है) मैं एनपी-हार्ड को बुरा नहीं मानता।
Jayen

जवाबों:


6

यह नवीन गोयल के जवाब के लिए एक अतिरिक्त है।

चूंकि JSON फाइल को ट्री डेटा संरचना के रूप में माना जा सकता है, आप पेड़ों के लिए XBW- ट्रांसफॉर्म का उपयोग कर सकते हैं , जो स्ट्रिंग्स के लिए बर्व्स -व्हीलर ट्रांसफॉर्म का विस्तार है।


1
उसके लिए धन्यवाद। मेरे पास केवल JSON सूची / सरणी है, कोई JSON ऑब्जेक्ट नहीं, इसलिए मैं यह नहीं देखता कि इसे एक पेड़ कैसे माना जा सकता है। मैं तारों को एक तिकड़ी में बदल सकता था, लेकिन फिर मैं यह नहीं देखता कि यह एक्सबीडब्ल्यू-परिवर्तन से कैसे संबंधित है।
Jayen

4

बरोज़ - व्हीलर ट्रांसफ़ॉर्मेशन एक जाना-पहचाना कम्प्रेशन अल्गोरिथम है जो स्ट्रिंग को सिक्योर करने के लिए कैरेक्टर्स को रीऑर्डर करके काम करता है।


1
इसके लिए धन्यवाद, लेकिन मुझे यकीन नहीं है कि मैं इस जानकारी का उपयोग कैसे कर सकता हूं। मैं सूची में तार को संकुचित होने के लिए फिर से व्यवस्थित करना चाहता हूं, लेकिन मुझे परवाह नहीं है कि क्या मैं मूल आदेश वापस पा सकता हूं।
Jayen

1

गज़िप संपीड़न में सुधार करने के लिए, आप सूची में पास होने के लिए "समान" तार चाहते हैं। इस तरह की समानता को परिभाषित करने के कई तरीके हैं; मुझे एक उचित एक का वर्णन करें जो अभ्यास में अच्छी तरह से काम करता है। याद रखें कि gzip का ब्लॉक आकार 64K है। इस प्रकार, आपका डेटा 64K बाइट्स के ब्लॉक में विभाजित हो जाएगा और प्रत्येक ब्लॉक स्वतंत्र रूप से संकुचित हो जाएगा। थियो ऑप्टिमाइज़ेशन कंप्रेशन, हर ब्लॉक में अलग-अलग k-mers (साइज k) के सब्सट्रक्शन की संख्या को कम करने की आवश्यकता होगी। प्रेरणा यह है कि इस तरह के सभी पदार्थों को एक पहचानकर्ता के साथ बदल दिया जाएगा।

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

एक विकल्प zstd का उपयोग करना है , जो कि (i) तेजी से है, (ii) उच्च संपीड़न अनुपात प्राप्त करता है, और (iii) ब्लॉक आकार पर सीमाएं नहीं है (और इस प्रकार, इनपुट आदेश के बावजूद तार को समान रूप से अच्छी तरह से संकुचित करता है)।


0

मैंने कुछ समय पहले एक एल्गोरिथ्म देखा था जो शायद उपयोगी हो सकता है। यह प्रत्येक शब्द के बीच की दूरी की गणना करने के लिए एक संपादित दूरी एल्गोरिथ्म का उपयोग करता है। इस प्रकार, यह एक ग्राफ बनाता है जो प्रत्येक किनारे का वजन यह दूरी है। अंत में, इसे एक ऐसा रास्ता चुनने का आदेश मिलता है, जिसमें सबसे कम वजन होता है। शायद यह gzip में सुधार कर सकता है।


यह ट्रैक्टेबल नहीं लगता, लेकिन अगर कोई इसे
आजमाता है

मैं इसे परखने की कोशिश करूँगा। मैं इस समस्या को लेकर उत्सुक हूं। इसके अलावा, आपको क्यों लगता है कि यह ट्रैक्टेबल नहीं है?
राफेल रिबेरो

जहाँ तक मुझे पता है, एडिटिंग डिस्टेंस O (nm) है, जहाँ n और m स्ट्रिंग्स की जोड़ी में अक्षरों की संख्या है और आपको स्ट्रिंग्स O (s ^ 2) की प्रत्येक जोड़ी के लिए ऐसा करना है, इसलिए यदि n = मी, वह O (s ^ 2 * n ^ 2) है जो 1.5 मिलियन स्ट्रिंग्स के लिए मेरे लिए अट्रैक्टिव लगता है।
जयन

ओह, मैंने जटिलता के बारे में चिंता नहीं की, क्योंकि मुझे लगा कि आपकी समस्या केवल बाइनरी आकार को कम करना है। तो यह ऑपरेशन अधिक बार होगा, है ना?
राफेल रिबेरो

मैं यहां खोज कर रहा था और हो सकता है कि लेडेनशेटिन ऑटोमेटा का उपयोग करके एडिटस्टेंस की लागत को कम किया जा सके
राफेल रिबेरो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.