ट्रैक
/
Julia
Julia
/
अभ्यास
/
क्रमबद्ध करने की कसौटी
क्रमबद्ध करने की कसौटी

क्रमबद्ध करने की कसौटी

सीखने का अभ्यास

परिचय

Julia, ज़्यादातर प्रोग्रामिंग भाषाओं की तरह, कई तरह के कलेक्शन टाइप देती है।

कुछ कलेक्शन स्वाभाविक रूप से क्रमबद्ध होते हैं (Vectors और बहु-आयामी Arrays भी), इसलिए हम उनके एलिमेंट तक स्थिति के ज़रिए पहुँच सकते हैं। दूसरे कलेक्शन बिना क्रम के होते हैं (Sets, Dicts), और उनके एलिमेंट तक की या वैल्यू के ज़रिए पहुँचना पड़ता है।

सबसे आसान उदाहरण लीजिए: मान लीजिए हमारे पास Ints का एक Vector है और हम उसे आरोही क्रम में लगाना चाहते हैं।

julia> v = [3, 2, 4, 1]
4-element Vector{Int64}:
 3
 2
 4
 1

julia> sort(v)
4-element Vector{Int64}:
 1
 2
 3
 4

# sort descending
julia> sort(v, rev=true)
4-element Vector{Int64}:
 4
 3
 2
 1

आसान! sort() फंक्शन का नाम ही साफ बता देता है कि यह क्या करता है, और देखने में लगता है कि यह क्रमबद्ध Vector ही लौटाता है।

सिर्फ मज़ाक! सिलेबस में इस मुकाम तक पहुँचकर शायद आपको (और ठीक ही) शक हो कि यहाँ कुछ बारीकियाँ हैं जिन पर चर्चा करनी होगी।

म्यूटेटिंग और नॉन-म्यूटेटिंग फंक्शन

sort(v) चलाने के बाद v क्या है?

julia> v
4-element Vector{Int64}:
 3
 2
 4
 1

julia> issorted(v)
false

मूल वेक्टर में कोई बदलाव नहीं हुआ। sort() एक नॉन-म्यूटेटिंग फंक्शन है जो अपने इनपुट की एक कॉपी लौटाता है।

कई जगहों पर यह अच्छा डिज़ाइन है: हमारे पास एक प्योर फंक्शन होता है जिसका व्यवहार समझना आसान है, चाहे कोड समानांतर हो या वितरित।

दूसरी ओर, मान लीजिए हमारे पास अरबों स्ट्रिंग का एक ऐरे हो और हम उसे क्रमबद्ध करना चाहें।

क्रमबद्ध करने में शायद काफी समय लगेगा। साथ ही हमें हर चीज़ की कॉपी बनानी पड़ेगी (धीमा!), और उस कॉपी को रखने के लिए काफी मेमोरी चाहिए (कई गीगाबाइट!)。

अब इससे काफी मिलते-जुलते कोड को देखिए:

# v is as previously

julia> issorted(v)
false

julia> sort!(v)
4-element Vector{Int64}:
 1
 2
 3
 4

julia> v
4-element Vector{Int64}:
 1
 2
 3
 4

julia> issorted(v)
true

अब इनपुट Vector बिना कॉपी बनाए उसी जगह पर क्रमबद्ध हो जाता है, और मूल क्रम हमेशा के लिए खत्म हो जाता है।

यह कुशल हो सकता है, यह बग पैदा कर सकता है और अनपेक्षित साइड इफेक्ट दे सकता है, और आपका कोड इस्तेमाल करने वाले दूसरे लोगों के लिए यह उलझन पैदा कर सकता है। सोच-समझकर चुनिए!

sort!() एक "म्यूटेटिंग फंक्शन" है, और एक (बहुत ही सख्त) परंपरा के अनुसार जो भी फंक्शन अपने इनपुट को बदलता है, उसके नाम के आगे ! लगा दिया जाता है, ताकि यह प्रोग्रामर के लिए चेतावनी बन जाए।

इंडेक्स ऐरे से क्रमबद्ध करना

अगर जिन एलिमेंट को क्रमबद्ध करना है वे बड़े ऑब्जेक्ट हैं, तो उनके स्थिति इंडेक्स के साथ काम करना आसान हो सकता है।

julia> langs = ["Julia", "C++", "Python", "Elixir"]
4-element Vector{String}:
 "Julia"
 "C++"
 "Python"
 "Elixir"

julia> inxs = sortperm(langs)  # => Integers
4-element Vector{Int64}:
 2
 4
 1
 3

julia> langs[inxs]  # sort the entire vector
4-element Vector{String}:
 "C++"
 "Elixir"
 "Julia"
 "Python"

