2008-09-28 14 views
8

समय-समय पर मैं वेब ब्राउज़ करता हूं और ट्रिक्स के अपने बैग में डाल करने के लिए दिलचस्प एल्गोरिदम और डेटास्ट्रक्चर की तलाश करता हूं। एक साल पहले मैं Soft Heap डेटा-स्ट्रक्चर में आया और पास सॉर्टिंग के बारे में सीखा।सॉर्टिंग एल्गोरिदम के पास - कब उपयोग करें?

इसके पीछे विचार यह है कि तुलनात्मक प्रकार के ओ (एन लॉग एन) बाधा को तोड़ना संभव है यदि आप इस तथ्य के साथ रह सकते हैं कि सॉर्ट एल्गोरिदम थोड़ा सा धोखा देती है। आपको लगभग क्रमबद्ध सूची मिलती है लेकिन आपको कुछ त्रुटियों के साथ भी रहना होगा।

मैंने परीक्षण वातावरण में एल्गोरिदम के साथ खेला लेकिन कभी उनके लिए उपयोग नहीं मिला।

तो प्रश्न: क्या किसी ने कभी अभ्यास में सॉर्टिंग के आसपास उपयोग किया है? यदि ऐसा है तो किस तरह के अनुप्रयोगों में? क्या आप एक उपयोग-मामले को सोच सकते हैं जहां सॉर्टिंग के पास सही काम करना है?

उत्तर

4

बहुत सारे "लालची" हेरिस्टिक्स हैं जहां आप समय-समय पर सेट का न्यूनतम चयन करते हैं। लालची हेरिस्टिक सही नहीं है, इसलिए यदि आप न्यूनतम चुनते हैं तो भी आपको सर्वश्रेष्ठ अंतिम उत्तर प्राप्त करने की गारंटी नहीं है। वास्तव में, GRASP मेटा-हेरिस्टिक, आप जानबूझकर यादृच्छिक त्रुटि प्रस्तुत करते हैं ताकि आपको कई अंतिम समाधान मिलें और सर्वोत्तम चुनें। उस स्थिति में, गति के बदले में आपके सॉर्ट रूटीन में कुछ त्रुटि पेश करना एक अच्छा व्यापार होगा।

9

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

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

+0

अच्छा! अगर मैं कर सकता तो मैं आपको दो बार वोट दूंगा। :-) –

4

बस यहां अनुमान लगा रहा है, लेकिन एक चीज जिसे मैं कल्पना करता हूं डेटाबेस क्वेरी अनुकूलन है।

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

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

कुछ अनुकूलन एल्गोरिदम "वादा" (आंशिक) योजनाओं की एक क्रमबद्ध कतार का उपयोग करते हैं। यदि आपको वास्तव में कोई फर्क नहीं पड़ता कि आपको बिल्कुल सही योजना मिलती है, तो हो सकता है कि आप लगभग-क्रमबद्ध कतार का उपयोग कर सकें?

एक और विचार (और मैं अभी भी अनुमान लगा रहा हूं) एक समय-साझाकरण प्रणाली में प्रक्रियाओं या धागे के लिए एक शेड्यूलर है, जहां यह महत्वपूर्ण नहीं हो सकता है कि अगर कोई निश्चित प्रक्रिया या धागा इसके बाद कुछ मिलीसेकंड प्राप्त करता है सख्ती से प्राथमिकता से क्रमबद्ध।

+0

+1, मुझे डीबी योजना अनुकूलन उदाहरण पसंद है। प्रक्रिया शेड्यूलिंग के साथ मुझे लगता है कि यह अधिक जटिल है, क्योंकि बिना किसी गारंटी के "परिणाम कितना और कितना" परिणाम पूरी तरह से हल होने में विफल रहता है, आप प्रक्रिया भुखमरी के साथ हवादार हो सकते हैं। –

1

कहीं भी

  1. आप तेजी से प्रतिक्रिया करने के लिए अपेक्षा की जाती है,
  2. आप ग्राहक के लिए सही व्यवहार का वादा नहीं कर रहे हैं,
  3. लेकिन आंतरिक रूप से आप कुछ नियम

आप इसका इस्तेमाल कर सकते हैं । नियम-आधारित प्राथमिकता कतार के बारे में "इतना सख्त नहीं" कैसे? वह कहाँ उपयोगी होगा? शायद थ्रेड/प्रक्रिया/संसाधन शेड्यूलिंग। धागे/प्रक्रिया शेड्यूलिंग में आप वास्तव में वादा नहीं कर रहे हैं कि कोई भी धागा पहले, दूसरे या आखिरी बार जा रहा है, लेकिन आम तौर पर आप सभी को कुछ मौका देना चाहते हैं। आप ढीले नियम को लागू करना चाहते हैं, इसलिए यह प्रीemptive, प्राथमिकता, blabla ..

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

2

पास-सॉर्टिंग के लिए एक आम अनुप्रयोग तब होता है जब कोई व्यक्ति जोड़ी की तुलना कर रहा है और आप उन्हें कई प्रश्न पूछना नहीं चाहते हैं।

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

-1

ओ (एन लॉग एन) पहले से ही बहुत तेज़ है। मुझे नहीं लगता कि कोई भी निकट-क्रमबद्ध एल्गोरिदम का उपयोग करके शुरू करेगा। आप कोड के साथ शुरू करेंगे जो सिर्फ एक पूर्ण प्रकार है (चूंकि आपकी प्रोग्रामिंग भाषा पसंद की संभावना sort फ़ंक्शन प्रदान करती है और nearsort फ़ंक्शन नहीं), और जब आपको अनुभव मिलता है कि इस तरह का समय बहुत अधिक समय ले रहा था, तो आप सवाल करना शुरू कर देंगे कि क्या आपका डेटा वास्तव में को पूरी तरह से क्रमबद्ध करने की आवश्यकता है, और निकटतम प्रकार का उपयोग करने पर विचार करें।

असल में, आप कभी भी किसी न किसी प्रकार का उपयोग करने पर विचार नहीं करेंगे जबतक कि आपने पहली बार अपने प्रोग्राम में गंभीर बाधा बनने के लिए सॉर्टिंग की खोज नहीं की।

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