2013-08-25 5 views
5

में जगह में मैं स्कैला में क्विकॉर्ट के साथ थोड़ा उलझन में हूं। विनिर्देश के अनुसार, क्विकस्टोर्ट केवल ऐरे पर लागू किया जा सकता है, लेकिन ArrayBuffer के लिए नहीं। और क्विकस्टोर्ट प्लेस में इस तरह का काम करेगा यानी मूल ऐरे बदल देगा।क्विकॉर्ट को स्केल करने के लिए ऐरेबफर पर लागू नहीं किया जा सकता है Scala

val intArray = Array(7,1,4,6,9)   //> intArray : Array[Int] = Array(7, 1, 4, 6, 9) 
Sorting.quickSort(intArray) 
intArray.mkString("<"," and ",">")  //> res4: String = <1 and 4 and 6 and 7 and 9> 

अब मैं समझता हूँ कि क्यों एक ही मैं ArrayBuilder साथ नहीं कर सकते पा रहा हूँ। क्या इसके पीछे कोई कारण है? और यदि मैं क्विकॉर्ट एल्गोरिदम के साथ एक ऐरेबिल्डर को सॉर्ट करना चाहता हूं, तो स्कैला द्वारा प्रदान किया गया विकल्प क्या है? सभी मदद के लिए धन्यवाद।

उत्तर

5

मेरा मानना ​​है कि अपने प्रश्न का उत्तर स्काला के स्रोत कोड की जांच, निर्धारित करने के लिए क्या व्यवहार आप कार्यों में बनाया गया है कि ArrayBuffer के साथ आते हैं से प्राप्त कर सकते द्वारा पाया जा सकता है: sortWith, sortBy, आदि ..

.. प्रलेखन के शीर्ष पर "Seqlike"

किसी भी तरह:

इन कार्यों विशेषता "SeqLike" को परिभाषित करने से आते हैं (आप ScalaDoc में उस वर्ग के लिए ब्राउज़, और स्रोत के लिए अगले करने के लिए लिंक पर क्लिक करके स्रोत कोड की जांच कर सकते सॉर्टिंग से संबंधित अधिकांश कोड को इस फ़ंक्शन से धक्का दिया जाता है:

def sorted[B >: A](implicit ord: Ordering[B]): Repr = { 
    val len = this.length 
    val arr = new ArraySeq[A](len) 
    var i = 0 
    for (x <- this.seq) { 
     arr(i) = x 
     i += 1 
    } 
    java.util.Arrays.sort(arr.array, ord.asInstanceOf[Ordering[Object]]) 
    val b = newBuilder 
    b.sizeHint(len) 
    for (x <- arr) b += x 
    b.result() 
    } 

जो मूल रूप से सरणी की एक प्रति बनाता है और Java.util.Arrays.Sort का उपयोग करके इसे टाइप करता है। तो अगला सवाल बन जाता है, "जावा यहाँ क्या कर रहा है?" मैं उत्सुक था और एपीआई वर्णित था:

कार्यान्वयन नोट: सॉर्टिंग एल्गोरिदम व्लादिमीर यारोस्लावस्की, जॉन बेंटले और जोशुआ ब्लोच द्वारा दोहरी-पिवट क्विक्सॉर्ट है। यह एल्गोरिदम कई डेटा सेटों पर ओ (एन लॉग (एन)) प्रदर्शन प्रदान करता है जो अन्य क्विकॉर्ट्स को वर्गबद्ध प्रदर्शन में गिरावट का कारण बनता है, और आमतौर पर पारंपरिक (एक-पिवट) क्विक्सोर्ट कार्यान्वयन से तेज़ होता है।

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

+0

@LalolnDublin: यह ध्वनि बनाता है। मैं स्रोत कोड पर अधिक गहराई से देखने की कोशिश करूंगा। किसी भी संदेह के मामले में, मैं इसे यहां पोस्ट करूंगा। –

+0

यह एक अच्छा सवाल है कि मैंने सोचा है कि स्कैला वास्तव में इन मामलों में क्या कर रहा है ... स्रोत कोड जानकारी और अभ्यास का एक धन है (यह देखते हुए कि वे अंतर्निहित वस्तुओं के आसपास कैसे जाते हैं, आदि) – LaloInDublin

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

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