2009-05-18 10 views
8

मैं स्थान डेटा (अक्षांश, देशांतर, दिनांक, समय) को संपीड़ित करना चाहता हूं। सभी संख्या निश्चित प्रारूप में हैं। उनमें से 2 (अक्षांश, देशांतर) दशमलव प्रारूप के साथ हैं। अन्य 2 पूर्णांक हैं।संख्याओं के लिए संपीड़न एल्गोरिदम केवल

अब ये संख्या निश्चित प्रारूप स्ट्रिंग में हैं।

निश्चित प्रारूप में संख्याओं को संपीड़ित करने के लिए एल्गोरिदम क्या हैं? स्ट्रिंग संपीड़न की तुलना में केवल संख्या संपीड़न (यदि कोई है) बेहतर है? क्या मुझे सीधे संख्याओं में परिवर्तित किए बिना स्ट्रिंग को संपीड़ित करना चाहिए और फिर संपीड़ित करना चाहिए?

अग्रिम धन्यवाद।

+1

क्या आप लेट/लांग के लिए निश्चित बिंदु या फ़्लोटिंग पॉइंट का उपयोग कर रहे हैं? यदि आपके पास निश्चित स्थिति हैं तो आप केवल बाइट सरणी में मानों को पैक कर सकते हैं। प्रत्येक पैकेट में डेटा की इतनी छोटी मात्रा के साथ आपके पास संपीड़न/पैकेट हेडर में अधिक से अधिक सिर होगा, जो आपके डेटा में होगा। इसके साथ आप किस भाषा के साथ काम कर रहे हैं? –

उत्तर

7

यह उन स्थानों में से एक है जहां एक छोटा सिद्धांत सहायक होता है। आपको कई चीजों के बारे में सोचना होगा:

  • आपके माप का संकल्प क्या है: 0.1 डिग्री या 0.001 डिग्री? 1 सेकंड या एक माइक्रोसेकंड?
  • माप से जुड़े हैं और कुछ क्रम में, या एक साथ यादृच्छिक रूप से फेंक रहे हैं?

मान लें, सिर्फ उदाहरण के लिए, कि संकल्प 0.01 ° है। उन्हें आप जानते हैं कि आपके मान -180 डिग्री सेल्सियस + 180 डिग्री, या 35 9 00 विभिन्न मानों से हैं। एलजी (35 9 00) ≈ 16 इसलिए आपको 16 बिट्स की आवश्यकता है; -90 डिग्री के लिए 14 बिट्स - + 9 0 डिग्री। स्पष्ट रूप से, यदि आप इस तरह के मूल्य को फ़्लोटिंग-पॉइंट के रूप में संग्रहीत कर रहे हैं, तो आप डेटा को आधे से तुरंत संपीड़ित कर सकते हैं।

इसी प्रकार तिथि के साथ, सीमा क्या है; आपके पास कितने बिट्स होना चाहिए?

अब, डेटा कुछ आदेश (जैसे, नमूने एक भी जहाज़ पर क्रमिक रूप से लिया गया) तो आप सभी की जरूरत एक शुरुआत के मूल्य और एक डेल्टा है में है अगर; जो बड़ा अंतर बना सकता है। 30 समुद्री मील पर यात्रा करने वाले जहाज के साथ, स्थिति अब 0.03 डिग्री प्रति घंटा या लगभग 0.0000083 डिग्री प्रति सेकंड नहीं बदल सकती है। वे डेल्टा बहुत छोटे मूल्य होने जा रहे हैं, ताकि आप उन्हें बहुत कम बिट्स में स्टोर कर सकें।

बिंदु जिन्हें आप कर सकते की एक संख्या देखते हैं, लेकिन आप डेटा के बारे में अधिक पता करने के लिए की तुलना में हम एक सिफारिश बनाने के लिए क्या होता है।


अद्यतन: ओह, प्रतीक्षा करें, निश्चित बिंदु तार?!

ठीक है, यह (अपेक्षाकृत) आसान है। बस शुरू करने के लिए, हाँ, आप अपने तारों को कुछ बाइनरी प्रतिनिधित्व में परिवर्तित करना चाहते हैं। एक डेटा आइटम को बनाने बस, आप

040.00105.0020090518212100Z 

जो आप

 
| 4000   | short int, 16 bits | 
| 10500   | short int, 16 bits | 
| 20090518212100Z | 64 bits   | 

को परिवर्तित कर सकते हैं ताकि 96 बिट, 12 बाइट्स 26 बाइट्स बनाम है हो सकता है।

+0

आपके उत्कृष्ट सुझाव के लिए धन्यवाद। मैं इस तरह के समाधान की उम्मीद कर रहा था। यहां, डेटा प्रारूप तय किया गया है और हजारों अनुक्रमिक डेटा हैं। तो, मुझे लगता है कि डेल्टा समाधान यहां अधिक कुशल है। समस्या यह है कि इसमें कोई अनुक्रमण नहीं है। इसलिए, डेटा को पढ़ने से पहले हमेशा डिकंप्रेसर किया जाना चाहिए। क्या आप इंडेक्सिंग के साथ बेहतर समाधान सुझा सकते हैं? बहुत बहुत धन्यवाद। – fireball003

