2012-06-10 15 views
11

संघों, चौराहे और मतभेदों से बना कम्प्यूटेशंस सेट अक्सर कई अलग-अलग तरीकों से व्यक्त किया जा सकता है। क्या कोई सिद्धांत या ठोस कार्यान्वयन है जो किसी दिए गए उत्तर तक पहुंचने के लिए आवश्यक गणना की मात्रा को कम करने का प्रयास करता है?इंटेलिजेंट पूरी तरह से कार्यात्मक सेट

उदाहरण के लिए, मैं पहली बार पड़ोसी गोले में एक असंगत सामग्री के सिमुलेशन में परमाणुओं को विघटित करने की कोशिश करते समय इसका एक व्यावहारिक अनुप्रयोग आया, जहां पहला खोल कुछ मूल मूल परमाणु के तत्काल पड़ोसियों और दूसरे खोल हैं परमाणुओं है कि यह पहले या तो पहले खोल या एक में नहीं पहले खोल के पड़ोसी हैं:

nth 0 = singleton i 
nth 1 = neighbors i 
nth n = reduce union (map neighbors (nth(n-1))) - nth(n-1) - nth(n-2) 

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

संभावित रूप से एक बुद्धिमान सेट कार्यान्वयन मूल्यांकन की रचना करने के लिए मूल्यांकन करने से पहले मूल्यांकन करने के लिए अभिव्यक्ति की रचना की जा सकती है और उसके बाद अनुकूलित किया जा सकता है (उदाहरण के लिए इंटरमीडिएट सेट के आकार को कम करने के लिए)। क्या ऐसे सेट कार्यान्वयन मौजूद हैं?

+1

ठीक है, मुझे लगता है कि सिंगल-कॉलम टेबल वाले SQL डेटाबेस अनिवार्य रूप से क्वेरी-भाषा-अनुकूलक के साथ सेट होते हैं। मुझे नहीं पता कि उनमें से कोई भी अनुकूलन है जो इस क्वेरी पर लागू होगा, हालांकि ... या यहां तक ​​कि SQL इस क्वेरी को व्यक्त करने में सक्षम होने के लिए एक रोमांचक पर्याप्त भाषा है या नहीं। –

+1

मैंने कुछ साल पहले शायद एक दर्जन देखा और एसक्यूएल क्वेरी ऑप्टिमाइज़र के उल्लेखनीय अपवाद के साथ इसका उत्तर "नहीं" था। – Gene

+2

सी ++ अभिव्यक्ति टेम्पलेट्स की तरह लगता है ... – ildjarn

उत्तर

8

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

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

मुझे लगता है कि इस अवधारणा के पीछे एक बहुत गहरा सिद्धांत है कि पेपर संकेत देता है लेकिन कभी भी मंत्रमुग्ध नहीं होता है, और अगर कोई और जानता है कि यह क्या है, तो कृपया मुझे बताएं, क्योंकि यह किसी और चीज के लिए बहुत प्रासंगिक है भी!

+2

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

+3

फ़्यूज़न ऑप्टिमाइज़ेशन रिकर्सिव सह-बीजगणित के गुणों के एन्कोडिंग हैं। विभिन्न बीजगणितीय कानून, जब अभिव्यक्तियों पर पुनर्लेखन के रूप में लागू होते हैं, जटिलता में सुधार करते हैं। हिनज एट अल। सिद्धांत को कवर करें http://www.cs.ox.ac.uk/ralf.hinze/publications/IFL10.pdf। –

+0

आप दोनों के लिए धन्यवाद। यह बहुत मदद करता है। –

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