julia> langs[inxs[1:2]]  # slice the indices
2-element Vector{String}:
 "C++"
 "Elixir"

चूँकि langs एक वेक्टर है, इसका हर इंडेक्स 1:length(langs) के बीच एक पूर्णांक होता है। sortperm() का आउटपुट इन पूर्णांकों का एक क्रमचय होता है, जो इनपुट वेक्टर को क्रमबद्ध करने के क्रम से मेल खाता है।

निर्देश

एक ऐसी कंपनी ने आपको सहायक उत्पादन इंजीनियर की नौकरी दी है, जो कछुओं के लिए रज़ाई बनाती है।

दिन भर ऑर्डर आते रहते हैं। हर ऑर्डर में ग्राहक का नाम या नंबर और ऑर्डर की मात्रा होती है। इन्हें अगली सुबह, दिन का उत्पादन शुरू होने से पहले, प्रोसेस किया जाता है।

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

1. मात्राएँ क्रमबद्ध कीजिए!

जैसा कि बताया गया, मात्राओं के ऐरे को सबसे बड़ी से सबसे छोटी तक क्रमबद्ध करना होगा। ये ऐरे बहुत बड़े हो सकते हैं, इसलिए इन्हें जगह पर ही क्रमबद्ध करना चाहिए। सब कुछ का सही हिसाब रखने के लिए आपको मात्राओं के मुताबिक ग्राहकों के ऐरे को भी क्रमबद्ध करना होगा, और इसके लिए मात्राओं का एक क्रमचय चाहिए होगा।

एक फंक्शन sortquantity!(qty) लिखिए, जो Integer मात्राओं का एक Vector लेता है। यह फंक्शन इनपुट qty को जगह पर ही घटते क्रम में क्रमबद्ध करता है और इसी क्रम का क्रमचय लौटाता है।

julia> qty = [8, 9, 5, 6]
4-element Vector{Int64}:
 8
 9
 5
 6

julia> sortquantity!(qty)
4-element Vector{Int64}:
 2
 1
 4
 3

julia> qty # original vector is sorted in-place
4-element Vector{Int64}:
 9
 8
 6
 5

2. ग्राहकों को क्रमबद्ध कीजिए

जैसा ऊपर बताया गया, आपको ग्राहकों को एक तय क्रम में बनाए रखना है।

एक फंक्शन sortcustomer(cust, srtperm) लिखिए, जो ग्राहकों का एक Vector cust और क्रमचय का Vector srtperm लेता है। यह फंक्शन एक नया ऐरे लौटाता है, जिसमें ग्राहक उस क्रम में होते हैं जो यह क्रमचय तय करता है।

julia> cust = ["a", "b", "c"]
3-element Vector{String}:
 "a"
 "b"
 "c"

julia> sortcustomer(cust, [2, 3, 1])
3-element Vector{String}:
 "b"
 "c"
 "a"

julia> cust # original vector remains unsorted
3-element Vector{String}:
 "a"
 "b"
 "c"

3. उत्पादन शेड्यूल बनाइए!

अब इन सबको मिलाकर आप उन कछुओं को गर्म रखने में मदद कर सकते हैं! अब आप मात्राओं और ग्राहकों को ठीक से क्रमबद्ध कर सकते हैं, लेकिन भेजने के लिए इनका मूल क्रम वापस पाना भी ज़रूरी है। यह काम उल्टे क्रमचय की मदद से किया जा सकता है।

एक फंक्शन production_schedule!(cust, qty) लिखिए, जो ग्राहकों का एक Vector और मात्राओं का एक Vector लेता है। यह फंक्शन मात्राओं को जगह पर ही घटते क्रम में क्रमबद्ध करता है। यह मात्राओं के उसी क्रम में क्रमबद्ध ग्राहकों का एक नया Vector लौटाता है, और साथ ही एक उल्टा क्रमचय लौटाता है, जिसकी मदद से क्रमबद्ध वेक्टर को उसके मूल क्रम में वापस लाया जा सकता है।

julia> cust, qty = ["a", "b", "c"], [2, 3, 1]
(["a", "b", "c"], [2, 3, 1])

julia> orderedcust, invperm = production_schedule!(cust, qty)
(["b", "a", "c"], [2, 1, 3])

julia> qty # has been sorted in-place
3-element Vector{Int64}:
 3
 2
 1

julia> orderedcust[invperm], qty[invperm] # inverse permutation gives original ordering
(["a", "b", "c"], [2, 3, 1])
GitHub के ज़रिए संपादित करें यह लिंक एक नई विंडो या टैब में खुलता है
Julia Exercism

क्रमबद्ध करने की कसौटी शुरू करने के लिए तैयार हैं?

Exercism पर साइन अप कीजिए और Julia को 35 कॉन्सेप्ट128 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।