कारण कि विशेष कोड धीमी है:
यह तेजी से होना चाहिए। (यदि List
और उसके पूर्वजों को विशेषीकृत किया गया तो यह बेहतर किया जा सकता है।) यह शायद 5 या उससे अधिक के कारक से चीजों को धीमा कर देगा।
इसके अलावा, एल्गोरिदम रूप से, उन कार्यों कुछ महंगे हैं क्योंकि आप एक पूरी सूची बनाने, और फिर एक पूरी नई सूची मध्यवर्ती सूची के कुछ घटकों बर्बाद कर रहे हैं। यदि आपने इसे एक झुकाव में किया है, तो आप बेहतर हो जाएंगे। आप की तरह कुछ कर सकता है:
list collect (case e if (e*2>10) => e*2)
लेकिन क्या हुआ अगर गणना e*2
वास्तव में महंगा है? फिर आप
(List[Int]() /: list)((ls,e) => { val x = e*2; if (x>10) x :: ls else ls }
को छोड़कर यह पीछे की तरफ दिखाई देगा। (यदि आवश्यकता हो तो आप इसे उलट सकते हैं, लेकिन इसके लिए एक नई सूची बनाने की आवश्यकता है, जो फिर से आदर्श एल्गोरिदमिक नहीं है।)
बेशक, यदि आप अकेले उपयोग कर रहे हैं तो आपके पास जावा में एक ही तरह की एल्गोरिदमिक समस्याएं हैं लिंक्ड सूची - आपकी नई सूची पीछे की तरफ समाप्त हो जाएगी, या आपको इसे दो बार बनाना होगा, पहले रिवर्स में और फिर आगे, या आपको इसे (गैर-पूंछ) रिकर्सन (जो स्कैला में आसान है, लेकिन इसके लिए अव्यवस्थित है) इस तरह की चीज किसी भी भाषा में है क्योंकि आप स्टैक को खत्म कर देंगे), या आपको एक म्यूटेबल सूची बनाना है और फिर बाद में नाटक करना है कि यह व्यवहार्य नहीं है। (जो, आकस्मिक रूप से, आप स्कैला में भी कर सकते हैं - mutable.LinkedList
देखें।)
स्रोत
2011-02-04 15:02:35
यह उत्तर समस्या पाती है, लेकिन कोई अच्छा समाधान नहीं प्रदान करता है। – Raphael
@ राफेल - लाइब्रेरी की वर्तमान स्थिति को वास्तव में नहीं दिया गया है। जब आप primitives के साथ काम कर रहे हों तो 'view'/'force' आपको सहेजने वाला नहीं है। –
यदि 'ई * 2 महंगा था, तो मध्यवर्ती चरण होने की लागत कम हो जाएगी। शायद स्मृति की समस्याएं, यदि आप बड़ी मात्रा में डेटा से निपटते हैं। – ziggystar