दो सरणियाँ दीं; $births
जन्म के वर्षों की एक सूची जिसमें यह संकेत दिया गया है कि किसी का जन्म हुआ था, और $deaths
मृत्यु की वर्षों की एक सूची जिसमें यह दर्शाता है कि किसी की मृत्यु कब हुई, हम उस वर्ष को कैसे पा सकते हैं जिस पर जनसंख्या सबसे अधिक थी?
निम्नलिखित सरणियों के उदाहरण के लिए:
$births = [1984, 1981, 1984, 1991, 1996];
$deaths = [1991, 1984];
जिस वर्ष जनसंख्या सबसे अधिक होनी चाहिए थी 1996
, क्योंकि 3
उस वर्ष के दौरान लोग जीवित थे, जो उन सभी वर्षों की सबसे अधिक जनसंख्या गणना थी।
यहाँ उस पर चल रहे गणित है:
| जन्म | मौत | जनसंख्या | | ------- | ------- | ------------ | | 1981 | | 1 | | 1984 | | 2 | | 1984 | 1984 | 2 | | 1991 | 1991 | 2 | | 1996 | | 3 |
मान्यताओं
हम सुरक्षित रूप से मान सकते हैं कि जिस वर्ष किसी का जन्म हुआ है वह जनसंख्या एक वर्ष तक बढ़ सकती है और जिस वर्ष किसी की मृत्यु हुई है वह जनसंख्या एक से घट सकती है। तो इस उदाहरण में, 2 लोग 1984 में पैदा हुए थे और 1 व्यक्ति की मृत्यु 1984 को हुई थी, जिसका अर्थ है कि उस वर्ष जनसंख्या में 1 की वृद्धि हुई।
हम यह भी सुरक्षित रूप से मान सकते हैं कि मृत्यु की संख्या कभी भी जन्म की संख्या से अधिक नहीं होगी और यह कि कोई भी मृत्यु तब नहीं हो सकती जब जनसंख्या 0 पर हो।
हम यह भी सुरक्षित रूप से मान सकते हैं कि दोनों में साल $deaths
और $births
नकारात्मक या चल बिन्दु मान कभी नहीं होगा ( वे हमेशा 0 से अधिक धनात्मक पूर्णांक हो )।
हम यह नहीं मान सकते हैं कि सरणियों को क्रमबद्ध किया जाएगा या कि डुप्लिकेट मान नहीं होंगे, हालांकि।
आवश्यकताएँ
हमें उस वर्ष को वापस करने के लिए एक फ़ंक्शन लिखना चाहिए जिस पर इनपुट के रूप में इन दो सरणियों को देखते हुए सबसे अधिक आबादी हुई। समारोह वापस आ सकते हैं 0
, false
, ""
, या NULL
( किसी भी falsey मूल्य स्वीकार्य है ) करता है, तो इनपुट सरणियों खाली हैं या अगर जनसंख्या भर 0 पर हमेशा था। यदि कई वर्षों में सबसे अधिक जनसंख्या हुई, तो समारोह पहले वर्ष में वापस आ सकता है, जिस पर उच्चतम जनसंख्या या किसी भी बाद का वर्ष था।
उदाहरण के लिए:
$births = [1997, 1997, 1997, 1998, 1999];
$deaths = [1998, 1999];
/* The highest population was 3 on 1997, 1998 and 1999, either answer is correct */
इसके अतिरिक्त, समाधान के बिग ओ सहित सहायक होगा।
ऐसा करने का मेरा सबसे अच्छा प्रयास निम्नलिखित होगा:
function highestPopulationYear(Array $births, Array $deaths): Int {
sort($births);
sort($deaths);
$nextBirthYear = reset($births);
$nextDeathYear = reset($deaths);
$years = [];
if ($nextBirthYear) {
$years[] = $nextBirthYear;
}
if ($nextDeathYear) {
$years[] = $nextDeathYear;
}
if ($years) {
$currentYear = max(0, ...$years);
} else {
$currentYear = 0;
}
$maxYear = $maxPopulation = $currentPopulation = 0;
while(current($births) !== false || current($deaths) !== false || $years) {
while($currentYear === $nextBirthYear) {
$currentPopulation++;
$nextBirthYear = next($births);
}
while($currentYear === $nextDeathYear) {
$currentPopulation--;
$nextDeathYear = next($deaths);
}
if ($currentPopulation >= $maxPopulation) {
$maxPopulation = $currentPopulation;
$maxYear = $currentYear;
}
$years = [];
if ($nextBirthYear) {
$years[] = $nextBirthYear;
}
if ($nextDeathYear) {
$years[] = $nextDeathYear;
}
if ($years) {
$currentYear = min($years);
} else {
$currentYear = 0;
}
}
return $maxYear;
}
ऊपर दिए गए एल्गोरिदम को बहुपद समय में काम करना चाहिए, यह सबसे खराब है O(((n log n) * 2) + k)
जहां n
प्रत्येक सरणी से छांटे जाने वाले तत्वों k
की संख्या है और जन्म के वर्षों की संख्या है ( क्योंकि हम k
हमेशा से जानते हैंk >= y
) जहां y
मृत्यु की संख्या है। हालांकि, मुझे यकीन नहीं है कि कोई अधिक कुशल समाधान है।
मौजूदा एल्गोरिथ्म में कम्प्यूटेशनल जटिलता के एक बेहतर बिग ओ में मेरे हित विशुद्ध रूप से हैं । मेमोरी जटिलता का कोई सरोकार नहीं है। न ही रनटाइम ऑप्टिमाइजेशन है। कम से कम यह एक प्राथमिक चिंता का विषय नहीं है । किसी भी छोटे / प्रमुख रनटाइम अनुकूलन का स्वागत है, लेकिन यहां महत्वपूर्ण कारक नहीं है।