2017-03-10 8 views
7

कल मेरे पास रिवर्स ऑर्डर में संग्रह पर पुन: प्रयास करना था। मुझे reverse फ़ंक्शन मिला, लेकिन यह एक पुनरावर्तक नहीं लौटाता है, लेकिन वास्तव में एक उलटा संग्रह बनाता है।जूलिया में रिवर्स पुनरावृत्ति

स्पष्ट रूप से, Reverse इटरेटर होता था, जो कई वर्षों पहले removed था। मुझे reference कुछ (एक प्रकार?) भी मिल सकता है जिसे Order.Reverse कहा जाता है, लेकिन ऐसा लगता है कि यह मेरे प्रश्न पर लागू नहीं होता है।

Iterators.jl पैकेज में कई रोचक पुनरावृत्ति पैटर्न हैं, लेकिन जाहिर है कि पुनरावृत्ति पुनरावृत्ति नहीं है।

मैं निश्चित रूप से reverse फ़ंक्शन का उपयोग कर सकता हूं, और कुछ मामलों में, उदाहरण के लिए reverse(eachindex(c)) जो एक उल्टा इटरेटर वापस करता है, लेकिन मैं एक सामान्य रिवर्स इटेटरेटर पसंद करूंगा।

क्या ऐसी कोई बात है?

उत्तर

5

जेफ की टिप्पणी जब वह तीन साल पहले रिवर्स इटरेटर हटाया (the issue you linked में) आज बस के रूप में प्रासंगिक है:

मैं इस को हटाने के बाद से यह सिर्फ काम नहीं करता है के पक्ष में अत्यधिक हूँ। Iterator.jl में बाकी सब कुछ के विपरीत यह अनुक्रमण पर निर्भर करता है, पुनरावृत्ति नहीं, और यह सब कुछ भी सूचकांक पर काम नहीं करता है (उदाहरण के लिए UTF8String)। मुझे बेस में इस तरह की लैंडमाइन्स होने से नफरत है।

सबसे बुनियादी स्तर पर, इटरेटर केवल तीन चीजें कैसे करें: पुनरावृत्ति शुरू करें, अगला तत्व प्राप्त करें, और जांच करें कि पुनरावृत्ति क्या किया जाता है या नहीं। एक इटरेटर बनाने के लिए जो इन प्राइमेटिव्स का उपयोग नहीं करता है, आपको ओ (एन^2) एल्गोरिदम की आवश्यकता होगी: पूरे इटेटरेटर के माध्यम से चलें, जब तक आप अंतिम तत्व नहीं पाते, तब तक गिनती करें। फिर पुनरावृत्त फिर से पर जाएं, केवल इस बार अंतिम तत्व पर रोकें। निश्चित रूप से यह आवंटित नहीं करता है, लेकिन यह रास्ता केवल सरणी को एक सरणी में एकत्र करने और फिर पीछे की ओर अनुक्रमणित करने से धीमा होगा। और यह एक शॉट शॉटरेटर्स (जैसे eachline) के लिए पूरी तरह टूटा जाएगा। इसलिए एक कुशल सामान्य रिवर्स इटेटरेटर बनाना संभव नहीं है।

ध्यान दें कि reverse(eachindex(c)) सामान्य रूप में काम नहीं करता है:

julia> reverse(eachindex(sprand(5,5,.2))) 
ERROR: MethodError: no method matching reverse(::CartesianRange{CartesianIndex{2}}) 

एक वैकल्पिक है कि अभी भी साथ काम करेंगे सरणियों ऑफसेट reverse(linearindices(c)) है।

+0

मैं _did_ उस टिप्पणी को पढ़ता हूं, लेकिन मैंने इसे इस अर्थ के रूप में नहीं लिया कि रिवर्स पुनरावृत्ति अक्षम था। और स्टीफन कार्पिनस्की की निम्नलिखित टिप्पणी ने उस छाप को भी नहीं छोड़ा। भले ही, आपके तर्क बहुत समझ में आते हैं, लेकिन संग्रह के कुछ सबसेट के लिए रिवर्स पुनरावृत्ति का समर्थन करने के लिए अव्यवहारिक होगा? मुझे लगता है कि पाइथन के पास ऐसा कुछ है: https://docs.python.org/3/library/functions.html#reversed – DNF

+0

नहीं, यह बिल्कुल अव्यवहारिक नहीं होगा। यह सिर्फ इतना है कि किसी ने अभी तक इस तरह के एक इंटरफ़ेस को परिभाषित नहीं किया है - हमें बस उस काम को करने की आवश्यकता है और मुझे लगता है कि यह स्वीकार किया जाएगा। रेफरी। https://github.com/JuliaLang/julia/issues/4590#issuecomment-26684029 –

+0

मैं देखता हूं। खैर, यह मेरे प्रश्न का उत्तर देता है। – DNF