एक्सेल / शेयरडस्ट्रीम के लिए सॉर्ट एल्गोरिथ्म


10

एक्सेल में, वे एक संख्यात्मक मानचित्रण के लिए 'कंप्रेस' करते हैं (हालांकि मुझे यकीन नहीं है कि इस मामले में सेक शब्द सही है)। यहाँ एक उदाहरण नीचे दिखाया गया है:

यहां छवि विवरण दर्ज करें

हालांकि यह समग्र फ़ाइलों और स्मृति पदचिह्न को कम करने में मदद करता है, फिर एक्सेल एक स्ट्रिंग क्षेत्र पर कैसे छंटनी करता है? क्या हर एक स्ट्रिंग को लुकअप मैपिंग के माध्यम से जाना होगा: और यदि ऐसा है, तो यह स्ट्रिंग फ़ील्ड पर एक प्रकार का कार्य / धीमा करने की लागत को बहुत अधिक नहीं बढ़ाएगा (यदि 1M मान थे, तो 1M कुंजी लुकअप नहीं होगा तुच्छ)। इस पर दो प्रश्न:

  1. एक्सेल एप्लिकेशन के भीतर साझा स्ट्रिंग्स का उपयोग किया जाता है, या केवल जब डेटा की बचत होती है?
  2. फिर मैदान पर छाँटने के लिए एक उदाहरण एल्गोरिदम क्या होगा? कोई भी भाषा ठीक है (c, c #, c ++, python)।

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

मुझे लगता है कि यह मानचित्रण किसी दस्तावेज़ के भौतिक XML प्रतिनिधित्व में मौजूद है, इस बात पर स्वतंत्र है कि Excel आंतरिक रूप से रनटाइम पर डेटा का प्रतिनिधित्व कैसे करता है। मेरा मानना ​​है कि कच्चे तरीके से डेटा के स्तंभों का प्रतिनिधित्व करना अधिक कम्प्यूटेशनल रूप से कुशल है (हालांकि यह कई तरीकों से किया जा सकता है)।
अल्क्रक्स

@alxrcs ऐसे कोई दस्तावेज़ या पुस्तकें हैं जो SQLServer के लिए कुछ इस तरह से Excel के आंतरिक में जाते हैं? amazon.com/Pro-Server-Internals-Dmitri-Korotkevitch/dp/… , या क्या यह मूल रूप से एमएस टीम के बाहर एक ब्लैक बॉक्स है?
डेविड ५४२

यकीन नहीं होता, सॉरी। आप फ़ाइल स्वरूपों के लिए कुछ विशिष्टताओं को ऑनलाइन पा सकते हैं, लेकिन मुझे नहीं लगता कि एक्सेल रनटाइम इंटर्नल्स पर विवरण खोजना आसान है।
alxrcs

वैसे भी, आपके दूसरे प्रश्न से मुझे संदेह है कि आप एक्सेल स्पेसिक्स की तुलना में सिद्धांत में अधिक रुचि रखते हैं, क्या यह सही है?
alxrcs

जवाबों:


0

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

यदि कक्षों में फ़ाइल के समान ही अनुक्रमणिकाएँ हैं, तो यहां बताया गया है कि columnValueवेक्टर द्वारा संग्रहीत तारों के आधार पर वे किस प्रकार सॉर्ट करेंगे जो वे sharedStringsवेक्टर में संग्रहीत करने के लिए इंगित कर रहे हैं (C ++ में जब से आपने कहा कि कोई अंतर नहीं है) 2 की कीमत पर तुलनात्मक संचालन के लिए अतिरिक्त अनुमापन:

// sort indexes from columnValue based on comparing values in sharedStrings
sort(columnValue.begin(), columnValue.end(), 
     [&sharedStrings](size_t i1, size_t i2){return sharedStrings[i1] < sharedStrings[i2];});

यह ओपी में नहीं था, लेकिन रिवर्स SharedStringTableलुकअप ऑपरेशन धीमा है और तत्वों को एक शब्दकोश में कैशिंग करने में मदद करता है।


0

Microsoft Excel साझा स्ट्रिंग्स तालिका

साझा स्ट्रिंग्स टेबल है और ओपन XML मानक, जैसा कि आईएसओ मानक द्वारा परिभाषित किया गया है - आईएसओ / आईईसी 29500-1: 2016 (ई)

साझा तार की आधिकारिक परिभाषा (आईएसओ दस्तावेज़ से उद्धृत)

साझा स्ट्रिंग तालिका

स्ट्रिंग मानों को सीधे स्प्रेडशीट सेल तत्वों के अंदर संग्रहीत किया जा सकता है; हालाँकि, एकाधिक सेल तत्वों के अंदर समान मान रखने से बहुत बड़ी वर्कशीट पार्ट्स में परिणाम हो सकते हैं, जिसके परिणामस्वरूप प्रदर्शन में गिरावट हो सकती है। साझा स्ट्रिंग तालिका कार्यपुस्तिका में साझा किए गए स्ट्रिंग मानों की अनुक्रमित सूची है, जो कार्यान्वयन को केवल एक बार मान संग्रहीत करने की अनुमति देता है।

साझा स्ट्रिंग्स पर आईएसओ मानक से डाउनलोड किया जा सकता है

https://standards.iso.org/ittf/PubliclyAvailableStandards/c071691_ISO_IEC_29500-1_2016.zip

इस विषय पर सवालों के जवाब

प्रश्न 1: क्या एक्सेल एप्लिकेशन के भीतर ही साझा स्ट्रिंग्स का उपयोग किया जाता है, या केवल डेटा सहेजते समय?

उत्तर: साझा किए गए स्ट्रिंग्स का उपयोग एक्सेल द्वारा केवल दस्तावेज़ को सहेजने के समय किया जाता है, IE, केवल भंडारण पर एक फ़ाइल के रूप में स्प्रेडशीट को संग्रहीत करने के उद्देश्य से।

हालाँकि, जब फ़ाइल को प्रदर्शन के लिए खोला जाता है, तो कोशिकाओं को साझा स्ट्रिंग तालिका से खींचे गए वास्तविक स्ट्रिंग मानों से आबाद किया जाता है।

-

प्रश्न 2: मैदान पर छाँटने के लिए एक उदाहरण एल्गोरिदम क्या होगा? कोई भी भाषा ठीक है (c, c #, c ++, python)।

उत्तर: एक्सेल जैसे एप्लिकेशन के लिए, मुझे लगता है कि क्विक सॉर्ट का एक विशेष स्वामित्व भिन्नता है स्ट्रांग वैल्यू को सॉर्ट करने के लिए का सबसे अधिक संभावना वाला एल्गोरिदम है।

एक्सेल में 1,048,576 पंक्तियों की सीमा है। इस आकार के लिए, त्वरित सॉर्ट निश्चित रूप से विजेता है। त्वरित परिमाण इस परिमाण के डेटा सेट के लिए बहुत ही कुशल परिणाम दे सकता है।

यहाँ तार छाँटने के लिए C ++ में त्वरित सॉर्ट के कार्यान्वयन के लिए लिंक है:

http://www.cplusplus.com/forum/beginner/101599/


2
त्वरित प्रकार स्ट्रिंग पर ही होगा, आपको एक पॉइंटर को स्थगित करना होगा या लुकअप मैप को एक लाख बार करना होगा, हालांकि नहीं? मुझे लगता है कि यह जवाब मूल रूप से "हां, यह साझा स्ट्रिंग्स करता है। यहां साझा स्ट्रिंग्स के बिना एक प्रकार का काम करने का तरीका है" कहा गया है।
डेविड ५४२

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

1
समझा। हां, मेरी रुचि का मुख्य बिंदु यह था कि यह मेमोरी में कैसे संभाला जाता है, / -से-स्टोरेज पहलू के बाहर। क्या आपके पास उस हिस्से में कोई अंतर्दृष्टि है?
डेविड ५४२

एक्सेल सॉर्टिंग में, उपयोगकर्ता को सॉर्ट क्रम को कॉलम की सूची के रूप में निर्दिष्ट करना होगा (उदाहरण: कॉलम ए द्वारा क्रमबद्ध करें, फिर बी द्वारा, फिर सी द्वारा, फिर डी द्वारा।)। मान लीजिए कि कॉलम A में डुप्लिकेट स्ट्रिंग्स हैं। छँटाई करते समय, कॉलम A के लिए समान मान वाली सभी पंक्तियों को 'कॉलम B' के मानों पर क्रमबद्ध किया जाएगा। यदि B की कोशिकाओं में भी डुप्लिकेट मान हैं, तो कॉलम C पर सॉर्ट किया जाएगा ... ताकि अद्वितीय मान वाले कॉलम तक मिल जाए। यदि किसी भी कॉलम में अद्वितीय मान नहीं हैं, तो पंक्तियों को छोड़ दिया जाएगा।
गोपीनाथ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.