मेरा पसंदीदा Software Engineering इंटरव्यू सवाल: Median की गणना
(krisshamloo.com)- टेक्निकल इंटरव्यू में छोटे implementation सवाल पहेलियों की तुलना में अधिक प्रभावी हो सकते हैं, और median की गणना बुनियादी coding क्षमता और design sense दोनों को साथ में दिखाती है
- यह sorting की मांग करने वाली समस्या है, इसलिए इससे स्वाभाविक रूप से ऐसे API सवाल निकलते हैं जैसे function खुद sort करे या caller sort करे, और क्या मूल array को बदला जा सकता है
- odd और even length को अलग करने वाली branch, index calculation, और off-by-one गलतियां उम्मीदवार की debugging प्रक्रिया को देखने के लिए उपयुक्त हैं
- median और average के अंतर, test लिखने की आसानी, और Python की statistics standard library की जानकारी तक, इस छोटे सवाल के भीतर बहुत कुछ जांचा जा सकता है
- उदाहरण implementation खाली list पर
ValueErrorफेंकता है,sorted()से copy sort करता है, फिर even length पर बीच के दो मानों का average और odd length पर बीच का मान लौटाता है
Median समस्या इंटरव्यू के लिए उपयुक्त क्यों है
- अच्छा टेक्निकल इंटरव्यू सवाल कोई उलझी हुई puzzle नहीं होना चाहिए, बल्कि सहज implementation के भीतर से गहरे विषय निकाल पाने वाला होना चाहिए
- “संख्याओं की array लेकर median लौटाने वाला function लिखिए” जैसा सवाल यह जांचने के लिए अच्छा Fizz Buzz-प्रकार का संकेत है कि उम्मीदवार वास्तव में programming कर सकता है या नहीं
- array के मानों को घटाकर एक परिणाम तक लाना बुनियादी क्षमता का हिस्सा है, और समस्या इतनी छोटी भी है कि बातचीत और debugging दोनों को साथ में देखना आसान होता है
Implementation के दौरान सामने आने वाले निर्णय बिंदु
- median की गणना के लिए पहले sorting चाहिए
- यह तय करना होता है कि function खुद sort करे या caller sorted array दे
- जब array reference से pass हो, तब क्या मूल को बदलना स्वीकार्य है, यह भी API contract का हिस्सा बनता है
- ऐसे विकल्प performance discussion से भी जुड़ते हैं
- index calculation में off-by-one का जाल होता है
- गलती हुई या नहीं, उससे ज्यादा महत्वपूर्ण यह देखना है कि उम्मीदवार छोटी समस्या को debug कैसे करता है
- array की length के अनुसार return value बदलती है
- even length में बीच के दो मानों का average लौटाया जाता है
- odd length में बीच का मान लौटाया जाता है
छोटे सवाल से आगे बढ़ती बातचीत
- median, average की तुलना में अधिकतर स्थितियों में क्यों बेहतर विकल्प हो सकता है, इस तरह की statistics discussion तक बात जा सकती है
- input और expected value सरल होने से इसे test करना आसान है, इसलिए उम्मीदवार अपने testing sense को अच्छे से दिखा सकता है
- Python में
statisticsstandard library की जानकारी दिखाने का मौका भी मिलता है
उदाहरण Python implementation की पसंद
- खाली list पर
ValueError("median called with empty list")उठाया जाता है sorted(numbers)का उपयोग किया जाता है, इसलिएnumbers.sort()के विपरीत input list सीधे sort नहीं होती- length को
len(numbers)से लिया जाता है, और middle index कोmid = length // 2से निकाला जाता है - even length में
(numbers[mid - 1] + numbers[mid]) / 2.0लौटाया जाता है, और odd length मेंnumbers[mid]लौटाया जाता है
1 टिप्पणियां
Lobste.rs की राय
यह लेख ठीक से समझ नहीं आता। लगता है लेखक को पता नहीं कि median को O(n) में निकाला जा सकता है। संदर्भ: https://rcoh.me/posts/linear-time-median-finding/
इसलिए “शुरू से ही संख्याएँ sorted होनी चाहिए” कहना गलत है। इसी वजह से मुझे यह अच्छा interview problem भी नहीं लगता। optimal solution एक जटिल algorithm है, इसलिए अगर किसी ने इसे रटकर न सीखा हो तो उससे मौके पर इसकी उम्मीद करना मुश्किल है, और अगर रटकर सीखा भी हो तो उससे candidate का मूल्यांकन करने में खास मदद नहीं मिलती।
इसकी बजाय candidate से array को library function से sort करके बीच का मान लौटाने वाला naive solution लिखने को कहा जा सकता है
n*log(n)solution दिया था और phone interview में reject कर दिया गया थाबाद में algorithms class में quickselect सीखा, और सोचा, “उम्मीद है वे यह नहीं चाह रहे थे कि मैं इसे वहीं तुरंत सोच लूँ।” खैर, शायद वह role मेरे लिए सही नहीं था
जहाँ तक “array को library function से sort करके बीच का मान लौटाने वाले naive solution” की उम्मीद की बात है, मैं candidate से python standard library से बेहतर code की उम्मीद नहीं करता
bonus के तौर पर, इससे तुरंत पता चल जाता है कि किसी ने algorithms पढ़े हैं या कम से कम interview की तैयारी की है। वे quickselect इस्तेमाल करने का सुझाव देंगे: https://en.wikipedia.org/wiki/Quickselect
और अगर quickselect को शुरुआत से खुद लिखना पड़े, तो वह भी किया जा सकता है। मूल रूप से यह partition + binary search के काफ़ी करीब है
Python का
inttype overflow नहीं करता, लेकिन अगर आप C, C++ या Go इस्तेमाल कर रहे हों, तो even-length array वाले branch में addition overflow की चिंता नहीं करनी चाहिए?intमें नहीं बल्किfloatमें होता है। फिर भी overflow होकरinfबनने की संभावना है। अगर array के दोनों elementssys.float_info.maxहों, तो जवाब भीsys.float_info.maxहोना चाहिए, लेकिन addition का परिणामinfहोगा और उसे 2 से divide करने पर भीinfही रहेगाइसे ठीक करने के लिए आप addition पर 2 से divide करने को distribute कर सकते हैं, लेकिन तब subnormal numbers में गलत जवाब मिलेगा। ज़्यादातर लोग शायद मान लेते हैं कि program में इतने बड़े numbers आएँगे ही नहीं कि यह समस्या हो। यहाँ numpy भी warning के साथ
infदेता है:वास्तव में median चुनने के भी कई तरीके हैं। जैसे आप linear interpolation करेंगे, upper bound लेंगे, या lower bound लेंगे
और quantiles तक पहुँचते-पहुँचते इस पर घंटों बात की जा सकती है। एक मान चुनना और कई मान एक साथ चुनना, दोनों के लिए अलग approach चाहिए
मैं मूल पोस्ट जैसे interview problems इस्तेमाल नहीं करता। मैं smoothness चाहता हूँ, यानी problem की कठिनाई candidate की क्षमता और अनुभव के अनुसार सहज रूप से बदलनी चाहिए। खासकर अगर library functions, quickselect, या radix sort जैसे algorithms के बारे में जानकारी अचानक परिणाम को बहुत बदल दे, तो वह measurement के लिए अच्छा सवाल नहीं है
तब आप candidate के अनुभव और क्षमता को नहीं, बल्कि यह परख रहे होते हैं कि उसे कोई खास magic artifact पता है या नहीं। follow-up questions से इसे कुछ हद तक सुधारा जा सकता है, लेकिन शुरू से ही ज़्यादा smooth problem देना बेहतर है