2010-03-11 15 views

उत्तर

18

पहले एक

(n >= 3) && (n <= 99) 

यह 3 संचालन

n >= 3 
n <= 99 
and 

कहाँ elem के रूप में सरणी में आइटम लग रही है क्या कर रहा है, इसलिए तक क्या कर रहा है तेजी से होता है (99 - 3) * 2 संचालन।

index = 0 
isFound = false 
array[] = { 3, 4, 5, 6, ... 98, 99 } 

while isFound == false 
    isFound = (n == array[index++]) 
+0

क्या यह वास्तव में 'elem' वास्तव में लागू किया गया है? क्या वास्तव में कोई काला जादू नहीं है ?? बिलकुल?? :) –

+4

क्या आप "काला जादू" की अपेक्षा करेंगे? यहां तक ​​कि यदि हुड के तहत संकलक पहचानता है [3..99] एक सीमा है और एक श्रेणी की जांच को पूर्ववत करता है तो यह अभी भी (n> = 3) && (n <= 99) –

+2

जैसा ही होगा, मुझे लगता है कि आप जीएचसी को इस विशेष मामले को फिर से लिखने के लिए एक लाइट 'एआईएम/एनमफ्रॉमटो "फॉरल एक्स लो हाय का उपयोग करके अनुकूलित किया जा सकता है। elem x (enumFromTo lo hi) = (x> = lo && x <= hi) '। मैंने फिर से लिखने के नियमों के साथ कुछ भी नहीं किया है (हालांकि काले जादू की तरह बहुत अधिक ;-), तो नमक के एक बड़े चुटकी के साथ इसे ले लो! – yatima2975

11

(n> = 3) & & (एन < = 99) तेजी से होता है, क्योंकि यह केवल दो तुच्छ तुलना शामिल है। यदि कंपाइलर/दुभाषिया किसी भी तरह का असली काला जादू अनुकूलन नहीं करता है तो उसे सूची ([3..99]) बनाना है क्योंकि आलसी मूल्यांकन का उपयोग नहीं किया जा सकता है (आमतौर पर जब तक आप पूरा नहीं कर लेते हैं, तब तक अगले मूल्य को खींचते हैं, जो इस मामले में ओ (एन/2) की जटिलता होगी)।

+2

+1 स्टैक ओवरफ्लो में आपका स्वागत है :) –

+0

+1 तो कोई काला जादू नहीं है हालांकि मैं कुछ की उम्मीद कर रहा था :) एसओ में भी आपका स्वागत है! –

8

इन दो अभिव्यक्तियों का मतलब एक ही बात नहीं है। एक सूक्ष्म अंतर यह है कि एक पर Ord और अन्य Enum पर निर्भर करता है:

> :t \n -> (n >= 3) && (n <= 99) 
\n -> (n >= 3) && (n <= 99) :: (Num a, Ord a) => a -> Bool 

> :t \n -> n `elem` [3..99] 
\n -> n `elem` [3..99] :: (Num a, Enum a) => a -> Bool 

तो, उदाहरण के लिए, यदि n 3.14159 है, तो पहले टेस्ट पास जाएगा, लेकिन दूसरा नहीं होगा:

> (pi >= 3) && (pi <= 99) 
True 

> pi `elem` [3..99] 
False 

इसके अलावा, जबकि चार प्रस्तावना Num उदाहरणों (Int, Integer, Float, और Double) दोनों Ord और Enum के सभी उदाहरणों हैं, यह एक अंकीय प्रकार Ord का एक उदाहरण है कि कल्पना करना संभव है लेकिन Enum नहीं। ऐसे मामले में, दूसरा परीक्षण कानूनी भी नहीं होगा।

इसलिए, आम तौर पर, कंपाइलर दूसरे के जितना तेज़ हो सकता है जब तक कि यह किसी दिए गए प्रकार के लिए नहीं जानता, यह Ord है और सीमा में सभी ऑर्डर किए गए मान सूची गणना में भी हैं enumFromTo द्वारा बनाया गया। Float और Double के लिए यह सच नहीं है, और Int और Integer के लिए कंपाइलर इसे प्राप्त करने का कोई तरीका नहीं है, कंपाइलर और लाइब्रेरी प्रोग्रामर को इसे कोड देना होगा और यह सुनिश्चित करना होगा कि यह सभी मामलों में हो।

-2

मशीन और कंपाइलर (या दुभाषिया) पर निर्भर करता है।

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