2010-01-15 12 views
8

लक्ष्यएक सॉर्टऑर्डर को दूसरे में परिवर्तित करने के लिए पूर्ण न्यूनतम परिवर्तनों की गणना कैसे करें?

कैसे डेटा है कि एक एक आदेश से संभव बाइट की न्यूनतम राशि का उपयोग कर अन्य आदेश पर बताता है कि कैसे करने के लिए फिर से आदेश में एक स्थिर सूची एन्कोड करने के लिए?

मूल प्रेरणा

मूल रूप से इस समस्या पैदा हुई है, जबकि महंगा उपग्रह संचार का उपयोग कर संवेदक डेटा रिले करना एक समस्या पर काम कर रहा। एक डिवाइस में लगभग 1,000 सेंसर की एक सूची थी जो वे निगरानी कर रहे थे। सेंसर सूची बदल नहीं सका। प्रत्येक सेंसर में एक अद्वितीय आईडी थी। अंतिम विश्लेषण के लिए सभी डेटा आंतरिक रूप से लॉग इन किए जा रहे थे, केवल एक चीज जो उपयोगकर्ताओं को रोज़ाना जरूरी थी, उस क्रम में कौन सा सेंसर निकाल दिया गया था।

पूरी परियोजना को तोड़ दिया गया था, लेकिन यह समस्या अनदेखा करने के लिए बहुत दिलचस्प लगती है। इसके अलावा मैंने पहले "स्वैप" के बारे में बात की थी क्योंकि मैं सॉर्टिंग एल्गोरिदम के बारे में सोच रहा था, लेकिन वास्तव में यह एकमात्र आदेश है जो महत्वपूर्ण है, उस क्रम में आने के लिए आवश्यक कदम शायद इससे कोई फर्क नहीं पड़ता।

कैसे डेटा

आदेश दिया गया था एसक्यूएल संदर्भ में तो आप इसे इस के बारे में सोच सकता है।

**Initial Load** 

create table sensor (id int, last_detected datetime, other stuff) 
-- fill table with ids of all sensors for this location 

Day 0: Select ID from Sensor order by id 
    (initially data is sorted by the sensor.id because its a known value) 

Day 1: Select ID from Sensor order by last_detected 
Day 2: Select ID from Sensor order by last_detected 
Day 3: Select ID from Sensor order by last_detected 

अनुमान

  • शुरू कर सूची और न खत्म होने वाली सूची आइटम की सटीक एक ही सेट से बना है
  • प्रत्येक सेंसर में एक विशिष्ट आईडी (32 बिट पूर्णांक) है
  • आकार सूची में लगभग 1,000 आइटम
  • प्रत्येक सेंसर कई बार प्रति मिनट कई बार आग लग सकता है या नहीं
  • केवल आईडी सॉर्ट ऑर्डर में परिवर्तन को रिले किया जाना चाहिए।
  • इष्टतम समाधान लगाने के लिए गणना संसाधन सस्ते/असीमित
  • डेटा लागत महंगा है, लगभग प्रति किलो प्रति किलो।
  • डेटा केवल पूरे बाइट (ओकटेट) के रूप में भेजा जा सकता है
  • दिवस 0 आदेश प्रेषक और प्राप्तकर्ता से जाना जाता है
  • साथ शुरू करने के लिए अभी के लिए पूरी तरह से प्रणाली कार्यों मान वृद्धि कर देता है और कोई त्रुटि जाँच
  • की आवश्यकता है

जैसा कि मैंने कहा था कि परियोजना/हार्डवेयर अब और नहीं है, इसलिए यह अब सिर्फ एक अकादमिक समस्या है।

चुनौती!

एक एनकोडर

  • को देखते हुए ए डे एन सॉर्ट क्रम
  • को देखते हुए बी दिवस एन 1 सॉर्ट क्रम
  • वापसी सी परिभाषित करेंकि कैसे संभव बाइट्स की कम से कम संख्या का उपयोग कर बी करने के लिए एक कन्वर्ट करने के लिए का वर्णन बाइट्स का एक संग्रह

एक डिकोडर

परिभाषित
  • को देखते हुए ए डे एन सॉर्ट क्रम
  • बी का एक संग्रह को देखते हुए बाइट्स
  • वापसी सी डे एन 1 सॉर्ट क्रम