+1

हम डेटा को वास्तव में पसंद करने के लिए नीचे उतरना शुरू करते हैं, और यदि नुकसान स्वीकार्य है। कुछ विचार, यद्यपि: प्रत्येक के कदमों का पूर्ण मूल्य संग्रहित करें, इसलिए आपको कभी भी/2 चरणों के योग को चलाने की आवश्यकता नहीं है; पहली व्युत्पन्न और एक अलग चरण चौड़ाई स्टोर करें ("अनुकूली अंतर एन्कोडिंग" देखें।) दूसरी पसंद कुछ जानकारी खो देती है, हालांकि आप कितनी कम सीमा निर्धारित कर सकते हैं। –

5

संपीड़न आमतौर पर बाइट स्ट्रीम पर काम करता है। जब किसी स्ट्रीम में बाइट मानों का एक गैर-वर्दी वितरण होता है (उदाहरण के लिए पाठ, या टेक्स्ट के रूप में संग्रहीत संख्या), तो आप जो संपीड़न अनुपात प्राप्त कर सकते हैं वह अधिक होगा, क्योंकि बाइट्स को स्टोर करने के लिए कम बिट्स का उपयोग किया जाता है जो अधिक बार दिखाई देते हैं (हफमैन में संपीड़न)।

आमतौर पर, डेटा की बात कर रहे बस द्विआधारी संख्या (नहीं पाठ) के रूप में जमा किया जाएगा, और कि आम तौर पर अंतरिक्ष और पुनः प्राप्ति कुशल है।

मैं सुझाव है कि आप The Data Compression Book

2

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

डेटा संपीड़न "यादृच्छिक" डेटा पर खराब काम करता है। यदि आपका डेटा एक छोटी सी सीमा के भीतर है, तो आप इसका लाभ उठाने में भी सक्षम हो सकते हैं।

सच में, आप बस आम एल्गोरिदम के किसी भी चलाने की कोशिश करें और अगर डेटा "पर्याप्त संकुचित" है देखना चाहिए। यदि नहीं, और आप संपीड़न एल्गोरिदम द्वारा "अंतर्ज्ञानी" होने की तुलना में डेटा के बारे में अधिक जानते हैं, तो आपको उस जानकारी का लाभ उठाना चाहिए।

एक उदाहरण का कहना है कि अपने डेटा बस अक्षांश और लांग के हैं, लेकिन वे एक दूसरे के लिए "बंद" माना रहे हैं नहीं है। फिर आप शायद "मूल" लेट और लांग स्टोर कर सकते हैं, और शेष अंतर हो सकते हैं। शायद ये मतभेद एक एकल, हस्ताक्षरित बाइट में फिट होने के लिए काफी छोटे हैं।

चीजें आप डेटा बनाम कुछ सामान्य एल्गोरिथ्म यह पता लगाने में सक्षम नहीं हो सकता है क्या की जानकारी के साथ क्या कर सकते हैं की सिर्फ एक सरल उदाहरण है कि।

1

यह आप डेटा के साथ क्या करने जा रहे हैं पर निर्भर करता है, और आप कितना सटीक की जरूरत है।

लैट/लम्बाई पारंपरिक रूप से डिग्री, मिनट और सेकंड में दी जाती है, 60 सेकेंड से मिनट, डिग्री के लिए 60 मिनट, और अक्षांश के 1 डिग्री नाममात्र रूप से 60 समुद्री मील (एनएमआई) के बराबर होती है। 1 मिनट तो 1 नॉटिकल मील है, और 1 सेकंड 100 से कुछ अधिक फीट है।

अक्षांश -90 +90 डिग्री से चला जाता है। पूर्णांक सेकंड के रूप में अक्षांश का प्रतिनिधित्व करने से आपको -324000 .. + 324000, या लगभग 20 बिट्स की एक श्रृंखला मिलती है। रेखांश -180 से +180 तक चला जाता है, इसलिए देशांतर को समान रूप से 1 और बिट की आवश्यकता होती है।

तो तुम एक पूरा अक्षांश/देशांतर स्थिति का प्रतिनिधित्व कर सकते हैं, 50 फीट +/- को 41 बिट्स में।

जाहिर

, अगर आप ज्यादा सटीक, आप अपने बिट गिनती वापस नीचे कर सकते हैं कि जरूरत नहीं है।

ध्यान दें कि पारंपरिक सिंगल-परिशुद्धता 32-बिट फ्लोट मंटिसा के 24 बिट्स का उपयोग करता है, इसलिए यदि आप अपने लेट/लम्बे समय में फ्लोट करने के लिए कनवर्ट करते हैं तो आप लगभग +/- 6 फीट तक नीचे आ जाते हैं। इस तरह की चीज़ के लिए दो सिंगल-प्रेसिजन फ्लोट को हरा करना मुश्किल है।

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