मज़ा हर किसी को है।

+0

क्या आप वाकई एक सॉर्टिंग समस्या है? यदि मैं सही ढंग से पढ़ता हूं, तो यह एक संपीड़न समस्या की तरह लगता है - आप जानना चाहते हैं कि न्यूनतम संग्रहण का उपयोग करते समय, किस डिवाइस को निकाल दिया गया था। साथ ही, अगर मैं सचमुच पढ़ता हूं, तो मैं स्पष्ट हूं कि आप "सॉर्ट ऑर्डर" के रूप में संदर्भित कर रहे हैं। ऐसा लगता है कि आप पूछ रहे हैं कि डेटा को कैसे सॉर्ट किया जाना चाहिए, लेकिन मुझे सॉर्टिंग मामलों के बारे में कोई निर्देश नहीं दिख रहा है - जब कुछ निकाल दिया जाता है, कितनी बार इसे निकाल दिया जाता है, आदि यह जानने के बिना कि हम किस प्रकार का आउटपुट देख रहे हैं के लिए, आपको यह बताने में बहुत मुश्किल है कि हम इसे कैसे क्रमबद्ध करेंगे। – atk

+1

यह diffing की तरह बहुत लगता है। जिसे आप "सॉर्ट ऑर्डर" कहते हैं, वास्तव में सेंसर-आईडी की मनमानी सूची है। –

+1

दूसरे शब्दों में, सूची को एक टेक्स्ट फ़ाइल में रखें; आपका एन्कोडर 'diff' है और आपका डिकोडर' पैच' है। हालांकि आपको पसंद है पैच को संपीड़ित करें। एसओ पर अलग-अलग एल्गोरिदम के बारे में सैकड़ों प्रश्न हैं, लेकिन विकिपीडिया बेहतर पढ़ सकता है। http://en.wikipedia.org/wiki/Diff#Algorithm –

उत्तर

1

अकादमिक समस्या के रूप में, एक दृष्टिकोण कंप्यूटर प्रोग्रामिंग की कला के द्वितीय भाग के खंड II के एल्गोरिदम पी सेक्शन 3.3.2 को देखने के लिए होगा, जो एन ऑब्जेक्ट्स पर प्रत्येक क्रमपरिवर्तन को 0 और एन -1 के बीच एक पूर्णांक में मानचित्रित करता है। । यदि हर संभव क्रमपरिवर्तन किसी भी समय समान रूप से संभव है, तो आप सबसे अच्छा कर सकते हैं यह गणना (बहु परिशुद्धता) पूर्णांक की गणना और संचार करना है। अभ्यास में, प्रत्येक सेंसर को 10-बिट संख्या देकर और फिर उन 10 बिट संख्याओं को पैक करना ताकि आपके पास उदा। 5 बाइट्स के प्रत्येक खंड में पैक 4 संख्या लगभग भी करेंगे।

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

+0

मैं विशेष रूप से इसके पहले भाग से सहमत हूं। यदि आपके पास प्रत्येक संभावित क्रमपरिवर्तन (और उस संख्या से क्रमपरिवर्तन उत्पन्न करने का तरीका) है, तो सभी को प्रसारित करने की आवश्यकता है, जो अगले क्रमपरिवर्तन की संख्या है। –

+0

दरअसल, आप केवल क्रमपरिवर्तन की आईडी के बीच अंतर प्राप्त कर सकते हैं क्योंकि यह औसत पर प्रसारित कम जानकारी होगी .. इसके अलावा, अगर कुछ क्रमिकताएं अधिक संभावनाएं हैं, तो आप उन संख्याओं को एकसाथ बनाने के लिए क्रमपरिवर्तन के क्रम को पुनर्व्यवस्थित कर सकते हैं जो, जब क्रमपरिवर्तन आईडी के बीच केवल अंतर प्रसारित करने के साथ संयुक्त होता है, तो कम जानकारी प्रसारित की जाएगी। यहां कुंजी यह है कि पहले से ही जानकर बहुत सारी सूचनाएं प्रसारित की गई हैं कि 1000 सेंसर हैं जिनमें प्रत्येक के पास अद्वितीय पहचान संख्याएं हैं। –

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